diff --git a/.gitignore b/.gitignore index 3c63e24e..1562caa0 100644 --- a/.gitignore +++ b/.gitignore @@ -17,21 +17,11 @@ *.bak *.bak* *.exe +__debug_bin* +debug/ +*.log.* +main # Build Output -local/omc_db.sqlite +local/*.sqlite omc -restagent/restagent - -# Run temp file and dir -restagent/backup/ -restagent/log/ -restagent/upload/ -restagent/software/ -restagent/database/ -restagent/license/ - -sshsvc/sshsvc -sshsvc/mmllog/ -sshsvc/mmlhome/ -sshsvc/log/ diff --git a/.vscode/launch.json b/.vscode/launch.json index f549ed53..a75d47af 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,12 +14,13 @@ "args": ["--env", "local", "-c", "./local/omc.yaml"] }, { - "name": "debug sshsvc", + "name": "调试更新数据库", "type": "go", "request": "launch", "mode": "debug", - "program": "sshsvc/sshsvc.go", - "console": "integratedTerminal" - } + "program": "main.go", + "console": "integratedTerminal", + "args": ["-c", "./local/omc.yaml", "--sqlPath", "./build/database/std/upgrade", "--sqlSource", "std"] + } ] } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 432f2e04..0c1c8114 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,66 @@ # 版本发布日志 +## 2.2508.2-20250815 + +- 修复 删除认证源将关联用户信息移除,用户类型sys更新为System +- 优化 UE/CDR查询条件imsi支持模糊匹配 +- 优化 kpi接收neinfo信息局部赋值,ws控制器实例化方式 +- 优化 数据库导入执行异常错误判断忽略 +- 修复 操作日志记录信息json序列化字符串避免结构异常导致无法解析 +- 新增 第三方登录认证和管理 +- 修复 cdr/ue查询时间字段改用记录时间,传入时间解析时区UTC0导致无法正常查询 +- 修复 告警日志查询补充告警状态字段,告警状态字典值修正为枚举字符串 + +## 2.2508.1-20250808 + +- 修复 MML类型object_type初始值mml更新General,MML日志记录功能接口 +- 修复 UDM签约缺失rfsp和usagetype参数修改 +- 修复 MML命令执行回车\r\n ,特殊IMS无法输出问题 +- 修复 基站状态记录时间变更查询字段create_time +- 优化 系统用户账号简单4位长度,密码简单6位 +- 修复 更新数据库重复记录错误输出信息并跳过 +- 修复 自定义KPI计算NaN导致序列化失败 + +## 2.2507.4-20250801 + +- 修复 密码强制修改非首次登录校验去除日期判断,补充参数说明翻译信息 +- 新增 CBC预警广播功能 +- 新增 仪表盘总览替换,语音数据概览 + +## 2.2507.3-20250725 + +- 优化 减少上报数据不进行警告类型日志记录 +- 优化 自检产生的告警辅助信息字符重复追加 +- 修复 告警同步返回状态为正常,过程错误信息返回到响应 +- 更新 IMS-CDR结果码说明,告警导出表格标题编码翻译补充 +- 修复 自定义指标数据统计不处理小数,计算小于0就强制为0 +- 修复 告警级别判断成类型导致事件存储到告警中 +- 修复 网管状态信息返回nil字符修改,信息返回版本号 + +## 2.2507.2-20250718 + +- 移除 iperf安装包,features、lib和sshsvc目录 +- 移除 将配置文件中无用配置删除精简 +- 重构 接收CDR/UE接入/告警/KPI功能 +- 新增 nssf/n3iwf直连接口 +- 新增 通知模块,暂时只有邮件和smsc发送,可在OMC配置中修改参数 +- 新增 mml到工具模块 +- 新增 北向定义网元状态/配置下发接口,oam对外开放无限制接口模块 +- 修复 服务端口监听失败每5秒重试最多10次 +- 更新 OMC/CBC/UDM参数配置映射文件 +- 更新 升级数据库表结构,依赖更新并加入go-oam +- 新增 告警分组统计数量接口 +- 新增 mt版本移动过过来的三个大屏页面的系统菜单 +- 删除 移除sshsvc服务 +- 新增 北向定义网元状态/配置下发接口 +- 新增 补充缺失的自定义指标接口 + +## 2.2507.1-20250705 + +- 修复 SMSC和UDM配置在lite下无法正常显示问题 +- 更新 AMF配置缺少Gnb List Config定义,SMF配置新增GNB和远程Gy配置 +- 新增 IMS指标IDD呼入呼出,自定义指标IDD + ## 2.2506.4-20250627 - 优化 IMS-KPI隐藏掉原因值接收 diff --git a/README.md b/README.md index 2c88408e..5870d8c8 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,9 @@ | 33033/33034 | 信令跟踪上报 UDP/TCP | | 33060 | 性能分析 pprof | | 33040 | 网管测试 Api | +| 21/22/25 | SSH/FTP | +| 33066 | 网管连接 mysql | +| 6379 | 网管连接 redis | ## redis 配置文件相关 diff --git a/build/database/lite/common/mml_command.sql b/build/database/lite/common/mml_command.sql index 0a21cf1e..c87dafd8 100644 --- a/build/database/lite/common/mml_command.sql +++ b/build/database/lite/common/mml_command.sql @@ -15,14 +15,6 @@ CREATE TABLE "mml_command" ( PRIMARY KEY ("id") ); --- ---------------------------- --- Indexes structure for table mml_command --- ---------------------------- -CREATE INDEX "id" -ON "mml_command" ( - "id" ASC -); - -- ---------------------------- -- Records of mml_command -- ---------------------------- diff --git a/build/database/lite/common/mml_system.sql b/build/database/lite/common/mml_system.sql index 6aaf1aec..78d77ead 100644 --- a/build/database/lite/common/mml_system.sql +++ b/build/database/lite/common/mml_system.sql @@ -19,64 +19,64 @@ CREATE TABLE "mml_system" ( -- ---------------------------- -- Records of mml_system -- ---------------------------- -INSERT INTO "mml_system" VALUES (833, 'UPF', 'upfManagement', 'UPF Management', 'help', '', 'List UPF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (834, 'UPF', 'systemManagement', 'System Management', 'set', 'n3 driver', 'Set N3 Driver', 'mml', '[{"comment":"","display":"Type","filter":"","name":"type","optional":"false","type":"int"},{"comment":"","display":"IP address","filter":"","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Mask","filter":"","name":"mask","optional":"false","type":"string"},{"comment":"","display":"Mac address","filter":"","name":"mac","optional":"false","type":"string"},{"comment":"","display":"PCI address","filter":"","name":"pci","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (835, 'UPF', 'systemManagement', 'System Management', 'set', 'n4 ip', 'Set N4 IP Address', 'mml', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (836, 'UPF', 'systemManagement', 'System Management', 'set', 'n6 driver', 'Set N6 Driver', 'mml', '[{"comment":"","display":"Type","filter":"","name":"type","optional":"false","type":"int"},{"comment":"","display":"IP address","filter":"","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Mask","filter":"","name":"mask","optional":"false","type":"string"},{"comment":"","display":"Mac address","filter":"","name":"mac","optional":"false","type":"string"},{"comment":"","display":"PCI address","filter":"","name":"pci","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (837, 'UPF', 'systemManagement', 'System Management', 'set', 'n9 driver', 'Set N9 Driver', 'mml', '[{"comment":"","display":"Type","filter":"","name":"type","optional":"false","type":"int"},{"comment":"","display":"IP address","filter":"","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Mask","filter":"","name":"mask","optional":"false","type":"string"},{"comment":"","display":"Mac address","filter":"","name":"mac","optional":"false","type":"string"},{"comment":"","display":"PCI address","filter":"","name":"pci","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (838, 'UPF', 'systemManagement', 'System Management', 'set', 'dnn', 'Set DNN', 'mml', '[{"comment":"","display":"DNN","filter":"","name":"dnn","optional":"false","type":"string"},{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (839, 'UPF', 'systemManagement', 'System Management', 'set', 'pfcp', 'Set PFCP', 'mml', '[{"comment":"","display":"Path","filter":"","name":"path","optional":"false","type":"string"},{"comment":"","display":"Local IP Address","filter":"","name":"local","optional":"false","type":"string"},{"comment":"","display":"Remote IP Address","filter":"","name":"remote","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (840, 'UPF', 'systemManagement', 'System Management', 'set', 'qos', 'Set Qos', 'mml', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"string"},{"comment":"","display":"5qi","filter":"","name":"5qi","optional":"false","type":"string"},{"comment":"","display":"Priority Level","filter":"","name":"priority","optional":"false","type":"int"},{"comment":"","display":"MBR","filter":"","name":"mbr","optional":"false","type":"string"},{"comment":"","display":"GBR","filter":"","name":"gbr","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (841, 'UPF', 'systemManagement', 'System Management', 'set', 'pccrule', 'Set PCC Rule', 'mml', '[{"comment":"","display":"Index","filter":"0~65535","name":"index","optional":"false","type":"int"},{"comment":"","display":"Precedence","filter":"","name":"precedence","optional":"false","type":"int"},{"comment":"","display":"QOS Index","filter":"","name":"qosindex","optional":"false","type":"int"},{"comment":"","display":"Filter Direction","filter":"{\"0\":\"NA\", \"1\":\"Uplink\", \"2\":\"Downlink\", \"3\":\"Bidirectionallink\"}","name":"direction","optional":"true","type":"int"},{"comment":"","display":"Filter","filter":"","name":"filter","optional":"true","type":"string"},{"comment":"","display":"Application ID","filter":"","name":"appid","optional":"true","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (842, 'UPF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'mml', '[{"comment":"","display":"CMD","filter":"","name":"cmd","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (843, 'UPF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO "mml_system" VALUES (853, 'SMF', 'smfManagement', 'SMF Management', 'help', '', 'List SMF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (854, 'SMF', 'systemManagement', 'System Management', 'set', 'n7 server', 'Set N7 Server', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Port","filter":"0~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (855, 'SMF', 'systemManagement', 'System Management', 'set', 'n7 client', 'Set N7 Client', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (856, 'SMF', 'systemManagement', 'System Management', 'set', 'n10 server', 'Set N10 Server', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Port","filter":"0~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (857, 'SMF', 'systemManagement', 'System Management', 'set', 'n10 client', 'Set N10 Client', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (858, 'SMF', 'systemManagement', 'System Management', 'set', 'n11 server', 'Set N11 Server', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Port","filter":"0~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (859, 'SMF', 'systemManagement', 'System Management', 'set', 'n11 client', 'Set N11 Client', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (860, 'SMF', 'systemManagement', 'System Management', 'set', 'dnn', 'Set DNN', 'mml', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"int"},{"comment":"","display":"DNN","filter":"","name":"DNN","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (862, 'SMF', 'systemManagement', 'System Management', 'set', 'qos', 'Set Qos', 'mml', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"string"},{"comment":"","display":"SD","filter":"","name":"5qi","optional":"false","type":"string"},{"comment":"","display":"5qipl","filter":"","name":"5qipl","optional":"false","type":"string"},{"comment":"","display":"arppl","filter":"","name":"arppl","optional":"false","type":"string"},{"comment":"","display":"arppci","filter":"","name":"arppci","optional":"false","type":"string"},{"comment":"","display":"arppvi","filter":"","name":"arppvi","optional":"false","type":"string"},{"comment":"","display":"mfbrul","filter":"","name":"mfbrul","optional":"false","type":"string"},{"comment":"","display":"mfbrdl","filter":"","name":"mfbrdl","optional":"false","type":"string"},{"comment":"","display":"gfbrul","filter":"","name":"gfbrul","optional":"false","type":"string"},{"comment":"","display":"gfbrdl","filter":"","name":"gfbrdl","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (863, 'SMF', 'systemManagement', 'System Management', 'set', 'snssai', 'Set Snssai', 'mml', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"string"},{"display":"sst-sd","filter":"","name":"sst-sd","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (864, 'SMF', 'systemManagement', 'System Management', 'release', 'imsi', 'Release IMSI', 'mml', '[{"comment":"","display":"IMSI","filter":"","name":"imsi","optional":"false","type":"string"},{"display":"PDU Session Id","filter":"","name":"pduSessId","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (865, 'SMF', 'systemManagement', 'System Management', 'set', 'urr', 'Set URR', 'mml', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"string"},{"comment":"","display":"Quota Volume Tatol","filter":"","name":"quotavolumetatol","optional":"false","type":"string"},{"comment":"","display":"Quota Volume UL","filter":"","name":"quotavolumeul","optional":"false","type":"string"},{"comment":"","display":"Quota Volume DL","filter":"","name":"quotavolumedl","optional":"false","type":"string"},{"comment":"","display":"Quota Time","filter":"","name":"quotatime","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (866, 'SMF', 'systemManagement', 'System Management', 'set', 'dpi', 'Set DPI', 'mml', '[{"comment":"","display":"Flag","filter":"{\"0\":\"disable\", \"1\":\"enable\"}","name":"flag","optional":"false","type":"enum"},{"comment":"","display":"Max Detect Packet Number","filter":"","name":"max","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (867, 'SMF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'mml', '[{"comment":"","display":"CMD","filter":"","name":"cmd","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (868, 'SMF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO "mml_system" VALUES (870, 'IMS', 'imsManagement', 'IMS Management', 'help', '', 'List IMS MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (871, 'N3IWF', 'n3iwfManagement', 'N3IWF Management', 'help', '', 'List N3IWF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (872, 'NSSF', 'nssfManagement', 'NSSF Management', 'help', '', 'List NSSF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (873, 'NRF', 'nrfManagement', 'NRF Management', 'help', '', 'List NRF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (874, 'PCF', 'pcfManagement', 'PCF Management', 'help', '', 'List PCF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (875, 'AMF', 'subsManagement', 'Subscriber Management', 'list', 'imsi', 'List Online IMSI', 'mml', '[{"comment":"","display":"IMSI","filter":"32","name":"imsi","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (876, 'AMF', 'amfManagement', 'AMF Management', 'help', '', 'List AMF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (877, 'AMF', 'systemManagement', 'System Management', 'set', 'n8_ip', 'Set N8 IP Address', 'mml', '[{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (878, 'AMF', 'systemManagement', 'System Management', 'set', 'n11_ip', 'Set N11 IP Address', 'mml', '[{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (879, 'AMF', 'systemManagement', 'System Management', 'set', 'n12_ip', 'Set N12 IP Address', 'mml', '[{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (880, 'AMF', 'systemManagement', 'System Management', 'set', 'n2_ip', 'Set N2 IP Address', 'mml', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (881, 'AMF', 'systemManagement', 'System Management', 'set', 'n2_port', 'Set N2 Port', 'mml', '[{"comment":"","display":"Port","filter":"0~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (882, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpversion', 'Set NTP Version', 'mml', '[{"comment":"","display":"Version","filter":"","name":"version","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (883, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpmaxdiff', 'Set NTP Max Diff', 'mml', '[{"comment":"","display":"Max Value(ms)","filter":"100~2000","name":"value","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (884, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpsynctimer', 'Set NTP Sync Timer', 'mml', '[{"comment":"","display":"Periods(second)","filter":"","name":"periods","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (885, 'AMF', 'systemManagement', 'System Management', 'add', 'slice', 'Add Slice', 'mml', '[{"comment":"","display":"SST","filter":"","name":"sst","optional":"false","type":"string"},{"comment":"","display":"SD","filter":"","name":"sd","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (886, 'AMF', 'systemManagement', 'System Management', 'deregister', 'imsi', 'Deregister IMSI', 'mml', '[{"comment":"","display":"IMSI","filter":"","name":"IMSI","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (887, 'AMF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'mml', '[{"comment":"","display":"CMD","filter":"","name":"cmd","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (888, 'AMF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO "mml_system" VALUES (889, 'UDM', 'udmManagement', 'UDM Management', 'help', '', 'List UDM MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (890, 'UDM', 'systemManagement', 'System Management', 'set', 'n8ip', 'Set N8 IP Address', 'mml', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"ipv4"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (891, 'UDM', 'systemManagement', 'System Management', 'set', 'n8port', 'Set N8 Port', 'mml', '[{"comment":"","display":"Port","filter":"1~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (892, 'UDM', 'systemManagement', 'System Management', 'set', 'n8scheme', 'Set N8 Scheme', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (893, 'UDM', 'systemManagement', 'System Management', 'set', 'n10ip', 'Set N10 IP Address', 'mml', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (894, 'UDM', 'systemManagement', 'System Management', 'set', 'n10port', 'Set N10 Port', 'mml', '[{"comment":"","display":"Port","filter":"1~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (895, 'UDM', 'systemManagement', 'System Management', 'set', 'n10scheme', 'Set N10 Scheme', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (896, 'UDM', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'mml', '[{"comment":"","display":"CMD","filter":"","name":"cmd","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (897, 'UDM', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO "mml_system" VALUES (898, 'AUSF', 'ausfManagement', 'AUSF Management', 'help', '', 'List AUSF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO "mml_system" VALUES (899, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12ip', 'Set N12 IP Address', 'mml', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (900, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12port', 'Set N12 Port', 'mml', '[{"comment":"","display":"Port","filter":"1~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (901, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12scheme', 'Set N12 Scheme', 'mml', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (902, 'AUSF', 'systemManagement', 'System Management', 'set', 'supirange', 'Set SUPI Range', 'mml', '[{"comment":"","display":"SUPI Range","filter":"","name":"supirange","optional":"false","type":"string"}]', 'Inactive'); -INSERT INTO "mml_system" VALUES (903, 'AUSF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO "mml_system" VALUES (904, 'MME', 'mmeManagement', 'MME Management', 'help', '', 'List MME MML CMD', 'mml', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (833, 'UPF', 'upfManagement', 'UPF Management', 'help', '', 'List UPF MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (834, 'UPF', 'systemManagement', 'System Management', 'set', 'n3 driver', 'Set N3 Driver', 'General', '[{"comment":"","display":"Type","filter":"","name":"type","optional":"false","type":"int"},{"comment":"","display":"IP address","filter":"","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Mask","filter":"","name":"mask","optional":"false","type":"string"},{"comment":"","display":"Mac address","filter":"","name":"mac","optional":"false","type":"string"},{"comment":"","display":"PCI address","filter":"","name":"pci","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (835, 'UPF', 'systemManagement', 'System Management', 'set', 'n4 ip', 'Set N4 IP Address', 'General', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (836, 'UPF', 'systemManagement', 'System Management', 'set', 'n6 driver', 'Set N6 Driver', 'General', '[{"comment":"","display":"Type","filter":"","name":"type","optional":"false","type":"int"},{"comment":"","display":"IP address","filter":"","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Mask","filter":"","name":"mask","optional":"false","type":"string"},{"comment":"","display":"Mac address","filter":"","name":"mac","optional":"false","type":"string"},{"comment":"","display":"PCI address","filter":"","name":"pci","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (837, 'UPF', 'systemManagement', 'System Management', 'set', 'n9 driver', 'Set N9 Driver', 'General', '[{"comment":"","display":"Type","filter":"","name":"type","optional":"false","type":"int"},{"comment":"","display":"IP address","filter":"","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Mask","filter":"","name":"mask","optional":"false","type":"string"},{"comment":"","display":"Mac address","filter":"","name":"mac","optional":"false","type":"string"},{"comment":"","display":"PCI address","filter":"","name":"pci","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (838, 'UPF', 'systemManagement', 'System Management', 'set', 'dnn', 'Set DNN', 'General', '[{"comment":"","display":"DNN","filter":"","name":"dnn","optional":"false","type":"string"},{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (839, 'UPF', 'systemManagement', 'System Management', 'set', 'pfcp', 'Set PFCP', 'General', '[{"comment":"","display":"Path","filter":"","name":"path","optional":"false","type":"string"},{"comment":"","display":"Local IP Address","filter":"","name":"local","optional":"false","type":"string"},{"comment":"","display":"Remote IP Address","filter":"","name":"remote","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (840, 'UPF', 'systemManagement', 'System Management', 'set', 'qos', 'Set Qos', 'General', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"string"},{"comment":"","display":"5qi","filter":"","name":"5qi","optional":"false","type":"string"},{"comment":"","display":"Priority Level","filter":"","name":"priority","optional":"false","type":"int"},{"comment":"","display":"MBR","filter":"","name":"mbr","optional":"false","type":"string"},{"comment":"","display":"GBR","filter":"","name":"gbr","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (841, 'UPF', 'systemManagement', 'System Management', 'set', 'pccrule', 'Set PCC Rule', 'General', '[{"comment":"","display":"Index","filter":"0~65535","name":"index","optional":"false","type":"int"},{"comment":"","display":"Precedence","filter":"","name":"precedence","optional":"false","type":"int"},{"comment":"","display":"QOS Index","filter":"","name":"qosindex","optional":"false","type":"int"},{"comment":"","display":"Filter Direction","filter":"{\"0\":\"NA\", \"1\":\"Uplink\", \"2\":\"Downlink\", \"3\":\"Bidirectionallink\"}","name":"direction","optional":"true","type":"int"},{"comment":"","display":"Filter","filter":"","name":"filter","optional":"true","type":"string"},{"comment":"","display":"Application ID","filter":"","name":"appid","optional":"true","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (842, 'UPF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'General', '[{"comment":"","display":"CMD","filter":"","name":"cmd","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (843, 'UPF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO "mml_system" VALUES (853, 'SMF', 'smfManagement', 'SMF Management', 'help', '', 'List SMF MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (854, 'SMF', 'systemManagement', 'System Management', 'set', 'n7 server', 'Set N7 Server', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Port","filter":"0~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (855, 'SMF', 'systemManagement', 'System Management', 'set', 'n7 client', 'Set N7 Client', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (856, 'SMF', 'systemManagement', 'System Management', 'set', 'n10 server', 'Set N10 Server', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Port","filter":"0~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (857, 'SMF', 'systemManagement', 'System Management', 'set', 'n10 client', 'Set N10 Client', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (858, 'SMF', 'systemManagement', 'System Management', 'set', 'n11 server', 'Set N11 Server', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"},{"comment":"","display":"Port","filter":"0~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (859, 'SMF', 'systemManagement', 'System Management', 'set', 'n11 client', 'Set N11 Client', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"},{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (860, 'SMF', 'systemManagement', 'System Management', 'set', 'dnn', 'Set DNN', 'General', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"int"},{"comment":"","display":"DNN","filter":"","name":"DNN","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (862, 'SMF', 'systemManagement', 'System Management', 'set', 'qos', 'Set Qos', 'General', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"string"},{"comment":"","display":"SD","filter":"","name":"5qi","optional":"false","type":"string"},{"comment":"","display":"5qipl","filter":"","name":"5qipl","optional":"false","type":"string"},{"comment":"","display":"arppl","filter":"","name":"arppl","optional":"false","type":"string"},{"comment":"","display":"arppci","filter":"","name":"arppci","optional":"false","type":"string"},{"comment":"","display":"arppvi","filter":"","name":"arppvi","optional":"false","type":"string"},{"comment":"","display":"mfbrul","filter":"","name":"mfbrul","optional":"false","type":"string"},{"comment":"","display":"mfbrdl","filter":"","name":"mfbrdl","optional":"false","type":"string"},{"comment":"","display":"gfbrul","filter":"","name":"gfbrul","optional":"false","type":"string"},{"comment":"","display":"gfbrdl","filter":"","name":"gfbrdl","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (863, 'SMF', 'systemManagement', 'System Management', 'set', 'snssai', 'Set Snssai', 'General', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"string"},{"display":"sst-sd","filter":"","name":"sst-sd","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (864, 'SMF', 'systemManagement', 'System Management', 'release', 'imsi', 'Release IMSI', 'General', '[{"comment":"","display":"IMSI","filter":"","name":"imsi","optional":"false","type":"string"},{"display":"PDU Session Id","filter":"","name":"pduSessId","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (865, 'SMF', 'systemManagement', 'System Management', 'set', 'urr', 'Set URR', 'General', '[{"comment":"","display":"Index","filter":"","name":"index","optional":"false","type":"string"},{"comment":"","display":"Quota Volume Tatol","filter":"","name":"quotavolumetatol","optional":"false","type":"string"},{"comment":"","display":"Quota Volume UL","filter":"","name":"quotavolumeul","optional":"false","type":"string"},{"comment":"","display":"Quota Volume DL","filter":"","name":"quotavolumedl","optional":"false","type":"string"},{"comment":"","display":"Quota Time","filter":"","name":"quotatime","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (866, 'SMF', 'systemManagement', 'System Management', 'set', 'dpi', 'Set DPI', 'General', '[{"comment":"","display":"Flag","filter":"{\"0\":\"disable\", \"1\":\"enable\"}","name":"flag","optional":"false","type":"enum"},{"comment":"","display":"Max Detect Packet Number","filter":"","name":"max","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (867, 'SMF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'General', '[{"comment":"","display":"CMD","filter":"","name":"cmd","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (868, 'SMF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO "mml_system" VALUES (870, 'IMS', 'imsManagement', 'IMS Management', 'help', '', 'List IMS MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (871, 'N3IWF', 'n3iwfManagement', 'N3IWF Management', 'help', '', 'List N3IWF MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (872, 'NSSF', 'nssfManagement', 'NSSF Management', 'help', '', 'List NSSF MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (873, 'NRF', 'nrfManagement', 'NRF Management', 'help', '', 'List NRF MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (874, 'PCF', 'pcfManagement', 'PCF Management', 'help', '', 'List PCF MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (875, 'AMF', 'subsManagement', 'Subscriber Management', 'list', 'imsi', 'List Online IMSI', 'General', '[{"comment":"","display":"IMSI","filter":"32","name":"imsi","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (876, 'AMF', 'amfManagement', 'AMF Management', 'help', '', 'List AMF MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (877, 'AMF', 'systemManagement', 'System Management', 'set', 'n8_ip', 'Set N8 IP Address', 'General', '[{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (878, 'AMF', 'systemManagement', 'System Management', 'set', 'n11_ip', 'Set N11 IP Address', 'General', '[{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (879, 'AMF', 'systemManagement', 'System Management', 'set', 'n12_ip', 'Set N12 IP Address', 'General', '[{"comment":"","display":"IP Address","filter":"0~64","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (880, 'AMF', 'systemManagement', 'System Management', 'set', 'n2_ip', 'Set N2 IP Address', 'General', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (881, 'AMF', 'systemManagement', 'System Management', 'set', 'n2_port', 'Set N2 Port', 'General', '[{"comment":"","display":"Port","filter":"0~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (882, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpversion', 'Set NTP Version', 'General', '[{"comment":"","display":"Version","filter":"","name":"version","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (883, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpmaxdiff', 'Set NTP Max Diff', 'General', '[{"comment":"","display":"Max Value(ms)","filter":"100~2000","name":"value","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (884, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpsynctimer', 'Set NTP Sync Timer', 'General', '[{"comment":"","display":"Periods(second)","filter":"","name":"periods","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (885, 'AMF', 'systemManagement', 'System Management', 'add', 'slice', 'Add Slice', 'General', '[{"comment":"","display":"SST","filter":"","name":"sst","optional":"false","type":"string"},{"comment":"","display":"SD","filter":"","name":"sd","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (886, 'AMF', 'systemManagement', 'System Management', 'deregister', 'imsi', 'Deregister IMSI', 'General', '[{"comment":"","display":"IMSI","filter":"","name":"IMSI","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (887, 'AMF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'General', '[{"comment":"","display":"CMD","filter":"","name":"cmd","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (888, 'AMF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO "mml_system" VALUES (889, 'UDM', 'udmManagement', 'UDM Management', 'help', '', 'List UDM MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (890, 'UDM', 'systemManagement', 'System Management', 'set', 'n8ip', 'Set N8 IP Address', 'General', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"ipv4"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (891, 'UDM', 'systemManagement', 'System Management', 'set', 'n8port', 'Set N8 Port', 'General', '[{"comment":"","display":"Port","filter":"1~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (892, 'UDM', 'systemManagement', 'System Management', 'set', 'n8scheme', 'Set N8 Scheme', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (893, 'UDM', 'systemManagement', 'System Management', 'set', 'n10ip', 'Set N10 IP Address', 'General', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (894, 'UDM', 'systemManagement', 'System Management', 'set', 'n10port', 'Set N10 Port', 'General', '[{"comment":"","display":"Port","filter":"1~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (895, 'UDM', 'systemManagement', 'System Management', 'set', 'n10scheme', 'Set N10 Scheme', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (896, 'UDM', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'General', '[{"comment":"","display":"CMD","filter":"","name":"cmd","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (897, 'UDM', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO "mml_system" VALUES (898, 'AUSF', 'ausfManagement', 'AUSF Management', 'help', '', 'List AUSF MML CMD', 'General', 'null', 'Active'); +INSERT INTO "mml_system" VALUES (899, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12ip', 'Set N12 IP Address', 'General', '[{"comment":"","display":"IP Address","filter":"","name":"ip","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (900, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12port', 'Set N12 Port', 'General', '[{"comment":"","display":"Port","filter":"1~65535","name":"port","optional":"false","type":"int"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (901, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12scheme', 'Set N12 Scheme', 'General', '[{"comment":"","display":"Scheme","filter":"{\"0\":\"http\", \"1\":\"https\"}","name":"scheme","optional":"false","type":"enum"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (902, 'AUSF', 'systemManagement', 'System Management', 'set', 'supirange', 'Set SUPI Range', 'General', '[{"comment":"","display":"SUPI Range","filter":"","name":"supirange","optional":"false","type":"string"}]', 'Inactive'); +INSERT INTO "mml_system" VALUES (903, 'AUSF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO "mml_system" VALUES (904, 'MME', 'mmeManagement', 'MME Management', 'help', '', 'List MME MML CMD', 'General', 'null', 'Active'); diff --git a/build/database/lite/common/ne_config.sql b/build/database/lite/common/ne_config.sql index da6dc9ae..2df1a188 100644 --- a/build/database/lite/common/ne_config.sql +++ b/build/database/lite/common/ne_config.sql @@ -96,22 +96,22 @@ INSERT INTO "ne_config" VALUES (190, 'SMF', 'localDhcpCfg', 'Local DHCP Config', INSERT INTO "ne_config" VALUES (191, 'SMF', 'dnnselectdhcpserver', 'DNN Select DHCP Server', 'array', '[{"access":"read-only","comment":"","display":"Index","filter":"0~65535","name":"index","type":"int","value":""},{"access":"read-write","comment":"","display":"Enable","filter":"","name":"enable","type":"bool","value":"false"},{"access":"read-write","comment":"","display":"DNN","filter":"1~64","name":"dnn","type":"string","value":""},{"access":"read-write","comment":"e.g. 192.168.1.1","display":"DHCP Server IP","filter":"","name":"dhcpServerAddr","type":"string","value":""}]', 23, '', 1751019165587, 'public'); INSERT INTO "ne_config" VALUES (192, '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"}]', 25, '', 1751019165593, 'public'); --- 更新 UDM 配置 20250613 -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\":\"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, '', 1749815867447, 'public'); -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\"}]', 5, '', 1749815867466, 'public'); -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\"}]', 7, '', 1749815867471, 'public'); -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\"}]', 9, '', 1749815867476, 'public'); -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\"}]', 11, '', 1749815867480, 'public'); -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\"}]', 13, '', 1749815867486, 'public'); -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\"}]', 15, '', 1749815867491, 'public'); -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\"}]', 17, '', 1749815867496, 'public'); -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\"}]', 19, '', 1749815867501, 'public'); -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\"}]', 21, '', 1749815867506, 'public'); -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\"}]', 23, '', 1749815867511, 'public'); -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\"}]', 25, '', 1749815867516, 'public'); -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\"}]', 27, '', 1749815867521, 'public'); -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\"}]', 29, '', 1749815867527, 'public'); -INSERT INTO "ne_config" VALUES (214, 'UDM', 'ausfCfg', 'AUSF Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EAP-Aka SupiOrImsi Prefix\",\"filter\":\"\",\"name\":\"eapAkaSupiImsiPrefix\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF FQDN\",\"filter\":\"0~128\",\"name\":\"ausfFqdn\",\"type\":\"string\",\"value\":\"ausf.5gc.com\"}]', 3, '', 1749815867461, 'public'); +-- 更新 UDM 配置 20250715 +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":"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, '', 1752577177260, 'public'); +INSERT INTO "ne_config" VALUES (201, 'UDM', 'ausfCfg', 'AUSF Config', 'list', '[{"access":"read-write","comment":"","display":"AUSF enable","filter":"","name":"enable","type":"bool","value":"true"},{"access":"read-write","comment":"","display":"EAP-Aka SupiOrImsi Prefix","filter":"","name":"eapAkaSupiImsiPrefix","type":"bool","value":"false"},{"access":"read-write","comment":"","display":"AUSF FQDN","filter":"0~128","name":"ausfFqdn","type":"string","value":"ausf.5gc.com"}]', 3, '', 1752577177350, 'public'); +INSERT INTO "ne_config" VALUES (202, '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"}]', 5, '', 1752577177371, 'public'); +INSERT INTO "ne_config" VALUES (203, '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"}]', 7, '', 1752577177376, 'public'); +INSERT INTO "ne_config" VALUES (204, '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"}]', 9, '', 1752577177380, 'public'); +INSERT INTO "ne_config" VALUES (205, '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":"lab_sar"},{"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"}]', 11, '', 1752577177385, 'public'); +INSERT INTO "ne_config" VALUES (206, '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"}]', 13, '', 1752577177391, 'public'); +INSERT INTO "ne_config" VALUES (207, '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"}]', 15, '', 1752577177395, 'public'); +INSERT INTO "ne_config" VALUES (208, '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"}]', 17, '', 1752577177401, 'public'); +INSERT INTO "ne_config" VALUES (209, '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"}]', 19, '', 1752577177405, 'public'); +INSERT INTO "ne_config" VALUES (210, '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"}]', 21, '', 1752577177410, 'public'); +INSERT INTO "ne_config" VALUES (211, '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"}]', 23, '', 1752577177415, 'public'); +INSERT INTO "ne_config" VALUES (212, '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"}]', 25, '', 1752577177419, 'public'); +INSERT INTO "ne_config" VALUES (213, '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"}]', 27, '', 1752577177423, 'public'); +INSERT INTO "ne_config" VALUES (214, '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"}]', 29, '', 1752577177427, 'public'); -- 更新 UPF 配置 20250320 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, '', 1742469466451, 'public'); @@ -133,22 +133,22 @@ INSERT INTO "ne_config" VALUES (235, 'UPF', 'dpiHeaderEnrichInfoList', 'DPI Head 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"}]', 35, '', 1742469466580, 'public'); INSERT INTO "ne_config" VALUES (237, 'UPF', 'networkControlFreeServerList', 'Free Server List', 'array', '[{"access":"read-write","comment":"1~32","display":"Index","filter":"1~32","name":"index","type":"int","value":"1"},{"access":"read-write","comment":"","display":"Enabled","filter":"0~1","name":"enabled","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":"Server IPv4","filter":"","name":"serverIpv4","type":"string","value":"0.0.0.0"},{"access":"read-write","comment":"","display":"Server IPv4 Mask","filter":"","name":"serverIpv4Mask","type":"string","value":"255.255.255.0"},{"access":"read-write","comment":"","display":"Server IPv6","filter":"","name":"serverIpv6","type":"string","value":""},{"access":"read-write","comment":"","display":"Server IPv6 Prefix","filter":"","name":"serverIpv6Prefix","type":"int","value":"64"}],"comment":"","display":"Free Server Address List","filter":"0~32","name":"freeServerAddrList","type":"int","value":"1"}]', 27, '', 1742469466563, 'public'); --- 更新 CBC 配置 20240823 -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, 'public'); -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, 'public'); -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, 'public'); +-- 更新 CBC 配置 20250715 +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":"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":"","display":"SBI Scheme","filter":"{\"0\":\"http\",\"1\":\"https\"}","name":"sbiScheme","type":"enum","value":"0"},{"access":"read-write","comment":"0~65535","display":"SBI Timeout","filter":"0~65535","name":"sbiTimeout","type":"int","value":"3"}]', 1, '', 1752577098470, 'public'); +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":"apply the current AMF NF Profile","display":"Enable AMF","filter":"{\"0\":\"false\",\"1\":\"true\"}","name":"enabled","type":"bool","value":"1"},{"access":"read-write","comment":"","display":"NF Name","filter":"0~64","name":"name","type":"string","value":"AMF"},{"access":"read-write","comment":"format: http://\u003cIP\u003e:\u003cPORT\u003e e.g: http://192.168.1.1:9090","display":"AMF URI","filter":"0~64","name":"uri","type":"string","value":"http://172.16.5.130:8080"},{"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":"MCC","filter":"^\\d{3,3}$","name":"mcc","type":"regex","value":"460"},{"access":"read-write","comment":"","display":"MNC","filter":"^\\d{2,3}$","name":"mnc","type":"regex","value":"00"},{"access":"read-write","comment":"(A).format is decimal string,e.g:43888 (B).Allow set multiple tac value by ; split, e:4388;4360 ","display":"TAC","filter":"^(\\d+(;\\d+)*)?$","name":"tac","type":"regex","value":"4388"}],"comment":"allow TaiList null or add more tai value","display":"Tai List","filter":"","name":"taiList","type":"regex","value":""}]', 3, '', 1752577099153, 'public'); +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":"apply the current MME NF Profile","display":"Enable MME","filter":"{\"0\":\"false\",\"1\":\"true\"}","name":"enabled","type":"bool","value":"1"},{"access":"read-write","comment":"","display":"NF Name","filter":"0~64","name":"name","type":"string","value":"MME"},{"access":"read-write","comment":"format: sctp://\u003cIP\u003e:\u003cPORT\u003e e.g: sctp://192.168.1.1:9090","display":"MME URI","filter":"0~64","name":"uri","type":"string","value":"sctp://192.168.1.1:9090"},{"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":"MCC","filter":"^\\d{3,3}$","name":"mcc","type":"regex","value":"460"},{"access":"read-write","comment":"","display":"MNC","filter":"^\\d{2,3}$","name":"mnc","type":"regex","value":"00"},{"access":"read-write","comment":"(A).format is decimal string,e.g:43888 (B).Allow set multiple tac value by ; split, e:4388;4360 ","display":"TAC","filter":"^(\\d+(;\\d+)*)?$","name":"tac","type":"regex","value":"4388"}],"comment":"allow TaiList null or add more tai value","display":"Tai List","filter":"","name":"taiList","type":"regex","value":""}]', 5, '', 1752577099228, 'public'); --- 更新 OMC 配置 2025627 -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":"string, no variable support","display":"Email Title","filter":"","name":"title","type":"string","value":""},{"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, '', 1751013716061, 'public'); -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, '', 1750993234232, 'public'); -INSERT INTO "ne_config" VALUES (262, 'OMC', 'trace', 'NE Signaling Trace', 'list', '[{"access":"read-write","comment":"enable or disable NE signaling trace creation","display":"Enable","filter":"{\"0\":\"false\",\"1\":\"true\"}","name":"enabled","type":"bool","value":"false"},{"access":"read-write","comment":"NE signaling trace host address","display":"Host","filter":"0~128","name":"host","type":"ipv4","value":"172.16.5.100"},{"access":"read-write","comment":"NE signaling trace port","display":"Port","filter":"3000~65530","name":"port","type":"int","value":"33033"}]', 1, '', 1750993234209, 'public'); +-- 更新 OMC 配置 20250715 +INSERT INTO "ne_config" VALUES (260, 'OMC', 'trace', 'NE Signaling Trace', 'list', '[{"access":"read-write","comment":"enable or disable NE signaling trace creation","display":"Enable","filter":"{\"0\":\"false\",\"1\":\"true\"}","name":"enabled","type":"bool","value":"false"},{"access":"read-write","comment":"NE signaling trace host address","display":"Host","filter":"0~128","name":"host","type":"ipv4","value":"172.16.5.100"},{"access":"read-write","comment":"NE signaling trace port","display":"Port","filter":"3000~65530","name":"port","type":"int","value":"33033"}]', 1, '', 1752576919477, 'public'); +INSERT INTO "ne_config" VALUES (261, 'OMC', 'notificationEmail', 'Alarm Email Forward Interface', 'list', '[{"access":"rw","comment":"Is it enabled forward alarm with Email interface","display":"Enable","filter":"{\"0\":\"false\",\"1\":\"true\"}","name":"enable","type":"bool","value":"true"},{"access":"rw","comment":"","display":"Email List","filter":"","name":"list","type":"string","value":""},{"access":"rw","comment":"string, no variable support","display":"Email Title","filter":"","name":"title","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":""}]', 3, '', 1752576919810, 'public'); +INSERT INTO "ne_config" VALUES (262, 'OMC', 'notificationSMSC', '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":"list","type":"string","value":""},{"access":"rw","comment":"The SMSC SMPP Address","display":"SMSC Address","filter":"","name":"addr","type":"string","value":""},{"access":"rw","comment":"","display":"System ID","filter":"","name":"systemid","type":"string","value":""},{"access":"rw","comment":"","display":"System Type","filter":"","name":"systemtype","type":"string","value":""},{"access":"rw","comment":"","display":"Password","filter":"","name":"password","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":"coding","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, '', 1752576919817, 'public'); -- 更新 SMSC 配置 2025521 -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 Number\",\"filter\":\"0~32\",\"name\":\"smscNumber\",\"type\":\"string\",\"value\":\"0\"},{\"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, '', 1747799255683, 'public'); -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', 1747799256006, 'public'); -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\\\",\\\"19\\\":\\\"smpp8dcs0Unpack7\\\",\\\"20\\\":\\\"smpp8dcs0ISO8859\\\"}\",\"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', 1747799256626, 'public'); -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', 1747799256855, 'public'); -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', 1747799257026, 'public'); +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 Number","filter":"0~32","name":"smscNumber","type":"string","value":"0"},{"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, '', 1751438862010, 'public'); +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', 1751438862028, 'public'); +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\",\"19\":\"smpp8dcs0Unpack7\",\"20\":\"smpp8dcs0ISO8859\"}","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', 1751438862033, 'public'); +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', 1751438862037, 'public'); +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', 1751438862041, 'public'); -- 更新 SGWC 配置 20241219 INSERT INTO "ne_config" VALUES (300, 'SGWC', 'sgwcSystem', 'System Config', 'list', '[{"access":"read-write","comment":"IPv4/IPv6/IPv4v6","display":"Local S11 IP Type","filter":"^(IPv4|IPv6|IPv4v6)$","name":"s11IpType","type":"string","value":""},{"access":"read-write","comment":"IPv4 Format","display":"Local S11 IPv4","filter":"","name":"s11Ipv4","type":"string","value":"172.16.5.80"},{"access":"read-write","comment":"IPv6 Format","display":"Local S11 IPv6","filter":"","name":"s11Ipv6","type":"string","value":""},{"access":"read-write","comment":"IPv4/IPv6/IPv4v6","display":"Local S5/S8 IP Type","filter":"^(IPv4|IPv6|IPv4v6)$","name":"s58IpType","type":"string","value":""},{"access":"read-write","comment":"IPv4 Format","display":"Local S5/S8 IPv4","filter":"","name":"s58Ipv4","type":"string","value":"172.16.5.81"},{"access":"read-write","comment":"IPv6 Format","display":"Local S5/S8 IPv6","filter":"","name":"s58Ipv6","type":"string","value":""},{"access":"read-write","comment":"IPv4/IPv6/IPv4v6","display":"Local Sx IP Type","filter":"^(IPv4|IPv6|IPv4v6)$","name":"sxIpType","type":"string","value":""},{"access":"read-write","comment":"IPv4 Format","display":"Local Sx IPv4","filter":"","name":"sxIpv4","type":"string","value":"172.16.5.81"},{"access":"read-write","comment":"IPv6 Format","display":"Local Sx IPv6","filter":"","name":"sxIpv6","type":"string","value":""}]', 1, '', 1734512800790, 'public'); diff --git a/build/database/lite/install/alarm.sql b/build/database/lite/install/alarm.sql index 094631bd..31dd1b40 100644 --- a/build/database/lite/install/alarm.sql +++ b/build/database/lite/install/alarm.sql @@ -15,22 +15,22 @@ CREATE TABLE "alarm" ( "alarm_code" integer(11), "event_time" integer(20), "alarm_type" text(64), - "orig_severity" text(10), - "perceived_severity" text(10), + "orig_severity" text(64), + "perceived_severity" text(64), "object_uid" text(64), "object_name" text(64), "object_type" text(20), "location_info" text(2048), - "alarm_status" text(10), + "alarm_status" text(64), "specific_problem" text(255), "specific_problem_id" text(100), "add_info" text(2048), - "ack_state" integer(11), + "ack_state" text(64), "ack_time" integer(20), - "ack_user" text(16), - "clear_type" integer(11), + "ack_user" text(64), + "clear_type" text(64), "clear_time" integer(20), - "clear_user" text(16), + "clear_user" text(64), "timestamp" integer(20), PRIMARY KEY ("id") ); @@ -44,12 +44,11 @@ ON "alarm" ( "orig_severity" ASC, "event_time" ASC ); -CREATE UNIQUE INDEX "uk_uni_aid_ne_aseq" +CREATE UNIQUE INDEX "uk_uni_ne_aid" ON "alarm" ( "ne_type" ASC, "ne_id" ASC, - "alarm_id" ASC, - "alarm_seq" ASC + "alarm_id" ASC ); -- ---------------------------- diff --git a/build/database/lite/install/alarm_event.sql b/build/database/lite/install/alarm_event.sql index 8a398a66..8145b4ab 100644 --- a/build/database/lite/install/alarm_event.sql +++ b/build/database/lite/install/alarm_event.sql @@ -15,13 +15,13 @@ CREATE TABLE "alarm_event" ( "object_name" text(64), "object_type" text(20), "location_info" text(2048), - "alarm_status" text(10), + "alarm_status" text(64), "specific_problem" text(255), "specific_problem_id" text(100), "add_info" text(2048), - "clear_type" integer(11), + "clear_type" text(64), "clear_time" integer(20), - "clear_user" text(16), + "clear_user" text(64), "timestamp" integer(20), PRIMARY KEY ("id") ); @@ -34,12 +34,11 @@ ON "alarm_event" ( "alarm_status" ASC, "event_time" ASC ); -CREATE UNIQUE INDEX "uk_ti_aid_aseq" +CREATE UNIQUE INDEX "uk_ti_aid" ON "alarm_event" ( "ne_type" ASC, "ne_id" ASC, - "alarm_id" ASC, - "alarm_seq" ASC + "alarm_id" ASC ); -- ---------------------------- diff --git a/build/database/lite/install/alarm_forward_log.sql b/build/database/lite/install/alarm_forward_log.sql index 6235f395..86eafc94 100644 --- a/build/database/lite/install/alarm_forward_log.sql +++ b/build/database/lite/install/alarm_forward_log.sql @@ -10,8 +10,8 @@ CREATE TABLE "alarm_forward_log" ( "alarm_id" text(32), "alarm_code" integer(11), "alarm_title" text(255), - "alarm_status" text(10), - "alarm_type" text(10), + "alarm_status" text(64), + "alarm_type" text(64), "orig_severity" text(10), "event_time" integer(20), "created_at" integer(20), diff --git a/build/database/lite/install/alarm_log.sql b/build/database/lite/install/alarm_log.sql index 0e942b41..9bb727a3 100644 --- a/build/database/lite/install/alarm_log.sql +++ b/build/database/lite/install/alarm_log.sql @@ -10,9 +10,9 @@ CREATE TABLE "alarm_log" ( "alarm_id" text(32), "alarm_code" integer(11), "alarm_title" text(255), - "alarm_status" text(10), - "alarm_type" text(10), - "orig_severity" text(10), + "alarm_status" text(64), + "alarm_type" text(64), + "orig_severity" text(64), "event_time" integer(20), "created_at" integer(20), PRIMARY KEY ("id") diff --git a/build/database/lite/install/cbc_message.sql b/build/database/lite/install/cbc_message.sql new file mode 100755 index 00000000..956983db --- /dev/null +++ b/build/database/lite/install/cbc_message.sql @@ -0,0 +1,25 @@ +-- ---------------------------- +-- Table structure for cbc_message +-- ---------------------------- +DROP TABLE IF EXISTS `cbc_message`; +CREATE TABLE "cbc_message" ( + "id" integer NOT NULL, + "ne_type" text(32), + "ne_id" text(32), + "message_json" text(10240), + "status" text(32), + "detail" text(255), + "created_at" integer, + "updated_at" integer, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table cbc_message +-- ---------------------------- +CREATE INDEX "idx_cbcm_ne_time" +ON "cbc_message" ( + "ne_type" ASC, + "ne_id" ASC, + "created_at" ASC +); diff --git a/build/database/lite/install/kpi_c_title.sql b/build/database/lite/install/kpi_c_title.sql index 19ed5903..f235d713 100644 --- a/build/database/lite/install/kpi_c_title.sql +++ b/build/database/lite/install/kpi_c_title.sql @@ -52,3 +52,5 @@ INSERT INTO "kpi_c_title" VALUES (90, 'IMS', 'IMS.C.01', 'InitReg_Success_Rate', INSERT INTO "kpi_c_title" VALUES (91, 'IMS', 'IMS.C.02', 'MO_Success_Rate', '(''SCSCF.05''/''SCSCF.06'')*100', '%', '', '1', 'admin', 1739362260083); INSERT INTO "kpi_c_title" VALUES (92, 'IMS', 'IMS.C.03', 'MT_Success_Rate', '(''SCSCF.07''/''SCSCF.08'')*100', '%', '', '1', 'admin', 1739362260083); INSERT INTO "kpi_c_title" VALUES (93, 'IMS', 'IMS.C.04', 'Service_Success_Rate', '((''SCSCF.05''+''SCSCF.07'')/(''SCSCF.06''+''SCSCF.08''))*100', '%', '', '1', 'admin', 1739362260083); +INSERT INTO "kpi_c_title" VALUES (94, 'IMS', 'IMS.C.05', 'IDDOutgoing_Success_Rate', '(''IDD.03''/''IDD.01'')*100', '%', '', '1', 'admin', 1739362260083); +INSERT INTO "kpi_c_title" VALUES (95, 'IMS', 'IMS.C.06', 'IDDIncoming_Success_Rate', '(''IDD.06''/''IDD.04'')*100', '%', '', '1', 'admin', 1739362260083); diff --git a/build/database/lite/install/mml_log.sql b/build/database/lite/install/mml_log.sql index 392309ec..8c2a5391 100644 --- a/build/database/lite/install/mml_log.sql +++ b/build/database/lite/install/mml_log.sql @@ -8,9 +8,9 @@ CREATE TABLE "mml_log" ( "ip" text(64), "ne_type" text(32), "ne_id" text(32), - "mml" text(1024), - "result" text(2048), - "log_time" text, + "command" text(512), + "result" text(255), + "log_time" integer, PRIMARY KEY ("id") ); diff --git a/build/database/lite/install/sys_config.sql b/build/database/lite/install/sys_config.sql index 37dd7f6e..6dadb65c 100644 --- a/build/database/lite/install/sys_config.sql +++ b/build/database/lite/install/sys_config.sql @@ -28,7 +28,7 @@ INSERT INTO "sys_config" VALUES (5, 'config.sys.user.lockTime', 'sys.user.lockTi INSERT INTO "sys_config" VALUES (6, 'config.sys.officialUrl', 'sys.officialUrl', '#', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.officialUrlRemark'); INSERT INTO "sys_config" VALUES (7, 'config.sys.helpDoc', 'sys.helpDoc', '/static/helpDoc/{language}_doc.pdf', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.helpDocRemark'); INSERT INTO "sys_config" VALUES (8, 'sys.account.captchaType', 'sys.account.captchaType', 'math', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'sys.account.captchaTypeRemark'); -INSERT INTO "sys_config" VALUES (9, 'config.sys.user.passwordPolicy', 'sys.user.passwordPolicy', '{"minLength":8,"specialChars":2,"uppercase":1,"lowercase":1}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwordPolicyRemark'); +INSERT INTO "sys_config" VALUES (9, 'config.sys.user.passwordPolicy', 'sys.user.passwordPolicy', '{"minLength":6,"specialChars":0,"uppercase":0,"lowercase":0}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwordPolicyRemark'); INSERT INTO "sys_config" VALUES (10, 'config.sys.user.passwdExpire', 'sys.user.passwdExpire', '{"expHours":0,"alertHours":360}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwdExpireRemark'); INSERT INTO "sys_config" VALUES (11, 'config.sys.user.fristPasswdChange', 'sys.user.fristPasswdChange', 'false', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.fristPasswdChangeRemark'); INSERT INTO "sys_config" VALUES (12, 'config.sys.user.passwdNotAllowedHistory', 'sys.user.passwdNotAllowedHistory', '0', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwdNotAllowedHistoryRemark'); diff --git a/build/database/lite/install/sys_dict_data.sql b/build/database/lite/install/sys_dict_data.sql index 9e7049ca..c879e3eb 100644 --- a/build/database/lite/install/sys_dict_data.sql +++ b/build/database/lite/install/sys_dict_data.sql @@ -53,28 +53,28 @@ INSERT INTO "sys_dict_data" VALUES (27, 'trace_type', 'dictData.trace.user', '3' INSERT INTO "sys_dict_data" VALUES (28, 'sys_job_save_log', 'dictData.jobSaveLog.no', '0', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (29, 'sys_job_save_log', 'dictData.jobSaveLog.yes', '1', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (30, 'ne_host_type', 'dictData.ne_host_type.redis', 'redis', 2, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (31, 'alarm_status', 'dictData.alarmStatus.history', '0', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (32, 'alarm_status', 'dictData.alarmStatus.active', '1', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (31, 'alarm_status', 'dictData.alarmStatus.history', 'Clear', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (32, 'alarm_status', 'dictData.alarmStatus.active', 'Active', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (33, 'sys_role_datascope', 'dictData.datascope.all', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (34, 'sys_role_datascope', 'dictData.datascope.custom', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (35, 'sys_role_datascope', 'dictData.datascope.dept', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (36, 'sys_role_datascope', 'dictData.datascope.deptAndChid', '4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (37, 'sys_role_datascope', 'dictData.datascope.self', '5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (38, 'active_alarm_type', 'dictData.active_alarm_type.communication', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (39, 'active_alarm_type', 'dictData.active_alarm_type.equipment', '2', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (40, 'active_alarm_type', 'dictData.active_alarm_type.processing', '3', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (41, 'active_alarm_type', 'dictData.active_alarm_type.environmental', '4', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (42, 'active_alarm_type', 'dictData.active_alarm_type.qualityOfService', '5', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (43, 'active_clear_type', 'dictData.active_clear_type.notCleared', '0', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (44, 'active_clear_type', 'dictData.active_clear_type.auto', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (45, 'active_clear_type', 'dictData.active_clear_type.hand', '2', 2, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (46, 'active_ack_state', 'dictData.active_ack_state.unconfirmed', '0', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (47, 'active_ack_state', 'dictData.active_ack_state.confirmed', '1', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (48, 'active_alarm_severity', 'dictData.active_alarm_severity.critical', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (49, 'active_alarm_severity', 'dictData.active_alarm_severity.major', '2', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (50, 'active_alarm_severity', 'dictData.active_alarm_severity.minor', '3', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (51, 'active_alarm_severity', 'dictData.active_alarm_severity.warning', '4', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (52, 'active_alarm_severity', 'dictData.active_alarm_severity.event', '5', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (38, 'active_alarm_type', 'dictData.active_alarm_type.communication', 'CommunicationAlarm', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (39, 'active_alarm_type', 'dictData.active_alarm_type.equipment', 'EquipmentAlarm', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (40, 'active_alarm_type', 'dictData.active_alarm_type.processing', 'ProcessingFailure', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (41, 'active_alarm_type', 'dictData.active_alarm_type.environmental', 'EnvironmentalAlarm', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (42, 'active_alarm_type', 'dictData.active_alarm_type.qualityOfService', 'QualityOfServiceAlarm', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (43, 'active_clear_type', 'dictData.active_clear_type.notCleared', 'NotClear', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (44, 'active_clear_type', 'dictData.active_clear_type.auto', 'AutoClear', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (45, 'active_clear_type', 'dictData.active_clear_type.hand', 'ManualClear', 2, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (46, 'active_ack_state', 'dictData.active_ack_state.unconfirmed', 'NotAck', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (47, 'active_ack_state', 'dictData.active_ack_state.confirmed', 'Ack', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (48, 'active_alarm_severity', 'dictData.active_alarm_severity.critical', 'Critical', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (49, 'active_alarm_severity', 'dictData.active_alarm_severity.major', 'Major', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (50, 'active_alarm_severity', 'dictData.active_alarm_severity.minor', 'Minor', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (51, 'active_alarm_severity', 'dictData.active_alarm_severity.warning', 'Warning', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (52, 'active_alarm_severity', 'dictData.active_alarm_severity.event', 'Event', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (53, 'index_status', 'dictType.index_status.normal', 'normal', 1, '#91cc75', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (54, 'index_status', 'dictType.index_status.abnormal', 'abnormal', 2, '#ee6666', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (55, 'cdr_sip_code', 'dictData.cdr_sip_code.200', '200', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); @@ -91,9 +91,9 @@ INSERT INTO "sys_dict_data" VALUES (65, 'ue_auth_code', 'dictData.ue_auth_code.0 INSERT INTO "sys_dict_data" VALUES (66, 'ue_auth_code', 'dictData.ue_auth_code.005', '005', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (67, 'ue_auth_code', 'dictData.ue_auth_code.006', '006', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (68, 'ue_auth_code', 'dictData.ue_auth_code.007', '007', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (69, 'ue_event_type', 'dictData.ue_event_type.auth', 'auth-result', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (70, 'ue_event_type', 'dictData.ue_event_type.detach', 'detach', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO "sys_dict_data" VALUES (71, 'ue_event_type', 'dictData.ue_event_type.state', 'cm-state', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (69, 'ue_event_type', 'dictData.ue_event_type.auth', 'Auth', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (70, 'ue_event_type', 'dictData.ue_event_type.detach', 'Detach', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (71, 'ue_event_type', 'dictData.ue_event_type.state', 'CM', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (72, 'ue_event_cm_state', 'dictData.ue_event_cm_state.connected', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (73, 'ue_event_cm_state', 'dictData.ue_event_cm_state.idle', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (74, 'ue_event_cm_state', 'dictData.ue_event_cm_state.inactive', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); @@ -192,4 +192,8 @@ INSERT INTO "sys_dict_data" VALUES (166, 'cdr_sip_code_cause', 'dictData.cdr_sip INSERT INTO "sys_dict_data" VALUES (167, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (168, 'trace_interfaces', 'dictData.trace_interfaces.14', 'N14', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (169, 'trace_interfaces', 'dictData.trace_interfaces.5', 'N5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (170, 'sys_user_type', 'dictData.sys_user_type.system', 'System', 1, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); diff --git a/build/database/lite/install/sys_dict_type.sql b/build/database/lite/install/sys_dict_type.sql index 30bb5f99..39b564de 100644 --- a/build/database/lite/install/sys_dict_type.sql +++ b/build/database/lite/install/sys_dict_type.sql @@ -27,6 +27,7 @@ INSERT INTO "sys_dict_type" VALUES (5, 'dictType.sys_job_group', 'sys_job_group' INSERT INTO "sys_dict_type" VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_yes_no_remark'); INSERT INTO "sys_dict_type" VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_oper_type_remark'); INSERT INTO "sys_dict_type" VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_common_status_remark'); +INSERT INTO "sys_dict_type" VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_type" VALUES (50, 'dictType.trace_type', 'trace_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.trace_type_remark'); INSERT INTO "sys_dict_type" VALUES (51, 'dictType.alarm_status', 'alarm_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.alarm_status_remark'); INSERT INTO "sys_dict_type" VALUES (52, 'dictType.ne_version_status', 'ne_version_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.ne_version_status_remark'); diff --git a/build/database/lite/install/sys_i18n.sql b/build/database/lite/install/sys_i18n.sql index 8d0e5921..6d99089e 100644 --- a/build/database/lite/install/sys_i18n.sql +++ b/build/database/lite/install/sys_i18n.sql @@ -611,7 +611,7 @@ INSERT INTO "sys_i18n" VALUES (541, 'dictData.cdr_sip_code.404', '404 找不到' INSERT INTO "sys_i18n" VALUES (542, 'dictData.cdr_sip_code.487', '487 请求已终止', '487 Request Terminated'); INSERT INTO "sys_i18n" VALUES (543, 'dictData.cdr_sip_code.503', '503 服务不可用', '503 Service Unavailable'); INSERT INTO "sys_i18n" VALUES (544, 'dictData.cdr_sip_code.504', '504 服务器超时', '504 Server Timeout'); -INSERT INTO "sys_i18n" VALUES (545, 'dictData.cdr_sip_code.603', '603 下降', '603 Decline'); +INSERT INTO "sys_i18n" VALUES (545, 'dictData.cdr_sip_code.603', '603 拒绝', '603 Decline'); INSERT INTO "sys_i18n" VALUES (546, 'dictData.cdr_sip_code.606', '606 不可接受', '606 Not Acceptable'); INSERT INTO "sys_i18n" VALUES (547, 'cache.name.token', '用户令牌', 'User Token'); INSERT INTO "sys_i18n" VALUES (548, 'cache.name.sys_config', '参数管理', 'Parameters Management'); @@ -833,13 +833,13 @@ INSERT INTO "sys_i18n" VALUES (729, 'dictData.cdr_sip_code_cause.200', '正常 INSERT INTO "sys_i18n" VALUES (730, 'dictData.cdr_sip_code_cause.202', '申请已被接受处理,但尚未完成 ', 'The request has been accepted for processing, but it hasn it completed yet'); INSERT INTO "sys_i18n" VALUES (731, 'dictData.cdr_sip_code_cause.302', '因其他原因呼叫失败', 'Call failure for other reason'); INSERT INTO "sys_i18n" VALUES (732, 'dictData.cdr_sip_code_cause.402', '因其他原因呼叫失败', 'Call failure for other reason'); -INSERT INTO "sys_i18n" VALUES (733, 'dictData.cdr_sip_code_cause.403', '拒绝 MO 用户', 'MO User Rejected'); -INSERT INTO "sys_i18n" VALUES (734, 'dictData.cdr_sip_code_cause.404', 'MT 用户离线', 'MT User Offline'); +INSERT INTO "sys_i18n" VALUES (733, 'dictData.cdr_sip_code_cause.403', '拒接主叫用户', 'MO User Rejected'); +INSERT INTO "sys_i18n" VALUES (734, 'dictData.cdr_sip_code_cause.404', '被叫用户离线', 'MT User Offline'); INSERT INTO "sys_i18n" VALUES (735, 'dictData.cdr_sip_code_cause.480', '因其他原因呼叫失败', 'Call failure for other reason'); INSERT INTO "sys_i18n" VALUES (736, 'dictData.cdr_sip_code_cause.481', '电话无法拨出', 'Call cannot be dialed'); INSERT INTO "sys_i18n" VALUES (737, 'dictData.cdr_sip_code_cause.482', '闪断', 'Flashback'); -INSERT INTO "sys_i18n" VALUES (738, 'dictData.cdr_sip_code_cause.486', 'MT 用户忙', 'MT User Busy'); -INSERT INTO "sys_i18n" VALUES (739, 'dictData.cdr_sip_code_cause.487', 'MO 用户断线', 'MO User Disconnected'); +INSERT INTO "sys_i18n" VALUES (738, 'dictData.cdr_sip_code_cause.486', '被叫用户忙', 'MT User Busy'); +INSERT INTO "sys_i18n" VALUES (739, 'dictData.cdr_sip_code_cause.487', '主叫挂断', 'MO User Disconnected'); INSERT INTO "sys_i18n" VALUES (740, 'dictData.cdr_sip_code_cause.408', '服务器等待响应的时间过长', 'The server waits too long for a response'); INSERT INTO "sys_i18n" VALUES (741, 'dictData.cdr_sip_code_cause.488', '媒体详细信息与服务器支持的内容不匹配', 'Media details didn’t match what the server supports'); INSERT INTO "sys_i18n" VALUES (742, 'dictData.cdr_sip_code_cause.489', '因其他原因呼叫失败', 'Call failure for other reason'); @@ -847,7 +847,7 @@ INSERT INTO "sys_i18n" VALUES (743, 'dictData.cdr_sip_code_cause.500', '服务 INSERT INTO "sys_i18n" VALUES (744, 'dictData.cdr_sip_code_cause.503', '服务器超载或因维护而停机,无法处理呼叫', 'The server is overloaded or down for maintenance and can it process the call'); INSERT INTO "sys_i18n" VALUES (745, 'dictData.cdr_sip_code_cause.504', '服务器尝试以您的名义与另一台服务器通信,但未及时收到回复,并超时了', 'The server tried to talk to another server on your behalf, didn’t get a reply in time, and timed out'); INSERT INTO "sys_i18n" VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其他原因呼叫失败', 'Call failure for other reason'); -INSERT INTO "sys_i18n" VALUES (747, 'dictData.cdr_sip_code_cause.603', 'MT 明确拒绝通话', 'MT explicitly rejected the call'); +INSERT INTO "sys_i18n" VALUES (747, 'dictData.cdr_sip_code_cause.603', '被叫拒接', 'MT explicitly rejected the call'); INSERT INTO "sys_i18n" VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the user’s device, but some parts of the session setup weren it acceptable'); INSERT INTO "sys_i18n" VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause'); INSERT INTO "sys_i18n" VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data'); @@ -930,3 +930,33 @@ AddInfo: Additional information on alarms dayLt: Days less than, default 30 days'); INSERT INTO "sys_i18n" VALUES (756, 'dictData.trace_interfaces.14', 'N14', 'N14'); INSERT INTO "sys_i18n" VALUES (757, 'dictData.trace_interfaces.5', 'N5', 'N5'); +INSERT INTO "sys_i18n" VALUES (758, "alarm.export.alarmCode", "告警编码", "Alarm Code"); +INSERT INTO "sys_i18n" VALUES (759, "config.sys.user.fristPasswdChangeRemark", "关闭改为false 开启改为true, 建议同时设置密码有效期", "Off to false On to true, it is recommended to set the password expiration date at the same time."); +INSERT INTO "sys_i18n" VALUES (760, "menu.perf.kpiIMSOverview", "语音数据概览", "Voice Data Overview"); +INSERT INTO "sys_i18n" VALUES (761, "dictType.sys_user_type", "用户类型", "User Type"); +INSERT INTO "sys_i18n" VALUES (762, "dictData.sys_user_type.system", "系统", "System"); +INSERT INTO "sys_i18n" VALUES (763, "dictData.sys_user_type.ldap", "LDAP", "LDAP"); +INSERT INTO "sys_i18n" VALUES (764, "dictData.sys_user_type.smtp", "SMTP", "SMTP"); +INSERT INTO "sys_i18n" VALUES (765, "dictData.sys_user_type.oauth2", "OAuth2", "OAuth2"); +INSERT INTO "sys_i18n" VALUES (766, "user.export.userType", "用户类型", "User Type"); +INSERT INTO "sys_i18n" VALUES (767, "menu.system.loginSource", "第三方登录认证", "Third Party Login Source"); +INSERT INTO "sys_i18n" VALUES (768, "log.operate.title.sysLoginSource", "认证源", "Login Source"); + +INSERT INTO "sys_i18n" VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); +INSERT INTO "sys_i18n" VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); +INSERT INTO "sys_i18n" VALUES (2002, 'menu.psap.agent.callback', '回拨管理', 'Callback Management'); +INSERT INTO "sys_i18n" VALUES (2003, 'callback.status.NEW', '新建', 'New'); +INSERT INTO "sys_i18n" VALUES (2004, 'callback.status.IN_PROGRESS', '处理中', 'In Progress'); +INSERT INTO "sys_i18n" VALUES (2005, 'callback.status.NO_ANSWER_1', '未应答1', 'No Answer 1'); +INSERT INTO "sys_i18n" VALUES (2006, 'callback.status.NO_ANSWER_2', '未应答2', 'No Answer 2'); +INSERT INTO "sys_i18n" VALUES (2007, 'callback.status.TIMEOUT', '超时', 'Timeout'); +INSERT INTO "sys_i18n" VALUES (2008, 'callback.status.PENDING', '挂起', 'Pending'); +INSERT INTO "sys_i18n" VALUES (2009, 'callback.status.CLOSED', '关闭', 'Closed'); +INSERT INTO "sys_i18n" VALUES (2010, 'job.export.cdr.mf', '定期导出MF话单', 'Periodic Export of MF Call Records'); +INSERT INTO "sys_i18n" VALUES (2011, 'job.psap.ticket.monitor', '回拨工单监控', 'Callback Ticket Monitoring'); +INSERT INTO "sys_i18n" VALUES (2012, 'menu.omc.cdr', '话单', 'Call Records'); +INSERT INTO "sys_i18n" VALUES (2013, 'menu.omc.cdr.mf', '紧急呼叫话单', 'Emergency Call Records'); +INSERT INTO "sys_i18n" VALUES (2014, 'menu.omc.cdr.crbt', '彩铃话单', 'Color Ring Back Tone Records'); +INSERT INTO "sys_i18n" VALUES (2015, 'menu.omc.cdr.mms', '彩信话单', 'Multimedia Message Service Records'); +INSERT INTO "sys_i18n" VALUES (2016, 'menu.ue.cbc.cbe', '预警广播', 'Early Warning Broadcast'); +INSERT INTO "sys_i18n" VALUES (2017, 'log.operate.title.cbcMessage', '预警广播', 'Early Warning Broadcast'); diff --git a/build/database/lite/install/sys_job.sql b/build/database/lite/install/sys_job.sql index 1c9a85b4..0e16f7b4 100644 --- a/build/database/lite/install/sys_job.sql +++ b/build/database/lite/install/sys_job.sql @@ -41,9 +41,9 @@ INSERT INTO "sys_job" VALUES (10, 'job.delete_ne_config_backup', 'SYSTEM', 'dele INSERT INTO "sys_job" VALUES (11, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{"storeDays":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark'); INSERT INTO "sys_job" VALUES (12, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{"storeDays":7,"neList":["IMS","AMF","UDM","UPF","MME","SMSC","SMF","MME"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark'); -INSERT INTO "sys_job" VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{"alarmTitle":"NE State Check Alarm","alarmType":"2","origSeverity":"2","specificProblem":"alarm cause: the system state of target NE has not been received","specificProblemId":"AC10000","addInfo":""}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark'); -INSERT INTO "sys_job" VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{"alarmTitle":"NE State Check Alarm CPU/Menory/Disk","alarmType":"2","origSeverity":"2","specificProblem":"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold","specificProblemId":"AC10100","addInfo":"","cpuUseGt":70,"memUseGt":70,"diskUseGt":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark'); -INSERT INTO "sys_job" VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{"alarmTitle":"NE State Check Alarm License","alarmType":"2","origSeverity":"2","specificProblem":"Alarm Cause: License received from target NE is about to expire","specificProblemId":"AC10200","addInfo":"","dayLt":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark'); +INSERT INTO "sys_job" VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{"alarmTitle":"NE State Check Alarm","alarmType":"EquipmentAlarm","origSeverity":"Major","specificProblem":"alarm cause: the system state of target NE has not been received","specificProblemId":"AC10000","addInfo":""}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark'); +INSERT INTO "sys_job" VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{"alarmTitle":"NE State Check Alarm CPU/Menory/Disk","alarmType":"EquipmentAlarm","origSeverity":"Major","specificProblem":"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold","specificProblemId":"AC10100","addInfo":"","cpuUseGt":70,"memUseGt":70,"diskUseGt":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark'); +INSERT INTO "sys_job" VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{"alarmTitle":"NE State Check Alarm License","alarmType":"EquipmentAlarm","origSeverity":"Major","specificProblem":"Alarm Cause: License received from target NE is about to expire","specificProblemId":"AC10200","addInfo":"","dayLt":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark'); INSERT INTO "sys_job" VALUES (30, 'job.backup_remove_file', 'SYSTEM', 'backup_remove_file', '[{"backupPath":"/udm_data/auth","storeDays":30},{"backupPath":"/udm_data/sub","storeDays":30},{"backupPath":"/udm_data/voip","storeDays":30},{"backupPath":"/udm_data/volte","storeDays":30},{"backupPath":"/cdr/ims_cdr_event","storeDays":30},{"backupPath":"/cdr/smsc_cdr_event","storeDays":30},{"backupPath":"/cdr/smf_cdr_event","storeDays":30},{"backupPath":"/cdr/sgwc_cdr_event","storeDays":30},{"backupPath":"/log/sys_log_operate","storeDays":30,"storeNum":7},{"backupPath":"/log/sys_log_login","storeDays":30,"storeNum":7}]', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_remove_file_remark'); INSERT INTO "sys_job" VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{"dataType":["auth","sub","voip","volte"],"fileType":"txt"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark'); diff --git a/build/database/lite/install/sys_login_source.sql b/build/database/lite/install/sys_login_source.sql new file mode 100644 index 00000000..fd9c6e99 --- /dev/null +++ b/build/database/lite/install/sys_login_source.sql @@ -0,0 +1,33 @@ +-- ---------------------------- +-- Table structure for sys_login_source +-- ---------------------------- +DROP TABLE IF EXISTS "sys_login_source"; +CREATE TABLE "sys_login_source" ( + "id" integer NOT NULL, + "uid" text(32), + "type" text(32), + "name" text(64), + "icon" text(255), + "active_flag" text(1), + "sync_flag" text(1), + "config" text, + "create_by" text(64), + "create_time" integer, + "update_by" text(64), + "update_time" integer, + "remark" text(500), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table sys_login_source +-- ---------------------------- +CREATE INDEX "idx_ls_type_name" +ON "sys_login_source" ( + "type" ASC, + "name" ASC +); + +-- ---------------------------- +-- Records of sys_login_source +-- ---------------------------- diff --git a/build/database/lite/install/sys_menu.sql b/build/database/lite/install/sys_menu.sql index 891ba0bb..2dd693ea 100644 --- a/build/database/lite/install/sys_menu.sql +++ b/build/database/lite/install/sys_menu.sql @@ -47,6 +47,7 @@ INSERT INTO "sys_menu" VALUES (105, 'menu.security.post', 2113, 6, 'post', 'syst INSERT INTO "sys_menu" VALUES (106, 'menu.system.dictType', 1, 30, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.dictTypeRemark'); INSERT INTO "sys_menu" VALUES (107, 'menu.system.dictData', 1, 31, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.dictDataRemark'); INSERT INTO "sys_menu" VALUES (108, 'menu.system.paramSet', 1, 59, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.paramSetRemark'); +INSERT INTO "sys_menu" VALUES (109, 'menu.system.loginSource', 2113, 12, 'login-source', 'system/login-source/index', '1', '1', 'M', '1', '1', 'system:loginSource:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (111, 'menu.system.systemLog', 1, 11, 'log', '', '1', '1', 'D', '0', '0', '', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemLogRemark'); INSERT INTO "sys_menu" VALUES (112, 'menu.system.systemInfo', 1, 5, 'system-info', 'monitor/system/info', '1', '1', 'M', '1', '1', 'monitor:system:info', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemInfoRemark'); INSERT INTO "sys_menu" VALUES (113, 'menu.system.cacheInfo', 1, 8, 'cache-info', 'monitor/cache/info', '1', '1', 'M', '1', '1', 'monitor:cache:info', 'icon-gongnengjieshao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.cacheInfoRemark'); @@ -109,6 +110,10 @@ INSERT INTO "sys_menu" VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', ' INSERT INTO "sys_menu" VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (1057, 'menu.common.query', 109, 1, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (1058, 'menu.common.add', 109, 2, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (1059, 'menu.common.edit', 109, 3, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (1060, 'menu.common.delete', 109, 4, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); @@ -146,8 +151,8 @@ INSERT INTO "sys_menu" VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 12, 'kpiKey INSERT INTO "sys_menu" VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', '', '1', '0', 'D', '1', '1', '', 'icon-zhizuoliucheng', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.udmRemark'); -INSERT INTO "sys_menu" VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '1', '1', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.setRemark'); -INSERT INTO "sys_menu" VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.omcRemark'); +INSERT INTO "sys_menu" VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '0', '0', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.setRemark'); +INSERT INTO "sys_menu" VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '0', '0', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.omcRemark'); INSERT INTO "sys_menu" VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'sgwc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2113, 'menu.security', 0, 14, 'security', '', '1', '0', 'D', '1', '1', '', 'icon-suofang', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.securityRemark'); INSERT INTO "sys_menu" VALUES (2114, 'menu.system.systemSet', 1, 60, 'setting', 'system/setting/index', '1', '1', 'M', '1', '1', 'system:setting:index', 'icon-piliang', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemSetRemark'); @@ -155,6 +160,8 @@ INSERT INTO "sys_menu" VALUES (2115, 'menu.system.systemResource', 1, 6, 'monito INSERT INTO "sys_menu" VALUES (2116, 'menu.dashboard.smscCDR.content', 2157, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:smsc:content', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2117, 'menu.common.delete', 2140, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:ne:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2119, 'Alarm Overview', 2129, 6, 'alarm-overview', 'faultManage/alarm-overview/index', '1', '1', 'M', '1', '1', 'faultManage:active-overview:index', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2120, 'DashboardV1', 2131, 8, 'dashboardV1', 'dashboard/overview/index', '1', '0', 'M', '1', '1', 'dashboard:overview:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2121, 'menu.system.user.editRole', 100, 8, '', '', '1', '1', 'B', '1', '1', 'system:user:editRole', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2122, 'menu.system.setting.i18n', 2114, 1, '', '', '1', '1', 'B', '1', '1', 'system:setting:i18n', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.setting.i18nRemark'); INSERT INTO "sys_menu" VALUES (2123, 'menu.log.neFile', 2089, 9, 'neFile', 'ne/neFile/index', '1', '0', 'M', '1', '1', 'ne:neFile:index', 'icon-tubiaohuizhi', '0', 'system', 1728641403588, 'system', 1728641403588, ''); @@ -170,6 +177,7 @@ INSERT INTO "sys_menu" VALUES (2135, 'menu.ne.neHost', 4, 15, 'neHost', 'ne/neHo INSERT INTO "sys_menu" VALUES (2136, 'menu.ne.neHostCommand', 4, 18, 'neHostCommand', 'ne/neHostCommand/index', '1', '0', 'M', '1', '0', 'ne:neHostCommand:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2137, 'menu.ne.neInfo', 4, 10, 'neInfo', 'ne/neInfo/index', '1', '0', 'M', '1', '1', 'ne:neInfo:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2138, 'menu.dashboard.amfUE', 2141, 1, 'amfUE', 'dashboard/amfUE/index', '1', '0', 'M', '1', '1', 'amf#ue:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2139, 'menu.perf.kpiIMSOverview', 2099, 14, 'dashboard', 'perfManage/overview/index', '1', '0', 'M', '1', '1', 'ims#perfManage:dashboard:index', 'icon-fuzhichenggong', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2140, 'menu.monitor.cdr', 2089, 10, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2141, 'menu.monitor.event', 2089, 20, 'event', '', '1', '0', 'D', '1', '1', '', 'icon-gengduo', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2142, 'menu.ne.neQuickSetup', 4, 40, 'neQuickSetup', 'ne/neQuickSetup/index', '1', '1', 'M', '1', '1', 'ne:neQuickSetup:list', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, ''); @@ -200,3 +208,5 @@ INSERT INTO "sys_menu" VALUES (2166, 'menu.dashboard.overview.smfUeNum', 2132, 4 INSERT INTO "sys_menu" VALUES (2167, 'menu.dashboard.overview.imsUeNum', 2132, 2, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:imsUeNum', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2168, 'menu.dashboard.overview.gnbBase', 2132, 6, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:gnbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2169, 'menu.dashboard.overview.enbBase', 2132, 8, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:enbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); + +INSERT INTO `sys_menu` VALUES (20000, 'menu.ue.cbc.cbe', 5, 20, 'cbe', 'cbc/cbe/index', '1', '0', 'M', '1', '1', 'cbc#dashboard:cdr:index', 'icon-tubiaoku', '0', 'system', 1711352709786, 'system', 1747796007372, ''); diff --git a/build/database/lite/install/sys_role_menu.sql b/build/database/lite/install/sys_role_menu.sql index a5786837..1828c854 100644 --- a/build/database/lite/install/sys_role_menu.sql +++ b/build/database/lite/install/sys_role_menu.sql @@ -3,8 +3,8 @@ -- ---------------------------- DROP TABLE IF EXISTS "sys_role_menu"; CREATE TABLE "sys_role_menu" ( - "role_id" integer(20) NOT NULL, - "menu_id" integer(20) NOT NULL, + "role_id" integer NOT NULL, + "menu_id" integer NOT NULL, PRIMARY KEY ("role_id", "menu_id") ); @@ -22,6 +22,7 @@ INSERT INTO "sys_role_menu" VALUES (2, 101); INSERT INTO "sys_role_menu" VALUES (2, 102); INSERT INTO "sys_role_menu" VALUES (2, 103); INSERT INTO "sys_role_menu" VALUES (2, 108); +INSERT INTO "sys_role_menu" VALUES (2, 109); INSERT INTO "sys_role_menu" VALUES (2, 111); INSERT INTO "sys_role_menu" VALUES (2, 116); INSERT INTO "sys_role_menu" VALUES (2, 117); @@ -41,9 +42,23 @@ INSERT INTO "sys_role_menu" VALUES (2, 1012); INSERT INTO "sys_role_menu" VALUES (2, 1014); INSERT INTO "sys_role_menu" VALUES (2, 1030); INSERT INTO "sys_role_menu" VALUES (2, 1032); +INSERT INTO "sys_role_menu" VALUES (2, 1034); +INSERT INTO "sys_role_menu" VALUES (2, 1039); +INSERT INTO "sys_role_menu" VALUES (2, 1041); +INSERT INTO "sys_role_menu" VALUES (2, 1042); +INSERT INTO "sys_role_menu" VALUES (2, 1044); +INSERT INTO "sys_role_menu" VALUES (2, 1045); +INSERT INTO "sys_role_menu" VALUES (2, 1048); +INSERT INTO "sys_role_menu" VALUES (2, 1049); +INSERT INTO "sys_role_menu" VALUES (2, 1050); INSERT INTO "sys_role_menu" VALUES (2, 1051); INSERT INTO "sys_role_menu" VALUES (2, 1053); INSERT INTO "sys_role_menu" VALUES (2, 1055); +INSERT INTO "sys_role_menu" VALUES (2, 1056); +INSERT INTO "sys_role_menu" VALUES (2, 1057); +INSERT INTO "sys_role_menu" VALUES (2, 1058); +INSERT INTO "sys_role_menu" VALUES (2, 1059); +INSERT INTO "sys_role_menu" VALUES (2, 1060); INSERT INTO "sys_role_menu" VALUES (2, 2000); INSERT INTO "sys_role_menu" VALUES (2, 2001); INSERT INTO "sys_role_menu" VALUES (2, 2002); @@ -85,6 +100,7 @@ INSERT INTO "sys_role_menu" VALUES (2, 2132); INSERT INTO "sys_role_menu" VALUES (2, 2133); INSERT INTO "sys_role_menu" VALUES (2, 2137); INSERT INTO "sys_role_menu" VALUES (2, 2138); +INSERT INTO "sys_role_menu" VALUES (2, 2139); INSERT INTO "sys_role_menu" VALUES (2, 2140); INSERT INTO "sys_role_menu" VALUES (2, 2141); INSERT INTO "sys_role_menu" VALUES (2, 2143); @@ -109,6 +125,8 @@ INSERT INTO "sys_role_menu" VALUES (2, 2165); INSERT INTO "sys_role_menu" VALUES (2, 2166); INSERT INTO "sys_role_menu" VALUES (2, 2167); INSERT INTO "sys_role_menu" VALUES (2, 2168); +INSERT INTO "sys_role_menu" VALUES (2, 2169); +INSERT INTO "sys_role_menu" VALUES (2, 20000); INSERT INTO "sys_role_menu" VALUES (3, 1); INSERT INTO "sys_role_menu" VALUES (3, 4); @@ -116,6 +134,15 @@ INSERT INTO "sys_role_menu" VALUES (3, 5); INSERT INTO "sys_role_menu" VALUES (3, 60); INSERT INTO "sys_role_menu" VALUES (3, 65); INSERT INTO "sys_role_menu" VALUES (3, 66); +INSERT INTO "sys_role_menu" VALUES (3, 108); +INSERT INTO "sys_role_menu" VALUES (3, 112); +INSERT INTO "sys_role_menu" VALUES (3, 500); +INSERT INTO "sys_role_menu" VALUES (3, 501); +INSERT INTO "sys_role_menu" VALUES (3, 1030); +INSERT INTO "sys_role_menu" VALUES (3, 1032); +INSERT INTO "sys_role_menu" VALUES (3, 1034); +INSERT INTO "sys_role_menu" VALUES (3, 1039); +INSERT INTO "sys_role_menu" VALUES (3, 1042); INSERT INTO "sys_role_menu" VALUES (3, 2000); INSERT INTO "sys_role_menu" VALUES (3, 2001); INSERT INTO "sys_role_menu" VALUES (3, 2002); @@ -128,6 +155,7 @@ INSERT INTO "sys_role_menu" VALUES (3, 2009); INSERT INTO "sys_role_menu" VALUES (3, 2010); INSERT INTO "sys_role_menu" VALUES (3, 2011); INSERT INTO "sys_role_menu" VALUES (3, 2083); +INSERT INTO "sys_role_menu" VALUES (3, 2084); INSERT INTO "sys_role_menu" VALUES (3, 2086); INSERT INTO "sys_role_menu" VALUES (3, 2087); INSERT INTO "sys_role_menu" VALUES (3, 2088); @@ -137,8 +165,11 @@ INSERT INTO "sys_role_menu" VALUES (3, 2094); INSERT INTO "sys_role_menu" VALUES (3, 2097); INSERT INTO "sys_role_menu" VALUES (3, 2107); INSERT INTO "sys_role_menu" VALUES (3, 2109); +INSERT INTO "sys_role_menu" VALUES (3, 2112); INSERT INTO "sys_role_menu" VALUES (3, 2114); INSERT INTO "sys_role_menu" VALUES (3, 2116); +INSERT INTO "sys_role_menu" VALUES (3, 2118); +INSERT INTO "sys_role_menu" VALUES (3, 2122); INSERT INTO "sys_role_menu" VALUES (3, 2123); INSERT INTO "sys_role_menu" VALUES (3, 2126); INSERT INTO "sys_role_menu" VALUES (3, 2128); @@ -156,20 +187,40 @@ INSERT INTO "sys_role_menu" VALUES (3, 2147); INSERT INTO "sys_role_menu" VALUES (3, 2148); INSERT INTO "sys_role_menu" VALUES (3, 2151); INSERT INTO "sys_role_menu" VALUES (3, 2152); +INSERT INTO "sys_role_menu" VALUES (3, 2153); INSERT INTO "sys_role_menu" VALUES (3, 2157); INSERT INTO "sys_role_menu" VALUES (3, 2158); +INSERT INTO "sys_role_menu" VALUES (3, 2162); +INSERT INTO "sys_role_menu" VALUES (3, 2163); INSERT INTO "sys_role_menu" VALUES (3, 2165); INSERT INTO "sys_role_menu" VALUES (3, 2166); INSERT INTO "sys_role_menu" VALUES (3, 2167); INSERT INTO "sys_role_menu" VALUES (3, 2168); +INSERT INTO "sys_role_menu" VALUES (3, 2169); +INSERT INTO "sys_role_menu" VALUES (3, 20000); INSERT INTO "sys_role_menu" VALUES (4, 4); +INSERT INTO "sys_role_menu" VALUES (4, 112); +INSERT INTO "sys_role_menu" VALUES (4, 115); +INSERT INTO "sys_role_menu" VALUES (4, 500); +INSERT INTO "sys_role_menu" VALUES (4, 501); +INSERT INTO "sys_role_menu" VALUES (4, 1039); +INSERT INTO "sys_role_menu" VALUES (4, 1041); +INSERT INTO "sys_role_menu" VALUES (4, 1042); +INSERT INTO "sys_role_menu" VALUES (4, 1044); +INSERT INTO "sys_role_menu" VALUES (4, 1048); INSERT INTO "sys_role_menu" VALUES (4, 2087); INSERT INTO "sys_role_menu" VALUES (4, 2088); INSERT INTO "sys_role_menu" VALUES (4, 2089); +INSERT INTO "sys_role_menu" VALUES (4, 2091); +INSERT INTO "sys_role_menu" VALUES (4, 2092); +INSERT INTO "sys_role_menu" VALUES (4, 2094); INSERT INTO "sys_role_menu" VALUES (4, 2097); +INSERT INTO "sys_role_menu" VALUES (4, 2112); +INSERT INTO "sys_role_menu" VALUES (4, 2113); +INSERT INTO "sys_role_menu" VALUES (4, 2115); INSERT INTO "sys_role_menu" VALUES (4, 2116); -INSERT INTO "sys_role_menu" VALUES (4, 2118); +INSERT INTO "sys_role_menu" VALUES (4, 2123); INSERT INTO "sys_role_menu" VALUES (4, 2126); INSERT INTO "sys_role_menu" VALUES (4, 2128); INSERT INTO "sys_role_menu" VALUES (4, 2129); @@ -190,6 +241,14 @@ INSERT INTO "sys_role_menu" VALUES (4, 2168); INSERT INTO "sys_role_menu" VALUES (5, 4); INSERT INTO "sys_role_menu" VALUES (5, 2087); +INSERT INTO "sys_role_menu" VALUES (5, 2115); INSERT INTO "sys_role_menu" VALUES (5, 2126); +INSERT INTO "sys_role_menu" VALUES (5, 2128); INSERT INTO "sys_role_menu" VALUES (5, 2130); +INSERT INTO "sys_role_menu" VALUES (5, 2131); +INSERT INTO "sys_role_menu" VALUES (5, 2132); INSERT INTO "sys_role_menu" VALUES (5, 2165); +INSERT INTO "sys_role_menu" VALUES (5, 2166); +INSERT INTO "sys_role_menu" VALUES (5, 2167); +INSERT INTO "sys_role_menu" VALUES (5, 2168); +INSERT INTO "sys_role_menu" VALUES (5, 2169); diff --git a/build/database/lite/install/sys_user.sql b/build/database/lite/install/sys_user.sql index ab646349..ee669db1 100644 --- a/build/database/lite/install/sys_user.sql +++ b/build/database/lite/install/sys_user.sql @@ -12,6 +12,8 @@ CREATE TABLE "sys_user" ( "sex" text(1), "avatar" text(255), "password" text(128), + "user_type" text(20), + "user_source" text(32), "status_flag" text(1), "del_flag" text(1), "password_update_time" integer, @@ -29,7 +31,7 @@ CREATE TABLE "sys_user" ( -- ---------------------------- -- Records of sys_user -- ---------------------------- -INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$WVW6if2TNfR3OJmcaD9wX.gEd9TRymr5.Di2izFdDKUuiEGWuAqk6', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$WVW6if2TNfR3OJmcaD9wX.gEd9TRymr5.Di2izFdDKUuiEGWuAqk6', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); diff --git a/build/database/lite/upgrade/upg_alarm.sql b/build/database/lite/upgrade/upg_alarm.sql new file mode 100644 index 00000000..dbb993b7 --- /dev/null +++ b/build/database/lite/upgrade/upg_alarm.sql @@ -0,0 +1,75 @@ +-- ---------------------------- +-- Table structure for alarm +-- ---------------------------- +UPDATE "alarm" SET "alarm_type" = 'CommunicationAlarm' WHERE "alarm_type" = '1'; +UPDATE "alarm" SET "alarm_type" = 'EquipmentAlarm' WHERE "alarm_type" = '2'; +UPDATE "alarm" SET "alarm_type" = 'ProcessingFailure' WHERE "alarm_type" = '3'; +UPDATE "alarm" SET "alarm_type" = 'EnvironmentalAlarm' WHERE "alarm_type" = '4'; +UPDATE "alarm" SET "alarm_type" = 'QualityOfServiceAlarm' WHERE "alarm_type" = '5'; +UPDATE "alarm" SET "orig_severity" = 'Critical', "perceived_severity" = 'Critical' WHERE "orig_severity" = '1'; +UPDATE "alarm" SET "orig_severity" = 'Major', "perceived_severity" = 'Major' WHERE "orig_severity" = '2'; +UPDATE "alarm" SET "orig_severity" = 'Minor', "perceived_severity" = 'Minor' WHERE "orig_severity" = '3'; +UPDATE "alarm" SET "orig_severity" = 'Warning', "perceived_severity" = 'Warning' WHERE "orig_severity" = '4'; +UPDATE "alarm" SET "orig_severity" = 'Event', "perceived_severity" = 'Event' WHERE "orig_severity" = '5'; +UPDATE "alarm" SET "alarm_status" = 'Clear' WHERE "alarm_status" = '0'; +UPDATE "alarm" SET "alarm_status" = 'Active' WHERE "alarm_status" = '1'; +UPDATE "alarm" SET "ack_state" = 'NotAck' WHERE "ack_state" = '0'; +UPDATE "alarm" SET "ack_state" = 'Ack' WHERE "ack_state" = '1'; +UPDATE "alarm" SET "clear_type" = 'NotClear' WHERE "clear_type" = '0'; +UPDATE "alarm" SET "clear_type" = 'AutoClear' WHERE "clear_type" = '1'; +UPDATE "alarm" SET "clear_type" = 'ManualClear' WHERE "clear_type" = '2'; +ALTER TABLE "alarm" RENAME TO "alarm_old"; +CREATE TABLE "alarm" ( + "id" integer NOT NULL, + "ne_type" text(32) NOT NULL, + "ne_id" text(64) NOT NULL, + "ne_name" text(32), + "province" text(32), + "pv_flag" text(10), + "alarm_seq" integer(11), + "alarm_id" text(32) NOT NULL, + "alarm_title" text(255), + "alarm_code" integer(11), + "event_time" integer(20), + "alarm_type" text(64), + "orig_severity" text(64), + "perceived_severity" text(64), + "object_uid" text(64), + "object_name" text(64), + "object_type" text(20), + "location_info" text(2048), + "alarm_status" text(64), + "specific_problem" text(255), + "specific_problem_id" text(100), + "add_info" text(2048), + "ack_state" text(64), + "ack_time" integer(20), + "ack_user" text(64), + "clear_type" text(64), + "clear_time" integer(20), + "clear_user" text(64), + "timestamp" integer(20), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table alarm +-- ---------------------------- +CREATE INDEX IF NOT EXISTS "idx_status_severity_time" +ON "alarm" ( + "alarm_status" ASC, + "orig_severity" ASC, + "event_time" ASC +); +CREATE UNIQUE INDEX IF NOT EXISTS "uk_uni_ne_aid" +ON "alarm" ( + "ne_type" ASC, + "ne_id" ASC, + "alarm_id" ASC +); + +-- ---------------------------- +-- Records of alarm +-- ---------------------------- +INSERT INTO "alarm" ("id", "ne_type", "ne_id", "ne_name", "province", "pv_flag", "alarm_seq", "alarm_id", "alarm_title", "alarm_code", "event_time", "alarm_type", "orig_severity", "perceived_severity", "object_uid", "object_name", "object_type", "location_info", "alarm_status", "specific_problem", "specific_problem_id", "add_info", "ack_state", "ack_time", "ack_user", "clear_type", "clear_time", "clear_user", "timestamp") SELECT "id", "ne_type", "ne_id", "ne_name", "province", "pv_flag", "alarm_seq", "alarm_id", "alarm_title", "alarm_code", "event_time", "alarm_type", "orig_severity", "perceived_severity", "object_uid", "object_name", "object_type", "location_info", "alarm_status", "specific_problem", "specific_problem_id", "add_info", "ack_state", "ack_time", "ack_user", "clear_type", "clear_time", "clear_user", "timestamp" FROM "alarm_old"; +DROP TABLE IF EXISTS "alarm_old"; diff --git a/build/database/lite/upgrade/upg_alarm_event.sql b/build/database/lite/upgrade/upg_alarm_event.sql new file mode 100644 index 00000000..b8e5a583 --- /dev/null +++ b/build/database/lite/upgrade/upg_alarm_event.sql @@ -0,0 +1,53 @@ +-- ---------------------------- +-- Table structure for alarm_event +-- ---------------------------- +UPDATE "alarm_event" SET "alarm_status" = 'Clear' WHERE "alarm_status" = '0'; +UPDATE "alarm_event" SET "alarm_status" = 'Active' WHERE "alarm_status" = '1'; +UPDATE "alarm_event" SET "clear_type" = 'NotClear' WHERE "clear_type" = '0'; +UPDATE "alarm_event" SET "clear_type" = 'AutoClear' WHERE "clear_type" = '1'; +UPDATE "alarm_event" SET "clear_type" = 'ManualClear' WHERE "clear_type" = '2'; +ALTER TABLE "alarm_event" RENAME TO "alarm_event_old"; +CREATE TABLE "alarm_event" ( + "id" integer NOT NULL, + "ne_type" text(32) NOT NULL, + "ne_id" text(64) NOT NULL, + "alarm_seq" integer(11), + "alarm_id" text(32) NOT NULL, + "alarm_title" text(255), + "alarm_code" integer(11), + "event_time" integer(20), + "object_uid" text(64), + "object_name" text(64), + "object_type" text(20), + "location_info" text(2048), + "alarm_status" text(64), + "specific_problem" text(255), + "specific_problem_id" text(100), + "add_info" text(2048), + "clear_type" text(64), + "clear_time" integer(20), + "clear_user" text(64), + "timestamp" integer(20), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table alarm_event +-- ---------------------------- +CREATE INDEX IF NOT EXISTS "idx_astatus_etime" +ON "alarm_event" ( + "alarm_status" ASC, + "event_time" ASC +); +CREATE UNIQUE INDEX IF NOT EXISTS "uk_ti_aid" +ON "alarm_event" ( + "ne_type" ASC, + "ne_id" ASC, + "alarm_id" ASC +); + +-- ---------------------------- +-- Records of alarm_event +-- ---------------------------- +INSERT INTO "alarm_event" ("id", "ne_type", "ne_id", "alarm_seq", "alarm_id", "alarm_title", "alarm_code", "event_time", "object_uid", "object_name", "object_type", "location_info", "alarm_status", "specific_problem", "specific_problem_id", "add_info", "clear_type", "clear_time", "clear_user", "timestamp") SELECT "id", "ne_type", "ne_id", "alarm_seq", "alarm_id", "alarm_title", "alarm_code", "event_time", "object_uid", "object_name", "object_type", "location_info", "alarm_status", "specific_problem", "specific_problem_id", "add_info", "clear_type", "clear_time", "clear_user", "timestamp" FROM "alarm_event_old"; +DROP TABLE IF EXISTS "alarm_event_old"; diff --git a/build/database/lite/upgrade/upg_alarm_forward_log.sql b/build/database/lite/upgrade/upg_alarm_forward_log.sql new file mode 100644 index 00000000..93e5a7e7 --- /dev/null +++ b/build/database/lite/upgrade/upg_alarm_forward_log.sql @@ -0,0 +1,40 @@ +-- ---------------------------- +-- Table structure for alarm_forward_log +-- ---------------------------- +UPDATE "alarm_forward_log" SET "alarm_type" = 'CommunicationAlarm' WHERE "alarm_type" = '1'; +UPDATE "alarm_forward_log" SET "alarm_type" = 'EquipmentAlarm' WHERE "alarm_type" = '2'; +UPDATE "alarm_forward_log" SET "alarm_type" = 'ProcessingFailure' WHERE "alarm_type" = '3'; +UPDATE "alarm_forward_log" SET "alarm_type" = 'EnvironmentalAlarm' WHERE "alarm_type" = '4'; +UPDATE "alarm_forward_log" SET "alarm_type" = 'QualityOfServiceAlarm' WHERE "alarm_type" = '5'; +UPDATE "alarm_forward_log" SET "orig_severity" = 'Critical' WHERE "orig_severity" = '1'; +UPDATE "alarm_forward_log" SET "orig_severity" = 'Major' WHERE "orig_severity" = '2'; +UPDATE "alarm_forward_log" SET "orig_severity" = 'Minor' WHERE "orig_severity" = '3'; +UPDATE "alarm_forward_log" SET "orig_severity" = 'Warning' WHERE "orig_severity" = '4'; +UPDATE "alarm_forward_log" SET "orig_severity" = 'Event' WHERE "orig_severity" = '5'; +UPDATE "alarm_forward_log" SET "alarm_status" = 'Clear' WHERE "alarm_status" = '0'; +UPDATE "alarm_forward_log" SET "alarm_status" = 'Active' WHERE "alarm_status" = '1'; +ALTER TABLE "alarm_forward_log" RENAME TO "alarm_forward_log_old"; +CREATE TABLE "alarm_forward_log" ( + "id" integer NOT NULL, + "ne_type" text(16), + "ne_id" text(64) NOT NULL, + "alarm_seq" integer(11), + "alarm_id" text(32), + "alarm_code" integer(11), + "alarm_title" text(255), + "alarm_status" text(64), + "alarm_type" text(64), + "orig_severity" text(10), + "event_time" integer(20), + "created_at" integer(20), + "type" text(255), + "target" text(255), + "result" text(255), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Records of alarm_forward_log +-- ---------------------------- +INSERT INTO "alarm_forward_log" ("id", "ne_type", "ne_id", "alarm_seq", "alarm_id", "alarm_code", "alarm_title", "alarm_status", "alarm_type", "orig_severity", "event_time", "created_at", "type", "target", "result") SELECT "id", "ne_type", "ne_id", "alarm_seq", "alarm_id", "alarm_code", "alarm_title", "alarm_status", "alarm_type", "orig_severity", "event_time", "created_at", "type", "target", "result" FROM "alarm_forward_log_old"; +DROP TABLE IF EXISTS "alarm_forward_log_old"; diff --git a/build/database/lite/upgrade/upg_alarm_log.sql b/build/database/lite/upgrade/upg_alarm_log.sql new file mode 100644 index 00000000..66b78694 --- /dev/null +++ b/build/database/lite/upgrade/upg_alarm_log.sql @@ -0,0 +1,37 @@ +-- ---------------------------- +-- Table structure for alarm_log +-- ---------------------------- +UPDATE "alarm_log" SET "alarm_type" = 'CommunicationAlarm' WHERE "alarm_type" = '1'; +UPDATE "alarm_log" SET "alarm_type" = 'EquipmentAlarm' WHERE "alarm_type" = '2'; +UPDATE "alarm_log" SET "alarm_type" = 'ProcessingFailure' WHERE "alarm_type" = '3'; +UPDATE "alarm_log" SET "alarm_type" = 'EnvironmentalAlarm' WHERE "alarm_type" = '4'; +UPDATE "alarm_log" SET "alarm_type" = 'QualityOfServiceAlarm' WHERE "alarm_type" = '5'; +UPDATE "alarm_log" SET "orig_severity" = 'Critical' WHERE "orig_severity" = '1'; +UPDATE "alarm_log" SET "orig_severity" = 'Major' WHERE "orig_severity" = '2'; +UPDATE "alarm_log" SET "orig_severity" = 'Minor' WHERE "orig_severity" = '3'; +UPDATE "alarm_log" SET "orig_severity" = 'Warning' WHERE "orig_severity" = '4'; +UPDATE "alarm_log" SET "orig_severity" = 'Event' WHERE "orig_severity" = '5'; +UPDATE "alarm_log" SET "alarm_status" = 'Clear' WHERE "alarm_status" = '0'; +UPDATE "alarm_log" SET "alarm_status" = 'Active' WHERE "alarm_status" = '1'; +ALTER TABLE "alarm_log" RENAME TO "alarm_log_old"; +CREATE TABLE "alarm_log" ( + "id" integer NOT NULL, + "ne_type" text(16), + "ne_id" text(64) NOT NULL, + "alarm_seq" integer(11), + "alarm_id" text(32), + "alarm_code" integer(11), + "alarm_title" text(255), + "alarm_status" text(64), + "alarm_type" text(64), + "orig_severity" text(64), + "event_time" integer(20), + "created_at" integer(20), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Records of alarm_log +-- ---------------------------- +INSERT INTO "alarm_log" ("id", "ne_type", "ne_id", "alarm_seq", "alarm_id", "alarm_code", "alarm_title", "alarm_status", "alarm_type", "orig_severity", "event_time", "created_at") SELECT "id", "ne_type", "ne_id", "alarm_seq", "alarm_id", "alarm_code", "alarm_title", "alarm_status", "alarm_type", "orig_severity", "event_time", "created_at" FROM "alarm_log_old"; +DROP TABLE IF EXISTS "alarm_log_old"; diff --git a/build/database/lite/upgrade/upg_cbc_message.sql b/build/database/lite/upgrade/upg_cbc_message.sql new file mode 100755 index 00000000..b2a1924d --- /dev/null +++ b/build/database/lite/upgrade/upg_cbc_message.sql @@ -0,0 +1,24 @@ +-- ---------------------------- +-- Table structure for cbc_message +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "cbc_message" ( + "id" integer NOT NULL, + "ne_type" text(32), + "ne_id" text(32), + "message_json" text(10240), + "status" text(32), + "detail" text(255), + "created_at" integer, + "updated_at" integer, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table cbc_message +-- ---------------------------- +CREATE INDEX IF NOT EXISTS "idx_cbcm_ne_time" +ON "cbc_message" ( + "ne_type" ASC, + "ne_id" ASC, + "created_at" ASC +); diff --git a/build/database/lite/upgrade/upg_kpi_c_title.sql b/build/database/lite/upgrade/upg_kpi_c_title.sql index 9e683954..912241e8 100644 --- a/build/database/lite/upgrade/upg_kpi_c_title.sql +++ b/build/database/lite/upgrade/upg_kpi_c_title.sql @@ -53,3 +53,5 @@ REPLACE INTO "kpi_c_title" VALUES (90, 'IMS', 'IMS.C.01', 'InitReg_Success_Rate' REPLACE INTO "kpi_c_title" VALUES (91, 'IMS', 'IMS.C.02', 'MO_Success_Rate', '(''SCSCF.05''/''SCSCF.06'')*100', '%', '', '1', 'admin', 1739362260083); REPLACE INTO "kpi_c_title" VALUES (92, 'IMS', 'IMS.C.03', 'MT_Success_Rate', '(''SCSCF.07''/''SCSCF.08'')*100', '%', '', '1', 'admin', 1739362260083); REPLACE INTO "kpi_c_title" VALUES (93, 'IMS', 'IMS.C.04', 'Service_Success_Rate', '((''SCSCF.05''+''SCSCF.07'')/(''SCSCF.06''+''SCSCF.08''))*100', '%', '', '1', 'admin', 1739362260083); +REPLACE INTO "kpi_c_title" VALUES (94, 'IMS', 'IMS.C.05', 'IDDOutgoing_Success_Rate', '(''IDD.03''/''IDD.01'')*100', '%', '', '1', 'admin', 1739362260083); +REPLACE INTO "kpi_c_title" VALUES (95, 'IMS', 'IMS.C.06', 'IDDIncoming_Success_Rate', '(''IDD.06''/''IDD.04'')*100', '%', '', '1', 'admin', 1739362260083); diff --git a/build/database/lite/upgrade/upg_mml_log.sql b/build/database/lite/upgrade/upg_mml_log.sql new file mode 100644 index 00000000..8c2a5391 --- /dev/null +++ b/build/database/lite/upgrade/upg_mml_log.sql @@ -0,0 +1,19 @@ +-- ---------------------------- +-- Table structure for mml_log +-- ---------------------------- +DROP TABLE IF EXISTS "mml_log"; +CREATE TABLE "mml_log" ( + "id" integer NOT NULL, + "user" text(32), + "ip" text(64), + "ne_type" text(32), + "ne_id" text(32), + "command" text(512), + "result" text(255), + "log_time" integer, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Records of mml_log +-- ---------------------------- diff --git a/build/database/lite/upgrade/upg_sys_config.sql b/build/database/lite/upgrade/upg_sys_config.sql new file mode 100644 index 00000000..5c378642 --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_config.sql @@ -0,0 +1,45 @@ +-- ---------------------------- +-- Table structure for sys_config +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_config" ( + "config_id" integer NOT NULL, + "config_name" text(64), + "config_key" text(64), + "config_value" text(500), + "config_type" text(1), + "del_flag" text(1), + "create_by" text(64), + "create_time" integer, + "update_by" text(64), + "update_time" integer, + "remark" text(500), + PRIMARY KEY ("config_id") +); + +-- ---------------------------- +-- Records of sys_config +-- ---------------------------- +REPLACE INTO "sys_config" VALUES (1, 'config.sys.user.initPassword', 'sys.user.initPassword', 'Abcd@1234..', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.initPasswordRemark'); +REPLACE INTO "sys_config" VALUES (2, 'config.sys.account.captchaEnabled', 'sys.account.captchaEnabled', 'false', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.account.captchaEnabledRemark'); +REPLACE INTO "sys_config" VALUES (3, 'config.sys.account.registerUser', 'sys.account.registerUser', 'false', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.account.registerUserRemark'); +REPLACE INTO "sys_config" VALUES (4, 'config.sys.user.maxRetryCount', 'sys.user.maxRetryCount', '5', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.maxRetryCountRemark'); +REPLACE INTO "sys_config" VALUES (5, 'config.sys.user.lockTime', 'sys.user.lockTime', '10', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.lockTimeRemark'); +REPLACE INTO "sys_config" VALUES (6, 'config.sys.officialUrl', 'sys.officialUrl', '#', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.officialUrlRemark'); +REPLACE INTO "sys_config" VALUES (7, 'config.sys.helpDoc', 'sys.helpDoc', '/static/helpDoc/{language}_doc.pdf', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.helpDocRemark'); +REPLACE INTO "sys_config" VALUES (8, 'sys.account.captchaType', 'sys.account.captchaType', 'math', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'sys.account.captchaTypeRemark'); +REPLACE INTO "sys_config" VALUES (9, 'config.sys.user.passwordPolicy', 'sys.user.passwordPolicy', '{"minLength":6,"specialChars":0,"uppercase":0,"lowercase":0}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwordPolicyRemark'); +REPLACE INTO "sys_config" VALUES (10, 'config.sys.user.passwdExpire', 'sys.user.passwdExpire', '{"expHours":0,"alertHours":360}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwdExpireRemark'); +REPLACE INTO "sys_config" VALUES (11, 'config.sys.user.fristPasswdChange', 'sys.user.fristPasswdChange', 'false', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.fristPasswdChangeRemark'); +REPLACE INTO "sys_config" VALUES (12, 'config.sys.user.passwdNotAllowedHistory', 'sys.user.passwdNotAllowedHistory', '0', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwdNotAllowedHistoryRemark'); +REPLACE INTO "sys_config" VALUES (21, 'config.monitor.sysResource.storeDays', 'monitor.sysResource.storeDays', '30', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.monitor.sysResource.storeDaysRemark'); +REPLACE INTO "sys_config" VALUES (22, 'config.sys.logo.type', 'sys.logo.type', 'brand', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.logo.typeRemark'); +REPLACE INTO "sys_config" VALUES (23, 'config.sys.logo.filePathIcon', 'sys.logo.filePathIcon', '/static/logo/{language}_icon.png', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.logo.filePathIconRemark'); +REPLACE INTO "sys_config" VALUES (24, 'config.sys.logo.filePathBrand', 'sys.logo.filePathBrand', '/static/logo/{language}_brand.png', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.logo.filePathBrandRemark'); +REPLACE INTO "sys_config" VALUES (25, 'config.sys.loginBackground', 'sys.loginBackground', '#', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.loginBackgroundRemark'); +REPLACE INTO "sys_config" VALUES (26, 'config.sys.title', 'sys.title', 'config.sys.titleValue', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.titleRemark'); +REPLACE INTO "sys_config" VALUES (27, 'config.sys.copyright', 'sys.copyright', 'config.sys.copyrightValue', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.copyrightRemark'); +REPLACE INTO "sys_config" VALUES (28, 'config.sys.i18nOpen', 'sys.i18n.open', 'true', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.i18nOpenRemark'); +REPLACE INTO "sys_config" VALUES (29, 'config.sys.i18nDefault', 'sys.i18n.default', 'en_US', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.i18nDefaultRemark'); +REPLACE INTO "sys_config" VALUES (30, 'config.sys.lockTime', 'sys.lockTime', '0', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.lockTimeRemark'); +REPLACE INTO "sys_config" VALUES (31, 'config.sys.homePage', 'sys.homePage', 'configManage/neOverview/index', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.homePageRemark'); +REPLACE INTO "sys_config" VALUES (32, 'config.neData.backupDataFTP', 'neData.backupDataFTP', 'VXEECeDMoYhX29pqsb753ecJOnPfxB6XrEa9QdUrRqwKI7EmJei5HlvehvL+wL0Osjo3Y2Qs7ADA6eL3SrisiVXAVVXv38KMhvcSU9eaAzl/jrY4ahsq6a/eSbzxFDgE21US7/YnsyDRG7eGAc7W5Q==', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.neData.backupDataFTPRemark'); diff --git a/build/database/lite/upgrade/upg_sys_dict_data.sql b/build/database/lite/upgrade/upg_sys_dict_data.sql new file mode 100644 index 00000000..aae60d22 --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_dict_data.sql @@ -0,0 +1,198 @@ +-- ---------------------------- +-- Table structure for sys_dict_data +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_dict_data" ( + "data_id" integer NOT NULL, + "dict_type" text(64) NOT NULL, + "data_label" text(255) NOT NULL, + "data_value" text(512) NOT NULL, + "data_sort" integer(11), + "tag_class" text(64), + "tag_type" text(12), + "status_flag" text(1), + "del_flag" text(1), + "create_by" text(64), + "create_time" integer(20), + "update_by" text(64), + "update_time" integer(20), + "remark" text(500), + PRIMARY KEY ("data_id") +); + +-- ---------------------------- +-- Records of sys_dict_data +-- ---------------------------- +REPLACE INTO "sys_dict_data" VALUES (1, 'sys_user_sex', 'dictData.sex.un', '0', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (2, 'sys_user_sex', 'dictData.sex.male', '1', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (3, 'sys_user_sex', 'dictData.sex.female', '2', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (4, 'sys_show_hide', 'dictData.show', '1', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (5, 'sys_show_hide', 'dictData.hide', '0', 2, '', 'error', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (6, 'sys_normal_disable', 'dictData.normal', '1', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (7, 'sys_normal_disable', 'dictData.disable', '0', 2, '', 'error', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (8, 'sys_yes_no', 'dictData.yes', 'Y', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (9, 'sys_yes_no', 'dictData.no', 'N', 2, '', 'error', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (10, 'sys_common_status', 'dictData.success', '1', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (11, 'sys_common_status', 'dictData.fail', '0', 2, '', 'error', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (12, 'sys_job_status', 'dictData.jobStatus.normal', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (13, 'sys_job_status', 'dictData.jobStatus.pause', '0', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (14, 'sys_job_group', 'dictData.jobGroup.Default', 'DEFAULT', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (15, 'sys_job_group', 'dictData.jobGroup.System', 'SYSTEM', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (16, 'sys_oper_type', 'dictData.operType.other', '0', 1, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (17, 'sys_oper_type', 'dictData.operType.add', '1', 2, '', 'blue', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (18, 'sys_oper_type', 'dictData.operType.edit', '2', 3, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (19, 'sys_oper_type', 'dictData.operType.delete', '3', 4, '', 'red', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (20, 'sys_oper_type', 'dictData.operType.auth', '4', 5, '', '#108ee9', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (21, 'sys_oper_type', 'dictData.operType.export', '5', 6, '', 'orange', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (22, 'sys_oper_type', 'dictData.operType.import', '6', 7, '', 'orange', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (23, 'sys_oper_type', 'dictData.operType.forced quit', '7', 8, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (24, 'sys_oper_type', 'dictData.operType.clear', '8', 9, '', '#f50', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (25, 'trace_type', 'dictData.trace.interface', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (26, 'trace_type', 'dictData.trace.device', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (27, 'trace_type', 'dictData.trace.user', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (28, 'sys_job_save_log', 'dictData.jobSaveLog.no', '0', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (29, 'sys_job_save_log', 'dictData.jobSaveLog.yes', '1', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (30, 'ne_host_type', 'dictData.ne_host_type.redis', 'redis', 2, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (31, 'alarm_status', 'dictData.alarmStatus.history', 'Clear', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (32, 'alarm_status', 'dictData.alarmStatus.active', 'Active', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (33, 'sys_role_datascope', 'dictData.datascope.all', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (34, 'sys_role_datascope', 'dictData.datascope.custom', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (35, 'sys_role_datascope', 'dictData.datascope.dept', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (36, 'sys_role_datascope', 'dictData.datascope.deptAndChid', '4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (37, 'sys_role_datascope', 'dictData.datascope.self', '5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (38, 'active_alarm_type', 'dictData.active_alarm_type.communication', 'CommunicationAlarm', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (39, 'active_alarm_type', 'dictData.active_alarm_type.equipment', 'EquipmentAlarm', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (40, 'active_alarm_type', 'dictData.active_alarm_type.processing', 'ProcessingFailure', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (41, 'active_alarm_type', 'dictData.active_alarm_type.environmental', 'EnvironmentalAlarm', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (42, 'active_alarm_type', 'dictData.active_alarm_type.qualityOfService', 'QualityOfServiceAlarm', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (43, 'active_clear_type', 'dictData.active_clear_type.notCleared', 'NotClear', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (44, 'active_clear_type', 'dictData.active_clear_type.auto', 'AutoClear', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (45, 'active_clear_type', 'dictData.active_clear_type.hand', 'ManualClear', 2, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (46, 'active_ack_state', 'dictData.active_ack_state.unconfirmed', 'NotAck', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (47, 'active_ack_state', 'dictData.active_ack_state.confirmed', 'Ack', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (48, 'active_alarm_severity', 'dictData.active_alarm_severity.critical', 'Critical', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (49, 'active_alarm_severity', 'dictData.active_alarm_severity.major', 'Major', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (50, 'active_alarm_severity', 'dictData.active_alarm_severity.minor', 'Minor', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (51, 'active_alarm_severity', 'dictData.active_alarm_severity.warning', 'Warning', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (52, 'active_alarm_severity', 'dictData.active_alarm_severity.event', 'Event', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (53, 'index_status', 'dictType.index_status.normal', 'normal', 1, '#91cc75', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (54, 'index_status', 'dictType.index_status.abnormal', 'abnormal', 2, '#ee6666', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (55, 'cdr_sip_code', 'dictData.cdr_sip_code.200', '200', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (56, 'cdr_sip_code', 'dictData.cdr_sip_code.403', '403', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (57, 'cdr_sip_code', 'dictData.cdr_sip_code.408', '408', 13, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (58, 'cdr_sip_code', 'dictData.cdr_sip_code.500', '500', 16, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (59, 'cdr_call_type', 'dictData.cdr_call_type.audio', 'audio', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (60, 'cdr_call_type', 'dictData.cdr_call_type.video', 'video', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (61, 'ue_auth_code', 'dictData.ue_auth_code.200', '200', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (62, 'ue_auth_code', 'dictData.ue_auth_code.001', '001', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (63, 'ue_auth_code', 'dictData.ue_auth_code.002', '002', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (64, 'ue_auth_code', 'dictData.ue_auth_code.003', '003', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (65, 'ue_auth_code', 'dictData.ue_auth_code.004', '004', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (66, 'ue_auth_code', 'dictData.ue_auth_code.005', '005', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (67, 'ue_auth_code', 'dictData.ue_auth_code.006', '006', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (68, 'ue_auth_code', 'dictData.ue_auth_code.007', '007', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (69, 'ue_event_type', 'dictData.ue_event_type.auth', 'Auth', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (70, 'ue_event_type', 'dictData.ue_event_type.detach', 'Detach', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (71, 'ue_event_type', 'dictData.ue_event_type.state', 'CM', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (72, 'ue_event_cm_state', 'dictData.ue_event_cm_state.connected', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (73, 'ue_event_cm_state', 'dictData.ue_event_cm_state.idle', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (74, 'ue_event_cm_state', 'dictData.ue_event_cm_state.inactive', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (75, 'cdr_sip_code', 'dictData.cdr_sip_code.404', '404', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (76, 'cdr_sip_code', 'dictData.cdr_sip_code.487', '487', 12, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (77, 'cdr_sip_code', 'dictData.cdr_sip_code.503', '503', 17, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (78, 'cdr_sip_code', 'dictData.cdr_sip_code.504', '504', 18, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (79, 'cdr_sip_code', 'dictData.cdr_sip_code.603', '603', 21, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (80, 'cdr_sip_code', 'dictData.cdr_sip_code.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (81, 'cdr_sip_code', 'dictData.cdr_sip_code.202', '202', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (82, 'cdr_call_type', 'dictData.cdr_call_type.sms', 'sms', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (83, 'cdr_sip_code', 'dictData.cdr_sip_code.488', '488', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (84, 'cdr_sip_code', 'dictData.cdr_sip_code.0', '0', 99, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (85, 'ne_host_type', 'dictData.ne_host_type.ssh', 'ssh', 0, '', 'blue', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (86, 'ne_host_type', 'dictData.ne_host_type.telnet', 'telnet', 1, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (87, 'ne_host_groupId', 'dictData.ne_host_groupId.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (88, 'ne_host_groupId', 'dictData.ne_host_groupId.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (89, 'ne_host_groupId', 'dictData.ne_host_groupId.2', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (90, 'ne_host_authMode', 'dictData.ne_host_authMode.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (91, 'ne_host_authMode', 'dictData.ne_host_authMode.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (92, 'ne_host_cmd_groupId', 'dictData.ne_host_cmd_groupId.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (93, 'ne_host_cmd_groupId', 'dictData.ne_host_cmd_groupId.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (94, 'ne_info_status', 'dictData.ne_info_status.0', '0', 0, '', 'error', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (95, 'ne_info_status', 'dictData.ne_info_status.1', '1', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (96, 'ne_info_status', 'dictData.ne_info_status.2', '2', 2, '', 'orange', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (97, 'ne_info_status', 'dictData.ne_info_status.3', '3', 3, '', 'blue', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (98, 'ne_license_status', 'dictData.ne_license_status.0', '0', 0, '', 'warning', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (99, 'ne_license_status', 'dictData.ne_license_status.1', '1', 1, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (100, 'ne_host_authMode', 'dictData.ne_host_authMode.2', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (101, 'ne_version_status', 'dictData.ne_version_status.0', '0', 0, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (102, 'ne_version_status', 'dictData.ne_version_status.1', '1', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (103, 'ne_version_status', 'dictData.ne_version_status.2', '2', 1, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (104, 'ne_version_status', 'dictData.ne_version_status.3', '3', 1, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (105, 'cdr_cause_code', 'dictData.cdr_cause_code.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (106, 'cdr_cause_code', 'dictData.cdr_cause_code.8', '8', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (107, 'cdr_cause_code', 'dictData.cdr_cause_code.10', '10', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (108, 'cdr_cause_code', 'dictData.cdr_cause_code.21', '21', 10, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (109, 'cdr_cause_code', 'dictData.cdr_cause_code.22', '22', 11, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (110, 'cdr_cause_code', 'dictData.cdr_cause_code.27', '27', 12, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (111, 'cdr_cause_code', 'dictData.cdr_cause_code.28', '28', 13, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (112, 'cdr_cause_code', 'dictData.cdr_cause_code.29', '29', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (113, 'cdr_cause_code', 'dictData.cdr_cause_code.30', '30', 15, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (114, 'cdr_cause_code', 'dictData.cdr_cause_code.38', '38', 16, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (115, 'cdr_cause_code', 'dictData.cdr_cause_code.41', '41', 20, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (116, 'cdr_cause_code', 'dictData.cdr_cause_code.41', '41', 21, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (117, 'cdr_cause_code', 'dictData.cdr_cause_code.42', '42', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (118, 'cdr_cause_code', 'dictData.cdr_cause_code.47', '47', 23, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (119, 'cdr_cause_code', 'dictData.cdr_cause_code.50', '50', 30, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (120, 'trace_msg_type', 'dictData.trace_msg_type.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (121, 'trace_msg_type', 'dictData.trace_msg_type.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (122, 'trace_msg_direct', 'dictData.trace_msg_direct.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (123, 'trace_msg_direct', 'dictData.trace_msg_direct.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (124, 'trace_interfaces', 'dictData.trace_interfaces.1', 'N1', 1, '', '', '0', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (125, 'trace_interfaces', 'dictData.trace_interfaces.2', 'N2', 2, '', '', '0', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (126, 'trace_interfaces', 'dictData.trace_interfaces.3', 'N1/N2', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (127, 'trace_interfaces', 'dictData.trace_interfaces.4', 'N4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (128, 'trace_interfaces', 'dictData.trace_interfaces.8', 'N8', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (129, 'trace_interfaces', 'dictData.trace_interfaces.10', 'N10', 10, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (130, 'trace_interfaces', 'dictData.trace_interfaces.11', 'N11', 11, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (131, 'trace_interfaces', 'dictData.trace_interfaces.12', 'N12', 12, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (132, 'trace_interfaces', 'dictData.trace_interfaces.13', 'N13', 13, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (133, 'trace_interfaces', 'dictData.trace_interfaces.7', 'N7', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (134, 'trace_interfaces', 'dictData.trace_interfaces.15', 'N15', 15, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (135, 'trace_interfaces', 'dictData.trace_interfaces.17', 'N17', 17, '', '', '0', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (136, 'trace_interfaces', 'dictData.trace_interfaces.20', 'N20', 20, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (137, 'trace_interfaces', 'dictData.trace_interfaces.22', 'N22', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (138, 'trace_interfaces', 'dictData.trace_interfaces.40', 'N40', 40, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (139, 'cdr_sip_code', 'dictData.cdr_sip_code.302', '302', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (140, 'cdr_sip_code', 'dictData.cdr_sip_code.402', '402', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (141, 'cdr_sip_code', 'dictData.cdr_sip_code.480', '480', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (142, 'cdr_sip_code', 'dictData.cdr_sip_code.481', '481', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (143, 'cdr_sip_code', 'dictData.cdr_sip_code.482', '482', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (144, 'cdr_sip_code', 'dictData.cdr_sip_code.486', '486', 11, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (145, 'cdr_sip_code', 'dictData.cdr_sip_code.489', '489', 15, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (146, 'cdr_sip_code', 'dictData.cdr_sip_code.580', '580', 19, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (147, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.0', '0', 99, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (148, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.200', '200', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (149, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.202', '202', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (150, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.302', '302', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (151, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.402', '402', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (152, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.403', '403', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (153, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.404', '404', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (154, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.480', '480', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (155, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.481', '481', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (156, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.482', '482', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (157, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.486', '486', 11, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (158, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.487', '487', 12, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (159, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.408', '408', 13, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (160, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.488', '488', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (161, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.489', '489', 15, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (162, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.500', '500', 16, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (163, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.503', '503', 17, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (164, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.504', '504', 18, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (165, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.580', '580', 19, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (166, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.603', '603', 21, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (167, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (168, 'trace_interfaces', 'dictData.trace_interfaces.14', 'N14', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (169, 'trace_interfaces', 'dictData.trace_interfaces.5', 'N5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (170, 'sys_user_type', 'dictData.sys_user_type.system', 'System', 1, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); + diff --git a/build/database/lite/upgrade/upg_sys_dict_type.sql b/build/database/lite/upgrade/upg_sys_dict_type.sql new file mode 100644 index 00000000..dca3cac3 --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_dict_type.sql @@ -0,0 +1,54 @@ +-- ---------------------------- +-- Table structure for sys_dict_type +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_dict_type" ( + "dict_id" integer NOT NULL, + "dict_name" text(64) NOT NULL, + "dict_type" text(64) NOT NULL, + "status_flag" text(1), + "del_flag" text(1), + "create_by" text(64), + "create_time" integer(20), + "update_by" text(64), + "update_time" integer(20), + "remark" text(500), + PRIMARY KEY ("dict_id") +); + +-- ---------------------------- +-- Records of sys_dict_type +-- ---------------------------- +REPLACE INTO "sys_dict_type" VALUES (1, 'dictType.sys_user_sex', 'sys_user_sex', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_user_sex_remark'); +REPLACE INTO "sys_dict_type" VALUES (2, 'dictType.sys_show_hide', 'sys_show_hide', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_show_hide_remark'); +REPLACE INTO "sys_dict_type" VALUES (3, 'dictType.sys_normal_disable', 'sys_normal_disable', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_normal_disable_remark'); +REPLACE INTO "sys_dict_type" VALUES (4, 'dictType.sys_job_status', 'sys_job_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_job_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (5, 'dictType.sys_job_group', 'sys_job_group', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_job_group_remark'); +REPLACE INTO "sys_dict_type" VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_yes_no_remark'); +REPLACE INTO "sys_dict_type" VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_oper_type_remark'); +REPLACE INTO "sys_dict_type" VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_common_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (50, 'dictType.trace_type', 'trace_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.trace_type_remark'); +REPLACE INTO "sys_dict_type" VALUES (51, 'dictType.alarm_status', 'alarm_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.alarm_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (52, 'dictType.ne_version_status', 'ne_version_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.ne_version_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (53, 'dictType.sys_role_datascope', 'sys_role_datascope', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_role_datascope_remark'); +REPLACE INTO "sys_dict_type" VALUES (54, 'dictType.active_alarm_type', 'active_alarm_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.active_alarm_type_remark'); +REPLACE INTO "sys_dict_type" VALUES (55, 'dictType.active_clear_type', 'active_clear_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.active_clear_type_remark'); +REPLACE INTO "sys_dict_type" VALUES (56, 'dictType.active_ack_state', 'active_ack_state', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.active_ack_state_remark'); +REPLACE INTO "sys_dict_type" VALUES (57, 'dictType.active_alarm_severity', 'active_alarm_severity', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.active_alarm_severity_remark'); +REPLACE INTO "sys_dict_type" VALUES (58, 'dictType.index_status', 'index_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.index_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (59, 'dictType.cdr_sip_code', 'cdr_sip_code', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (60, 'dictType.cdr_call_type', 'cdr_call_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (61, 'dictType.ue_auth_code', 'ue_auth_code', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (62, 'dictType.ue_event_type', 'ue_event_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (63, 'dictType.ue_event_cm_state', 'ue_event_cm_state', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (64, 'dictType.ne_host_type', 'ne_host_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (65, 'dictType.ne_host_groupId', 'ne_host_groupId', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (66, 'dictType.ne_host_authMode', 'ne_host_authMode', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (67, 'dictType.ne_host_cmd_groupId', 'ne_host_cmd_groupId', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (68, 'dictType.ne_info_status', 'ne_info_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (69, 'dictType.ne_license_status', 'ne_license_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (70, 'dictType.cdr_cause_code', 'cdr_cause_code', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (71, 'dictType.trace_msg_type', 'trace_msg_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (72, 'dictType.trace_msg_direct', 'trace_msg_direct', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (73, 'dictType.trace_interfaces', 'trace_interfaces', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (74, 'dictType.cdr_sip_code_cause', 'cdr_sip_code_cause', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); diff --git a/build/database/lite/upgrade/upg_sys_i18n.sql b/build/database/lite/upgrade/upg_sys_i18n.sql new file mode 100644 index 00000000..256fbb8a --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_i18n.sql @@ -0,0 +1,961 @@ +-- ---------------------------- +-- Table structure for sys_i18n +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_i18n" ( + "id" integer NOT NULL, + "key_lable" text(255) NOT NULL, + "value_zh" text(2048), + "value_en" text(2048), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Records of sys_i18n +-- ---------------------------- +REPLACE INTO "sys_i18n" VALUES (1, 'i18n', '中文', 'English'); +REPLACE INTO "sys_i18n" VALUES (2, 'hello', '你好', 'Hello'); +REPLACE INTO "sys_i18n" VALUES (3, 'menu.system', '系统', 'System'); +REPLACE INTO "sys_i18n" VALUES (4, 'menu.monitor', '监控', 'Monitor'); +REPLACE INTO "sys_i18n" VALUES (5, 'menu.tools', '工具', 'Tools'); +REPLACE INTO "sys_i18n" VALUES (6, 'menu.ne', '网元', 'NE'); +REPLACE INTO "sys_i18n" VALUES (7, 'menu.ue', '终端', 'UE'); +REPLACE INTO "sys_i18n" VALUES (8, 'menu.systemRemark', '系统管理目录', 'System Management Catalog'); +REPLACE INTO "sys_i18n" VALUES (9, 'menu.monitorRemark', '系统监控目录', 'System Monitor Catalog'); +REPLACE INTO "sys_i18n" VALUES (10, 'menu.toolsRemark', '系统工具目录', 'System Tools Catalog'); +REPLACE INTO "sys_i18n" VALUES (11, 'menu.neRemark', '网元配置管理目录', 'NE Configuration Management Catalog'); +REPLACE INTO "sys_i18n" VALUES (12, 'menu.ueRemark', '网元终端信息目录', 'Network Element Terminal Information Catalog'); +REPLACE INTO "sys_i18n" VALUES (13, 'menu.security.user', '用户管理', 'User Management'); +REPLACE INTO "sys_i18n" VALUES (14, 'menu.security.role', '角色管理', 'Role Management'); +REPLACE INTO "sys_i18n" VALUES (15, 'menu.security.roleUser', '分配角色', 'Assigning Roles'); +REPLACE INTO "sys_i18n" VALUES (16, 'menu.system.menu', '菜单管理', 'Menu Management'); +REPLACE INTO "sys_i18n" VALUES (17, 'menu.security.dept', '部门管理', 'Department Management'); +REPLACE INTO "sys_i18n" VALUES (18, 'menu.security.post', '岗位管理', 'Position Management'); +REPLACE INTO "sys_i18n" VALUES (19, 'menu.system.dictType', '字典管理', 'Dictionary Management'); +REPLACE INTO "sys_i18n" VALUES (20, 'menu.system.dictData', '字典数据', 'Dictionary Data'); +REPLACE INTO "sys_i18n" VALUES (21, 'menu.system.paramSet', '参数设置', 'Parameter Settings'); +REPLACE INTO "sys_i18n" VALUES (22, 'menu.system.systemLog', '系统日志', 'System Log'); +REPLACE INTO "sys_i18n" VALUES (23, 'menu.system.systemInfo', '系统信息', 'System Information'); +REPLACE INTO "sys_i18n" VALUES (24, 'menu.system.cacheInfo', '缓存信息', 'Cache Information'); +REPLACE INTO "sys_i18n" VALUES (25, 'menu.system.cache', '缓存管理', 'Cache Management'); +REPLACE INTO "sys_i18n" VALUES (26, 'menu.security.onlineUser', '在线用户', 'Online Users'); +REPLACE INTO "sys_i18n" VALUES (27, 'menu.system.job', '调度任务', 'Scheduling Tasks'); +REPLACE INTO "sys_i18n" VALUES (28, 'menu.system.jobLog', '调度日志', 'Scheduling Logs'); +REPLACE INTO "sys_i18n" VALUES (29, 'menu.tools.help', '帮助文档', 'Help Documentation'); +REPLACE INTO "sys_i18n" VALUES (30, 'menu.log.operat', '操作日志', 'Operation logs'); +REPLACE INTO "sys_i18n" VALUES (31, 'menu.log.login', '安全日志', 'Security logs'); +REPLACE INTO "sys_i18n" VALUES (32, 'menu.security.userRemark', '用户管理菜单', 'User Management Menu'); +REPLACE INTO "sys_i18n" VALUES (33, 'menu.security.roleRemark', '角色管理菜单', 'Role Management Menu'); +REPLACE INTO "sys_i18n" VALUES (34, 'menu.security.roleUserRemark', '分配角色内嵌隐藏菜单', 'Assign Roles Embedded Hidden Menu'); +REPLACE INTO "sys_i18n" VALUES (35, 'menu.system.menuRemark', '菜单管理菜单', 'Menu Management Menu'); +REPLACE INTO "sys_i18n" VALUES (36, 'menu.security.deptRemark', '部门管理菜单', 'Department management menu'); +REPLACE INTO "sys_i18n" VALUES (37, 'menu.security.postRemark', '岗位管理菜单', 'Job Management Menu'); +REPLACE INTO "sys_i18n" VALUES (38, 'menu.system.dictTypeRemark', '字典管理菜单', 'Dictionary management menu'); +REPLACE INTO "sys_i18n" VALUES (39, 'menu.system.dictDataRemark', '字典数据内嵌隐藏菜单', 'Dictionary data embedded hidden menu'); +REPLACE INTO "sys_i18n" VALUES (40, 'menu.system.paramSetRemark', '参数设置菜单', 'Parameter setting menu'); +REPLACE INTO "sys_i18n" VALUES (41, 'menu.system.systemLogRemark', '系统日志目录', 'System Log Catalog'); +REPLACE INTO "sys_i18n" VALUES (42, 'menu.system.systemInfoRemark', '系统信息菜单', 'System information menu'); +REPLACE INTO "sys_i18n" VALUES (43, 'menu.system.cacheInfoRemark', '缓存信息菜单', 'Cache Information Menu'); +REPLACE INTO "sys_i18n" VALUES (44, 'menu.system.cacheRemark', '缓存列表菜单', 'Cache List Menu'); +REPLACE INTO "sys_i18n" VALUES (45, 'menu.security.onlineUserRemark', '在线用户菜单', 'Online User Menu'); +REPLACE INTO "sys_i18n" VALUES (46, 'menu.system.jobRemark', '调度任务菜单', 'Scheduling Tasks menu'); +REPLACE INTO "sys_i18n" VALUES (47, 'menu.system.jobLogRemark', '调度日志内嵌隐藏菜单', 'Scheduling Log Embedded Hidden Menu'); +REPLACE INTO "sys_i18n" VALUES (48, 'menu.tools.helpRemark', '帮助文档菜单', 'Help file menu'); +REPLACE INTO "sys_i18n" VALUES (49, 'menu.log.operatRemark', '操作日志菜单', 'Operation log menu'); +REPLACE INTO "sys_i18n" VALUES (50, 'menu.log.loginRemark', '登录日志菜单', 'Login log menu'); +REPLACE INTO "sys_i18n" VALUES (51, 'menu.common.query', '查询', 'Inquiry'); +REPLACE INTO "sys_i18n" VALUES (52, 'menu.common.add', '新增', 'Add'); +REPLACE INTO "sys_i18n" VALUES (53, 'menu.common.edit', '修改', 'Modify'); +REPLACE INTO "sys_i18n" VALUES (54, 'menu.common.delete', '删除', 'Delete'); +REPLACE INTO "sys_i18n" VALUES (55, 'menu.common.export', '导出', 'Export'); +REPLACE INTO "sys_i18n" VALUES (56, 'menu.common.import', '导入', 'Import'); +REPLACE INTO "sys_i18n" VALUES (57, 'menu.common.resetPwd', '重置密码', 'Reset Password'); +REPLACE INTO "sys_i18n" VALUES (58, 'menu.common.unlock', '账户解锁', 'Account Unlock'); +REPLACE INTO "sys_i18n" VALUES (59, 'menu.forcedQuit.batch ', '批量强退', 'Batch Undo'); +REPLACE INTO "sys_i18n" VALUES (60, 'menu.forcedQuit.single', '单条强退', 'Individual Forced Retirement'); +REPLACE INTO "sys_i18n" VALUES (61, 'menu.neData.udmAuth', 'UDM鉴权用户', 'UDM Authentication'); +REPLACE INTO "sys_i18n" VALUES (62, 'menu.neData.udmSub', 'UDM签约用户', 'UDM Subscribers'); +REPLACE INTO "sys_i18n" VALUES (63, 'menu.neData.udmVOIP', 'VOIP鉴权用户', 'VOIP Authentication'); +REPLACE INTO "sys_i18n" VALUES (64, 'menu.neData.udmVolte', 'IMS签约用户', 'IMS Subscribers'); +REPLACE INTO "sys_i18n" VALUES (65, 'menu.neData.imsSub', 'IMS在线用户', 'IMS Online Users'); +REPLACE INTO "sys_i18n" VALUES (66, 'menu.neData.smfSub', 'UE在线信息', 'UE Online Information'); +REPLACE INTO "sys_i18n" VALUES (67, 'menu.neData.baseOnline', '基站在线', 'Radio Online'); +REPLACE INTO "sys_i18n" VALUES (68, 'menu.trace', '跟踪', 'Trace'); +REPLACE INTO "sys_i18n" VALUES (69, 'menu.trace.task', '网元跟踪任务', 'NE Trace Task'); +REPLACE INTO "sys_i18n" VALUES (70, 'menu.trace.taskData', '网元跟踪任务数据', 'NE Trace Task Data'); +REPLACE INTO "sys_i18n" VALUES (71, 'menu.trace.pcap', '信令抓包', 'Signaling Capture'); +REPLACE INTO "sys_i18n" VALUES (72, 'menu.fault', '监控', 'Monitor'); +REPLACE INTO "sys_i18n" VALUES (73, 'config.neData.backupDataFTP', '备份网元数据-同步FTP服务', 'Backup NE Data - Sync Data FTP Service'); +REPLACE INTO "sys_i18n" VALUES (74, 'config.neData.backupDataFTPRemark', '请通过系统页面进行设置FTP信息', 'Please set the FTP information through the system page.'); +REPLACE INTO "sys_i18n" VALUES (75, 'job.backup_export_table_sys_log_operate_remark', 'hour: 数据时间从任务执行时间前的小时数 +tableName: 数据表名 +columns: 支持字段 +backupPath: 备份输出路径 /usr/local/omc/backup/{backupPath}', 'hour: data time from the hour before the task execution time +tableName: data table name +columns: support fields +backupPath: backup output path /usr/local/omc/backup/{backupPath}'); +REPLACE INTO "sys_i18n" VALUES (76, 'job.backup_export_table_cdr_event_ims_remark', 'hour: 数据时间从任务执行时间前的小时数 +tableName: 数据表名 +columns: 支持字段 +backupPath: 备份输出路径 /usr/local/omc/backup/{backupPath}', 'hour: data time from the hour before the task execution time +tableName: data table name +columns: support fields +backupPath: backup output path /usr/local/omc/backup/{backupPath}'); +REPLACE INTO "sys_i18n" VALUES (77, 'job.backup_export_table_cdr_event_smf_remark', 'hour: 数据时间从任务执行时间前的小时数 +tableName: 数据表名 +columns: 支持字段 +backupPath: 备份输出路径 /usr/local/omc/backup/{backupPath}', 'hour: data time from the hour before the task execution time +tableName: data table name +columns: support fields +backupPath: backup output path /usr/local/omc/backup/{backupPath}'); +REPLACE INTO "sys_i18n" VALUES (78, 'menu.traceRemark', '跟踪管理目录', 'Tracking Management Menu'); +REPLACE INTO "sys_i18n" VALUES (79, 'menu.trace.taskRemark', '跟踪任务菜单', 'Tracking Task Menu'); +REPLACE INTO "sys_i18n" VALUES (80, 'config.sys.user.fristPasswdChange', '用户管理-首次登录密码修改', 'User Management-First Login Password Change'); +REPLACE INTO "sys_i18n" VALUES (81, 'menu.trace.pcapRemark', '信令抓包菜单', 'Signaling Capture Menu'); +REPLACE INTO "sys_i18n" VALUES (82, 'menu.faultRemark', '故障管理目录', 'Fault Management Catalog'); +REPLACE INTO "sys_i18n" VALUES (83, 'menu.fault.active', '活动告警', 'Active Alarms'); +REPLACE INTO "sys_i18n" VALUES (84, 'menu.log', '日志', 'Logs'); +REPLACE INTO "sys_i18n" VALUES (85, 'menu.log.mml', 'MML日志', 'MML Logs'); +REPLACE INTO "sys_i18n" VALUES (86, 'menu.log.alarm', '告警日志', 'Alarm Logs'); +REPLACE INTO "sys_i18n" VALUES (87, 'menu.log.forwarding', '告警前转日志', 'Alarm Forwarding Logs'); +REPLACE INTO "sys_i18n" VALUES (88, 'menu.log.set', '日志设置', 'Log Settings'); +REPLACE INTO "sys_i18n" VALUES (89, 'menu.monitor.sessionUser', '用户会话', 'User Sessions'); +REPLACE INTO "sys_i18n" VALUES (90, 'menu.fault.history', '历史告警', 'Historical Alarms'); +REPLACE INTO "sys_i18n" VALUES (91, 'menu.fault.set', '设置', 'Settings'); +REPLACE INTO "sys_i18n" VALUES (92, 'menu.perf', '性能', 'Performance'); +REPLACE INTO "sys_i18n" VALUES (93, 'menu.fault.activemRemark', '活动告警菜单', 'Active Alarm Menu'); +REPLACE INTO "sys_i18n" VALUES (94, 'menu.logRemark', '日志管理目录', 'Log Management Catalog'); +REPLACE INTO "sys_i18n" VALUES (95, 'menu.log.operatOldRemark', '操作日志旧layui菜单', 'Operation log old layui menu'); +REPLACE INTO "sys_i18n" VALUES (96, 'menu.log.mmlRemark', '操作MML日志', 'Operation MML Log'); +REPLACE INTO "sys_i18n" VALUES (97, 'menu.log.alarmRemark', '告警日志菜单', 'Alarm Log Menu'); +REPLACE INTO "sys_i18n" VALUES (98, 'menu.log.securityOldRemark', '安全日志旧layui菜单', 'Security Log Old Layui Menu'); +REPLACE INTO "sys_i18n" VALUES (99, 'menu.log.forwardingRemark', '告警前转日志菜单', 'Alarm forward log menu'); +REPLACE INTO "sys_i18n" VALUES (100, 'menu.log.setRemark', '日志设置菜单', 'Log Settings menu'); +REPLACE INTO "sys_i18n" VALUES (101, 'menu.monitor.sessionUserRemark', '用户会话旧layui菜单', 'User Session Old Layui Menu'); +REPLACE INTO "sys_i18n" VALUES (102, 'menu.fault.historyRemark', '历史告警菜单', 'Alarm history menu'); +REPLACE INTO "sys_i18n" VALUES (103, 'menu.fault.setRemark', '故障通用设置菜单', 'Fault General Setup Menu'); +REPLACE INTO "sys_i18n" VALUES (104, 'menu.perfRemark', '性能目录', 'Performance Catalog'); +REPLACE INTO "sys_i18n" VALUES (105, 'menu.perf.task', '任务管理', 'Performance Tasks'); +REPLACE INTO "sys_i18n" VALUES (106, 'menu.perf.data', '性能数据', 'Performance Data'); +REPLACE INTO "sys_i18n" VALUES (107, 'menu.perf.kpiOverView', '关键指标概览', 'Key Performance Overview'); +REPLACE INTO "sys_i18n" VALUES (108, 'menu.perf.threshold', '性能门限', 'Performance Thresholds'); +REPLACE INTO "sys_i18n" VALUES (109, 'menu.perf.kpi', '关键指标', 'Key Performance Indicators'); +REPLACE INTO "sys_i18n" VALUES (110, 'menu.perf.customTarget', '自定义指标', 'Custom Indicator Management'); +REPLACE INTO "sys_i18n" VALUES (111, 'menu.perf.kpiKeyTarget', '关键指标报表', 'Key Performance Reports'); +REPLACE INTO "sys_i18n" VALUES (112, 'menu.mml', 'MML', 'MML'); +REPLACE INTO "sys_i18n" VALUES (113, 'menu.mml.ne', '网元操作', 'NE Operation'); +REPLACE INTO "sys_i18n" VALUES (114, 'menu.mml.udm', 'UDM操作', 'UDM Operation'); +REPLACE INTO "sys_i18n" VALUES (115, 'menu.mml.set', 'MML设置', 'MML Settings'); +REPLACE INTO "sys_i18n" VALUES (116, 'menu.mml.omc', 'OMC操作', 'OMC Operation'); +REPLACE INTO "sys_i18n" VALUES (117, 'menu.perf.taskRemark', '任务管理菜单', 'Task Management Menu'); +REPLACE INTO "sys_i18n" VALUES (118, 'menu.perf.dataRemark', '性能数据菜单', 'Performance Data Menu'); +REPLACE INTO "sys_i18n" VALUES (119, 'menu.dashboard.smscCDR.content', '可见短信内容', 'Visible SMS content'); +REPLACE INTO "sys_i18n" VALUES (120, 'menu.perf.thresholdRemark', '性能门限菜单', 'Performance Threshold Menu'); +REPLACE INTO "sys_i18n" VALUES (121, 'menu.perf.kpiRemark', '黄金指标菜单', 'Key Performance Indicator Menu'); +REPLACE INTO "sys_i18n" VALUES (122, 'menu.perf.customTargetRemark', '自定义指标菜单', 'Custom Indicator Management Menu'); +REPLACE INTO "sys_i18n" VALUES (123, 'menu.dashboard.smfCDRByIMSI', '数据流量报表', 'Data Usage Report'); +REPLACE INTO "sys_i18n" VALUES (124, 'menu.mmlRemark', 'MML管理目录', 'MML Management Catalog'); +REPLACE INTO "sys_i18n" VALUES (125, 'menu.mml.neRemark', '网元操作菜单', 'Network Element Operations Menu'); +REPLACE INTO "sys_i18n" VALUES (126, 'menu.mml.udmRemark', '网元UDM用户数据菜单', 'Network Element UDM User Data Menu'); +REPLACE INTO "sys_i18n" VALUES (127, 'menu.mml.setRemark', 'MML设置菜单', 'MML Setup Menu'); +REPLACE INTO "sys_i18n" VALUES (128, 'menu.mml.omcRemark', 'OMC操作菜单', 'OMC Operation Menu'); +REPLACE INTO "sys_i18n" VALUES (129, 'menu.dashboard.sgwcCDR', '漫游数据话单', 'Roaming Data CDR'); +REPLACE INTO "sys_i18n" VALUES (130, 'menu.security', '安全', 'Security'); +REPLACE INTO "sys_i18n" VALUES (131, 'menu.system.systemSet', '系统设置', 'System Settings'); +REPLACE INTO "sys_i18n" VALUES (132, 'menu.system.systemResource', '系统资源', 'System Resources'); +REPLACE INTO "sys_i18n" VALUES (133, 'log.operate.title.sgwcCDR', '漫游数据话单', 'Roaming Data CDR'); +REPLACE INTO "sys_i18n" VALUES (134, 'menu.securityRemark', '安全管理目录', 'Security Management Catalog'); +REPLACE INTO "sys_i18n" VALUES (135, 'menu.system.systemSetRemark', '系统设置菜单', 'System Settings Menu'); +REPLACE INTO "sys_i18n" VALUES (136, 'menu.system.systemResourceRemark', '系统资源 cpu io network菜单', 'System Resources cpu io network menu'); +REPLACE INTO "sys_i18n" VALUES (137, 'dictData.offline', '离线', 'Offline'); +REPLACE INTO "sys_i18n" VALUES (138, 'dictData.online', '在线', 'Online'); +REPLACE INTO "sys_i18n" VALUES (139, 'menu.neData.baseStation', '基站状态', 'Radio State'); +REPLACE INTO "sys_i18n" VALUES (140, 'menu.noData', '没有可访问菜单数据!', 'There is no accessible menu data!'); +REPLACE INTO "sys_i18n" VALUES (141, 'menu.errNameExists', '操作菜单【{name}】失败,菜单名称已存在', 'Failed to operate menu [{name}], menu name already exists!'); +REPLACE INTO "sys_i18n" VALUES (142, 'menu.errPathExists', '操作菜单【{name}】失败,菜单路由地址已存在', 'Failed to operate menu [{name}], menu routing address already exists!'); +REPLACE INTO "sys_i18n" VALUES (143, 'menu.errFramePath', '操作菜单【{name}】失败,非内部地址请以http(s)://开头', 'Failed to manipulate menu [{name}], non-internal address should start with http(s)://'); +REPLACE INTO "sys_i18n" VALUES (144, 'menu.errParentStatus', '上级菜单未启用!', 'The parent menu is not enabled!'); +REPLACE INTO "sys_i18n" VALUES (145, 'menu.errHasChildUse', '操作菜单【{name}】失败,存在使用子菜单数:{num}', 'Operation menu [{name}] failed, number of submenus in use exists: {num}'); +REPLACE INTO "sys_i18n" VALUES (146, 'menu.errHasRoleUse', '操作菜单【{name}】失败,菜单已分配给角色数:{num}', 'Operation menu [{name}] failed, number of roles the menu has been assigned to: {num}'); +REPLACE INTO "sys_i18n" VALUES (147, 'dictData.sex.un', '未选择', 'Not Selected'); +REPLACE INTO "sys_i18n" VALUES (148, 'dictData.sex.male', '男', 'Male'); +REPLACE INTO "sys_i18n" VALUES (149, 'dictData.sex.female', '女', 'Female'); +REPLACE INTO "sys_i18n" VALUES (150, 'dictData.show', '显示', 'Show'); +REPLACE INTO "sys_i18n" VALUES (151, 'dictData.hide', '隐藏', 'Hide'); +REPLACE INTO "sys_i18n" VALUES (152, 'dictData.normal', '正常', 'Active'); +REPLACE INTO "sys_i18n" VALUES (153, 'dictData.disable', '停用', 'Inactive'); +REPLACE INTO "sys_i18n" VALUES (154, 'dictData.yes', '是', 'Yes'); +REPLACE INTO "sys_i18n" VALUES (155, 'dictData.no', '否', 'No'); +REPLACE INTO "sys_i18n" VALUES (156, 'dictData.success', '成功', 'Successful'); +REPLACE INTO "sys_i18n" VALUES (157, 'dictData.fail', '失败', 'Failed'); +REPLACE INTO "sys_i18n" VALUES (158, 'dictData.jobStatus.normal', '正常', 'Active'); +REPLACE INTO "sys_i18n" VALUES (159, 'dictData.jobStatus.pause', '暂停', 'Inactive'); +REPLACE INTO "sys_i18n" VALUES (160, 'dictData.jobGroup.Default', '默认', 'Default'); +REPLACE INTO "sys_i18n" VALUES (161, 'dictData.jobGroup.System', '系统', 'System'); +REPLACE INTO "sys_i18n" VALUES (162, 'dictData.operType.other', '其他', 'Other'); +REPLACE INTO "sys_i18n" VALUES (163, 'dictData.operType.add', '新增', 'New'); +REPLACE INTO "sys_i18n" VALUES (164, 'dictData.operType.edit', '修改', 'Modify'); +REPLACE INTO "sys_i18n" VALUES (165, 'dictData.operType.delete', '删除', 'Delete'); +REPLACE INTO "sys_i18n" VALUES (166, 'dictData.operType.auth', '授权', 'Authorization'); +REPLACE INTO "sys_i18n" VALUES (167, 'dictData.operType.export', '导出', 'Export'); +REPLACE INTO "sys_i18n" VALUES (168, 'dictData.operType.import', '导入', 'Import'); +REPLACE INTO "sys_i18n" VALUES (169, 'dictData.operType.forced quit', '强退', 'Forced Retirement'); +REPLACE INTO "sys_i18n" VALUES (170, 'dictData.operType.clear', '清空', 'Clear'); +REPLACE INTO "sys_i18n" VALUES (171, 'dictData.trace.interface', '接口跟踪', 'Interface Tracing'); +REPLACE INTO "sys_i18n" VALUES (172, 'dictData.trace.device', '设备跟踪', 'Module Tracing'); +REPLACE INTO "sys_i18n" VALUES (173, 'dictData.trace.user', '用户跟踪', 'User Tracing'); +REPLACE INTO "sys_i18n" VALUES (174, 'nbState.export.id', '编号', 'ID'); +REPLACE INTO "sys_i18n" VALUES (175, 'nbState.export.name', '基站名称', 'Name'); +REPLACE INTO "sys_i18n" VALUES (176, 'nbState.export.position', '基站位置', 'Position'); +REPLACE INTO "sys_i18n" VALUES (177, 'nbState.export.address', 'IP地址', 'IP Address'); +REPLACE INTO "sys_i18n" VALUES (178, 'nbState.export.nbName', '设备名称', 'RanNodeName'); +REPLACE INTO "sys_i18n" VALUES (179, 'nbState.export.ueNum', '在线用户数', 'UE Number'); +REPLACE INTO "sys_i18n" VALUES (180, 'nbState.export.state', '基站状态', 'State'); +REPLACE INTO "sys_i18n" VALUES (181, 'nbState.export.time', '变更时间', 'Change Time'); +REPLACE INTO "sys_i18n" VALUES (182, 'neHost.okBySSHLink', '设置免密直连成功', 'Setting up a password-free direct connection is successful'); +REPLACE INTO "sys_i18n" VALUES (183, 'neHost.banNE', '禁止操作网元', 'Do not operate the NE'); +REPLACE INTO "sys_i18n" VALUES (184, 'dictData.ne_host_type.redis', 'Redis', 'Redis'); +REPLACE INTO "sys_i18n" VALUES (185, 'menu.tools.ping', '网络探测测试', 'Net Probing Test'); +REPLACE INTO "sys_i18n" VALUES (186, 'menu.tools.iperf', '网络性能测试', 'Net Performance Test'); +REPLACE INTO "sys_i18n" VALUES (187, 'dictData.jobSaveLog.no', '不记录', 'No Record'); +REPLACE INTO "sys_i18n" VALUES (188, 'dictData.jobSaveLog.yes', '记录', 'Recorded'); +REPLACE INTO "sys_i18n" VALUES (189, 'dictData.neVersionStatus.upload', '已上传', 'Uploaded'); +REPLACE INTO "sys_i18n" VALUES (190, 'dictData.neVersionStatus.inactive', '未激活', 'Inactivated'); +REPLACE INTO "sys_i18n" VALUES (191, 'dictData.neVersionStatus.active', '已激活', 'Activated'); +REPLACE INTO "sys_i18n" VALUES (192, 'dictData.alarmStatus.history', '历史告警', 'Historical Alarm'); +REPLACE INTO "sys_i18n" VALUES (193, 'dictData.alarmStatus.active', '活动告警', 'Active Alarm'); +REPLACE INTO "sys_i18n" VALUES (194, 'dictData.export.code', '数据代码', 'Data Code'); +REPLACE INTO "sys_i18n" VALUES (195, 'dictData.export.sort', '数据排序', 'Data Sort'); +REPLACE INTO "sys_i18n" VALUES (196, 'dictData.export.label', '数据标签', 'Data Key'); +REPLACE INTO "sys_i18n" VALUES (197, 'dictData.export.value', '数据键值', 'Data Value'); +REPLACE INTO "sys_i18n" VALUES (198, 'dictData.export.type', '数据排序', 'Data Type'); +REPLACE INTO "sys_i18n" VALUES (199, 'dictData.export.status', '数据状态', 'Status'); +REPLACE INTO "sys_i18n" VALUES (200, 'dictData.datascope.all', '全部数据权限', 'All data permissions'); +REPLACE INTO "sys_i18n" VALUES (201, 'dictData.datascope.custom', '自定数据权限', 'Customized Data Rights'); +REPLACE INTO "sys_i18n" VALUES (202, 'dictData.datascope.dept', '部门数据权限', 'Departmental Data Permissions'); +REPLACE INTO "sys_i18n" VALUES (203, 'dictData.datascope.deptAndChid', '部门及以下数据权限', 'Department and below'); +REPLACE INTO "sys_i18n" VALUES (204, 'dictData.datascope.self', '仅本人数据权限', 'Personal data access only'); +REPLACE INTO "sys_i18n" VALUES (205, 'dictData.noData', '没有可访问字典编码数据!', 'There is no accessible dictionary code data!'); +REPLACE INTO "sys_i18n" VALUES (206, 'dictData.errLabelExists', '操作数据【{name}】失败,该字典类型下标签名已存在', 'Failed to manipulate data [{name}], tag name already exists under this dictionary type!'); +REPLACE INTO "sys_i18n" VALUES (207, 'dictType.sys_user_sex', '用户性别', 'User Gender'); +REPLACE INTO "sys_i18n" VALUES (208, 'dictType.sys_show_hide', '菜单状态', 'Menu Status'); +REPLACE INTO "sys_i18n" VALUES (209, 'dictType.sys_normal_disable', '系统开关', 'System switches'); +REPLACE INTO "sys_i18n" VALUES (210, 'dictType.sys_job_status', '任务状态', 'Task Status'); +REPLACE INTO "sys_i18n" VALUES (211, 'dictType.sys_job_group', '任务分组', 'Task Grouping'); +REPLACE INTO "sys_i18n" VALUES (212, 'dictType.sys_yes_no', '系统是否', 'System or not'); +REPLACE INTO "sys_i18n" VALUES (213, 'dictType.sys_oper_type', '操作类型', 'Operation Type'); +REPLACE INTO "sys_i18n" VALUES (214, 'dictType.sys_common_status', '系统状态', 'System Status'); +REPLACE INTO "sys_i18n" VALUES (215, 'dictType.trace_type', '跟踪类型', 'Trace Types'); +REPLACE INTO "sys_i18n" VALUES (216, 'menu.tools.ps', '进程运行程序', 'Process Running Program'); +REPLACE INTO "sys_i18n" VALUES (217, 'dictType.alarm_status', '告警日志类型', 'Alarm Log Type'); +REPLACE INTO "sys_i18n" VALUES (218, 'menu.tools.net', '进程网络连接', 'Process Net Connection'); +REPLACE INTO "sys_i18n" VALUES (219, 'dictType.ne_version_status', '网元软件版本状态', 'Network element software version status'); +REPLACE INTO "sys_i18n" VALUES (220, 'dictType.sys_user_sex_remark', '用户性别列表', 'User gender list'); +REPLACE INTO "sys_i18n" VALUES (221, 'dictType.sys_show_hide_remark', '菜单状态列表', 'Menu Status List'); +REPLACE INTO "sys_i18n" VALUES (222, 'dictType.sys_normal_disable_remark', '系统开关列表', 'System switch list'); +REPLACE INTO "sys_i18n" VALUES (223, 'dictType.sys_job_status_remark', '任务状态列表', 'Task Status List'); +REPLACE INTO "sys_i18n" VALUES (224, 'dictType.sys_job_group_remark', '任务分组列表', 'Task Grouping List'); +REPLACE INTO "sys_i18n" VALUES (225, 'dictType.sys_yes_no_remark', '系统是否列表', 'System whether list'); +REPLACE INTO "sys_i18n" VALUES (226, 'dictType.sys_oper_type_remark', '操作类型列表', 'Operation type list'); +REPLACE INTO "sys_i18n" VALUES (227, 'dictType.sys_common_status_remark', '登录状态列表', 'Login Status List'); +REPLACE INTO "sys_i18n" VALUES (228, 'dictType.trace_type_remark', '跟踪类型', 'Trace Types'); +REPLACE INTO "sys_i18n" VALUES (229, 'dictType.alarm_status_remark', '告警日志状态类型', 'Alarm Log Status Type'); +REPLACE INTO "sys_i18n" VALUES (230, 'menu.trace.tshark', '信令分析', 'Signaling Analysis'); +REPLACE INTO "sys_i18n" VALUES (231, 'menu.trace.wireshark', '信令跟踪', 'Signaling Trace'); +REPLACE INTO "sys_i18n" VALUES (232, 'dictType.ne_version_status_remark', '网元软件版本状态', 'Network element software version status'); +REPLACE INTO "sys_i18n" VALUES (233, 'dictType.export.id', '字典编号', 'Dictionary Number'); +REPLACE INTO "sys_i18n" VALUES (234, 'dictType.export.name', '字典名称', 'Dictionary Name'); +REPLACE INTO "sys_i18n" VALUES (235, 'dictType.export.type', '字典类型', 'Dictionary Type'); +REPLACE INTO "sys_i18n" VALUES (236, 'dictType.export.status', '字典状态', 'Status'); +REPLACE INTO "sys_i18n" VALUES (237, 'dictType.sys_role_datascope', '系统角色数据范围', 'System Role Data Range'); +REPLACE INTO "sys_i18n" VALUES (238, 'dictType.sys_role_datascope_remark', '系统角色数据范围映射', 'System Role Data Range Mapping'); +REPLACE INTO "sys_i18n" VALUES (239, 'dictType.noData', '没有可访问字典类型数据!', 'There is no accessible dictionary type data!'); +REPLACE INTO "sys_i18n" VALUES (240, 'dictType.errNameExists', '操作字典【{name}】失败,字典名称已存在', 'Failed to manipulate dictionary [{name}], dictionary name already exists!'); +REPLACE INTO "sys_i18n" VALUES (241, 'dictType.errTypeExists', '操作字典【{name}】失败,字典类型已存在', 'Failed to manipulate dictionary [{name}], dictionary type already exists!'); +REPLACE INTO "sys_i18n" VALUES (242, 'dept.root', '系统', 'System'); +REPLACE INTO "sys_i18n" VALUES (243, 'dept.root.item1', '未分配', 'Unallocated'); +REPLACE INTO "sys_i18n" VALUES (244, 'dept.noData', '没有可访问部门数据!', 'There is no accessible department data!'); +REPLACE INTO "sys_i18n" VALUES (245, 'dept.errParentDelFlag', '上级部门【{name}】已删除,不允许新增', 'The parent department [{name}] has been deleted and is not allowed to be added.'); +REPLACE INTO "sys_i18n" VALUES (246, 'dept.errParentStatus', '上级部门【{name}】停用,不允许新增', 'Parent department [{name}] is deactivated, additions are not allowed!'); +REPLACE INTO "sys_i18n" VALUES (247, 'dept.errNameExists', '操作部门【{name}】失败,部门名称已存在', 'Manipulate department [{name}] failed, department name already exists!'); +REPLACE INTO "sys_i18n" VALUES (248, 'dept.errParentID', '操作部门【{name}】失败,上级部门不能是自己', 'Failed to operate department [{name}], the parent department cannot be itself.'); +REPLACE INTO "sys_i18n" VALUES (249, 'dept.errHasChildUse', '操作失败,该部门包含未停用的子部门数量:{num}', 'Operation failed, the department contains undeactivated sub-departments number: {num}'); +REPLACE INTO "sys_i18n" VALUES (250, 'dept.errHasUserUse', '不允许删除,部门已分配给用户数:{num}', 'Deletion is not allowed, number of users the department has been assigned to: {num}'); +REPLACE INTO "sys_i18n" VALUES (251, 'config.sys.user.initPassword', '用户管理-账号初始密码', 'User Management-Account Initial Password'); +REPLACE INTO "sys_i18n" VALUES (252, 'config.sys.account.captchaEnabled', '账号自助-验证码开关', 'Account self-help-Certification code switch'); +REPLACE INTO "sys_i18n" VALUES (253, 'config.sys.account.registerUser', '账号自助-是否开启用户注册功能', 'Account self-service-Whether to enable the user registration function'); +REPLACE INTO "sys_i18n" VALUES (254, 'config.sys.user.maxRetryCount', '用户管理-密码最大错误次数', 'User Management-Maximum number of password errors'); +REPLACE INTO "sys_i18n" VALUES (255, 'config.sys.user.lockTime', '用户管理-密码锁定时间', 'User Management-Password Lock Time'); +REPLACE INTO "sys_i18n" VALUES (256, 'config.monitor.sysResource.storeDays', '监控-系统资源-数据保留时长', 'Monitor-System Resources-Data retention time'); +REPLACE INTO "sys_i18n" VALUES (257, 'config.sys.logo.type', '系统设置-LOGO类型', 'System Settings-Logo Type'); +REPLACE INTO "sys_i18n" VALUES (258, 'config.sys.logo.filePathIcon', '系统设置-LOGO文件icon', 'System Settings-Logo File icon'); +REPLACE INTO "sys_i18n" VALUES (259, 'config.sys.logo.filePathBrand', '系统设置-LOGO文件brand', 'System Settings-Logo File Brand'); +REPLACE INTO "sys_i18n" VALUES (260, 'config.sys.loginBackground', '系统设置-登录界面背景', 'System Settings-Login Interface Background'); +REPLACE INTO "sys_i18n" VALUES (261, 'config.sys.title', '系统设置-系统名称', 'System Settings-System Name'); +REPLACE INTO "sys_i18n" VALUES (262, 'config.sys.copyright', '系统设置-版权声明', 'System Settings-Copyright Notice'); +REPLACE INTO "sys_i18n" VALUES (263, 'config.sys.user.initPasswordRemark', '导入用户初始化密码', 'Import user initialization password'); +REPLACE INTO "sys_i18n" VALUES (264, 'config.sys.account.captchaEnabledRemark', '是否开启验证码功能(true开启,false关闭)', 'Whether to enable the verification code function (true on, false off)'); +REPLACE INTO "sys_i18n" VALUES (265, 'config.sys.account.registerUserRemark', '是否开启注册用户功能(true开启,false关闭)', 'Whether to enable the function of registered users (true on, false off)'); +REPLACE INTO "sys_i18n" VALUES (266, 'config.sys.user.maxRetryCountRemark', '密码最大错误次数', 'Maximum number of password errors'); +REPLACE INTO "sys_i18n" VALUES (267, 'config.sys.user.lockTimeRemark', '密码锁定时间,单位分钟(默认10分钟)', 'Password lock time in minutes (default 10 minutes)'); +REPLACE INTO "sys_i18n" VALUES (268, 'config.monitor.sysResource.storeDaysRemark', '监控-系统资源-数据保留时长,单位天。根据当前日期,删除超过保留时长的日期数据信息。', 'Monitor-System Resources-Data retention time, in days. According to the current date, delete the date data information that exceeds the retention time.'); +REPLACE INTO "sys_i18n" VALUES (269, 'config.sys.logo.typeRemark', '全图:brand +小图:icon', 'Full image: brand +Small image: icon'); +REPLACE INTO "sys_i18n" VALUES (270, 'config.sys.logo.filePathIconRemark', '文件支持网络地址图片和内部上传的文件路径', 'File support for web address images and file paths for internal uploads'); +REPLACE INTO "sys_i18n" VALUES (271, 'config.sys.logo.filePathBrandRemark', '文件支持网络地址图片和内部上传的文件路径', 'File support for web address images and paths to internally uploaded files'); +REPLACE INTO "sys_i18n" VALUES (272, 'config.sys.loginBackgroundRemark', '文件支持网络地址图片和内部上传的文件路径,默认背景用#号', 'The file supports web address images and internal upload file paths with a # in the default background'); +REPLACE INTO "sys_i18n" VALUES (273, 'config.sys.titleRemark', '系统名称长度限制20位字符串', 'System name length limit of 20-digit string'); +REPLACE INTO "sys_i18n" VALUES (274, 'config.sys.copyrightRemark', '底脚固定条,左侧放置版权声明', 'Footer fixing strip with copyright notice on the left side'); +REPLACE INTO "sys_i18n" VALUES (275, 'config..export.id', '参数编号', 'ID'); +REPLACE INTO "sys_i18n" VALUES (276, 'config..export.name', '参数名称', 'Config Name'); +REPLACE INTO "sys_i18n" VALUES (277, 'config..export.key', '参数键名', 'Config Key'); +REPLACE INTO "sys_i18n" VALUES (278, 'config..export.value', '参数键值', 'Config Value'); +REPLACE INTO "sys_i18n" VALUES (279, 'config..export.type', '系统内置', 'Built In'); +REPLACE INTO "sys_i18n" VALUES (280, 'config..export.remark', '参数说明', 'Config Description'); +REPLACE INTO "sys_i18n" VALUES (281, 'config.sys.titleValue', 'Core Network', 'Core Network'); +REPLACE INTO "sys_i18n" VALUES (282, 'config.sys.copyrightValue', 'Copyright ©2025 Core Network', 'Copyright ©2025 Core Network'); +REPLACE INTO "sys_i18n" VALUES (283, 'config.noData', '没有可访问参数配置数据!', 'No parameter configuration data is accessible!'); +REPLACE INTO "sys_i18n" VALUES (284, 'config.errKey', '无效 key', 'Invalid key'); +REPLACE INTO "sys_i18n" VALUES (285, 'config.errValueEq', '变更状态与旧值相等!', 'Change state is equal to the old value!'); +REPLACE INTO "sys_i18n" VALUES (286, 'config.errKeyExists', '操作参数配置【{name}】失败,参数键名已存在', 'Failed to manipulate parameter configuration [{name}], parameter key name already exists!'); +REPLACE INTO "sys_i18n" VALUES (287, 'config.errDelete', '删除参数配置信息失败!', 'Deletion of parameter configuration information failed!'); +REPLACE INTO "sys_i18n" VALUES (288, 'config.errType', '操作含有内置参数,禁止删除!', 'The operation contains built-in parameters and deletion is prohibited!'); +REPLACE INTO "sys_i18n" VALUES (289, 'job.monitor_sys_resource', '监控-系统资源', 'Monitor-System Resources'); +REPLACE INTO "sys_i18n" VALUES (290, 'job.monitor_sys_resource_remark', '系统资源CPU/IO/Netword收集 +interval单位分钟,平均分钟资源情况 +注:请根据cron表达式的时间单位分钟,传入参数interva值', 'System Resource CPU/IO/Netword Collection +interval unit minutes, average minute resource situation +Note: Please pass the value of the parameter interva according to the time unit minutes of the cron expression'); +REPLACE INTO "sys_i18n" VALUES (291, 'job.delete_ne_config_backup', '删除-过期配置文件备份', 'Delete-Expired NE ETC Backup File'); +REPLACE INTO "sys_i18n" VALUES (292, 'job.delete_ne_config_backup_remark', 'storeDays:表示保留最近天数的数据记录', 'storeDays: indicates that the most recent days of data records are kept.'); +REPLACE INTO "sys_i18n" VALUES (293, 'job.delete_alarm_record', '删除-过期告警记录', 'Delete-Expired Alarm Records'); +REPLACE INTO "sys_i18n" VALUES (294, 'job.delete_alarm_record_remark', 'storeDays:表示保留最近天数的数据记录 +storeNum:保留数量,默认保留7个', 'storeDays: indicates that the most recent days of data records are kept. +storeNum: the number of reservations, the default reservation is 7.'); +REPLACE INTO "sys_i18n" VALUES (295, 'job.delete_kpi_record', '删除-过期指标记录', 'Delete-Expired KPI Records'); +REPLACE INTO "sys_i18n" VALUES (296, 'job.delete_kpi_record_remark', 'storeDays:表示保留最近天数的数据记录 +neList:表示匹配的网元类型', 'storeDays: Indicates the most recent days of data records retained +neList: Indicates the type of network elements matched'); +REPLACE INTO "sys_i18n" VALUES (297, 'menu.neData.backupData', '导出文件', 'Exponted File'); +REPLACE INTO "sys_i18n" VALUES (298, 'config.sys.user.passwordPolicyNot', '未配置密码策略', 'Password policy not configured'); +REPLACE INTO "sys_i18n" VALUES (299, 'job.export.jobID', '任务编号', 'ID'); +REPLACE INTO "sys_i18n" VALUES (300, 'job.export.jobName', '任务名称', 'Name'); +REPLACE INTO "sys_i18n" VALUES (301, 'job.export.jobGroupName', '任务组名', 'Group'); +REPLACE INTO "sys_i18n" VALUES (302, 'job.export.invokeTarget', '调用目标', 'Invoke'); +REPLACE INTO "sys_i18n" VALUES (303, 'job.export.targetParams', '传入参数', 'Incoming Parameters'); +REPLACE INTO "sys_i18n" VALUES (304, 'job.export.cronExpression', 'cron表达式', 'Cron'); +REPLACE INTO "sys_i18n" VALUES (305, 'job.export.status', '状态', 'Status'); +REPLACE INTO "sys_i18n" VALUES (306, 'job.export.remark', '备注说明', 'Description'); +REPLACE INTO "sys_i18n" VALUES (307, 'job.export.jobLogID', '任务日志编号', 'ID'); +REPLACE INTO "sys_i18n" VALUES (308, 'job.export.jobLogStatus', '任务日志状态', 'Status'); +REPLACE INTO "sys_i18n" VALUES (309, 'job.export.jobLogTime', '任务日志时间', 'Time'); +REPLACE INTO "sys_i18n" VALUES (310, 'job.noData', '没有可访问调度任务数据!', 'There is no accessible scheduling task data!'); +REPLACE INTO "sys_i18n" VALUES (311, 'job.errTargetParams', '操作调度任务【{name}】失败,任务传入参数json字符串不正确', 'Failed to operate scheduling task [{name}] with incorrect task incoming parameter json string!'); +REPLACE INTO "sys_i18n" VALUES (312, 'job.errCronExpression', '操作调度任务【{name}】失败,Cron表达式不正确', 'Scheduled task [{name}] failed with incorrect Cron expression!'); +REPLACE INTO "sys_i18n" VALUES (313, 'job.errJobExists', '调度任务新增【{name}】失败,同任务组内有相同任务名称', 'Failed to add a new task [{name}] to a scheduling task, same task name in the same task group'); +REPLACE INTO "sys_i18n" VALUES (314, 'job.statusEq', '变更状态与旧值相等!', 'The change state is equal to the old value!'); +REPLACE INTO "sys_i18n" VALUES (315, 'role.system', '系统', 'System'); +REPLACE INTO "sys_i18n" VALUES (316, 'role.admin', '管理人员', 'Administrator'); +REPLACE INTO "sys_i18n" VALUES (317, 'role.operator', '运维人员', 'Operators'); +REPLACE INTO "sys_i18n" VALUES (318, 'role.monitor', '监控人员', 'Monitor'); +REPLACE INTO "sys_i18n" VALUES (319, 'role.vistor', '普通用户', 'General Users'); +REPLACE INTO "sys_i18n" VALUES (320, 'role.systemRemark', '系统,无法修改删除', 'System, cannot modify or delete'); +REPLACE INTO "sys_i18n" VALUES (321, 'role.adminRemark', '管理人员 可以对设备进行任何操作', 'Administrators can perform any operation on the device'); +REPLACE INTO "sys_i18n" VALUES (322, 'role.operatorRemark', '运维人员 可以从设备读取数据,并对设备进行配置,但是不能对设备进行软件升级操作。', 'Operation and maintenance personnel can read data from the device and configure the device, but cannot perform software upgrade operations on the device.'); +REPLACE INTO "sys_i18n" VALUES (323, 'role.monitorRemark', '监控人员 只能从设备读取数据,而不能对设备进行任何设置', 'Monitoring personnel Can only read data from the device, but cannot make any settings on the device'); +REPLACE INTO "sys_i18n" VALUES (324, 'role.vistorRemark', '普通用户 只可看系统相关信息', 'Ordinary users can only see system-related information'); +REPLACE INTO "sys_i18n" VALUES (325, 'role.export.id', '角色编号', 'Role Number'); +REPLACE INTO "sys_i18n" VALUES (326, 'role.export.name', '角色名称 ', 'Role Name'); +REPLACE INTO "sys_i18n" VALUES (327, 'role.export.key', '角色键值', 'Role Key'); +REPLACE INTO "sys_i18n" VALUES (328, 'role.export.sort', '角色顺序', 'Role Sort'); +REPLACE INTO "sys_i18n" VALUES (329, 'role.export.dataScope', '角色数据范围', 'Role Data Range'); +REPLACE INTO "sys_i18n" VALUES (330, 'role.export.status', '角色状态', 'Role Status'); +REPLACE INTO "sys_i18n" VALUES (331, 'role.noData', '没有可访问角色数据!', 'There is no accessible role data!'); +REPLACE INTO "sys_i18n" VALUES (332, 'role.statusEq', '变更状态与旧值相等!', 'The change status is equal to the old value!'); +REPLACE INTO "sys_i18n" VALUES (333, 'role.errNameExists', '操作角色【{name}】失败,角色名称已存在', 'Manipulating role [{name}] failed, role name already exists!'); +REPLACE INTO "sys_i18n" VALUES (334, 'role.errKeyExists', '操作角色【{name}】失败,角色键值已存在', 'Failed to manipulate role [{name}], role key already exists!'); +REPLACE INTO "sys_i18n" VALUES (335, 'post.admin', '系统', 'Systems'); +REPLACE INTO "sys_i18n" VALUES (336, 'post.operator', '管理', 'Management'); +REPLACE INTO "sys_i18n" VALUES (337, 'post.monitor', '运维', 'Operation & Maintenance'); +REPLACE INTO "sys_i18n" VALUES (338, 'post.visitor', '监控', 'Monitoring'); +REPLACE INTO "sys_i18n" VALUES (339, 'post.export.id', '岗位编号 ', 'Position Number'); +REPLACE INTO "sys_i18n" VALUES (340, 'post.export.code', '岗位编码', 'Position Code'); +REPLACE INTO "sys_i18n" VALUES (341, 'post.export.name', '岗位名称', 'Position Name'); +REPLACE INTO "sys_i18n" VALUES (342, 'post.export.sort', '岗位排序', 'Position Sort'); +REPLACE INTO "sys_i18n" VALUES (343, 'post.export.status', '岗位状态', 'Position Status'); +REPLACE INTO "sys_i18n" VALUES (344, 'post.noData', '没有可访问岗位数据!', 'There is no accessible post data!'); +REPLACE INTO "sys_i18n" VALUES (345, 'post.errNameExists', '操作岗位【{name}】失败,岗位名称已存在已存在', 'Failed to manipulate post [{name}], post name already exists already exists'); +REPLACE INTO "sys_i18n" VALUES (346, 'post.errCodeExists', '操作角色【{name}】失败,角色键值已存在', 'Failed to manipulate role [{name}], role key already exists.'); +REPLACE INTO "sys_i18n" VALUES (347, 'user.export.id', '用户编号', 'User Number'); +REPLACE INTO "sys_i18n" VALUES (348, 'user.export.name', '登录账号', 'Account'); +REPLACE INTO "sys_i18n" VALUES (349, 'user.export.nick', '用户昵称', 'Nick Name'); +REPLACE INTO "sys_i18n" VALUES (350, 'user.export.email', '电子邮箱', 'E-Mail'); +REPLACE INTO "sys_i18n" VALUES (351, 'user.export.phone', '手机号码', 'Cell phone number'); +REPLACE INTO "sys_i18n" VALUES (352, 'user.export.sex', '用户性别', 'Gender'); +REPLACE INTO "sys_i18n" VALUES (353, 'user.export.status', '用户状态', 'Status'); +REPLACE INTO "sys_i18n" VALUES (354, 'user.export.deptID', '部门编号', 'Department number'); +REPLACE INTO "sys_i18n" VALUES (355, 'user.export.deptName', '部门名称', 'Department'); +REPLACE INTO "sys_i18n" VALUES (356, 'user.export.deptLeader', '部门负责人', 'Department Head'); +REPLACE INTO "sys_i18n" VALUES (357, 'user.export.loginIP', '用户登录IP', 'Login Address'); +REPLACE INTO "sys_i18n" VALUES (358, 'user.export.loginDate', '用户登录时间', 'Login Time'); +REPLACE INTO "sys_i18n" VALUES (359, 'user.noData', '没有可访问用户数据!', 'No accessible user data!'); +REPLACE INTO "sys_i18n" VALUES (360, 'user.statusEq', '变更状态与旧值相等!', 'The change status is equal to the old value!'); +REPLACE INTO "sys_i18n" VALUES (361, 'user.errPasswdOld', '修改密码失败,旧密码错误', 'Change password failed, old password is wrong'); +REPLACE INTO "sys_i18n" VALUES (362, 'user.errPasswdEqOld', '新密码不能与旧密码相同', 'New password cannot be the same as the old one'); +REPLACE INTO "sys_i18n" VALUES (363, 'config.sys.user.passwordPolicyError', '密码至少{minLength}位,至少包含{specialChars}个特殊字符和至少{uppercase}个大写字母和至少{lowercase}个小写字母', 'Passwords are at least {minLength} digits long and contain at least {specialChars} special characters and at least {uppercase} uppercase letter and at least {lowercase} lowercase letter.'); +REPLACE INTO "sys_i18n" VALUES (364, 'user.errEmailFormat', '操作用户【{name}】失败,邮箱格式错误', 'Failed to operate user [{name}], mailbox format error'); +REPLACE INTO "sys_i18n" VALUES (365, 'user.errEmailExists', '操作用户【{name}】失败,邮箱已存在', 'Failed to operate user [{name}], mailbox already exists.'); +REPLACE INTO "sys_i18n" VALUES (366, 'user.errPhoneFormat', '操作用户【{name}】失败,手机号码格式错误', 'Failed to operate user [{name}], cell phone number format is wrong.'); +REPLACE INTO "sys_i18n" VALUES (367, 'user.errPhoneExists', '操作用户【{name}】失败,手机号码已存在', 'Failed to operate user [{name}], cell phone number already exists.'); +REPLACE INTO "sys_i18n" VALUES (368, 'user.errNameExists', '操作用户【{name}】失败,登录账号已存在', 'Failed to operate user [{name}], login account already exists.'); +REPLACE INTO "sys_i18n" VALUES (369, 'user.import.mustItem', '表格中必填列表项,{text}', 'Required list item in form, {text}'); +REPLACE INTO "sys_i18n" VALUES (370, 'user.import.phoneExist', '用户编号:{id} 手机号码 {phone} 已存在', 'User ID: {id} cell phone number {phone} Existing'); +REPLACE INTO "sys_i18n" VALUES (371, 'user.import.phoneFormat', '用户编号:{id} 手机号码 {phone} 格式错误', 'User ID: {id} cell phone number {phone} Wrong format'); +REPLACE INTO "sys_i18n" VALUES (372, 'user.import.emailExist', '用户编号:{id} 用户邮箱:{email} 已存在', 'User ID: {id} User Email: {email} Existing'); +REPLACE INTO "sys_i18n" VALUES (373, 'user.import.emailFormat', '用户编号:{id} 用户邮箱:{email} 格式错误', 'User ID: {id} Email: {email} Wrong Format'); +REPLACE INTO "sys_i18n" VALUES (374, 'user.import.success', '用户编号:{id} 登录名称:{name} 导入成功', 'User ID:{id} Login name:{name} Imported successfully!'); +REPLACE INTO "sys_i18n" VALUES (375, 'user.import.fail', '用户编号:{id} 登录名称:{name} 导入失败', 'User ID: {id} Login name: {name} Import failed'); +REPLACE INTO "sys_i18n" VALUES (376, 'user.import.successUpdate', '用户编号:{id} 登录名称:{name} 更新成功', 'User ID: {id} Login name: {name} Update success'); +REPLACE INTO "sys_i18n" VALUES (377, 'user.import.failUpdate', '用户编号:{id} 登录名称:{name} 更新失败', 'User ID: {id} Login Name: {name} Update Failed'); +REPLACE INTO "sys_i18n" VALUES (378, 'user.import.failTip', '很抱歉,导入失败!共 {num} 条数据格式不正确,错误如下:', 'Sorry, the import failed! A total of {num} entries were not formatted correctly, the error is below:'); +REPLACE INTO "sys_i18n" VALUES (379, 'user.import.successTip', '恭喜您,数据已全部导入成功!共 {num} 条,数据如下:', 'Congratulations, the data has been imported successfully! There are {num} entries with the following data:'); +REPLACE INTO "sys_i18n" VALUES (380, 'app.common.err403', '无权访问 {method} {requestURI}', 'Unauthorized access {method} {requestURI}'); +REPLACE INTO "sys_i18n" VALUES (381, 'app.common.err401', '无效身份授权', 'Invalid authorization'); +REPLACE INTO "sys_i18n" VALUES (382, 'app.common.err400', '参数错误', 'Parameter error'); +REPLACE INTO "sys_i18n" VALUES (383, 'app.common.exportEmpty', '导出数据记录为空', 'Export data record is empty'); +REPLACE INTO "sys_i18n" VALUES (384, 'app.common.errOperateAdmin', '不允许操作内置用户', 'Built-in users are not allowed to operate'); +REPLACE INTO "sys_i18n" VALUES (385, 'app.common.errOperateRole', '不允许操作内置角色', 'Built-in roles are not allowed to be operated'); +REPLACE INTO "sys_i18n" VALUES (386, 'app.common.deleteSuccess', '删除成功:{num}', 'Deleted successfully: {num}'); +REPLACE INTO "sys_i18n" VALUES (387, 'app.common.loginSuccess', '登录成功', 'Login Success'); +REPLACE INTO "sys_i18n" VALUES (388, 'app.common.logoutSuccess', '注销成功', 'Logout Successful'); +REPLACE INTO "sys_i18n" VALUES (389, 'app.common.errUnlock', '该用户未被锁定', 'The user is not locked'); +REPLACE INTO "sys_i18n" VALUES (390, 'app.common.noLoginUser', '登录用户信息无效', 'Invalid login user information'); +REPLACE INTO "sys_i18n" VALUES (391, 'app.common.rateLimitTip', '访问过于频繁,请稍候再试', 'Access too often, please try again later'); +REPLACE INTO "sys_i18n" VALUES (392, 'log.operate.export.id', '操作编号', 'Log ID'); +REPLACE INTO "sys_i18n" VALUES (393, 'log.operate.export.title', '模块名称', 'Module Name'); +REPLACE INTO "sys_i18n" VALUES (394, 'log.operate.export.businessType', '业务类型', 'Business Type'); +REPLACE INTO "sys_i18n" VALUES (395, 'log.operate.export.method', '操作方法', 'Operation Method'); +REPLACE INTO "sys_i18n" VALUES (396, 'log.operate.export.requestMethod', '请求方式 ', 'Request Method'); +REPLACE INTO "sys_i18n" VALUES (397, 'log.operate.export.operatorType', '操作类型', 'Operation Type'); +REPLACE INTO "sys_i18n" VALUES (398, 'log.operate.export.operName', '操作人员', 'Operator'); +REPLACE INTO "sys_i18n" VALUES (399, 'log.operate.export.deptName', '操作人员部门名称', 'Operator Department Name'); +REPLACE INTO "sys_i18n" VALUES (400, 'log.operate.export.url', '请求链接地址', 'Request URL'); +REPLACE INTO "sys_i18n" VALUES (401, 'log.operate.export.ip', '请求主机 ', 'Request Host'); +REPLACE INTO "sys_i18n" VALUES (402, 'log.operate.export.location', '请求地址', 'Request Address'); +REPLACE INTO "sys_i18n" VALUES (403, 'log.operate.export.param', '请求参数', 'Request Parameters'); +REPLACE INTO "sys_i18n" VALUES (404, 'log.operate.export.msg', '操作信息', 'Operation Information'); +REPLACE INTO "sys_i18n" VALUES (405, 'log.operate.export.status', '操作状态', 'Status'); +REPLACE INTO "sys_i18n" VALUES (406, 'log.operate.export.costTime', '消耗时间(毫秒)', 'Time Consumption (ms)'); +REPLACE INTO "sys_i18n" VALUES (407, 'log.operate.export.operTime', '操作时间', 'Time'); +REPLACE INTO "sys_i18n" VALUES (408, 'log.login.export.id', '记录编号', 'Log ID'); +REPLACE INTO "sys_i18n" VALUES (409, 'log.login.export.userName', '登录账号', 'Login Account'); +REPLACE INTO "sys_i18n" VALUES (410, 'log.login.export.status', '登录状态', 'Status'); +REPLACE INTO "sys_i18n" VALUES (411, 'log.login.export.ip', '登录地址', 'Login Address'); +REPLACE INTO "sys_i18n" VALUES (412, 'log.login.export.location', '登录地点', 'Login Location'); +REPLACE INTO "sys_i18n" VALUES (413, 'log.login.export.browser', '浏览器', 'Browser'); +REPLACE INTO "sys_i18n" VALUES (414, 'log.login.export.os', '操作系统', 'Operating System'); +REPLACE INTO "sys_i18n" VALUES (415, 'log.login.export.msg', '登录信息', 'Login Information'); +REPLACE INTO "sys_i18n" VALUES (416, 'log.login.export.time', '登录时间', 'Login Time'); +REPLACE INTO "sys_i18n" VALUES (417, 'trace.tcpdump.noData', '找不到 {type} {id} 对应网元信息', 'Can it find {type} {id} information of the corresponding network element.'); +REPLACE INTO "sys_i18n" VALUES (418, 'register.errUsername', '账号不能以数字开头,可包含大写小写字母,数字,且不少于5位', 'The account number cannot start with a number, but can contain upper and lower case letters, numbers, and not less than 5 digits.'); +REPLACE INTO "sys_i18n" VALUES (419, 'login.errPasswdExpire', '登录密码已过期', 'Login password has expired'); +REPLACE INTO "sys_i18n" VALUES (420, 'register.errPasswdNotEq', '用户确认输入密码不一致', 'User confirms password inconsistency'); +REPLACE INTO "sys_i18n" VALUES (421, 'register.success', '注册成功', 'Successful registration'); +REPLACE INTO "sys_i18n" VALUES (422, 'register.successMsg', '{name} 注册成功 {id}', '{name} Register Successful {id}'); +REPLACE INTO "sys_i18n" VALUES (423, 'log.operate.title.sysJobLog', '调度任务日志', 'Scheduling Task Logs'); +REPLACE INTO "sys_i18n" VALUES (424, 'log.operate.title.sysJob', '调度任务', 'Scheduling Tasks'); +REPLACE INTO "sys_i18n" VALUES (425, 'log.operate.title.tcpdump', '信令抓包', 'Signaling Capture'); +REPLACE INTO "sys_i18n" VALUES (426, 'log.operate.title.sysConfig', '参数配置', 'Parameter Configuration'); +REPLACE INTO "sys_i18n" VALUES (427, 'log.operate.title.sysDept', '部门', 'Sector'); +REPLACE INTO "sys_i18n" VALUES (428, 'log.operate.title.sysDictData', '字典数据', 'Dictionary Data'); +REPLACE INTO "sys_i18n" VALUES (429, 'log.operate.title.sysDictType', '字典类型', 'Dictionary type'); +REPLACE INTO "sys_i18n" VALUES (430, 'log.operate.title.sysMenu', '菜单', 'Menu'); +REPLACE INTO "sys_i18n" VALUES (431, 'log.operate.title.sysPost', '岗位', 'Positions'); +REPLACE INTO "sys_i18n" VALUES (432, 'log.operate.title.sysProfile', '个人信息', 'Personal Information'); +REPLACE INTO "sys_i18n" VALUES (433, 'log.operate.title.sysProfileAvatar', '个人头像', 'Personal avatar'); +REPLACE INTO "sys_i18n" VALUES (434, 'log.operate.title.sysRole', '角色', 'Roles'); +REPLACE INTO "sys_i18n" VALUES (435, 'log.operate.title.sysUser', '用户', 'User'); +REPLACE INTO "sys_i18n" VALUES (436, 'log.operate.title.sysLogOper', '操作日志记录', 'Operation Logging'); +REPLACE INTO "sys_i18n" VALUES (437, 'log.operate.title.sysLogLogin', '登录日志记录', 'Operation Logging'); +REPLACE INTO "sys_i18n" VALUES (438, 'login.errNameOrPasswd', '用户不存在或密码错误', 'User does not exist or password is wrong'); +REPLACE INTO "sys_i18n" VALUES (439, 'login.errDelFlag', '对不起,您的账号已被删除', 'Sorry, your account has been deleted'); +REPLACE INTO "sys_i18n" VALUES (440, 'login.errStatus', '对不起,您的帐户已被禁用', 'Sorry, your account has been disabled'); +REPLACE INTO "sys_i18n" VALUES (441, 'login.errRetryPasswd', '密码输入错误多次,帐户已被锁定', 'Password was entered incorrectly several times, account has been locked'); +REPLACE INTO "sys_i18n" VALUES (442, 'captcha.err', '验证码错误', 'Captcha Error'); +REPLACE INTO "sys_i18n" VALUES (443, 'captcha.errValid', '验证码已失效', 'Captcha is invalid'); +REPLACE INTO "sys_i18n" VALUES (444, 'app.common.noUaOsBrowser', '未知 未知', 'Unknown Unknown'); +REPLACE INTO "sys_i18n" VALUES (445, 'app.common.noIPregion', '内网', 'Intranet'); +REPLACE INTO "sys_i18n" VALUES (446, 'app.common.unknown', '未知', 'Unknown'); +REPLACE INTO "sys_i18n" VALUES (447, 'app.common.noNEInfo', '未找到匹配网元信息', 'No matching network element information found'); +REPLACE INTO "sys_i18n" VALUES (448, 'ne.udm.errImportUserAuthFileFormat', '请上传.csv或.txt的格式文件。英文逗号分割txt格式:imsi, ki, algo, amf, opc', 'Please upload a file in the format of. csv or. txt. English comma separated txt format: imsi, ki, algo, amf, opc'); +REPLACE INTO "sys_i18n" VALUES (449, 'ne.udm.errExportType', '导出文件类型支持CSV和txt', 'Export file types support CSV and txt'); +REPLACE INTO "sys_i18n" VALUES (450, 'ne.udm.errImportUserSubFileFormat', '请上传.csv或.txt的格式文件。英文逗号分割txt格式:imsi, msisdn, ambr, nssai, arfb, sar, rat, cn, smf_sel, sm_dat, eps_dat', 'Please upload files in .csv or .txt format. English comma-separated txt format: imsi, msisdn, ambr, nssai, arfb, sar, rat, cn, smf_sel, sm_dat, eps_dat'); +REPLACE INTO "sys_i18n" VALUES (451, 'log.operate.title.udmAuth', 'UDM鉴权用户', 'UDM Authentication'); +REPLACE INTO "sys_i18n" VALUES (452, 'log.operate.title.udmSub', 'UDM签约用户', 'UDM Subscriber'); +REPLACE INTO "sys_i18n" VALUES (453, 'dictType.active_alarm_type', '活动告警类型', 'Event Alarm Types'); +REPLACE INTO "sys_i18n" VALUES (454, 'dictType.active_alarm_type_remark', '活动告警类型列表', 'List of Active Alarm Types'); +REPLACE INTO "sys_i18n" VALUES (455, 'dictData.active_alarm_type.communication', '通信告警', 'Communication Alarm'); +REPLACE INTO "sys_i18n" VALUES (456, 'dictData.active_alarm_type.equipment', '设备告警', 'Equipment Alarm'); +REPLACE INTO "sys_i18n" VALUES (457, 'dictData.active_alarm_type.processing', '处理错误', 'Processing Failure Alarm'); +REPLACE INTO "sys_i18n" VALUES (458, 'dictData.active_alarm_type.environmental', '环境告警', 'Environmental Alarm'); +REPLACE INTO "sys_i18n" VALUES (459, 'dictData.active_alarm_type.qualityOfService', '服务质量', 'Quality of Service Alarm'); +REPLACE INTO "sys_i18n" VALUES (460, 'dictType.active_clear_type', '告警清除类型', 'Alarm Clearing Types'); +REPLACE INTO "sys_i18n" VALUES (461, 'dictType.active_clear_type_remark', '告警清除类型列表', 'List of Alarm Clearing Types'); +REPLACE INTO "sys_i18n" VALUES (462, 'dictData.active_clear_type.notCleared', '告警未清除', 'Not cleared'); +REPLACE INTO "sys_i18n" VALUES (463, 'dictData.active_clear_type.hand', '手动清除', 'Manually cleared'); +REPLACE INTO "sys_i18n" VALUES (464, 'dictData.active_clear_type.auto', '自动清除', 'Automatically cleared'); +REPLACE INTO "sys_i18n" VALUES (465, 'dictType.active_ack_state', '告警确认类型', 'Alarm Acknowledgement Types'); +REPLACE INTO "sys_i18n" VALUES (466, 'dictType.active_ack_state_remark', '告警确认类型列表', 'Alarm Acknowledgement Type List'); +REPLACE INTO "sys_i18n" VALUES (467, 'dictData.active_ack_state.unconfirmed', '未确认', 'Not Confirm'); +REPLACE INTO "sys_i18n" VALUES (468, 'dictData.active_ack_state.confirmed', '已确认', 'Confirm'); +REPLACE INTO "sys_i18n" VALUES (469, 'dictType.active_alarm_severity', '严重程度', 'Severity'); +REPLACE INTO "sys_i18n" VALUES (470, 'dictType.active_alarm_severity_remark', '严重程度列表', 'Severity List'); +REPLACE INTO "sys_i18n" VALUES (471, 'dictData.active_alarm_severity.critical', '严重告警', 'Critical'); +REPLACE INTO "sys_i18n" VALUES (472, 'dictData.active_alarm_severity.major', '主要告警', 'Major'); +REPLACE INTO "sys_i18n" VALUES (473, 'dictData.active_alarm_severity.minor', '次要告警', 'Minor'); +REPLACE INTO "sys_i18n" VALUES (474, 'dictData.active_alarm_severity.warning', '警告告警', 'Warning'); +REPLACE INTO "sys_i18n" VALUES (475, 'dictData.active_alarm_severity.event', '事件告警', 'Event'); +REPLACE INTO "sys_i18n" VALUES (476, 'config.sys.officialUrl', '系统设置-官网链接', 'System Settings - Official Website Links'); +REPLACE INTO "sys_i18n" VALUES (477, 'config.sys.helpDoc', '系统设置-系统使用文档', 'System Settings-System Documentation'); +REPLACE INTO "sys_i18n" VALUES (478, 'config.sys.officialUrlRemark', '默认无地址用#号', 'Default no address with # sign'); +REPLACE INTO "sys_i18n" VALUES (479, 'config.sys.helpDocRemark', '静态文件目录地址,使用{language}区分语言文件', 'Static file directory address, use {language} to distinguish language files'); +REPLACE INTO "sys_i18n" VALUES (480, 'log.operate.title.neAction', '网元处理', 'Network Element Processing'); +REPLACE INTO "sys_i18n" VALUES (481, 'log.operate.title.helpDoc', '系统使用文档', 'System Usage Documentation'); +REPLACE INTO "sys_i18n" VALUES (482, 'menu.ueUser.n3iwf', 'N3IWF在线用户', 'N3IWF Online User'); +REPLACE INTO "sys_i18n" VALUES (483, 'menu.neData.pcfSub', '用户策略控制信息', 'User PCC Information'); +REPLACE INTO "sys_i18n" VALUES (484, 'menu.system.user.editRole', '修改用户角色', 'Modifying User Role'); +REPLACE INTO "sys_i18n" VALUES (485, 'config.sys.i18nOpen', '国际化切换', 'Internationalization Switching'); +REPLACE INTO "sys_i18n" VALUES (486, 'config.sys.i18nDefault', '国际化默认语言', 'Internationalization Default Language'); +REPLACE INTO "sys_i18n" VALUES (487, 'user.export.role', '用户角色', 'Role'); +REPLACE INTO "sys_i18n" VALUES (488, 'menu.system.setting.i18n', '国际化切换', 'Internationalization Switch'); +REPLACE INTO "sys_i18n" VALUES (489, 'menu.system.setting.i18nRemark', '国际化多语言的切换选择', 'Internationalized multilingual switching options'); +REPLACE INTO "sys_i18n" VALUES (490, 'dictType.index_status', '首页状态', 'Home Status'); +REPLACE INTO "sys_i18n" VALUES (491, 'dictType.index_status_remark', '首页的网元状态颜色', 'Network element status colors on the home page'); +REPLACE INTO "sys_i18n" VALUES (492, 'dictType.index_status.normal', '正常', 'Normal'); +REPLACE INTO "sys_i18n" VALUES (493, 'dictType.index_status.abnormal', '异常', 'Abnormal'); +REPLACE INTO "sys_i18n" VALUES (494, 'menu.log.neFile', '网元日志文件', 'NE Log File'); +REPLACE INTO "sys_i18n" VALUES (495, 'menu.dashboard.overview.smfUeNum', '展示数据会话数', 'Display data session number'); +REPLACE INTO "sys_i18n" VALUES (496, 'menu.dashboard.overview.imsUeNum', '展示语音会话数', 'Display the number of voice sessions'); +REPLACE INTO "sys_i18n" VALUES (497, 'menu.dashboard.overview.gnbBase', '展示5G基站在线信息', 'Display 5G base station online information'); +REPLACE INTO "sys_i18n" VALUES (498, 'menu.dashboard.overview.enbBase', '展示4G基站在线信息', 'Display 4G base station online information'); +REPLACE INTO "sys_i18n" VALUES (499, 'job.ne_alarm_state_check', '网元告警-状态检查', 'NE Alarm-Health State Check'); +REPLACE INTO "sys_i18n" VALUES (500, 'job.ne_alarm_state_check_remark', '检查网元的健康状况,在出现异常时发出警报。 + +Alarm type: +CommunicationAlarm=1 +EquipmentAlarm=2 +ProcessingFailure=3 +EnvironmentalAlarm=4 +QualityOfServiceAlarm=5 + +Severity: +Critical=1 +Major=2 +Minor=3 +Warning=4', 'Checks the health of network elements and sends alerts in case of anomalies. + +Alarm type: +CommunicationAlarm=1 +EquipmentAlarm=2 +ProcessingFailure=3 +EnvironmentalAlarm=4 +QualityOfServiceAlarm=5 + +Severity: +Critical=1 +Major=2 +Minor=3 +Warning=4'); +REPLACE INTO "sys_i18n" VALUES (501, 'menu.neUser.nssf', 'NSSF在线订阅数', 'NSSF Subscription Info'); +REPLACE INTO "sys_i18n" VALUES (502, 'menu.neUser.nssfAmf', 'NSSF可用的注册AMF', 'NSSF Available AMFs'); +REPLACE INTO "sys_i18n" VALUES (503, 'menu.monitor.topology', '拓扑信息', 'Topology Info'); +REPLACE INTO "sys_i18n" VALUES (504, 'menu.monitor.topologyBuild', '拓扑图组编辑', 'Topological Graph Build'); +REPLACE INTO "sys_i18n" VALUES (505, 'log.operate.title.chartGraph', '拓扑图组', 'Topological Graph'); +REPLACE INTO "sys_i18n" VALUES (506, 'menu.monitor.topologyArchitecture', '网元拓扑组网', 'NE System Topology'); +REPLACE INTO "sys_i18n" VALUES (507, 'menu.alarm', '告警', 'Alarm'); +REPLACE INTO "sys_i18n" VALUES (508, 'menu.topology', '拓扑', 'Topology'); +REPLACE INTO "sys_i18n" VALUES (509, 'config.sys.lockTime', '系统设置-锁屏超时时长', 'System Settings - Screen Lock Timeout Duration'); +REPLACE INTO "sys_i18n" VALUES (510, 'config.sys.lockTimeRemark', '无操作时锁屏超时时长,单位(秒)。0表示无锁屏超时', 'Timeout of lock screen when no operation, unit (sec), 0 means no timeout of lock screen'); +REPLACE INTO "sys_i18n" VALUES (511, 'sys.account.captchaType', '账号自助-验证码类型', 'Account Self Service - Captcha Type'); +REPLACE INTO "sys_i18n" VALUES (512, 'sys.account.captchaTypeRemark', '使用验证码类型(math数值计算,char字符验证)', 'Using CAPTCHA types (math numeric calculation, char character validation)'); +REPLACE INTO "sys_i18n" VALUES (513, 'menu.dashboard', '仪表盘', 'Dashboard'); +REPLACE INTO "sys_i18n" VALUES (514, 'menu.dashboard.overview', '总览', 'Overview'); +REPLACE INTO "sys_i18n" VALUES (515, 'menu.dashboard.imsCDR', '语音话单', 'Voice CDR'); +REPLACE INTO "sys_i18n" VALUES (516, 'dictType.cdr_sip_code', 'IMS-Voice-SIP响应代码类别类型', 'IMS-Voice-SIP Response Code Category Type'); +REPLACE INTO "sys_i18n" VALUES (517, 'dictType.cdr_call_type', 'IMS-呼叫类型', 'IMS-Call Type'); +REPLACE INTO "sys_i18n" VALUES (518, 'dictType.ue_auth_code', 'UE 事件认证代码类型', 'UE Event Authentication Code Type'); +REPLACE INTO "sys_i18n" VALUES (519, 'dictType.ue_event_type', 'UE 事件类型', 'UE Event Type'); +REPLACE INTO "sys_i18n" VALUES (520, 'dictData.cdr_sip_code.200', '200 正常通话', '200 OK'); +REPLACE INTO "sys_i18n" VALUES (521, 'dictData.cdr_sip_code.403', '403 禁止访问', '403 Forbidden'); +REPLACE INTO "sys_i18n" VALUES (522, 'dictData.cdr_sip_code.408', '408 请求超时', '408 Request Timeout'); +REPLACE INTO "sys_i18n" VALUES (523, 'dictData.cdr_sip_code.500', '500 内部服务器错误', '500 Internal Server Error'); +REPLACE INTO "sys_i18n" VALUES (524, 'dictData.cdr_call_type.audio', '语音', 'Voice'); +REPLACE INTO "sys_i18n" VALUES (525, 'dictData.cdr_call_type.video', '视频', 'Video'); +REPLACE INTO "sys_i18n" VALUES (526, 'dictData.ue_auth_code.200', '成功', 'Success'); +REPLACE INTO "sys_i18n" VALUES (527, 'dictData.ue_auth_code.001', '网络失败', 'Network Failure'); +REPLACE INTO "sys_i18n" VALUES (528, 'dictData.ue_auth_code.002', '接口失败', 'Interface Failure'); +REPLACE INTO "sys_i18n" VALUES (529, 'dictData.ue_auth_code.003', 'MAC失败', 'MAC Failure'); +REPLACE INTO "sys_i18n" VALUES (530, 'dictData.ue_auth_code.004', '同步失败', 'Synchronization failure'); +REPLACE INTO "sys_i18n" VALUES (531, 'dictData.ue_auth_code.005', '不接受非5G认证', 'Non-5G Authentication Not Accepted'); +REPLACE INTO "sys_i18n" VALUES (532, 'dictData.ue_auth_code.006', '响应失败', 'Response Failure'); +REPLACE INTO "sys_i18n" VALUES (533, 'dictData.ue_auth_code.007', '未知', 'Unknown'); +REPLACE INTO "sys_i18n" VALUES (534, 'dictData.ue_event_type.auth', '认证', 'Authentication'); +REPLACE INTO "sys_i18n" VALUES (535, 'dictData.ue_event_type.detach', '注销', 'Detach'); +REPLACE INTO "sys_i18n" VALUES (536, 'dictData.ue_event_type.state', 'CM状态', 'CM Status'); +REPLACE INTO "sys_i18n" VALUES (537, 'dictType.ue_event_cm_state', 'UE 事件CM状态', 'UE Event CM Status'); +REPLACE INTO "sys_i18n" VALUES (538, 'dictData.ue_event_cm_state.connected', '连接', 'Connected'); +REPLACE INTO "sys_i18n" VALUES (539, 'dictData.ue_event_cm_state.idle', '空闲', 'Idle'); +REPLACE INTO "sys_i18n" VALUES (540, 'dictData.ue_event_cm_state.inactive', '不活动', 'Inactive'); +REPLACE INTO "sys_i18n" VALUES (541, 'dictData.cdr_sip_code.404', '404 找不到', '404 Not Found'); +REPLACE INTO "sys_i18n" VALUES (542, 'dictData.cdr_sip_code.487', '487 请求已终止', '487 Request Terminated'); +REPLACE INTO "sys_i18n" VALUES (543, 'dictData.cdr_sip_code.503', '503 服务不可用', '503 Service Unavailable'); +REPLACE INTO "sys_i18n" VALUES (544, 'dictData.cdr_sip_code.504', '504 服务器超时', '504 Server Timeout'); +REPLACE INTO "sys_i18n" VALUES (545, 'dictData.cdr_sip_code.603', '603 拒绝', '603 Decline'); +REPLACE INTO "sys_i18n" VALUES (546, 'dictData.cdr_sip_code.606', '606 不可接受', '606 Not Acceptable'); +REPLACE INTO "sys_i18n" VALUES (547, 'cache.name.token', '用户令牌', 'User Token'); +REPLACE INTO "sys_i18n" VALUES (548, 'cache.name.sys_config', '参数管理', 'Parameters Management'); +REPLACE INTO "sys_i18n" VALUES (549, 'cache.name.sys_dict', '字典管理', 'Dictionary Management'); +REPLACE INTO "sys_i18n" VALUES (550, 'cache.name.captcha_codes', '验证码', 'Captcha'); +REPLACE INTO "sys_i18n" VALUES (551, 'cache.name.repeat_submit', '防重提交', 'Resubmit'); +REPLACE INTO "sys_i18n" VALUES (552, 'cache.name.rate_limit', '限流', 'Limit Traffic'); +REPLACE INTO "sys_i18n" VALUES (553, 'cache.name.pwd_err_cnt', '登录账户密码错误次数', 'Number of Password Errors'); +REPLACE INTO "sys_i18n" VALUES (554, 'cache.name.ne_info', '网元信息管理', 'NE Info Management'); +REPLACE INTO "sys_i18n" VALUES (555, 'cache.name.ne_data', '网元数据管理', 'NE Data Management'); +REPLACE INTO "sys_i18n" VALUES (556, 'dictData.cdr_call_type.sms', '短信', 'SMS'); +REPLACE INTO "sys_i18n" VALUES (557, 'dictData.cdr_sip_code.202', '202 已接受', '202 Accepted'); +REPLACE INTO "sys_i18n" VALUES (558, 'dictData.cdr_sip_code.488', '488 这里不接受', '488 Not Acceptable Here'); +REPLACE INTO "sys_i18n" VALUES (559, 'dictData.cdr_sip_code.0', '0 原因不明', '0 Unknown Reason'); +REPLACE INTO "sys_i18n" VALUES (560, 'log.operate.title.ws', 'WS会话', 'WS Sessions'); +REPLACE INTO "sys_i18n" VALUES (561, 'log.operate.title.neHost', '网元主机', 'NE Host'); +REPLACE INTO "sys_i18n" VALUES (562, 'neHost.noData', '没有可访问主机信息数据!', 'There is no accessible host information data!'); +REPLACE INTO "sys_i18n" VALUES (563, 'neHost.errKeyExists', '主机信息操作【{name}】失败,同组内名称已存在', 'Host information operation [{name}] failed, name already exists in the same group'); +REPLACE INTO "sys_i18n" VALUES (564, 'neHost.errByHostInfo', '连接失败,请检查连接参数后重试', 'Connection Failed, Please check connection parameters and retry'); +REPLACE INTO "sys_i18n" VALUES (565, 'dictType.ne_host_type', '网元主机连接类型', 'Network element host connection type'); +REPLACE INTO "sys_i18n" VALUES (566, 'dictType.ne_host_groupId', '网元主机分组', 'Network element host grouping'); +REPLACE INTO "sys_i18n" VALUES (567, 'dictType.ne_host_authMode', '网元主机认证模式', 'Network element host authentication mode'); +REPLACE INTO "sys_i18n" VALUES (568, 'dictData.ne_host_type.ssh', 'SSH', 'SSH'); +REPLACE INTO "sys_i18n" VALUES (569, 'dictData.ne_host_type.telnet', 'Telnet', 'Telnet'); +REPLACE INTO "sys_i18n" VALUES (570, 'dictData.ne_host_groupId.0', '其他', 'Other'); +REPLACE INTO "sys_i18n" VALUES (571, 'dictData.ne_host_groupId.1', '网元', 'Network Elements'); +REPLACE INTO "sys_i18n" VALUES (572, 'dictData.ne_host_groupId.2', '系统', 'System'); +REPLACE INTO "sys_i18n" VALUES (573, 'dictData.ne_host_authMode.0', '密码认证', 'Password Authentication'); +REPLACE INTO "sys_i18n" VALUES (574, 'dictData.ne_host_authMode.1', '私钥认证', 'Private key authentication'); +REPLACE INTO "sys_i18n" VALUES (575, 'menu.tools.terminal', '主机终端', 'Host Terminal'); +REPLACE INTO "sys_i18n" VALUES (576, 'menu.ne.neHost', '网元主机', 'NE Host'); +REPLACE INTO "sys_i18n" VALUES (577, 'menu.ne.neHostCommand', '网元主机命令', 'NE Host CMD'); +REPLACE INTO "sys_i18n" VALUES (578, 'log.operate.title.neHostCmd', '网元主机命令', 'NE Host CMD'); +REPLACE INTO "sys_i18n" VALUES (579, 'neHostCmd.noData', '没有可访问主机命令数据!', 'No accessible host command data!'); +REPLACE INTO "sys_i18n" VALUES (580, 'neHostCmd.errKeyExists', '主机命令操作【{name}】失败,同组内名称已存在', 'Host command operation [{name}] failed, name already exists in the same group'); +REPLACE INTO "sys_i18n" VALUES (581, 'dictType.ne_host_cmd_groupId', '网元主机命令分组', 'Network element host command grouping'); +REPLACE INTO "sys_i18n" VALUES (582, 'dictData.ne_host_cmd_groupId.0', '默认', 'Default'); +REPLACE INTO "sys_i18n" VALUES (583, 'dictData.ne_host_cmd_groupId.1', '快速命令', 'Quick Commands'); +REPLACE INTO "sys_i18n" VALUES (584, 'menu.ne.neInfo', '网元信息', 'NE Information'); +REPLACE INTO "sys_i18n" VALUES (585, 'log.operate.title.neInfo', '网元信息', 'NE Information'); +REPLACE INTO "sys_i18n" VALUES (586, 'neInfo.noData', '没有可访问网元信息数据!', 'There is no accessible network element information data!'); +REPLACE INTO "sys_i18n" VALUES (587, 'neInfo.errKeyExists', '网元信息操作【{key}】失败,同类型下标识已存在', 'NE info operation [{key}] failed, identifier already exists under the same type'); +REPLACE INTO "sys_i18n" VALUES (588, 'log.operate.title.imsCDR', '通话话单', 'Voice CDR'); +REPLACE INTO "sys_i18n" VALUES (589, 'menu.dashboard.amfUE', '5G 终端事件', '5G UE Events'); +REPLACE INTO "sys_i18n" VALUES (590, 'log.operate.title.amfUE', '5G 终端事件', '5G UE Events'); +REPLACE INTO "sys_i18n" VALUES (591, 'dictData.ne_info_status.0', '离线', 'Offline'); +REPLACE INTO "sys_i18n" VALUES (592, 'dictData.ne_info_status.1', '在线', 'Active'); +REPLACE INTO "sys_i18n" VALUES (593, 'dictData.ne_info_status.2', '等待同步', 'Wait Sync'); +REPLACE INTO "sys_i18n" VALUES (594, 'dictData.ne_info_status.3', '待机', 'Standby'); +REPLACE INTO "sys_i18n" VALUES (595, 'dictType.ne_info_status', '网元信息状态', 'NE Info State'); +REPLACE INTO "sys_i18n" VALUES (596, 'menu.ne.neQuickSetup', '网元快速安装', 'NE Quick Setup'); +REPLACE INTO "sys_i18n" VALUES (597, 'log.operate.title.neConfig', '网元参数配置', 'NE Parameter Configuration'); +REPLACE INTO "sys_i18n" VALUES (598, 'menu.ne.neLicense', '网元许可', 'NE License'); +REPLACE INTO "sys_i18n" VALUES (599, 'log.operate.title.neLicense', '网元许可', 'NE License'); +REPLACE INTO "sys_i18n" VALUES (600, 'menu.ne.neSoftware', '网元软件包', 'NE Software'); +REPLACE INTO "sys_i18n" VALUES (601, 'log.operate.title.neSoftware', '网元软件包', 'NE Software'); +REPLACE INTO "sys_i18n" VALUES (602, 'log.operate.title.neVersion', '网元版本', 'NE Version'); +REPLACE INTO "sys_i18n" VALUES (603, 'menu.ne.neVersion', '网元版本', 'Ne Version'); +REPLACE INTO "sys_i18n" VALUES (604, 'dictType.ne_license_status', '网元许可状态', 'NE License Status'); +REPLACE INTO "sys_i18n" VALUES (605, 'dictData.ne_license_status.0', '无效', 'Invalid'); +REPLACE INTO "sys_i18n" VALUES (606, 'dictData.ne_license_status.1', '有效', 'Valid'); +REPLACE INTO "sys_i18n" VALUES (607, 'menu.dashboard.mocn', 'MOCN', 'MOCN'); +REPLACE INTO "sys_i18n" VALUES (608, 'menu.monitor.cdr', '话单', 'CDR'); +REPLACE INTO "sys_i18n" VALUES (609, 'menu.monitor.event', '事件', 'Events'); +REPLACE INTO "sys_i18n" VALUES (610, 'post.export.time', '创建时间', 'Creation Time'); +REPLACE INTO "sys_i18n" VALUES (611, 'role.export.time', '创建时间', 'Creation Time'); +REPLACE INTO "sys_i18n" VALUES (612, 'dictData.ne_host_authMode.2', '免密认证', 'Confidentiality Auth Mode'); +REPLACE INTO "sys_i18n" VALUES (613, 'menu.ne.neConfig', '网元配置', 'NE Config'); +REPLACE INTO "sys_i18n" VALUES (614, 'dictData.ne_version_status.0', '无', 'Nothing'); +REPLACE INTO "sys_i18n" VALUES (615, 'dictData.ne_version_status.1', '已是最新', 'Updated'); +REPLACE INTO "sys_i18n" VALUES (616, 'dictData.ne_version_status.2', '上一版本', 'Previous'); +REPLACE INTO "sys_i18n" VALUES (617, 'dictData.ne_version_status.3', '有新版本', 'Has New'); +REPLACE INTO "sys_i18n" VALUES (618, 'menu.fault.event', '事件通知', 'Event Notification'); +REPLACE INTO "sys_i18n" VALUES (619, 'menu.dashboard.smfCDR', '数据话单', 'Data CDR'); +REPLACE INTO "sys_i18n" VALUES (620, 'log.operate.title.smfCDR', '数据话单', 'Data CDR'); +REPLACE INTO "sys_i18n" VALUES (621, 'config.sys.i18nDefaultRemark', '国际化默认语言可选择 en_US、zh_CN', 'Internationalization default language selectable en_US、zh_CN'); +REPLACE INTO "sys_i18n" VALUES (622, 'config.sys.i18nOpenRemark', '是否显示切换的控件 true/false', 'Whether to display switched controls true/false'); +REPLACE INTO "sys_i18n" VALUES (623, 'menu.dashboard.mmeUE', '4G 终端事件', '4G UE Events'); +REPLACE INTO "sys_i18n" VALUES (624, 'log.operate.title.mmeUE', '4G 终端事件', '4G UE Events'); +REPLACE INTO "sys_i18n" VALUES (625, 'menu.system.user.editPost', '修改用户岗位', 'Modify User Post'); +REPLACE INTO "sys_i18n" VALUES (626, 'menu.dashboard.smscCDR', '短信话单', 'SMS CDR'); +REPLACE INTO "sys_i18n" VALUES (627, 'log.operate.title.smscCDR', '短信话单', 'SMS CDR'); +REPLACE INTO "sys_i18n" VALUES (628, 'menu.trace.pcapFile', '信令抓包文件', 'Signaling Capture File'); +REPLACE INTO "sys_i18n" VALUES (629, 'menu.trace.taskAnalyze', '网元跟踪任务分析', 'NE Trace Task Analysis'); +REPLACE INTO "sys_i18n" VALUES (630, 'job.ne_data_udm', '网元数据-UDM用户数据同步', 'NE Data-Sync UDM Data'); +REPLACE INTO "sys_i18n" VALUES (631, 'menu.system.setting.doc', '系统使用文档', 'System User Documentation'); +REPLACE INTO "sys_i18n" VALUES (632, 'menu.system.setting.official', '官网链接', 'Official Website'); +REPLACE INTO "sys_i18n" VALUES (633, 'menu.system.setting.lock', '锁屏操作', 'Lockscreen Operation'); +REPLACE INTO "sys_i18n" VALUES (634, 'menu.ne.neConfigBackup', '网元配置备份', 'NE Config Backups'); +REPLACE INTO "sys_i18n" VALUES (635, 'job.ne_config_backup', '网元-配置文件定期备份', 'NE-Config Backup Regularly'); +REPLACE INTO "sys_i18n" VALUES (636, 'job.ne_config_backup_remark', '网元配置文件定期备份到网管服务器 +可查看网元配置备份记录进行下载或通过网元信息操作导入配置', 'Network Element Configuration files are regularly backed up to the OMC +View network element configuration backup records for downloading or importing configurations through network element information operations.'); +REPLACE INTO "sys_i18n" VALUES (637, 'job.backup_export_table_sys_log_operate', '备份-操作日志表定期导出', 'Backup-Operation Log Table Periodic Export'); +REPLACE INTO "sys_i18n" VALUES (638, 'job.backup_export_table_cdr_event_ims', '备份-语音话单表定期导出', 'Backup-Regular Export of voice bill forms'); +REPLACE INTO "sys_i18n" VALUES (639, 'job.backup_export_table_cdr_event_smf', '备份-数据话单表定期导出', 'Backup-Regular Export of data sheet tables'); +REPLACE INTO "sys_i18n" VALUES (640, 'cache.name.oauth2_codes', '客户端授权码', 'Oauth2 Client Code'); +REPLACE INTO "sys_i18n" VALUES (641, 'cache.name.oauth2_devices', '客户端令牌', 'Oauth2 Token'); +REPLACE INTO "sys_i18n" VALUES (642, 'job.backup_export_cdr', '备份-CDR数据定期导出', 'Backup-Periodic export of CDR Data'); +REPLACE INTO "sys_i18n" VALUES (643, 'job.backup_export_cdr_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc +fileType: 文件类型 csv/xlsx +hour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support ims/smf/sgwc/smsc +fileType: file type csv/xlsx +hour: data time from the hour before the task execution time'); +REPLACE INTO "sys_i18n" VALUES (644, 'menu.log.exportFile', '导出文件', 'Exported File'); +REPLACE INTO "sys_i18n" VALUES (645, 'menu.perf.kpiCReport', '自定义指标数据', 'Custom Indicator Data'); +REPLACE INTO "sys_i18n" VALUES (646, 'menu.trace.taskHLR', 'HLR 跟踪任务', 'HLR Trace Task'); +REPLACE INTO "sys_i18n" VALUES (647, 'dictType.cdr_cause_code', 'CDR 响应原因代码类别类型', 'CDR Response Reason Code Category Type'); +REPLACE INTO "sys_i18n" VALUES (648, 'dictData.cdr_cause_code.0', '未知错误', 'Unknown Error'); +REPLACE INTO "sys_i18n" VALUES (649, 'dictData.cdr_cause_code.8', '运营者确定的禁止', 'Operator determined barring'); +REPLACE INTO "sys_i18n" VALUES (650, 'dictData.cdr_cause_code.10', '禁止呼叫', 'Call Barred'); +REPLACE INTO "sys_i18n" VALUES (651, 'dictData.cdr_cause_code.21', '呼叫被拒', 'Call rejected'); +REPLACE INTO "sys_i18n" VALUES (652, 'dictData.cdr_cause_code.22', '数量已更改', 'Number changed'); +REPLACE INTO "sys_i18n" VALUES (653, 'dictData.cdr_cause_code.27', '目的地出错', 'Destination out of order'); +REPLACE INTO "sys_i18n" VALUES (654, 'dictData.cdr_cause_code.28', '数字格式无效(数字不完整)', 'Invalid number format (incomplete number)'); +REPLACE INTO "sys_i18n" VALUES (655, 'dictData.cdr_cause_code.29', '设施被拒', 'Facility rejected'); +REPLACE INTO "sys_i18n" VALUES (656, 'dictData.cdr_cause_code.30', '回复状态查询', 'Response to STATUS ENQUIRY'); +REPLACE INTO "sys_i18n" VALUES (657, 'dictData.cdr_cause_code.38', '网络故障', 'Network out of order'); +REPLACE INTO "sys_i18n" VALUES (658, 'dictData.cdr_cause_code.41', '临时故障', 'Temporary failure'); +REPLACE INTO "sys_i18n" VALUES (659, 'dictData.cdr_cause_code.42', '交换设备拥塞', 'Switching equipment congestion'); +REPLACE INTO "sys_i18n" VALUES (660, 'dictData.cdr_cause_code.47', '资源不可用', 'Resource unavailable, unspecified'); +REPLACE INTO "sys_i18n" VALUES (661, 'dictData.cdr_cause_code.50', '请求的设施未订阅', 'Requested facility not subscribed'); +REPLACE INTO "sys_i18n" VALUES (662, 'job.backup_export_table_cdr_event_smsc', '备份-短信话单表定期导出', 'Backup-Regular Export of SMS call list'); +REPLACE INTO "sys_i18n" VALUES (663, 'job.backup_remove_file', '备份-定期删除备份目录下文件', 'Backup-Periodically Delete Directory Files'); +REPLACE INTO "sys_i18n" VALUES (664, 'config.sys.homePage', '自定义主页', 'Custom Home Page'); +REPLACE INTO "sys_i18n" VALUES (665, 'config.sys.homePageRemark', '选择列表中的任一页面作为主页路径', 'Select any page in the list as the homepage'); +REPLACE INTO "sys_i18n" VALUES (666, 'menu.ne.neOverview', '网元概览', 'NE Overview'); +REPLACE INTO "sys_i18n" VALUES (667, 'menu.ne.neOverviewRemark', '显示所有网元状态配置和license等概览信息', 'Displays overview information such as status, configuration and license of all network elements'); +REPLACE INTO "sys_i18n" VALUES (668, 'job.backup_export_table_cdr_event_sgwc', '备份-漫游数据话单表定期导出', 'Backup-Regular Export of Roaming Data table'); +REPLACE INTO "sys_i18n" VALUES (669, 'cache.name.i18n', '国际化语言管理', 'Internationalized Language Management'); +REPLACE INTO "sys_i18n" VALUES (670, 'config.sys.user.passwordPolicy', '用户管理-默认密码策略强度', 'User Management-Default Password Policy Strength'); +REPLACE INTO "sys_i18n" VALUES (671, 'config.sys.user.passwordPolicyRemark', 'minLength:密码至少8个字符 +specialChars:至少包含2个特殊字符(例如:!@#$%^&*()) +uppercase:至少包含一个大写字母 +lowercase:至少包含一个小写字母', 'minLength: password should be at least 8 characters long +specialChars: at least 2 special characters (e.g. ! @#$%^&*()) +uppercase: contain at least one uppercase letter +lowercase: contains at least one lowercase letter'); +REPLACE INTO "sys_i18n" VALUES (672, 'config.sys.user.passwdExpire', '用户管理-密码有效期', 'User Management-Password Expiration Date'); +REPLACE INTO "sys_i18n" VALUES (673, 'config.sys.user.passwdExpireRemark', '数值单位(小时) +expHours为过期时间,0表示不启用 +alertHours即将到期提醒时间', 'Numerical unit (hours) +expHours for the expiration time, 0 means not enabled +alertHours upcoming expiration reminder time'); +REPLACE INTO "sys_i18n" VALUES (674, 'config.sys.user.passwdNotAllowedHistory', '用户管理-不允许使用最近密码次数', 'User Management-Not Allowed Recent Passwords'); +REPLACE INTO "sys_i18n" VALUES (675, 'config.sys.user.passwdNotAllowedHistoryRemark', '创建新密码不等于之前使用的x次中的密码', 'Creating a new password that is not equal to the previously used password in x times'); +REPLACE INTO "sys_i18n" VALUES (676, 'login.errPasswdHistory', '不允许使用最近密码', 'Recent passwords not allowed'); +REPLACE INTO "sys_i18n" VALUES (677, 'log.operate.title.oauth2client', 'Oauth2客户端授权', 'Oauth2 Client Authorization'); +REPLACE INTO "sys_i18n" VALUES (678, 'log.operate.title.pcfRule', '终端策略规则', 'UE PCC Rule'); +REPLACE INTO "sys_i18n" VALUES (679, 'dictType.trace_msg_type', '跟踪消息类型', 'Trace Message Type'); +REPLACE INTO "sys_i18n" VALUES (680, 'dictData.trace_msg_type.0', '请求', 'Request'); +REPLACE INTO "sys_i18n" VALUES (681, 'dictData.trace_msg_type.1', '响应', 'Response'); +REPLACE INTO "sys_i18n" VALUES (682, 'dictType.trace_msg_direct', '跟踪消息方向', 'Track Message Direction'); +REPLACE INTO "sys_i18n" VALUES (683, 'dictData.trace_msg_direct.0', '接收', 'Receive'); +REPLACE INTO "sys_i18n" VALUES (684, 'dictData.trace_msg_direct.1', '发送', 'Send'); +REPLACE INTO "sys_i18n" VALUES (685, 'dictData.trace_interfaces.1', 'N1', 'N1'); +REPLACE INTO "sys_i18n" VALUES (686, 'dictData.trace_interfaces.2', 'N2', 'N2'); +REPLACE INTO "sys_i18n" VALUES (687, 'dictData.trace_interfaces.3', 'N1/N2', 'N1/N2'); +REPLACE INTO "sys_i18n" VALUES (688, 'dictData.trace_interfaces.4', 'N4', 'N4'); +REPLACE INTO "sys_i18n" VALUES (689, 'dictData.trace_interfaces.8', 'N8', 'N8'); +REPLACE INTO "sys_i18n" VALUES (690, 'dictData.trace_interfaces.10', 'N10', 'N10'); +REPLACE INTO "sys_i18n" VALUES (691, 'dictData.trace_interfaces.11', 'N11', 'N11'); +REPLACE INTO "sys_i18n" VALUES (692, 'dictData.trace_interfaces.12', 'N12', 'N12'); +REPLACE INTO "sys_i18n" VALUES (693, 'dictData.trace_interfaces.13', 'N13', 'N13'); +REPLACE INTO "sys_i18n" VALUES (694, 'dictData.trace_interfaces.7', 'N7', 'N7'); +REPLACE INTO "sys_i18n" VALUES (695, 'dictData.trace_interfaces.15', 'N15', 'N15'); +REPLACE INTO "sys_i18n" VALUES (696, 'dictData.trace_interfaces.17', 'N17', 'N17'); +REPLACE INTO "sys_i18n" VALUES (697, 'dictData.trace_interfaces.20', 'N20', 'N20'); +REPLACE INTO "sys_i18n" VALUES (698, 'dictData.trace_interfaces.22', 'N22', 'N22'); +REPLACE INTO "sys_i18n" VALUES (699, 'dictData.trace_interfaces.40', 'N40', 'N40'); +REPLACE INTO "sys_i18n" VALUES (700, 'dictData.cdr_sip_code.302', '302 原因不明', '302 Unknown Reason'); +REPLACE INTO "sys_i18n" VALUES (701, 'dictData.cdr_sip_code.402', '402 原因不明', '402 Unknown Reason'); +REPLACE INTO "sys_i18n" VALUES (702, 'dictData.cdr_sip_code.480', '480 被叫挂断/拒接', '480 Temporarily Unavailable'); +REPLACE INTO "sys_i18n" VALUES (703, 'dictData.cdr_sip_code.481', '481 原因不明', '481 Unknown Reason'); +REPLACE INTO "sys_i18n" VALUES (704, 'dictData.cdr_sip_code.482', '482 发现环路', '482 Loop Detected'); +REPLACE INTO "sys_i18n" VALUES (705, 'dictData.cdr_sip_code.486', '486 这里很忙', '486 Busy Here'); +REPLACE INTO "sys_i18n" VALUES (706, 'dictData.cdr_sip_code.489', '489 原因不明', '489 Unknown Reason'); +REPLACE INTO "sys_i18n" VALUES (707, 'dictData.cdr_sip_code.580', '580 原因不明', '580 Unknown Reason'); +REPLACE INTO "sys_i18n" VALUES (708, 'alarm.export.alarmType', '告警类型', 'Alarm Type'); +REPLACE INTO "sys_i18n" VALUES (709, 'alarm.export.origSeverity', '告警级别', 'Severity'); +REPLACE INTO "sys_i18n" VALUES (710, 'alarm.export.alarmTitle', '告警标题', 'Alarm Title'); +REPLACE INTO "sys_i18n" VALUES (711, 'alarm.export.eventTime', '告警产生时间', 'Event Time'); +REPLACE INTO "sys_i18n" VALUES (712, 'alarm.export.alarmId', '告警唯一标识', 'Alarm ID'); +REPLACE INTO "sys_i18n" VALUES (713, 'alarm.export.clearUser', '告警清除用户', 'Clear User'); +REPLACE INTO "sys_i18n" VALUES (714, 'alarm.export.clearType', '告警清除类型', 'Clear Type'); +REPLACE INTO "sys_i18n" VALUES (715, 'alarm.export.clearTime', '告警清除时间', 'Clear Time'); +REPLACE INTO "sys_i18n" VALUES (716, 'log.operate.title.alarm', '告警', 'Alarm'); +REPLACE INTO "sys_i18n" VALUES (717, 'ne.common.neType', '网元类型', 'NE Type'); +REPLACE INTO "sys_i18n" VALUES (718, 'ne.common.neName', '网元名称', 'NE Name'); +REPLACE INTO "sys_i18n" VALUES (719, 'ne.common.neId', '网元标识', 'NE ID'); +REPLACE INTO "sys_i18n" VALUES (720, 'log.operate.title.udmVOIP', 'VOIP用户', 'UDM VOIP'); +REPLACE INTO "sys_i18n" VALUES (721, 'log.operate.title.udmVolteIMS', 'VolteIMS用户', 'UDM VolteIMS'); +REPLACE INTO "sys_i18n" VALUES (722, 'log.operate.title.backup', '备份', 'Backup'); +REPLACE INTO "sys_i18n" VALUES (723, 'job.backup_export_table_cdr_event_smsc_remark', 'hour: 数据时间从任务执行时间前的小时数 +tableName: 数据表名 +columns: 支持字段 +backupPath: 备份输出路径 /usr/local/omc/backup/{backupPath}', 'hour: data time from the hour before the task execution time +tableName: data table name +columns: support fields +backupPath: backup output path /usr/local/omc/backup/{backupPath}'); +REPLACE INTO "sys_i18n" VALUES (724, 'job.backup_export_table_cdr_event_sgwc_remark', 'hour: 数据时间从任务执行时间前的小时数 +tableName: 数据表名 +columns: 支持字段 +backupPath: 备份输出路径 /usr/local/omc/backup/{backupPath}', 'hour: data time from the hour before the task execution time +tableName: data table name +columns: support fields +backupPath: backup output path /usr/local/omc/backup/{backupPath}'); +REPLACE INTO "sys_i18n" VALUES (725, 'job.backup_remove_file_remark', 'backupPath: 备份路径 /usr/local/omc/backup/{backupPath} +storeDays: 保留天数 +storeNum: 保留数量,默认保留7', 'backupPath: backup path /usr/local/omc/backup/{backupPath} +storeDays: retention days +storeNum: retention number, default retention 7'); +REPLACE INTO "sys_i18n" VALUES (726, 'job.backup_export_udm', '备份-UDM数据定期导出', 'Backup-Periodic export of UDM Data'); +REPLACE INTO "sys_i18n" VALUES (727, 'job.backup_export_udm_remark', 'dataType: 类型支持 auth/sub/voip/volte +fileType: 文件类型 csv/txt', 'Backup-Periodic export of dataType: type support auth/sub/voip/volte +fileType: file type csv/txt'); +REPLACE INTO "sys_i18n" VALUES (728, 'dictData.cdr_sip_code_cause.0', '因其他原因呼叫失败', 'Call failure for other reason'); +REPLACE INTO "sys_i18n" VALUES (729, 'dictData.cdr_sip_code_cause.200', '正常通话清除', 'Normal Call Clearing'); +REPLACE INTO "sys_i18n" VALUES (730, 'dictData.cdr_sip_code_cause.202', '申请已被接受处理,但尚未完成 ', 'The request has been accepted for processing, but it hasn it completed yet'); +REPLACE INTO "sys_i18n" VALUES (731, 'dictData.cdr_sip_code_cause.302', '因其他原因呼叫失败', 'Call failure for other reason'); +REPLACE INTO "sys_i18n" VALUES (732, 'dictData.cdr_sip_code_cause.402', '因其他原因呼叫失败', 'Call failure for other reason'); +REPLACE INTO "sys_i18n" VALUES (733, 'dictData.cdr_sip_code_cause.403', '拒接主叫用户', 'MO User Rejected'); +REPLACE INTO "sys_i18n" VALUES (734, 'dictData.cdr_sip_code_cause.404', '被叫用户离线', 'MT User Offline'); +REPLACE INTO "sys_i18n" VALUES (735, 'dictData.cdr_sip_code_cause.480', '因其他原因呼叫失败', 'Call failure for other reason'); +REPLACE INTO "sys_i18n" VALUES (736, 'dictData.cdr_sip_code_cause.481', '电话无法拨出', 'Call cannot be dialed'); +REPLACE INTO "sys_i18n" VALUES (737, 'dictData.cdr_sip_code_cause.482', '闪断', 'Flashback'); +REPLACE INTO "sys_i18n" VALUES (738, 'dictData.cdr_sip_code_cause.486', '被叫用户忙', 'MT User Busy'); +REPLACE INTO "sys_i18n" VALUES (739, 'dictData.cdr_sip_code_cause.487', '主叫挂断', 'MO User Disconnected'); +REPLACE INTO "sys_i18n" VALUES (740, 'dictData.cdr_sip_code_cause.408', '服务器等待响应的时间过长', 'The server waits too long for a response'); +REPLACE INTO "sys_i18n" VALUES (741, 'dictData.cdr_sip_code_cause.488', '媒体详细信息与服务器支持的内容不匹配', 'Media details didn’t match what the server supports'); +REPLACE INTO "sys_i18n" VALUES (742, 'dictData.cdr_sip_code_cause.489', '因其他原因呼叫失败', 'Call failure for other reason'); +REPLACE INTO "sys_i18n" VALUES (743, 'dictData.cdr_sip_code_cause.500', '服务器本身出了问题', 'Something went wrong inside the server itself'); +REPLACE INTO "sys_i18n" VALUES (744, 'dictData.cdr_sip_code_cause.503', '服务器超载或因维护而停机,无法处理呼叫', 'The server is overloaded or down for maintenance and can it process the call'); +REPLACE INTO "sys_i18n" VALUES (745, 'dictData.cdr_sip_code_cause.504', '服务器尝试以您的名义与另一台服务器通信,但未及时收到回复,并超时了', 'The server tried to talk to another server on your behalf, didn’t get a reply in time, and timed out'); +REPLACE INTO "sys_i18n" VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其他原因呼叫失败', 'Call failure for other reason'); +REPLACE INTO "sys_i18n" VALUES (747, 'dictData.cdr_sip_code_cause.603', '被叫拒接', 'MT explicitly rejected the call'); +REPLACE INTO "sys_i18n" VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the user’s device, but some parts of the session setup weren it acceptable'); +REPLACE INTO "sys_i18n" VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause'); +REPLACE INTO "sys_i18n" VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data'); +REPLACE INTO "sys_i18n" VALUES (751, 'job.backup_export_log_remark', 'dataType: 类型支持 operate/login +fileType: 文件类型 csv/xlsx +hour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support operate/login +fileType: file type csv/xlsx +hour: data time from the hour before the task execution time'); +REPLACE INTO "sys_i18n" VALUES (752, 'job.ne_alarm_state_check_cmd', '网元告警-内存/CPU/磁盘检查', 'NE Alarm-Memory/CPU/Disk Checks'); +REPLACE INTO "sys_i18n" VALUES (753, 'job.ne_alarm_state_check_cmd_remark', '检查网元的内存/CPU/磁盘检查健康状况,在出现过阈值时发出警报。 + +Alarm type: +CommunicationAlarm=1 +EquipmentAlarm=2 +ProcessingFailure=3 +EnvironmentalAlarm=4 +QualityOfServiceAlarm=5 + +Severity: +Critical=1 +Major=2 +Minor=3 +Warning=4 + +AddInfo: 告警补充信息 +cpuUseGt: CPU使用率大于, 范围0~100*CPU核心数 +memUseGt: 内存使用率大于, 范围0~100% +diskUseGt: 磁盘使用率大于, 范围0~100%', 'Checks the memory/CPU/disk check health of the network element and sends alerts when thresholds are crossed. + +Alarm type: +CommunicationAlarm=1 +EquipmentAlarm=2 +ProcessingFailure=3 +EnvironmentalAlarm=4 +QualityOfServiceAlarm=5 + +Severity: +Critical=1 +Major=2 +Minor=3 +Warning=4 + +AddInfo: Additional information on alarms +cpuUseGt: CPU utilization is greater than, range 0~100*number of CPU cores +memUseGt: Memory utilization greater than, range 0 to 100% +diskUseGt: Disk utilization greater than, range 0 to 100%'); +REPLACE INTO "sys_i18n" VALUES (754, 'job.ne_alarm_state_check_license', '网元告警-License到期检查', 'NE Alarm-License Expire Check'); +REPLACE INTO "sys_i18n" VALUES (755, 'job.ne_alarm_state_check_license_remark', '检查网元的License是否即将到期,在出现过阈值时发出警报。 + +Alarm type: +CommunicationAlarm=1 +EquipmentAlarm=2 +ProcessingFailure=3 +EnvironmentalAlarm=4 +QualityOfServiceAlarm=5 + +Severity: +Critical=1 +Major=2 +Minor=3 +Warning=4 + +AddInfo: 告警补充信息 +dayLt: 天数小于,默认30天', 'Checks if the network element is License is about to expire and sends an alert if a threshold is crossed. + +Alarm type: +CommunicationAlarm=1 +EquipmentAlarm=2 +ProcessingFailure=3 +EnvironmentalAlarm=4 +QualityOfServiceAlarm=5 + +Severity: +Critical=1 +Major=2 +Minor=3 +Warning=4 + +AddInfo: Additional information on alarms +dayLt: Days less than, default 30 days'); +REPLACE INTO "sys_i18n" VALUES (756, 'dictData.trace_interfaces.14', 'N14', 'N14'); +REPLACE INTO "sys_i18n" VALUES (757, 'dictData.trace_interfaces.5', 'N5', 'N5'); +REPLACE INTO "sys_i18n" VALUES (758, "alarm.export.alarmCode", "告警编码", "Alarm Code"); +REPLACE INTO "sys_i18n" VALUES (759, "config.sys.user.fristPasswdChangeRemark", "关闭改为false 开启改为true, 建议同时设置密码有效期", "Off to false On to true, it is recommended to set the password expiration date at the same time."); +REPLACE INTO "sys_i18n" VALUES (760, "menu.perf.kpiIMSOverview", "语音数据概览", "Voice Data Overview"); +REPLACE INTO "sys_i18n" VALUES (761, "dictType.sys_user_type", "用户类型", "User Type"); +REPLACE INTO "sys_i18n" VALUES (762, "dictData.sys_user_type.system", "系统", "System"); +REPLACE INTO "sys_i18n" VALUES (763, "dictData.sys_user_type.ldap", "LDAP", "LDAP"); +REPLACE INTO "sys_i18n" VALUES (764, "dictData.sys_user_type.smtp", "SMTP", "SMTP"); +REPLACE INTO "sys_i18n" VALUES (765, "dictData.sys_user_type.oauth2", "OAuth2", "OAuth2"); +REPLACE INTO "sys_i18n" VALUES (766, "user.export.userType", "用户类型", "User Type"); +REPLACE INTO "sys_i18n" VALUES (767, "menu.system.loginSource", "第三方登录认证", "Third Party Login Source"); +REPLACE INTO "sys_i18n" VALUES (768, "log.operate.title.sysLoginSource", "认证源", "Login Source"); + +REPLACE INTO "sys_i18n" VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); +REPLACE INTO "sys_i18n" VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); +REPLACE INTO "sys_i18n" VALUES (2002, 'menu.psap.agent.callback', '回拨管理', 'Callback Management'); +REPLACE INTO "sys_i18n" VALUES (2003, 'callback.status.NEW', '新建', 'New'); +REPLACE INTO "sys_i18n" VALUES (2004, 'callback.status.IN_PROGRESS', '处理中', 'In Progress'); +REPLACE INTO "sys_i18n" VALUES (2005, 'callback.status.NO_ANSWER_1', '未应答1', 'No Answer 1'); +REPLACE INTO "sys_i18n" VALUES (2006, 'callback.status.NO_ANSWER_2', '未应答2', 'No Answer 2'); +REPLACE INTO "sys_i18n" VALUES (2007, 'callback.status.TIMEOUT', '超时', 'Timeout'); +REPLACE INTO "sys_i18n" VALUES (2008, 'callback.status.PENDING', '挂起', 'Pending'); +REPLACE INTO "sys_i18n" VALUES (2009, 'callback.status.CLOSED', '关闭', 'Closed'); +REPLACE INTO "sys_i18n" VALUES (2010, 'job.export.cdr.mf', '定期导出MF话单', 'Periodic Export of MF Call Records'); +REPLACE INTO "sys_i18n" VALUES (2011, 'job.psap.ticket.monitor', '回拨工单监控', 'Callback Ticket Monitoring'); +REPLACE INTO "sys_i18n" VALUES (2012, 'menu.omc.cdr', '话单', 'Call Records'); +REPLACE INTO "sys_i18n" VALUES (2013, 'menu.omc.cdr.mf', '紧急呼叫话单', 'Emergency Call Records'); +REPLACE INTO "sys_i18n" VALUES (2014, 'menu.omc.cdr.crbt', '彩铃话单', 'Color Ring Back Tone Records'); +REPLACE INTO "sys_i18n" VALUES (2015, 'menu.omc.cdr.mms', '彩信话单', 'Multimedia Message Service Records'); +REPLACE INTO "sys_i18n" VALUES (2016, 'menu.ue.cbc.cbe', '预警广播', 'Early Warning Broadcast'); +REPLACE INTO "sys_i18n" VALUES (2017, 'log.operate.title.cbcMessage', '预警广播', 'Early Warning Broadcast'); diff --git a/build/database/lite/upgrade/upg_sys_job.sql b/build/database/lite/upgrade/upg_sys_job.sql new file mode 100644 index 00000000..47859628 --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_job.sql @@ -0,0 +1,50 @@ +-- ---------------------------- +-- Table structure for sys_job +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_job" ( + "job_id" integer NOT NULL, + "job_name" text(64), + "job_group" text(64), + "invoke_target" text(64) NOT NULL, + "target_params" text(2048), + "cron_expression" text(64), + "misfire_policy" text(1), + "concurrent" text(1), + "status_flag" text(1), + "save_log" text(1), + "create_by" text(64), + "create_time" integer(20), + "update_by" text(64), + "update_time" integer(20), + "remark" text(500), + PRIMARY KEY ("job_id") +); + +-- ---------------------------- +-- Indexes structure for table sys_job +-- ---------------------------- +CREATE UNIQUE INDEX IF NOT EXISTS "uk_name_group" +ON "sys_job" ( + "job_name" ASC, + "job_group" ASC +); + +-- ---------------------------- +-- Records of sys_job +-- ---------------------------- +REPLACE INTO "sys_job" VALUES (1, 'job.monitor_sys_resource', 'SYSTEM', 'monitor_sys_resource', '{"interval":5}', '0 0/5 * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.monitor_sys_resource_remark'); +REPLACE INTO "sys_job" VALUES (3, 'job.ne_data_udm', 'SYSTEM', 'ne_data_udm', '', '0 0 0/12 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, ''); +REPLACE INTO "sys_job" VALUES (6, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_config_backup_remark'); + +REPLACE INTO "sys_job" VALUES (10, 'job.delete_ne_config_backup', 'SYSTEM', 'delete_ne_config_backup', '{"storeDays":7,"storeNum":7}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_ne_config_backup_remark'); +REPLACE INTO "sys_job" VALUES (11, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{"storeDays":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark'); +REPLACE INTO "sys_job" VALUES (12, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{"storeDays":7,"neList":["IMS","AMF","UDM","UPF","MME","SMSC","SMF","MME"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark'); + +REPLACE INTO "sys_job" VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{"alarmTitle":"NE State Check Alarm","alarmType":"EquipmentAlarm","origSeverity":"Major","specificProblem":"alarm cause: the system state of target NE has not been received","specificProblemId":"AC10000","addInfo":""}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark'); +REPLACE INTO "sys_job" VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{"alarmTitle":"NE State Check Alarm CPU/Menory/Disk","alarmType":"EquipmentAlarm","origSeverity":"Major","specificProblem":"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold","specificProblemId":"AC10100","addInfo":"","cpuUseGt":70,"memUseGt":70,"diskUseGt":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark'); +REPLACE INTO "sys_job" VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{"alarmTitle":"NE State Check Alarm License","alarmType":"EquipmentAlarm","origSeverity":"Major","specificProblem":"Alarm Cause: License received from target NE is about to expire","specificProblemId":"AC10200","addInfo":"","dayLt":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark'); + +REPLACE INTO "sys_job" VALUES (30, 'job.backup_remove_file', 'SYSTEM', 'backup_remove_file', '[{"backupPath":"/udm_data/auth","storeDays":30},{"backupPath":"/udm_data/sub","storeDays":30},{"backupPath":"/udm_data/voip","storeDays":30},{"backupPath":"/udm_data/volte","storeDays":30},{"backupPath":"/cdr/ims_cdr_event","storeDays":30},{"backupPath":"/cdr/smsc_cdr_event","storeDays":30},{"backupPath":"/cdr/smf_cdr_event","storeDays":30},{"backupPath":"/cdr/sgwc_cdr_event","storeDays":30},{"backupPath":"/log/sys_log_operate","storeDays":30,"storeNum":7},{"backupPath":"/log/sys_log_login","storeDays":30,"storeNum":7}]', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_remove_file_remark'); +REPLACE INTO "sys_job" VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{"dataType":["auth","sub","voip","volte"],"fileType":"txt"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark'); +REPLACE INTO "sys_job" VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{"dataType":["ims","smf","sgwc","smsc"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark'); +REPLACE INTO "sys_job" VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{"dataType":["operate","login"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark'); diff --git a/build/database/lite/upgrade/upg_sys_login_source.sql b/build/database/lite/upgrade/upg_sys_login_source.sql new file mode 100644 index 00000000..34071608 --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_login_source.sql @@ -0,0 +1,32 @@ +-- ---------------------------- +-- Table structure for sys_login_source +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_login_source" ( + "id" integer NOT NULL, + "uid" text(32), + "type" text(32), + "name" text(64), + "icon" text(255), + "active_flag" text(1), + "sync_flag" text(1), + "config" text, + "create_by" text(64), + "create_time" integer, + "update_by" text(64), + "update_time" integer, + "remark" text(500), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table sys_login_source +-- ---------------------------- +CREATE INDEX IF NOT EXISTS "idx_ls_type_name" +ON "sys_login_source" ( + "type" ASC, + "name" ASC +); + +-- ---------------------------- +-- Records of sys_login_source +-- ---------------------------- diff --git a/build/database/lite/upgrade/upg_sys_menu.sql b/build/database/lite/upgrade/upg_sys_menu.sql new file mode 100644 index 00000000..1cc7a1c7 --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_menu.sql @@ -0,0 +1,211 @@ +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_menu" ( + "menu_id" integer NOT NULL, + "menu_name" text(64) NOT NULL, + "parent_id" integer, + "menu_sort" integer, + "menu_path" text(255), + "component" text(255), + "frame_flag" text(1), + "cache_flag" text(1), + "menu_type" text(1) NOT NULL, + "visible_flag" text(1), + "status_flag" text(1), + "perms" text(128), + "icon" text(128), + "del_flag" text(1), + "create_by" text(64), + "create_time" integer, + "update_by" text(64), + "update_time" integer, + "remark" text(500), + PRIMARY KEY ("menu_id") +); + +-- ---------------------------- +-- Records of sys_menu +-- ---------------------------- +REPLACE INTO "sys_menu" VALUES (1, 'menu.system', 0, 16, 'system', '', '1', '1', 'D', '1', '1', '', 'icon-xiangmu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.systemRemark'); +REPLACE INTO "sys_menu" VALUES (4, 'menu.ne', 0, 3, 'ne', '', '1', '0', 'D', '1', '1', '', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.configRemark'); +REPLACE INTO "sys_menu" VALUES (5, 'menu.ue', 0, 7, 'ue', '', '1', '0', 'D', '1', '1', '', 'icon-wocanyu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueRemark'); +REPLACE INTO "sys_menu" VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 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', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +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', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +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', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +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', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +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', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.security.roleUserRemark'); +REPLACE INTO "sys_menu" VALUES (103, 'menu.system.menu', 1, 10, 'menu', 'system/menu/index', '1', '1', 'M', '1', '1', 'system:menu:list', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.menuRemark'); +REPLACE INTO "sys_menu" VALUES (104, 'menu.security.dept', 2113, 5, 'dept', 'system/dept/index', '1', '1', 'M', '1', '1', 'system:dept:list', 'icon-yuzhanghao1', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.security.deptRemark'); +REPLACE INTO "sys_menu" VALUES (105, 'menu.security.post', 2113, 6, 'post', 'system/post/index', '1', '1', 'M', '1', '1', 'system:post:list', 'icon-gonggaodayi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.security.postRemark'); +REPLACE INTO "sys_menu" VALUES (106, 'menu.system.dictType', 1, 30, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.dictTypeRemark'); +REPLACE INTO "sys_menu" VALUES (107, 'menu.system.dictData', 1, 31, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.dictDataRemark'); +REPLACE INTO "sys_menu" VALUES (108, 'menu.system.paramSet', 1, 59, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.paramSetRemark'); +REPLACE INTO "sys_menu" VALUES (109, 'menu.system.loginSource', 2113, 12, 'login-source', 'system/login-source/index', '1', '1', 'M', '1', '1', 'system:loginSource:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (111, 'menu.system.systemLog', 1, 11, 'log', '', '1', '1', 'D', '0', '0', '', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemLogRemark'); +REPLACE INTO "sys_menu" VALUES (112, 'menu.system.systemInfo', 1, 5, 'system-info', 'monitor/system/info', '1', '1', 'M', '1', '1', 'monitor:system:info', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemInfoRemark'); +REPLACE INTO "sys_menu" VALUES (113, 'menu.system.cacheInfo', 1, 8, 'cache-info', 'monitor/cache/info', '1', '1', 'M', '1', '1', 'monitor:cache:info', 'icon-gongnengjieshao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.cacheInfoRemark'); +REPLACE INTO "sys_menu" VALUES (114, 'menu.system.cache', 1, 9, 'cache', 'monitor/cache/index', '1', '1', 'M', '1', '1', 'monitor:cache:list', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.cacheRemark'); +REPLACE INTO "sys_menu" VALUES (115, 'menu.security.onlineUser', 2113, 2, 'online', 'monitor/online/index', '1', '1', 'M', '1', '1', 'monitor:online:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.security.onlineUserRemark'); +REPLACE INTO "sys_menu" VALUES (116, 'menu.system.job', 1, 20, 'job', 'monitor/job/index', '1', '1', 'M', '1', '1', 'monitor:job:list', 'icon-lishi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.jobRemark'); +REPLACE INTO "sys_menu" VALUES (117, 'menu.system.jobLog', 1, 21, '/system/job/inline/log/:jobId', 'monitor/job/log', '1', '1', 'M', '0', '1', 'monitor:job:log', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.jobLogRemark'); +REPLACE INTO "sys_menu" VALUES (500, 'menu.log.operat', 2089, 25, 'operate', 'system/log/operate/index', '1', '1', 'M', '1', '1', 'system:log:operate:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.operatRemark'); +REPLACE INTO "sys_menu" VALUES (501, 'menu.log.login', 2089, 26, 'login', 'system/log/login/index', '1', '1', 'M', '1', '1', 'system:log:login:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.loginRemark'); +REPLACE INTO "sys_menu" VALUES (1000, 'menu.common.query', 100, 1, '', '', '1', '1', 'B', '1', '1', 'system:user:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1001, 'menu.common.add', 100, 2, '', '', '1', '1', 'B', '1', '1', 'system:user:add', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1002, 'menu.common.edit', 100, 3, '', '', '1', '1', 'B', '1', '1', 'system:user:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1003, 'menu.common.delete', 100, 4, '', '', '1', '1', 'B', '1', '1', 'system:user:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1004, 'menu.common.export', 100, 5, '', '', '1', '1', 'B', '1', '1', 'system:user:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1005, 'menu.common.import', 100, 6, '', '', '1', '1', 'B', '1', '1', 'system:user:import', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1006, 'menu.common.resetPwd', 100, 7, '', '', '1', '1', 'B', '1', '1', 'system:user:resetPwd', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1007, 'menu.common.query', 101, 1, '', '', '1', '1', 'B', '1', '1', 'system:role:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1008, 'menu.common.add', 101, 2, '', '', '1', '1', 'B', '1', '1', 'system:role:add', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1009, 'menu.common.edit', 101, 3, '', '', '1', '1', 'B', '1', '1', 'system:role:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1010, 'menu.common.delete', 101, 4, '', '', '1', '1', 'B', '1', '1', 'system:role:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1011, 'menu.common.export', 101, 5, '', '', '1', '1', 'B', '1', '1', 'system:role:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1012, 'menu.common.query', 103, 1, '', '', '1', '1', 'B', '1', '1', 'system:menu:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1013, 'menu.common.add', 103, 2, '', '', '1', '1', 'B', '1', '1', 'system:menu:add', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1014, 'menu.common.edit', 103, 3, '', '', '1', '1', 'B', '1', '1', 'system:menu:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1015, 'menu.common.delete', 103, 4, '', '', '1', '1', 'B', '1', '1', 'system:menu:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1016, 'menu.common.query', 104, 1, '', '', '1', '1', 'B', '1', '1', 'system:dept:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1017, 'menu.common.add', 104, 2, '', '', '1', '1', 'B', '1', '1', 'system:dept:add', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1018, 'menu.common.edit', 104, 3, '', '', '1', '1', 'B', '1', '1', 'system:dept:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1019, 'menu.common.delete', 104, 4, '', '', '1', '1', 'B', '1', '1', 'system:dept:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1020, 'menu.common.query', 105, 1, '', '', '1', '1', 'B', '1', '1', 'system:post:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1021, 'menu.common.add', 105, 2, '', '', '1', '1', 'B', '1', '1', 'system:post:add', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1022, 'menu.common.edit', 105, 3, '', '', '1', '1', 'B', '1', '1', 'system:post:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1023, 'menu.common.delete', 105, 4, '', '', '1', '1', 'B', '1', '1', 'system:post:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1024, 'menu.common.export', 105, 5, '', '', '1', '1', 'B', '1', '1', 'system:post:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1025, 'menu.common.query', 106, 1, '#', '', '1', '1', 'B', '1', '1', 'system:dict:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1026, 'menu.common.add', 106, 2, '#', '', '1', '1', 'B', '1', '1', 'system:dict:add', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1027, 'menu.common.edit', 106, 3, '#', '', '1', '1', 'B', '1', '1', 'system:dict:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1028, 'menu.common.delete', 106, 4, '#', '', '1', '1', 'B', '1', '1', 'system:dict:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1029, 'menu.common.export', 106, 5, '#', '', '1', '1', 'B', '1', '1', 'system:dict:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1030, 'menu.common.query', 108, 1, '#', '', '1', '1', 'B', '1', '1', 'system:config:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1031, 'menu.common.add', 108, 2, '#', '', '1', '1', 'B', '1', '1', 'system:config:add', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1032, 'menu.common.edit', 108, 3, '#', '', '1', '1', 'B', '1', '1', 'system:config:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1033, 'menu.common.delete', 108, 4, '#', '', '1', '1', 'B', '1', '1', 'system:config:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1034, 'menu.common.export', 108, 5, '#', '', '1', '1', 'B', '1', '1', 'system:config:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1039, 'menu.common.query', 500, 1, '#', '', '1', '1', 'B', '1', '1', 'system:log:operate:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1040, 'menu.common.delete', 500, 2, '#', '', '1', '1', 'B', '1', '1', 'system:log:operate:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1041, 'menu.common.export', 500, 3, '#', '', '1', '1', 'B', '1', '1', 'system:log:operate:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1042, 'menu.common.query', 501, 1, '#', '', '1', '1', 'B', '1', '1', 'system:log:login:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1043, 'menu.common.delete', 501, 2, '#', '', '1', '1', 'B', '1', '1', 'system:log:login:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1044, 'menu.common.export', 501, 3, '#', '', '1', '1', 'B', '1', '1', 'system:log:login:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1045, 'menu.common.unlock', 501, 4, '#', '', '1', '1', 'B', '1', '1', 'system:log:login:unlock', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1046, 'menu.common.query', 114, 1, '#', '', '1', '1', 'B', '1', '1', 'monitor:cache:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1047, 'menu.common.delete', 114, 2, '#', '', '1', '1', 'B', '1', '1', 'monitor:cache:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1048, 'menu.common.query', 115, 1, '#', '', '1', '1', 'B', '1', '1', 'monitor:online:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1049, 'menu.forcedQuit.batch ', 115, 2, '#', '', '1', '1', 'B', '1', '1', 'monitor:online:batchLogout', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1050, 'menu.forcedQuit.single', 115, 3, '#', '', '1', '1', 'B', '1', '1', 'monitor:online:forceLogout', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1051, 'menu.common.query', 116, 1, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:query', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1052, 'menu.common.add', 116, 2, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:add', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1057, 'menu.common.query', 109, 1, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1058, 'menu.common.add', 109, 2, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1059, 'menu.common.edit', 109, 3, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1060, 'menu.common.delete', 109, 4, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2003, 'menu.neData.udmVolte', 5, 7, 'udm-volte', 'neData/udm-volte/index', '1', '0', 'M', '1', '1', 'udm+ims#volte:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2004, 'menu.neData.imsSub', 5, 9, 'ims-sub', 'neData/ims-sub/index', '1', '0', 'M', '1', '1', 'ims#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2005, 'menu.neData.smfSub', 5, 12, 'smf-sub', 'neData/smf-sub/index', '1', '0', 'M', '1', '1', 'smf#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2006, 'menu.neData.baseOnline', 5, 15, 'base-online', 'neData/base-online/index', '1', '0', 'M', '0', '1', 'amf,mme#base-online:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2007, 'menu.neData.baseStation', 5, 18, 'base-station', 'neData/base-station/index', '1', '0', 'M', '1', '1', 'amf,mme#base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2008, 'menu.ueUser.n3iwf', 5, 20, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '1', '1', 'n3iwf#sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2009, 'menu.neData.pcfSub', 5, 24, 'pcf-sub', 'neData/pcf-sub/index', '1', '0', 'M', '1', '1', 'pcf#sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2010, 'menu.neUser.nssf', 5, 26, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '1', '1', 'nssf#sub:index', 'icon-daimayingyong', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2011, 'menu.neUser.nssfAmf', 5, 28, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '1', '1', 'nssf#sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2083, 'menu.trace', 2087, 30, 'traceManage', '', '1', '0', 'D', '1', '1', '', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.traceRemark'); +REPLACE INTO "sys_menu" VALUES (2084, 'menu.trace.task', 2083, 1, 'task', 'traceManage/task/index', '1', '0', 'M', '1', '1', 'traceManage:task:index', 'icon-chexiao', '0', 'system', 1728641403588, 'system', 1744453890548, 'menu.trace.taskRemark'); +REPLACE INTO "sys_menu" VALUES (2085, 'menu.trace.taskData', 2083, 4, 'task/inline/data', 'traceManage/task/data', '1', '0', 'M', '0', '1', 'traceManage:task:data', '#', '0', 'system', 1728641403588, 'system', 1744453921381, ''); +REPLACE INTO "sys_menu" VALUES (2086, 'menu.trace.pcap', 2083, 11, 'pcap', 'traceManage/pcap/index', '1', '1', 'M', '1', '1', 'traceManage:pcap:index', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.trace.pcapRemark'); +REPLACE INTO "sys_menu" VALUES (2087, 'menu.fault', 0, 2, 'faultManage', '', '1', '0', 'D', '1', '1', '', 'icon-jinggao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.faultRemark'); +REPLACE INTO "sys_menu" VALUES (2088, 'menu.fault.active', 2129, 1, 'active-alarm', 'faultManage/active-alarm/index', '1', '1', 'M', '1', '1', 'faultManage:active-alarm:index', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.fault.activemRemark'); +REPLACE INTO "sys_menu" VALUES (2089, 'menu.log', 0, 9, 'logManage', '', '1', '0', 'D', '1', '1', '', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.logRemark'); +REPLACE INTO "sys_menu" VALUES (2091, 'menu.log.mml', 2089, 30, 'mml', 'logManage/mml/index', '1', '1', 'M', '1', '1', 'logManage:mml:index', 'icon-wocanyu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.mmlRemark'); +REPLACE INTO "sys_menu" VALUES (2092, 'menu.log.alarm', 2089, 40, 'alarm-log', 'logManage/alarm/index', '1', '0', 'M', '1', '1', 'logManage:alarm:index', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.alarmRemark'); +REPLACE INTO "sys_menu" VALUES (2094, 'menu.log.forwarding', 2089, 41, 'forwarding', 'logManage/forwarding/index', '1', '0', 'M', '1', '1', 'logManage:forwarding:index', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.forwardingRemark'); +REPLACE INTO "sys_menu" VALUES (2095, 'menu.log.set', 2089, 45, 'logSet', 'logManage/logSet/index', '1', '0', 'M', '0', '0', 'logManage:logSet:index', 'icon-you', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.setRemark'); +REPLACE INTO "sys_menu" VALUES (2096, 'menu.neData.backupData', 5, 40, 'backup-data', 'neData/backup-data/index', '1', '0', 'M', '1', '1', 'ne-data:backup-data:list', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2097, 'menu.fault.history', 2129, 2, 'history-alarm', 'faultManage/history-alarm/index', '1', '1', 'M', '1', '1', 'faultManage/history-alarm/index', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.fault.historyRemark'); +REPLACE INTO "sys_menu" VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-setting', 'faultManage/fault-setting/index', '1', '0', 'M', '0', '1', 'faultManage/fault-setting/index', 'icon-gonggaodayi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.fault.setRemark'); +REPLACE INTO "sys_menu" VALUES (2099, 'menu.perf', 0, 5, 'perfManage', '', '1', '0', 'D', '1', '1', '', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.perfRemark'); +REPLACE INTO "sys_menu" VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', 'perfManage/taskManage/index', '1', '0', 'M', '0', '1', 'perfManage:taskManage:index', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.perf.taskRemark'); +REPLACE INTO "sys_menu" VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '0', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.perf.dataRemark'); +REPLACE INTO "sys_menu" VALUES (2102, 'menu.perf.kpiOverView', 2099, 10, 'kpiOverView', 'perfManage/kpiOverView/index', '1', '0', 'M', '1', '1', 'perfManage:perfReport:index', 'icon-gonggaodayi', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +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', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.perf.thresholdRemark'); +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', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.perf.kpiRemark'); +REPLACE INTO "sys_menu" VALUES (2105, 'menu.perf.customTarget', 2099, 99, 'customTarget', 'perfManage/customTarget/index', '1', '0', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.perf.customTargetRemark'); +REPLACE INTO "sys_menu" VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 12, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '1', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', '', '1', '0', 'D', '1', '1', '', 'icon-zhizuoliucheng', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.udmRemark'); +REPLACE INTO "sys_menu" VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '0', '0', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.setRemark'); +REPLACE INTO "sys_menu" VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '0', '0', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.mml.omcRemark'); +REPLACE INTO "sys_menu" VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'sgwc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2113, 'menu.security', 0, 14, 'security', '', '1', '0', 'D', '1', '1', '', 'icon-suofang', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.securityRemark'); +REPLACE INTO "sys_menu" VALUES (2114, 'menu.system.systemSet', 1, 60, 'setting', 'system/setting/index', '1', '1', 'M', '1', '1', 'system:setting:index', 'icon-piliang', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemSetRemark'); +REPLACE INTO "sys_menu" VALUES (2115, 'menu.system.systemResource', 1, 6, 'monitor', 'monitor/monitor/index', '1', '1', 'M', '1', '1', 'monitor:monitor:info', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.systemResourceRemark'); +REPLACE INTO "sys_menu" VALUES (2116, 'menu.dashboard.smscCDR.content', 2157, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:smsc:content', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2117, 'menu.common.delete', 2140, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:ne:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2119, 'Alarm Overview', 2129, 6, 'alarm-overview', 'faultManage/alarm-overview/index', '1', '1', 'M', '1', '1', 'faultManage:active-overview:index', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2120, 'DashboardV1', 2131, 8, 'dashboardV1', 'dashboard/overview/index', '1', '0', 'M', '1', '1', 'dashboard:overview:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2121, 'menu.system.user.editRole', 100, 8, '', '', '1', '1', 'B', '1', '1', 'system:user:editRole', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2122, 'menu.system.setting.i18n', 2114, 1, '', '', '1', '1', 'B', '1', '1', 'system:setting:i18n', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.setting.i18nRemark'); +REPLACE INTO "sys_menu" VALUES (2123, 'menu.log.neFile', 2089, 9, 'neFile', 'ne/neFile/index', '1', '0', 'M', '1', '1', 'ne:neFile:index', 'icon-tubiaohuizhi', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2126, 'menu.monitor.topology', 2130, 10, 'topology', 'monitor/topology/index', '1', '0', 'M', '1', '1', 'monitor:topology:index', 'icon-fangda', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2127, 'menu.monitor.topologyBuild', 2130, 30, 'topologyBuild', 'monitor/topologyBuild/index', '1', '0', 'M', '1', '1', 'monitor:topologyBuild:index', 'icon-fangda', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2128, 'menu.monitor.topologyArchitecture', 2130, 20, 'topologyArchitecture', 'monitor/topologyArchitecture/index', '1', '0', 'M', '1', '1', 'monitor:topologyArchitecture:index', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2129, 'menu.alarm', 2087, 20, 'alarm', '', '1', '0', 'D', '1', '1', '', 'icon-jinggao', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2130, 'menu.topology', 2087, 10, 'topology', '', '1', '0', 'D', '1', '1', '', 'icon-anzhuo', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2131, 'menu.dashboard', 2087, 15, 'dashboard', '', '1', '0', 'D', '1', '1', '', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2132, 'menu.dashboard.overview', 2131, 1, 'overview', 'dashboard/overview2/index', '1', '0', 'M', '1', '1', 'dashboard:overview:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2133, 'menu.dashboard.imsCDR', 2140, 3, 'imsCDR', 'dashboard/imsCDR/index', '1', '0', 'M', '1', '1', 'ims#cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2135, 'menu.ne.neHost', 4, 15, 'neHost', 'ne/neHost/index', '1', '1', 'M', '1', '0', 'ne:neHost:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2136, 'menu.ne.neHostCommand', 4, 18, 'neHostCommand', 'ne/neHostCommand/index', '1', '0', 'M', '1', '0', 'ne:neHostCommand:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2137, 'menu.ne.neInfo', 4, 10, 'neInfo', 'ne/neInfo/index', '1', '0', 'M', '1', '1', 'ne:neInfo:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2138, 'menu.dashboard.amfUE', 2141, 1, 'amfUE', 'dashboard/amfUE/index', '1', '0', 'M', '1', '1', 'amf#ue:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2139, 'menu.perf.kpiIMSOverview', 2099, 14, 'dashboard', 'perfManage/overview/index', '1', '0', 'M', '1', '1', 'ims#perfManage:dashboard:index', 'icon-fuzhichenggong', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2140, 'menu.monitor.cdr', 2089, 10, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2141, 'menu.monitor.event', 2089, 20, 'event', '', '1', '0', 'D', '1', '1', '', 'icon-gengduo', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2142, 'menu.ne.neQuickSetup', 4, 40, 'neQuickSetup', 'ne/neQuickSetup/index', '1', '1', 'M', '1', '1', 'ne:neQuickSetup:list', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2143, 'menu.ne.neLicense', 4, 20, 'neLicense', 'ne/neLicense/index', '1', '0', 'M', '1', '1', 'ne:neLicense:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2144, 'menu.ne.neSoftware', 4, 23, 'neSoftware', 'ne/neSoftware/index', '1', '0', 'M', '1', '1', 'ne:neSoftware:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2145, 'menu.ne.neVersion', 4, 26, 'neVersion', 'ne/neVersion/index', '1', '0', 'M', '1', '1', 'ne:neVersion:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2146, 'menu.ne.neConfig', 4, 28, 'neConfig', 'ne/neConfig/index', '1', '0', 'M', '1', '1', 'ne:neConfig:list', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2147, 'menu.fault.event', 2129, 3, 'event', 'faultManage/event/index', '1', '0', 'M', '1', '1', 'faultManage:event:index', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2148, 'menu.dashboard.smfCDR', 2140, 6, 'smfCDR', 'dashboard/smfCDR/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2149, 'menu.dashboard.mmeUE', 2141, 5, 'mmeUE', 'dashboard/mmeUE/index', '1', '0', 'M', '1', '1', 'mme#ue:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2150, 'menu.system.user.editPost', 100, 9, '', '', '1', '1', 'B', '1', '1', 'system:user:editPost', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2151, 'menu.system.setting.doc', 2114, 2, '', '', '1', '1', 'B', '1', '1', 'system:setting:doc', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2152, 'menu.system.setting.official', 2114, 3, '', '', '1', '1', 'B', '1', '1', 'system:setting:official', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2153, 'menu.system.setting.lock', 2114, 4, '', '', '1', '1', 'B', '1', '1', 'system:setting:lock', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2154, 'menu.ne.neConfigBackup', 4, 29, 'neConfigBackup', 'ne/neConfigBackup/index', '1', '0', 'M', '1', '1', 'ne:neConfigBackup:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2155, 'menu.common.delete', 2154, 1, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2156, 'menu.common.edit', 2154, 2, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'smsc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2158, 'menu.trace.pcapFile', 2083, 12, 'pcap/inline/file', 'traceManage/pcap/file', '1', '0', 'M', '0', '1', 'traceManage:pcap:index', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2159, 'menu.log.exportFile', 2089, 100, 'exportFile', 'logManage/exportFile/index', '1', '0', 'M', '1', '1', 'logManage:exportFile:index', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2160, 'menu.perf.kpiCReport', 2099, 100, 'kpiCReport', 'perfManage/kpiCReport/index', '1', '0', 'M', '1', '1', 'perfManage:kpiCReport:index', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +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', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2162, 'menu.trace.taskAnalyze', 2083, 2, 'task/inline/analyze', 'traceManage/task/analyze', '1', '0', 'M', '0', '1', 'traceManage:task:analyze', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +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', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +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', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2165, 'menu.ne.neOverview', 4, 1, 'neOverview', 'configManage/neOverview/index', '1', '0', 'M', '1', '1', 'configManage:neOverview:index', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ne.neOverviewRemark'); +REPLACE INTO "sys_menu" VALUES (2166, 'menu.dashboard.overview.smfUeNum', 2132, 4, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:smfUeNum', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2167, 'menu.dashboard.overview.imsUeNum', 2132, 2, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:imsUeNum', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2168, 'menu.dashboard.overview.gnbBase', 2132, 6, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:gnbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (2169, 'menu.dashboard.overview.enbBase', 2132, 8, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:enbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); + +REPLACE INTO `sys_menu` VALUES (20000, 'menu.ue.cbc.cbe', 5, 20, 'cbe', 'cbc/cbe/index', '1', '0', 'M', '1', '1', 'cbc#dashboard:cdr:index', 'icon-tubiaoku', '0', 'system', 1711352709786, 'system', 1747796007372, ''); diff --git a/build/database/lite/upgrade/upg_sys_role_menu.sql b/build/database/lite/upgrade/upg_sys_role_menu.sql new file mode 100644 index 00000000..15b8ae6a --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_role_menu.sql @@ -0,0 +1,299 @@ +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_role_menu" ( + "role_id" integer NOT NULL, + "menu_id" integer NOT NULL, + PRIMARY KEY ("role_id", "menu_id") +); + +DELETE FROM "sys_role_menu" WHERE "role_id" IN (2,3,4,5); +-- ---------------------------- +-- Records of sys_role_menu +-- ---------------------------- +REPLACE INTO "sys_role_menu" VALUES (2, 1); +REPLACE INTO "sys_role_menu" VALUES (2, 4); +REPLACE INTO "sys_role_menu" VALUES (2, 5); +REPLACE INTO "sys_role_menu" VALUES (2, 60); +REPLACE INTO "sys_role_menu" VALUES (2, 61); +REPLACE INTO "sys_role_menu" VALUES (2, 63); +REPLACE INTO "sys_role_menu" VALUES (2, 64); +REPLACE INTO "sys_role_menu" VALUES (2, 65); +REPLACE INTO "sys_role_menu" VALUES (2, 66); +REPLACE INTO "sys_role_menu" VALUES (2, 100); +REPLACE INTO "sys_role_menu" VALUES (2, 101); +REPLACE INTO "sys_role_menu" VALUES (2, 102); +REPLACE INTO "sys_role_menu" VALUES (2, 103); +REPLACE INTO "sys_role_menu" VALUES (2, 104); +REPLACE INTO "sys_role_menu" VALUES (2, 105); +REPLACE INTO "sys_role_menu" VALUES (2, 108); +REPLACE INTO "sys_role_menu" VALUES (2, 109); +REPLACE INTO "sys_role_menu" VALUES (2, 111); +REPLACE INTO "sys_role_menu" VALUES (2, 112); +REPLACE INTO "sys_role_menu" VALUES (2, 115); +REPLACE INTO "sys_role_menu" VALUES (2, 116); +REPLACE INTO "sys_role_menu" VALUES (2, 117); +REPLACE INTO "sys_role_menu" VALUES (2, 500); +REPLACE INTO "sys_role_menu" VALUES (2, 501); +REPLACE INTO "sys_role_menu" VALUES (2, 1000); +REPLACE INTO "sys_role_menu" VALUES (2, 1001); +REPLACE INTO "sys_role_menu" VALUES (2, 1002); +REPLACE INTO "sys_role_menu" VALUES (2, 1003); +REPLACE INTO "sys_role_menu" VALUES (2, 1004); +REPLACE INTO "sys_role_menu" VALUES (2, 1005); +REPLACE INTO "sys_role_menu" VALUES (2, 1006); +REPLACE INTO "sys_role_menu" VALUES (2, 1007); +REPLACE INTO "sys_role_menu" VALUES (2, 1008); +REPLACE INTO "sys_role_menu" VALUES (2, 1009); +REPLACE INTO "sys_role_menu" VALUES (2, 1010); +REPLACE INTO "sys_role_menu" VALUES (2, 1011); +REPLACE INTO "sys_role_menu" VALUES (2, 1012); +REPLACE INTO "sys_role_menu" VALUES (2, 1013); +REPLACE INTO "sys_role_menu" VALUES (2, 1014); +REPLACE INTO "sys_role_menu" VALUES (2, 1015); +REPLACE INTO "sys_role_menu" VALUES (2, 1016); +REPLACE INTO "sys_role_menu" VALUES (2, 1017); +REPLACE INTO "sys_role_menu" VALUES (2, 1018); +REPLACE INTO "sys_role_menu" VALUES (2, 1019); +REPLACE INTO "sys_role_menu" VALUES (2, 1020); +REPLACE INTO "sys_role_menu" VALUES (2, 1021); +REPLACE INTO "sys_role_menu" VALUES (2, 1022); +REPLACE INTO "sys_role_menu" VALUES (2, 1023); +REPLACE INTO "sys_role_menu" VALUES (2, 1024); +REPLACE INTO "sys_role_menu" VALUES (2, 1030); +REPLACE INTO "sys_role_menu" VALUES (2, 1032); +REPLACE INTO "sys_role_menu" VALUES (2, 1034); +REPLACE INTO "sys_role_menu" VALUES (2, 1039); +REPLACE INTO "sys_role_menu" VALUES (2, 1041); +REPLACE INTO "sys_role_menu" VALUES (2, 1042); +REPLACE INTO "sys_role_menu" VALUES (2, 1044); +REPLACE INTO "sys_role_menu" VALUES (2, 1045); +REPLACE INTO "sys_role_menu" VALUES (2, 1048); +REPLACE INTO "sys_role_menu" VALUES (2, 1049); +REPLACE INTO "sys_role_menu" VALUES (2, 1050); +REPLACE INTO "sys_role_menu" VALUES (2, 1051); +REPLACE INTO "sys_role_menu" VALUES (2, 1052); +REPLACE INTO "sys_role_menu" VALUES (2, 1053); +REPLACE INTO "sys_role_menu" VALUES (2, 1054); +REPLACE INTO "sys_role_menu" VALUES (2, 1055); +REPLACE INTO "sys_role_menu" VALUES (2, 1056); +REPLACE INTO "sys_role_menu" VALUES (2, 1057); +REPLACE INTO "sys_role_menu" VALUES (2, 1058); +REPLACE INTO "sys_role_menu" VALUES (2, 1059); +REPLACE INTO "sys_role_menu" VALUES (2, 1060); +REPLACE INTO "sys_role_menu" VALUES (2, 2000); +REPLACE INTO "sys_role_menu" VALUES (2, 2001); +REPLACE INTO "sys_role_menu" VALUES (2, 2002); +REPLACE INTO "sys_role_menu" VALUES (2, 2003); +REPLACE INTO "sys_role_menu" VALUES (2, 2004); +REPLACE INTO "sys_role_menu" VALUES (2, 2005); +REPLACE INTO "sys_role_menu" VALUES (2, 2007); +REPLACE INTO "sys_role_menu" VALUES (2, 2008); +REPLACE INTO "sys_role_menu" VALUES (2, 2009); +REPLACE INTO "sys_role_menu" VALUES (2, 2010); +REPLACE INTO "sys_role_menu" VALUES (2, 2011); +REPLACE INTO "sys_role_menu" VALUES (2, 2083); +REPLACE INTO "sys_role_menu" VALUES (2, 2084); +REPLACE INTO "sys_role_menu" VALUES (2, 2086); +REPLACE INTO "sys_role_menu" VALUES (2, 2087); +REPLACE INTO "sys_role_menu" VALUES (2, 2088); +REPLACE INTO "sys_role_menu" VALUES (2, 2089); +REPLACE INTO "sys_role_menu" VALUES (2, 2091); +REPLACE INTO "sys_role_menu" VALUES (2, 2092); +REPLACE INTO "sys_role_menu" VALUES (2, 2094); +REPLACE INTO "sys_role_menu" VALUES (2, 2096); +REPLACE INTO "sys_role_menu" VALUES (2, 2097); +REPLACE INTO "sys_role_menu" VALUES (2, 2099); +REPLACE INTO "sys_role_menu" VALUES (2, 2100); +REPLACE INTO "sys_role_menu" VALUES (2, 2101); +REPLACE INTO "sys_role_menu" VALUES (2, 2102); +REPLACE INTO "sys_role_menu" VALUES (2, 2103); +REPLACE INTO "sys_role_menu" VALUES (2, 2104); +REPLACE INTO "sys_role_menu" VALUES (2, 2105); +REPLACE INTO "sys_role_menu" VALUES (2, 2107); +REPLACE INTO "sys_role_menu" VALUES (2, 2108); +REPLACE INTO "sys_role_menu" VALUES (2, 2109); +REPLACE INTO "sys_role_menu" VALUES (2, 2112); +REPLACE INTO "sys_role_menu" VALUES (2, 2113); +REPLACE INTO "sys_role_menu" VALUES (2, 2114); +REPLACE INTO "sys_role_menu" VALUES (2, 2115); +REPLACE INTO "sys_role_menu" VALUES (2, 2116); +REPLACE INTO "sys_role_menu" VALUES (2, 2117); +REPLACE INTO "sys_role_menu" VALUES (2, 2118); +REPLACE INTO "sys_role_menu" VALUES (2, 2121); +REPLACE INTO "sys_role_menu" VALUES (2, 2122); +REPLACE INTO "sys_role_menu" VALUES (2, 2123); +REPLACE INTO "sys_role_menu" VALUES (2, 2126); +REPLACE INTO "sys_role_menu" VALUES (2, 2128); +REPLACE INTO "sys_role_menu" VALUES (2, 2129); +REPLACE INTO "sys_role_menu" VALUES (2, 2130); +REPLACE INTO "sys_role_menu" VALUES (2, 2131); +REPLACE INTO "sys_role_menu" VALUES (2, 2132); +REPLACE INTO "sys_role_menu" VALUES (2, 2133); +REPLACE INTO "sys_role_menu" VALUES (2, 2137); +REPLACE INTO "sys_role_menu" VALUES (2, 2138); +REPLACE INTO "sys_role_menu" VALUES (2, 2139); +REPLACE INTO "sys_role_menu" VALUES (2, 2140); +REPLACE INTO "sys_role_menu" VALUES (2, 2141); +REPLACE INTO "sys_role_menu" VALUES (2, 2142); +REPLACE INTO "sys_role_menu" VALUES (2, 2143); +REPLACE INTO "sys_role_menu" VALUES (2, 2145); +REPLACE INTO "sys_role_menu" VALUES (2, 2146); +REPLACE INTO "sys_role_menu" VALUES (2, 2147); +REPLACE INTO "sys_role_menu" VALUES (2, 2148); +REPLACE INTO "sys_role_menu" VALUES (2, 2149); +REPLACE INTO "sys_role_menu" VALUES (2, 2150); +REPLACE INTO "sys_role_menu" VALUES (2, 2151); +REPLACE INTO "sys_role_menu" VALUES (2, 2152); +REPLACE INTO "sys_role_menu" VALUES (2, 2153); +REPLACE INTO "sys_role_menu" VALUES (2, 2154); +REPLACE INTO "sys_role_menu" VALUES (2, 2155); +REPLACE INTO "sys_role_menu" VALUES (2, 2156); +REPLACE INTO "sys_role_menu" VALUES (2, 2157); +REPLACE INTO "sys_role_menu" VALUES (2, 2158); +REPLACE INTO "sys_role_menu" VALUES (2, 2159); +REPLACE INTO "sys_role_menu" VALUES (2, 2160); +REPLACE INTO "sys_role_menu" VALUES (2, 2162); +REPLACE INTO "sys_role_menu" VALUES (2, 2163); +REPLACE INTO "sys_role_menu" VALUES (2, 2164); +REPLACE INTO "sys_role_menu" VALUES (2, 2165); +REPLACE INTO "sys_role_menu" VALUES (2, 2166); +REPLACE INTO "sys_role_menu" VALUES (2, 2167); +REPLACE INTO "sys_role_menu" VALUES (2, 2168); +REPLACE INTO "sys_role_menu" VALUES (2, 2169); +REPLACE INTO "sys_role_menu" VALUES (2, 20000); + +REPLACE INTO "sys_role_menu" VALUES (3, 1); +REPLACE INTO "sys_role_menu" VALUES (3, 4); +REPLACE INTO "sys_role_menu" VALUES (3, 5); +REPLACE INTO "sys_role_menu" VALUES (3, 60); +REPLACE INTO "sys_role_menu" VALUES (3, 65); +REPLACE INTO "sys_role_menu" VALUES (3, 66); +REPLACE INTO "sys_role_menu" VALUES (3, 108); +REPLACE INTO "sys_role_menu" VALUES (3, 112); +REPLACE INTO "sys_role_menu" VALUES (3, 500); +REPLACE INTO "sys_role_menu" VALUES (3, 501); +REPLACE INTO "sys_role_menu" VALUES (3, 1030); +REPLACE INTO "sys_role_menu" VALUES (3, 1032); +REPLACE INTO "sys_role_menu" VALUES (3, 1034); +REPLACE INTO "sys_role_menu" VALUES (3, 1039); +REPLACE INTO "sys_role_menu" VALUES (3, 1042); +REPLACE INTO "sys_role_menu" VALUES (3, 2000); +REPLACE INTO "sys_role_menu" VALUES (3, 2001); +REPLACE INTO "sys_role_menu" VALUES (3, 2002); +REPLACE INTO "sys_role_menu" VALUES (3, 2003); +REPLACE INTO "sys_role_menu" VALUES (3, 2004); +REPLACE INTO "sys_role_menu" VALUES (3, 2005); +REPLACE INTO "sys_role_menu" VALUES (3, 2007); +REPLACE INTO "sys_role_menu" VALUES (3, 2008); +REPLACE INTO "sys_role_menu" VALUES (3, 2009); +REPLACE INTO "sys_role_menu" VALUES (3, 2010); +REPLACE INTO "sys_role_menu" VALUES (3, 2011); +REPLACE INTO "sys_role_menu" VALUES (3, 2083); +REPLACE INTO "sys_role_menu" VALUES (3, 2084); +REPLACE INTO "sys_role_menu" VALUES (3, 2086); +REPLACE INTO "sys_role_menu" VALUES (3, 2087); +REPLACE INTO "sys_role_menu" VALUES (3, 2088); +REPLACE INTO "sys_role_menu" VALUES (3, 2089); +REPLACE INTO "sys_role_menu" VALUES (3, 2091); +REPLACE INTO "sys_role_menu" VALUES (3, 2092); +REPLACE INTO "sys_role_menu" VALUES (3, 2094); +REPLACE INTO "sys_role_menu" VALUES (3, 2097); +REPLACE INTO "sys_role_menu" VALUES (3, 2107); +REPLACE INTO "sys_role_menu" VALUES (3, 2108); +REPLACE INTO "sys_role_menu" VALUES (3, 2109); +REPLACE INTO "sys_role_menu" VALUES (3, 2112); +REPLACE INTO "sys_role_menu" VALUES (3, 2114); +REPLACE INTO "sys_role_menu" VALUES (3, 2115); +REPLACE INTO "sys_role_menu" VALUES (3, 2116); +REPLACE INTO "sys_role_menu" VALUES (3, 2118); +REPLACE INTO "sys_role_menu" VALUES (3, 2122); +REPLACE INTO "sys_role_menu" VALUES (3, 2123); +REPLACE INTO "sys_role_menu" VALUES (3, 2126); +REPLACE INTO "sys_role_menu" VALUES (3, 2128); +REPLACE INTO "sys_role_menu" VALUES (3, 2129); +REPLACE INTO "sys_role_menu" VALUES (3, 2130); +REPLACE INTO "sys_role_menu" VALUES (3, 2131); +REPLACE INTO "sys_role_menu" VALUES (3, 2132); +REPLACE INTO "sys_role_menu" VALUES (3, 2133); +REPLACE INTO "sys_role_menu" VALUES (3, 2137); +REPLACE INTO "sys_role_menu" VALUES (3, 2138); +REPLACE INTO "sys_role_menu" VALUES (3, 2140); +REPLACE INTO "sys_role_menu" VALUES (3, 2141); +REPLACE INTO "sys_role_menu" VALUES (3, 2143); +REPLACE INTO "sys_role_menu" VALUES (3, 2146); +REPLACE INTO "sys_role_menu" VALUES (3, 2147); +REPLACE INTO "sys_role_menu" VALUES (3, 2148); +REPLACE INTO "sys_role_menu" VALUES (3, 2149); +REPLACE INTO "sys_role_menu" VALUES (3, 2151); +REPLACE INTO "sys_role_menu" VALUES (3, 2152); +REPLACE INTO "sys_role_menu" VALUES (3, 2153); +REPLACE INTO "sys_role_menu" VALUES (3, 2157); +REPLACE INTO "sys_role_menu" VALUES (3, 2158); +REPLACE INTO "sys_role_menu" VALUES (3, 2162); +REPLACE INTO "sys_role_menu" VALUES (3, 2163); +REPLACE INTO "sys_role_menu" VALUES (3, 2165); +REPLACE INTO "sys_role_menu" VALUES (3, 2166); +REPLACE INTO "sys_role_menu" VALUES (3, 2167); +REPLACE INTO "sys_role_menu" VALUES (3, 2168); +REPLACE INTO "sys_role_menu" VALUES (3, 2169); +REPLACE INTO "sys_role_menu" VALUES (3, 20000); + +REPLACE INTO "sys_role_menu" VALUES (4, 1); +REPLACE INTO "sys_role_menu" VALUES (4, 4); +REPLACE INTO "sys_role_menu" VALUES (4, 112); +REPLACE INTO "sys_role_menu" VALUES (4, 115); +REPLACE INTO "sys_role_menu" VALUES (4, 500); +REPLACE INTO "sys_role_menu" VALUES (4, 501); +REPLACE INTO "sys_role_menu" VALUES (4, 1039); +REPLACE INTO "sys_role_menu" VALUES (4, 1041); +REPLACE INTO "sys_role_menu" VALUES (4, 1042); +REPLACE INTO "sys_role_menu" VALUES (4, 1044); +REPLACE INTO "sys_role_menu" VALUES (4, 1048); +REPLACE INTO "sys_role_menu" VALUES (4, 2087); +REPLACE INTO "sys_role_menu" VALUES (4, 2088); +REPLACE INTO "sys_role_menu" VALUES (4, 2089); +REPLACE INTO "sys_role_menu" VALUES (4, 2091); +REPLACE INTO "sys_role_menu" VALUES (4, 2092); +REPLACE INTO "sys_role_menu" VALUES (4, 2094); +REPLACE INTO "sys_role_menu" VALUES (4, 2097); +REPLACE INTO "sys_role_menu" VALUES (4, 2112); +REPLACE INTO "sys_role_menu" VALUES (4, 2113); +REPLACE INTO "sys_role_menu" VALUES (4, 2115); +REPLACE INTO "sys_role_menu" VALUES (4, 2116); +REPLACE INTO "sys_role_menu" VALUES (4, 2123); +REPLACE INTO "sys_role_menu" VALUES (4, 2126); +REPLACE INTO "sys_role_menu" VALUES (4, 2128); +REPLACE INTO "sys_role_menu" VALUES (4, 2129); +REPLACE INTO "sys_role_menu" VALUES (4, 2130); +REPLACE INTO "sys_role_menu" VALUES (4, 2131); +REPLACE INTO "sys_role_menu" VALUES (4, 2132); +REPLACE INTO "sys_role_menu" VALUES (4, 2133); +REPLACE INTO "sys_role_menu" VALUES (4, 2138); +REPLACE INTO "sys_role_menu" VALUES (4, 2140); +REPLACE INTO "sys_role_menu" VALUES (4, 2141); +REPLACE INTO "sys_role_menu" VALUES (4, 2147); +REPLACE INTO "sys_role_menu" VALUES (4, 2148); +REPLACE INTO "sys_role_menu" VALUES (4, 2149); +REPLACE INTO "sys_role_menu" VALUES (4, 2157); +REPLACE INTO "sys_role_menu" VALUES (4, 2165); +REPLACE INTO "sys_role_menu" VALUES (4, 2166); +REPLACE INTO "sys_role_menu" VALUES (4, 2167); +REPLACE INTO "sys_role_menu" VALUES (4, 2168); +REPLACE INTO "sys_role_menu" VALUES (4, 2169); + +REPLACE INTO "sys_role_menu" VALUES (5, 1); +REPLACE INTO "sys_role_menu" VALUES (5, 4); +REPLACE INTO "sys_role_menu" VALUES (5, 112); +REPLACE INTO "sys_role_menu" VALUES (5, 2087); +REPLACE INTO "sys_role_menu" VALUES (5, 2115); +REPLACE INTO "sys_role_menu" VALUES (5, 2126); +REPLACE INTO "sys_role_menu" VALUES (5, 2128); +REPLACE INTO "sys_role_menu" VALUES (5, 2130); +REPLACE INTO "sys_role_menu" VALUES (5, 2131); +REPLACE INTO "sys_role_menu" VALUES (5, 2132); +REPLACE INTO "sys_role_menu" VALUES (5, 2165); +REPLACE INTO "sys_role_menu" VALUES (5, 2166); +REPLACE INTO "sys_role_menu" VALUES (5, 2167); +REPLACE INTO "sys_role_menu" VALUES (5, 2168); +REPLACE INTO "sys_role_menu" VALUES (5, 2169); diff --git a/build/database/lite/upgrade/upg_sys_user.sql b/build/database/lite/upgrade/upg_sys_user.sql new file mode 100644 index 00000000..89eab69f --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_user.sql @@ -0,0 +1,46 @@ +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +ALTER TABLE "sys_user" RENAME TO "sys_user_old"; +CREATE TABLE "sys_user" ( + "user_id" integer NOT NULL, + "dept_id" integer, + "user_name" text(36) NOT NULL, + "nick_name" text(36) NOT NULL, + "email" text(64), + "phone" text(32), + "sex" text(1), + "avatar" text(255), + "password" text(128), + "user_type" text(20), + "user_source" text(32), + "status_flag" text(1), + "del_flag" text(1), + "password_update_time" integer, + "login_count" integer, + "login_ip" text(128), + "login_time" integer, + "create_by" text(64), + "create_time" integer, + "update_by" text(64), + "update_time" integer, + "remark" text(200), + PRIMARY KEY ("user_id") +); + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO "sys_user" ( +"user_id", "dept_id", "user_name", "nick_name", "email", "phone", "sex", "avatar", "password", "status_flag", "del_flag", "password_update_time", "login_count", "login_ip", "login_time", "create_by", "create_time", "update_by", "update_time", "remark") +SELECT +"user_id", "dept_id", "user_name", "nick_name", "email", "phone", "sex", "avatar", "password", "status_flag", "del_flag", "password_update_time", "login_count", "login_ip", "login_time", "create_by", "create_time", "update_by", "update_time", "remark" +FROM "sys_user_old"; + +-- UPDATE "user_type", "user_source" +UPDATE sys_user SET +user_type = COALESCE((SELECT user_type FROM sys_user_old WHERE sys_user_old.user_id = sys_user.user_id), 'Sytem'), +user_source = COALESCE((SELECT user_source FROM sys_user_old WHERE sys_user_old.user_id = sys_user.user_id), '#') +WHERE EXISTS (SELECT 1 FROM sys_user_old WHERE sys_user_old.user_id = sys_user.user_id); + +DROP TABLE IF EXISTS "sys_user_old"; \ No newline at end of file diff --git a/build/database/std/common/mml_command.sql b/build/database/std/common/mml_command.sql index 43d1e488..ef32e0d4 100644 --- a/build/database/std/common/mml_command.sql +++ b/build/database/std/common/mml_command.sql @@ -1,22 +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: 14/05/2024 11:55:53 -*/ - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for mml_command -- ---------------------------- @@ -31,9 +12,8 @@ CREATE TABLE `mml_command` ( `mml_display` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `param_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, `status` enum('Active','Inactive') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Active' COMMENT '激活: Active 未激活: Inactive', - PRIMARY KEY (`id`) USING BTREE, - INDEX `id`(`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1626 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of mml_command @@ -71,5 +51,3 @@ INSERT INTO `mml_command` VALUES (1622, 'OMC', 'logManagement', 'Log Management' INSERT INTO `mml_command` VALUES (1623, 'OMC', 'logManagement', 'Log Management', 'lst', 'eventlog', 'List NE Event Log', '[{\"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\":\"log_time\\u003e\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Log time(\\u003e=)\",\"filter\":\"\",\"name\":\"starttime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"log_time\\u003c\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Log time(\\u003c=)\",\"filter\":\"\",\"name\":\"endtime\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1624, 'OMC', 'mmlManagement', 'MML Management', 'lst', 'mmlcmd', 'List MML Command', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Category\",\"filter\":\"\",\"name\":\"category\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"operation\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Operation\",\"filter\":\"\",\"name\":\"operation\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"object\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Object\",\"filter\":\"\",\"name\":\"object\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1625, 'OMC', 'systemManagement', 'System Management', 'dsp', 'sysinfo', 'Display NE System 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\"}]', 'Active'); - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/common/mml_system.sql b/build/database/std/common/mml_system.sql index f19b51c7..696dc145 100644 --- a/build/database/std/common/mml_system.sql +++ b/build/database/std/common/mml_system.sql @@ -29,7 +29,7 @@ CREATE TABLE `mml_system` ( `operation` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `object` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `mml_display` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `object_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'mml', + `object_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'General', `param_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, `status` enum('Active','Inactive') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Active' COMMENT '激活: Active 未激活: Inactive', PRIMARY KEY (`id`) USING BTREE @@ -38,66 +38,66 @@ CREATE TABLE `mml_system` ( -- ---------------------------- -- Records of mml_system -- ---------------------------- -INSERT INTO `mml_system` VALUES (833, 'UPF', 'upfManagement', 'UPF Management', 'help', '', 'List UPF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (834, 'UPF', 'systemManagement', 'System Management', 'set', 'n3 driver', 'Set N3 Driver', 'mml', '[{\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mask\",\"filter\":\"\",\"name\":\"mask\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mac address\",\"filter\":\"\",\"name\":\"mac\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"PCI address\",\"filter\":\"\",\"name\":\"pci\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (835, 'UPF', 'systemManagement', 'System Management', 'set', 'n4 ip', 'Set N4 IP Address', 'mml', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (836, 'UPF', 'systemManagement', 'System Management', 'set', 'n6 driver', 'Set N6 Driver', 'mml', '[{\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mask\",\"filter\":\"\",\"name\":\"mask\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mac address\",\"filter\":\"\",\"name\":\"mac\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"PCI address\",\"filter\":\"\",\"name\":\"pci\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (837, 'UPF', 'systemManagement', 'System Management', 'set', 'n9 driver', 'Set N9 Driver', 'mml', '[{\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mask\",\"filter\":\"\",\"name\":\"mask\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mac address\",\"filter\":\"\",\"name\":\"mac\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"PCI address\",\"filter\":\"\",\"name\":\"pci\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (838, 'UPF', 'systemManagement', 'System Management', 'set', 'dnn', 'Set DNN', 'mml', '[{\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"\",\"name\":\"dnn\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (839, 'UPF', 'systemManagement', 'System Management', 'set', 'pfcp', 'Set PFCP', 'mml', '[{\"comment\":\"\",\"display\":\"Path\",\"filter\":\"\",\"name\":\"path\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Local IP Address\",\"filter\":\"\",\"name\":\"local\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Remote IP Address\",\"filter\":\"\",\"name\":\"remote\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (840, 'UPF', 'systemManagement', 'System Management', 'set', 'qos', 'Set Qos', 'mml', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"5qi\",\"filter\":\"\",\"name\":\"5qi\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"\",\"name\":\"priority\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"MBR\",\"filter\":\"\",\"name\":\"mbr\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"GBR\",\"filter\":\"\",\"name\":\"gbr\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (841, 'UPF', 'systemManagement', 'System Management', 'set', 'pccrule', 'Set PCC Rule', 'mml', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"\",\"name\":\"precedence\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"QOS Index\",\"filter\":\"\",\"name\":\"qosindex\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"Filter Direction\",\"filter\":\"{\\\"0\\\":\\\"NA\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectionallink\\\"}\",\"name\":\"direction\",\"optional\":\"true\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"Filter\",\"filter\":\"\",\"name\":\"filter\",\"optional\":\"true\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Application ID\",\"filter\":\"\",\"name\":\"appid\",\"optional\":\"true\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (842, 'UPF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'mml', '[{\"comment\":\"\",\"display\":\"CMD\",\"filter\":\"\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (843, 'UPF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO `mml_system` VALUES (853, 'SMF', 'smfManagement', 'SMF Management', 'help', '', 'List SMF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (854, 'SMF', 'systemManagement', 'System Management', 'set', 'n7 server', 'Set N7 Server', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (855, 'SMF', 'systemManagement', 'System Management', 'set', 'n7 client', 'Set N7 Client', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (856, 'SMF', 'systemManagement', 'System Management', 'set', 'n10 server', 'Set N10 Server', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (857, 'SMF', 'systemManagement', 'System Management', 'set', 'n10 client', 'Set N10 Client', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (858, 'SMF', 'systemManagement', 'System Management', 'set', 'n11 server', 'Set N11 Server', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (859, 'SMF', 'systemManagement', 'System Management', 'set', 'n11 client', 'Set N11 Client', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (860, 'SMF', 'systemManagement', 'System Management', 'set', 'dnn', 'Set DNN', 'mml', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"\",\"name\":\"DNN\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (862, 'SMF', 'systemManagement', 'System Management', 'set', 'qos', 'Set Qos', 'mml', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"5qi\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"5qipl\",\"filter\":\"\",\"name\":\"5qipl\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"arppl\",\"filter\":\"\",\"name\":\"arppl\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"arppci\",\"filter\":\"\",\"name\":\"arppci\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"arppvi\",\"filter\":\"\",\"name\":\"arppvi\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"mfbrul\",\"filter\":\"\",\"name\":\"mfbrul\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"mfbrdl\",\"filter\":\"\",\"name\":\"mfbrdl\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"gfbrul\",\"filter\":\"\",\"name\":\"gfbrul\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"gfbrdl\",\"filter\":\"\",\"name\":\"gfbrdl\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (863, 'SMF', 'systemManagement', 'System Management', 'set', 'snssai', 'Set Snssai', 'mml', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"string\"},{\"display\":\"sst-sd\",\"filter\":\"\",\"name\":\"sst-sd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (864, 'SMF', 'systemManagement', 'System Management', 'release', 'imsi', 'Release IMSI', 'mml', '[{\"comment\":\"\",\"display\":\"IMSI\",\"filter\":\"\",\"name\":\"imsi\",\"optional\":\"false\",\"type\":\"string\"},{\"display\":\"PDU Session Id\",\"filter\":\"\",\"name\":\"pduSessId\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (865, 'SMF', 'systemManagement', 'System Management', 'set', 'urr', 'Set URR', 'mml', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Quota Volume Tatol\",\"filter\":\"\",\"name\":\"quotavolumetatol\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Quota Volume UL\",\"filter\":\"\",\"name\":\"quotavolumeul\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Quota Volume DL\",\"filter\":\"\",\"name\":\"quotavolumedl\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Quota Time\",\"filter\":\"\",\"name\":\"quotatime\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (866, 'SMF', 'systemManagement', 'System Management', 'set', 'dpi', 'Set DPI', 'mml', '[{\"comment\":\"\",\"display\":\"Flag\",\"filter\":\"{\\\"0\\\":\\\"disable\\\", \\\"1\\\":\\\"enable\\\"}\",\"name\":\"flag\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"Max Detect Packet Number\",\"filter\":\"\",\"name\":\"max\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (867, 'SMF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'mml', '[{\"comment\":\"\",\"display\":\"CMD\",\"filter\":\"\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (868, 'SMF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO `mml_system` VALUES (870, 'IMS', 'imsManagement', 'IMS Management', 'help', '', 'List IMS MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (871, 'N3IWF', 'n3iwfManagement', 'N3IWF Management', 'help', '', 'List N3IWF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (872, 'NSSF', 'nssfManagement', 'NSSF Management', 'help', '', 'List NSSF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (873, 'NRF', 'nrfManagement', 'NRF Management', 'help', '', 'List NRF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (874, 'PCF', 'pcfManagement', 'PCF Management', 'help', '', 'List PCF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (875, 'AMF', 'subsManagement', 'Subscriber Management', 'list', 'imsi', 'List Online IMSI', 'mml', '[{\"comment\":\"\",\"display\":\"IMSI\",\"filter\":\"32\",\"name\":\"imsi\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (876, 'AMF', 'amfManagement', 'AMF Management', 'help', '', 'List AMF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (877, 'AMF', 'systemManagement', 'System Management', 'set', 'n8_ip', 'Set N8 IP Address', 'mml', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (878, 'AMF', 'systemManagement', 'System Management', 'set', 'n11_ip', 'Set N11 IP Address', 'mml', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (879, 'AMF', 'systemManagement', 'System Management', 'set', 'n12_ip', 'Set N12 IP Address', 'mml', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (880, 'AMF', 'systemManagement', 'System Management', 'set', 'n2_ip', 'Set N2 IP Address', 'mml', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (881, 'AMF', 'systemManagement', 'System Management', 'set', 'n2_port', 'Set N2 Port', 'mml', '[{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (882, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpversion', 'Set NTP Version', 'mml', '[{\"comment\":\"\",\"display\":\"Version\",\"filter\":\"\",\"name\":\"version\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (883, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpmaxdiff', 'Set NTP Max Diff', 'mml', '[{\"comment\":\"\",\"display\":\"Max Value(ms)\",\"filter\":\"100~2000\",\"name\":\"value\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (884, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpsynctimer', 'Set NTP Sync Timer', 'mml', '[{\"comment\":\"\",\"display\":\"Periods(second)\",\"filter\":\"\",\"name\":\"periods\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (885, 'AMF', 'systemManagement', 'System Management', 'add', 'slice', 'Add Slice', 'mml', '[{\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (886, 'AMF', 'systemManagement', 'System Management', 'deregister', 'imsi', 'Deregister IMSI', 'mml', '[{\"comment\":\"\",\"display\":\"IMSI\",\"filter\":\"\",\"name\":\"IMSI\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (887, 'AMF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'mml', '[{\"comment\":\"\",\"display\":\"CMD\",\"filter\":\"\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (888, 'AMF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO `mml_system` VALUES (889, 'UDM', 'udmManagement', 'UDM Management', 'help', '', 'List UDM MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (890, 'UDM', 'systemManagement', 'System Management', 'set', 'n8ip', 'Set N8 IP Address', 'mml', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"ipv4\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (891, 'UDM', 'systemManagement', 'System Management', 'set', 'n8port', 'Set N8 Port', 'mml', '[{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"1~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (892, 'UDM', 'systemManagement', 'System Management', 'set', 'n8scheme', 'Set N8 Scheme', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (893, 'UDM', 'systemManagement', 'System Management', 'set', 'n10ip', 'Set N10 IP Address', 'mml', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (894, 'UDM', 'systemManagement', 'System Management', 'set', 'n10port', 'Set N10 Port', 'mml', '[{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"1~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (895, 'UDM', 'systemManagement', 'System Management', 'set', 'n10scheme', 'Set N10 Scheme', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (896, 'UDM', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'mml', '[{\"comment\":\"\",\"display\":\"CMD\",\"filter\":\"\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (897, 'UDM', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO `mml_system` VALUES (898, 'AUSF', 'ausfManagement', 'AUSF Management', 'help', '', 'List AUSF MML CMD', 'mml', 'null', 'Active'); -INSERT INTO `mml_system` VALUES (899, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12ip', 'Set N12 IP Address', 'mml', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (900, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12port', 'Set N12 Port', 'mml', '[{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"1~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (901, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12scheme', 'Set N12 Scheme', 'mml', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (902, 'AUSF', 'systemManagement', 'System Management', 'set', 'supirange', 'Set SUPI Range', 'mml', '[{\"comment\":\"\",\"display\":\"SUPI Range\",\"filter\":\"\",\"name\":\"supirange\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); -INSERT INTO `mml_system` VALUES (903, 'AUSF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'mml', 'null', 'Inactive'); -INSERT INTO `mml_system` VALUES (904, 'MME', 'mmeManagement', 'MME Management', 'help', '', 'List MME MML CMD', 'mml', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (833, 'UPF', 'upfManagement', 'UPF Management', 'help', '', 'List UPF MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (834, 'UPF', 'systemManagement', 'System Management', 'set', 'n3 driver', 'Set N3 Driver', 'General', '[{\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mask\",\"filter\":\"\",\"name\":\"mask\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mac address\",\"filter\":\"\",\"name\":\"mac\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"PCI address\",\"filter\":\"\",\"name\":\"pci\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (835, 'UPF', 'systemManagement', 'System Management', 'set', 'n4 ip', 'Set N4 IP Address', 'General', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (836, 'UPF', 'systemManagement', 'System Management', 'set', 'n6 driver', 'Set N6 Driver', 'General', '[{\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mask\",\"filter\":\"\",\"name\":\"mask\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mac address\",\"filter\":\"\",\"name\":\"mac\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"PCI address\",\"filter\":\"\",\"name\":\"pci\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (837, 'UPF', 'systemManagement', 'System Management', 'set', 'n9 driver', 'Set N9 Driver', 'General', '[{\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mask\",\"filter\":\"\",\"name\":\"mask\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Mac address\",\"filter\":\"\",\"name\":\"mac\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"PCI address\",\"filter\":\"\",\"name\":\"pci\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (838, 'UPF', 'systemManagement', 'System Management', 'set', 'dnn', 'Set DNN', 'General', '[{\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"\",\"name\":\"dnn\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (839, 'UPF', 'systemManagement', 'System Management', 'set', 'pfcp', 'Set PFCP', 'General', '[{\"comment\":\"\",\"display\":\"Path\",\"filter\":\"\",\"name\":\"path\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Local IP Address\",\"filter\":\"\",\"name\":\"local\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Remote IP Address\",\"filter\":\"\",\"name\":\"remote\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (840, 'UPF', 'systemManagement', 'System Management', 'set', 'qos', 'Set Qos', 'General', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"5qi\",\"filter\":\"\",\"name\":\"5qi\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"\",\"name\":\"priority\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"MBR\",\"filter\":\"\",\"name\":\"mbr\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"GBR\",\"filter\":\"\",\"name\":\"gbr\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (841, 'UPF', 'systemManagement', 'System Management', 'set', 'pccrule', 'Set PCC Rule', 'General', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"\",\"name\":\"precedence\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"QOS Index\",\"filter\":\"\",\"name\":\"qosindex\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"Filter Direction\",\"filter\":\"{\\\"0\\\":\\\"NA\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectionallink\\\"}\",\"name\":\"direction\",\"optional\":\"true\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"Filter\",\"filter\":\"\",\"name\":\"filter\",\"optional\":\"true\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Application ID\",\"filter\":\"\",\"name\":\"appid\",\"optional\":\"true\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (842, 'UPF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'General', '[{\"comment\":\"\",\"display\":\"CMD\",\"filter\":\"\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (843, 'UPF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO `mml_system` VALUES (853, 'SMF', 'smfManagement', 'SMF Management', 'help', '', 'List SMF MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (854, 'SMF', 'systemManagement', 'System Management', 'set', 'n7 server', 'Set N7 Server', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (855, 'SMF', 'systemManagement', 'System Management', 'set', 'n7 client', 'Set N7 Client', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (856, 'SMF', 'systemManagement', 'System Management', 'set', 'n10 server', 'Set N10 Server', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (857, 'SMF', 'systemManagement', 'System Management', 'set', 'n10 client', 'Set N10 Client', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (858, 'SMF', 'systemManagement', 'System Management', 'set', 'n11 server', 'Set N11 Server', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (859, 'SMF', 'systemManagement', 'System Management', 'set', 'n11 client', 'Set N11 Client', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (860, 'SMF', 'systemManagement', 'System Management', 'set', 'dnn', 'Set DNN', 'General', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"int\"},{\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"\",\"name\":\"DNN\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (862, 'SMF', 'systemManagement', 'System Management', 'set', 'qos', 'Set Qos', 'General', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"5qi\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"5qipl\",\"filter\":\"\",\"name\":\"5qipl\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"arppl\",\"filter\":\"\",\"name\":\"arppl\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"arppci\",\"filter\":\"\",\"name\":\"arppci\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"arppvi\",\"filter\":\"\",\"name\":\"arppvi\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"mfbrul\",\"filter\":\"\",\"name\":\"mfbrul\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"mfbrdl\",\"filter\":\"\",\"name\":\"mfbrdl\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"gfbrul\",\"filter\":\"\",\"name\":\"gfbrul\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"gfbrdl\",\"filter\":\"\",\"name\":\"gfbrdl\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (863, 'SMF', 'systemManagement', 'System Management', 'set', 'snssai', 'Set Snssai', 'General', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"string\"},{\"display\":\"sst-sd\",\"filter\":\"\",\"name\":\"sst-sd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (864, 'SMF', 'systemManagement', 'System Management', 'release', 'imsi', 'Release IMSI', 'General', '[{\"comment\":\"\",\"display\":\"IMSI\",\"filter\":\"\",\"name\":\"imsi\",\"optional\":\"false\",\"type\":\"string\"},{\"display\":\"PDU Session Id\",\"filter\":\"\",\"name\":\"pduSessId\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (865, 'SMF', 'systemManagement', 'System Management', 'set', 'urr', 'Set URR', 'General', '[{\"comment\":\"\",\"display\":\"Index\",\"filter\":\"\",\"name\":\"index\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Quota Volume Tatol\",\"filter\":\"\",\"name\":\"quotavolumetatol\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Quota Volume UL\",\"filter\":\"\",\"name\":\"quotavolumeul\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Quota Volume DL\",\"filter\":\"\",\"name\":\"quotavolumedl\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"Quota Time\",\"filter\":\"\",\"name\":\"quotatime\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (866, 'SMF', 'systemManagement', 'System Management', 'set', 'dpi', 'Set DPI', 'General', '[{\"comment\":\"\",\"display\":\"Flag\",\"filter\":\"{\\\"0\\\":\\\"disable\\\", \\\"1\\\":\\\"enable\\\"}\",\"name\":\"flag\",\"optional\":\"false\",\"type\":\"enum\"},{\"comment\":\"\",\"display\":\"Max Detect Packet Number\",\"filter\":\"\",\"name\":\"max\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (867, 'SMF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'General', '[{\"comment\":\"\",\"display\":\"CMD\",\"filter\":\"\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (868, 'SMF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO `mml_system` VALUES (870, 'IMS', 'imsManagement', 'IMS Management', 'help', '', 'List IMS MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (871, 'N3IWF', 'n3iwfManagement', 'N3IWF Management', 'help', '', 'List N3IWF MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (872, 'NSSF', 'nssfManagement', 'NSSF Management', 'help', '', 'List NSSF MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (873, 'NRF', 'nrfManagement', 'NRF Management', 'help', '', 'List NRF MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (874, 'PCF', 'pcfManagement', 'PCF Management', 'help', '', 'List PCF MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (875, 'AMF', 'subsManagement', 'Subscriber Management', 'list', 'imsi', 'List Online IMSI', 'General', '[{\"comment\":\"\",\"display\":\"IMSI\",\"filter\":\"32\",\"name\":\"imsi\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (876, 'AMF', 'amfManagement', 'AMF Management', 'help', '', 'List AMF MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (877, 'AMF', 'systemManagement', 'System Management', 'set', 'n8_ip', 'Set N8 IP Address', 'General', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (878, 'AMF', 'systemManagement', 'System Management', 'set', 'n11_ip', 'Set N11 IP Address', 'General', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (879, 'AMF', 'systemManagement', 'System Management', 'set', 'n12_ip', 'Set N12 IP Address', 'General', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"0~64\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (880, 'AMF', 'systemManagement', 'System Management', 'set', 'n2_ip', 'Set N2 IP Address', 'General', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (881, 'AMF', 'systemManagement', 'System Management', 'set', 'n2_port', 'Set N2 Port', 'General', '[{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (882, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpversion', 'Set NTP Version', 'General', '[{\"comment\":\"\",\"display\":\"Version\",\"filter\":\"\",\"name\":\"version\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (883, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpmaxdiff', 'Set NTP Max Diff', 'General', '[{\"comment\":\"\",\"display\":\"Max Value(ms)\",\"filter\":\"100~2000\",\"name\":\"value\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (884, 'AMF', 'systemManagement', 'System Management', 'set', 'ntpsynctimer', 'Set NTP Sync Timer', 'General', '[{\"comment\":\"\",\"display\":\"Periods(second)\",\"filter\":\"\",\"name\":\"periods\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (885, 'AMF', 'systemManagement', 'System Management', 'add', 'slice', 'Add Slice', 'General', '[{\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"optional\":\"false\",\"type\":\"string\"},{\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (886, 'AMF', 'systemManagement', 'System Management', 'deregister', 'imsi', 'Deregister IMSI', 'General', '[{\"comment\":\"\",\"display\":\"IMSI\",\"filter\":\"\",\"name\":\"IMSI\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (887, 'AMF', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'General', '[{\"comment\":\"\",\"display\":\"CMD\",\"filter\":\"\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (888, 'AMF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO `mml_system` VALUES (889, 'UDM', 'udmManagement', 'UDM Management', 'help', '', 'List UDM MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (890, 'UDM', 'systemManagement', 'System Management', 'set', 'n8ip', 'Set N8 IP Address', 'General', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"ipv4\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (891, 'UDM', 'systemManagement', 'System Management', 'set', 'n8port', 'Set N8 Port', 'General', '[{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"1~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (892, 'UDM', 'systemManagement', 'System Management', 'set', 'n8scheme', 'Set N8 Scheme', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (893, 'UDM', 'systemManagement', 'System Management', 'set', 'n10ip', 'Set N10 IP Address', 'General', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (894, 'UDM', 'systemManagement', 'System Management', 'set', 'n10port', 'Set N10 Port', 'General', '[{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"1~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (895, 'UDM', 'systemManagement', 'System Management', 'set', 'n10scheme', 'Set N10 Scheme', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (896, 'UDM', 'systemManagement', 'System Management', 'exec', 'shell', 'Execute Shell Command', 'General', '[{\"comment\":\"\",\"display\":\"CMD\",\"filter\":\"\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (897, 'UDM', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO `mml_system` VALUES (898, 'AUSF', 'ausfManagement', 'AUSF Management', 'help', '', 'List AUSF MML CMD', 'General', 'null', 'Active'); +INSERT INTO `mml_system` VALUES (899, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12ip', 'Set N12 IP Address', 'General', '[{\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (900, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12port', 'Set N12 Port', 'General', '[{\"comment\":\"\",\"display\":\"Port\",\"filter\":\"1~65535\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"int\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (901, 'AUSF', 'systemManagement', 'System Management', 'set', 'n12scheme', 'Set N12 Scheme', 'General', '[{\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"scheme\",\"optional\":\"false\",\"type\":\"enum\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (902, 'AUSF', 'systemManagement', 'System Management', 'set', 'supirange', 'Set SUPI Range', 'General', '[{\"comment\":\"\",\"display\":\"SUPI Range\",\"filter\":\"\",\"name\":\"supirange\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_system` VALUES (903, 'AUSF', 'systemManagement', 'System Management', 'reload', '', 'Reload Config', 'General', 'null', 'Inactive'); +INSERT INTO `mml_system` VALUES (904, 'MME', 'mmeManagement', 'MME Management', 'help', '', 'List MME MML CMD', 'General', 'null', 'Active'); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/common/ne_config.sql b/build/database/std/common/ne_config.sql index ec3ae400..d4d6f635 100644 --- a/build/database/std/common/ne_config.sql +++ b/build/database/std/common/ne_config.sql @@ -97,22 +97,22 @@ INSERT INTO `ne_config` VALUES (190, 'SMF', 'localDhcpCfg', 'Local DHCP Config', INSERT INTO `ne_config` VALUES (191, 'SMF', 'dnnselectdhcpserver', 'DNN Select DHCP Server', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"e.g. 192.168.1.1\",\"display\":\"DHCP Server IP\",\"filter\":\"\",\"name\":\"dhcpServerAddr\",\"type\":\"string\",\"value\":\"\"}]', 23, '', 1751019165587, 'public'); INSERT INTO `ne_config` VALUES (192, '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\"}]', 25, '', 1751019165593, 'public'); --- 更新 UDM 配置 20250613 -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\":\"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, '', 1749815867447, 'public'); -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\"}]', 5, '', 1749815867466, 'public'); -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\"}]', 7, '', 1749815867471, 'public'); -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\"}]', 9, '', 1749815867476, 'public'); -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\"}]', 11, '', 1749815867480, 'public'); -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\"}]', 13, '', 1749815867486, 'public'); -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\"}]', 15, '', 1749815867491, 'public'); -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\"}]', 17, '', 1749815867496, 'public'); -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\"}]', 19, '', 1749815867501, 'public'); -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\"}]', 21, '', 1749815867506, 'public'); -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\"}]', 23, '', 1749815867511, 'public'); -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\"}]', 25, '', 1749815867516, 'public'); -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\"}]', 27, '', 1749815867521, 'public'); -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\"}]', 29, '', 1749815867527, 'public'); -INSERT INTO `ne_config` VALUES (214, 'UDM', 'ausfCfg', 'AUSF Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EAP-Aka SupiOrImsi Prefix\",\"filter\":\"\",\"name\":\"eapAkaSupiImsiPrefix\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF FQDN\",\"filter\":\"0~128\",\"name\":\"ausfFqdn\",\"type\":\"string\",\"value\":\"ausf.5gc.com\"}]', 3, '', 1749815867461, 'public'); +-- 更新 UDM 配置 20250715 +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\":\"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, '', 1752577177260, 'public'); +INSERT INTO `ne_config` VALUES (201, 'UDM', 'ausfCfg', 'AUSF Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EAP-Aka SupiOrImsi Prefix\",\"filter\":\"\",\"name\":\"eapAkaSupiImsiPrefix\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF FQDN\",\"filter\":\"0~128\",\"name\":\"ausfFqdn\",\"type\":\"string\",\"value\":\"ausf.5gc.com\"}]', 3, '', 1752577177350, 'public'); +INSERT INTO `ne_config` VALUES (202, '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\"}]', 5, '', 1752577177371, 'public'); +INSERT INTO `ne_config` VALUES (203, '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\"}]', 7, '', 1752577177376, 'public'); +INSERT INTO `ne_config` VALUES (204, '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\"}]', 9, '', 1752577177380, 'public'); +INSERT INTO `ne_config` VALUES (205, '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\":\"lab_sar\"},{\"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\"}]', 11, '', 1752577177385, 'public'); +INSERT INTO `ne_config` VALUES (206, '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\"}]', 13, '', 1752577177391, 'public'); +INSERT INTO `ne_config` VALUES (207, '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\"}]', 15, '', 1752577177395, 'public'); +INSERT INTO `ne_config` VALUES (208, '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\"}]', 17, '', 1752577177401, 'public'); +INSERT INTO `ne_config` VALUES (209, '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\"}]', 19, '', 1752577177405, 'public'); +INSERT INTO `ne_config` VALUES (210, '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\"}]', 21, '', 1752577177410, 'public'); +INSERT INTO `ne_config` VALUES (211, '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\"}]', 23, '', 1752577177415, 'public'); +INSERT INTO `ne_config` VALUES (212, '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\"}]', 25, '', 1752577177419, 'public'); +INSERT INTO `ne_config` VALUES (213, '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\"}]', 27, '', 1752577177423, 'public'); +INSERT INTO `ne_config` VALUES (214, '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\"}]', 29, '', 1752577177427, 'public'); -- 更新 UPF 配置 20250320 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, '', 1742469466451, 'public'); @@ -134,22 +134,22 @@ INSERT INTO `ne_config` VALUES (235, 'UPF', 'dpiHeaderEnrichInfoList', 'DPI Head 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\"}]', 35, '', 1742469466580, 'public'); INSERT INTO `ne_config` VALUES (237, 'UPF', 'networkControlFreeServerList', 'Free Server List', 'array', '[{\"access\":\"read-write\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"0~1\",\"name\":\"enabled\",\"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\":\"Server IPv4\",\"filter\":\"\",\"name\":\"serverIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv4 Mask\",\"filter\":\"\",\"name\":\"serverIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6\",\"filter\":\"\",\"name\":\"serverIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6 Prefix\",\"filter\":\"\",\"name\":\"serverIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"Free Server Address List\",\"filter\":\"0~32\",\"name\":\"freeServerAddrList\",\"type\":\"int\",\"value\":\"1\"}]', 27, '', 1742469466563, 'public'); --- 更新 CBC 配置 20240823 -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, 'public'); -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, 'public'); -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, 'public'); +-- 更新 CBC 配置 20250715 +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\":\"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\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Timeout\",\"filter\":\"0~65535\",\"name\":\"sbiTimeout\",\"type\":\"int\",\"value\":\"3\"}]', 1, '', 1752577098470, 'public'); +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\":\"apply the current AMF NF Profile\",\"display\":\"Enable AMF\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"format: http://\\u003cIP\\u003e:\\u003cPORT\\u003e e.g: http://192.168.1.1:9090\",\"display\":\"AMF URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"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\":\"MCC\",\"filter\":\"^\\\\d{3,3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"460\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^\\\\d{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"00\"},{\"access\":\"read-write\",\"comment\":\"(A).format is decimal string,e.g:43888 (B).Allow set multiple tac value by ; split, e:4388;4360 \",\"display\":\"TAC\",\"filter\":\"^(\\\\d+(;\\\\d+)*)?$\",\"name\":\"tac\",\"type\":\"regex\",\"value\":\"4388\"}],\"comment\":\"allow TaiList null or add more tai value\",\"display\":\"Tai List\",\"filter\":\"\",\"name\":\"taiList\",\"type\":\"regex\",\"value\":\"\"}]', 3, '', 1752577099153, 'public'); +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\":\"apply the current MME NF Profile\",\"display\":\"Enable MME\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"MME\"},{\"access\":\"read-write\",\"comment\":\"format: sctp://\\u003cIP\\u003e:\\u003cPORT\\u003e e.g: sctp://192.168.1.1:9090\",\"display\":\"MME URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"sctp://192.168.1.1:9090\"},{\"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\":\"MCC\",\"filter\":\"^\\\\d{3,3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"460\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^\\\\d{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"00\"},{\"access\":\"read-write\",\"comment\":\"(A).format is decimal string,e.g:43888 (B).Allow set multiple tac value by ; split, e:4388;4360 \",\"display\":\"TAC\",\"filter\":\"^(\\\\d+(;\\\\d+)*)?$\",\"name\":\"tac\",\"type\":\"regex\",\"value\":\"4388\"}],\"comment\":\"allow TaiList null or add more tai value\",\"display\":\"Tai List\",\"filter\":\"\",\"name\":\"taiList\",\"type\":\"regex\",\"value\":\"\"}]', 5, '', 1752577099228, 'public'); --- 更新 OMC 配置 20250627 -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\":\"string, no variable support\",\"display\":\"Email Title\",\"filter\":\"\",\"name\":\"title\",\"type\":\"string\",\"value\":\"\"},{\"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, '', 1751013716061, 'public'); -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, '', 1750993234232, 'public'); -INSERT INTO `ne_config` VALUES (262, 'OMC', 'trace', 'NE Signaling Trace', 'list', '[{\"access\":\"read-write\",\"comment\":\"enable or disable NE signaling trace creation\",\"display\":\"Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"NE signaling trace host address\",\"display\":\"Host\",\"filter\":\"0~128\",\"name\":\"host\",\"type\":\"ipv4\",\"value\":\"172.16.5.100\"},{\"access\":\"read-write\",\"comment\":\"NE signaling trace port\",\"display\":\"Port\",\"filter\":\"3000~65530\",\"name\":\"port\",\"type\":\"int\",\"value\":\"33033\"}]', 1, '', 1750993234209, 'public'); +-- 更新 OMC 配置 20250715 +INSERT INTO `ne_config` VALUES (260, 'OMC', 'trace', 'NE Signaling Trace', 'list', '[{\"access\":\"read-write\",\"comment\":\"enable or disable NE signaling trace creation\",\"display\":\"Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"NE signaling trace host address\",\"display\":\"Host\",\"filter\":\"0~128\",\"name\":\"host\",\"type\":\"ipv4\",\"value\":\"172.16.5.100\"},{\"access\":\"read-write\",\"comment\":\"NE signaling trace port\",\"display\":\"Port\",\"filter\":\"3000~65530\",\"name\":\"port\",\"type\":\"int\",\"value\":\"33033\"}]', 1, '', 1752576919477, 'public'); +INSERT INTO `ne_config` VALUES (261, 'OMC', 'notificationEmail', 'Alarm Email Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with Email interface\",\"display\":\"Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Email List\",\"filter\":\"\",\"name\":\"list\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"string, no variable support\",\"display\":\"Email Title\",\"filter\":\"\",\"name\":\"title\",\"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\":\"\"}]', 3, '', 1752576919810, 'public'); +INSERT INTO `ne_config` VALUES (262, 'OMC', 'notificationSMSC', '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\":\"list\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"The SMSC SMPP Address\",\"display\":\"SMSC Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemid\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"\",\"name\":\"systemtype\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"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\":\"coding\",\"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, '', 1752576919817, 'public'); -- 更新 SMSC 配置 2025521 -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 Number\",\"filter\":\"0~32\",\"name\":\"smscNumber\",\"type\":\"string\",\"value\":\"0\"},{\"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, '', 1747799255683, 'public'); -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', 1747799256006, 'public'); -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\\\",\\\"19\\\":\\\"smpp8dcs0Unpack7\\\",\\\"20\\\":\\\"smpp8dcs0ISO8859\\\"}\",\"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', 1747799256626, 'public'); -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', 1747799256855, 'public'); -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', 1747799257026, 'public'); +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 Number\",\"filter\":\"0~32\",\"name\":\"smscNumber\",\"type\":\"string\",\"value\":\"0\"},{\"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, '', 1751438862010, 'public'); +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', 1751438862028, 'public'); +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\\\",\\\"19\\\":\\\"smpp8dcs0Unpack7\\\",\\\"20\\\":\\\"smpp8dcs0ISO8859\\\"}\",\"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', 1751438862033, 'public'); +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', 1751438862037, 'public'); +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', 1751438862041, 'public'); -- 更新 SGWC 配置 20241219 INSERT INTO `ne_config` VALUES (300, 'SGWC', 'sgwcSystem', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"IPv4/IPv6/IPv4v6\",\"display\":\"Local S11 IP Type\",\"filter\":\"^(IPv4|IPv6|IPv4v6)$\",\"name\":\"s11IpType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4 Format\",\"display\":\"Local S11 IPv4\",\"filter\":\"\",\"name\":\"s11Ipv4\",\"type\":\"string\",\"value\":\"172.16.5.80\"},{\"access\":\"read-write\",\"comment\":\"IPv6 Format\",\"display\":\"Local S11 IPv6\",\"filter\":\"\",\"name\":\"s11Ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4/IPv6/IPv4v6\",\"display\":\"Local S5/S8 IP Type\",\"filter\":\"^(IPv4|IPv6|IPv4v6)$\",\"name\":\"s58IpType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4 Format\",\"display\":\"Local S5/S8 IPv4\",\"filter\":\"\",\"name\":\"s58Ipv4\",\"type\":\"string\",\"value\":\"172.16.5.81\"},{\"access\":\"read-write\",\"comment\":\"IPv6 Format\",\"display\":\"Local S5/S8 IPv6\",\"filter\":\"\",\"name\":\"s58Ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4/IPv6/IPv4v6\",\"display\":\"Local Sx IP Type\",\"filter\":\"^(IPv4|IPv6|IPv4v6)$\",\"name\":\"sxIpType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4 Format\",\"display\":\"Local Sx IPv4\",\"filter\":\"\",\"name\":\"sxIpv4\",\"type\":\"string\",\"value\":\"172.16.5.81\"},{\"access\":\"read-write\",\"comment\":\"IPv6 Format\",\"display\":\"Local Sx IPv6\",\"filter\":\"\",\"name\":\"sxIpv6\",\"type\":\"string\",\"value\":\"\"}]', 1, '', 1734512800790, 'public'); diff --git a/build/database/std/install/alarm.sql b/build/database/std/install/alarm.sql index cd132c3a..8cda201e 100644 --- a/build/database/std/install/alarm.sql +++ b/build/database/std/install/alarm.sql @@ -13,31 +13,31 @@ CREATE TABLE `alarm` ( `ne_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元名称', `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元省份地域', `pv_flag` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元标识虚拟化标识', - `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', + `alarm_seq` int DEFAULT '0' COMMENT '告警序号 连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '告警ID', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级', - `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5', - `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', - `perceived_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '告警级别 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', + `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', + `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', + `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度', + `perceived_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '告警级别', `object_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象ID', `object_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象名称', `object_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象类型', `location_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警定位信息', - `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active', + `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', `specific_problem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警问题原因', `specific_problem_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警问题原因ID', `add_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警辅助信息', - `ack_state` int DEFAULT '0' COMMENT '确认状态 0: Unacked, 1: Acked', - `ack_time` bigint DEFAULT '0' COMMENT '确认时间 秒级', - `ack_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '确认用户', - `clear_type` int DEFAULT '0' COMMENT '清除状态 0: Unclear, 1: AutoClear, 2: ManualClear', + `ack_state` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotAck' COMMENT '确认状态', + `ack_time` bigint DEFAULT '0' COMMENT '确认时间', + `ack_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '确认用户', + `clear_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotClear' COMMENT '清除状态', `clear_time` bigint DEFAULT '0' COMMENT '清除时间', - `clear_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', + `clear_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', `timestamp` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_uni_aid_ne_aseq` (`ne_type`,`ne_id`,`alarm_id`,`alarm_seq`) USING BTREE, + UNIQUE KEY `uk_uni_ne_aid` (`ne_type`,`ne_id`,`alarm_id`) USING BTREE, KEY `idx_status_severity_time` (`alarm_status`,`orig_severity`,`event_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_记录表'; diff --git a/build/database/std/install/alarm_event.sql b/build/database/std/install/alarm_event.sql index a9175d33..984d03c1 100644 --- a/build/database/std/install/alarm_event.sql +++ b/build/database/std/install/alarm_event.sql @@ -10,22 +10,22 @@ CREATE TABLE `alarm_event` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', - `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', + `alarm_seq` int DEFAULT '0' COMMENT '告警序号 连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '告警ID', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级', + `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', `object_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象ID', `object_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象名称', `object_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象类型', `location_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警定位信息', - `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active', + `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', `specific_problem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警问题原因', `specific_problem_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警问题原因ID', `add_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警辅助信息', - `clear_type` int DEFAULT '0' COMMENT '清除状态 0: Unclear, 1: AutoClear, 2: ManualClear', + `clear_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotClear' COMMENT '清除状态', `clear_time` bigint DEFAULT '0' COMMENT '清除时间', - `clear_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', + `clear_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', `timestamp` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `uk_ti_aid_aseq` (`ne_type`,`ne_id`,`alarm_id`,`alarm_seq`) USING BTREE, diff --git a/build/database/std/install/alarm_forward_log.sql b/build/database/std/install/alarm_forward_log.sql index 5fd2fe30..72686a10 100644 --- a/build/database/std/install/alarm_forward_log.sql +++ b/build/database/std/install/alarm_forward_log.sql @@ -10,16 +10,16 @@ CREATE TABLE `alarm_forward_log` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', + `alarm_seq` int DEFAULT '0' COMMENT '告警序号 连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警ID', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', - `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active', - `alarm_type` varchar(10) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5', - `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级', + `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', + `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', + `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度 ', + `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', `created_at` bigint DEFAULT '0' COMMENT '创建时间', - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '转发方式 SMS/EMAIL', + `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '转发方式 SMS/EMAIL', `target` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '发送目标用户', `result` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '发送结果', PRIMARY KEY (`id`) USING BTREE diff --git a/build/database/std/install/alarm_log.sql b/build/database/std/install/alarm_log.sql index 2aa760ea..66239890 100644 --- a/build/database/std/install/alarm_log.sql +++ b/build/database/std/install/alarm_log.sql @@ -8,14 +8,14 @@ CREATE TABLE `alarm_log` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', + `alarm_seq` int DEFAULT '0' COMMENT '告警序号 连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警ID', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', - `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active', - `alarm_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5', - `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级', + `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', + `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', + `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度', + `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', `created_at` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_日志记录'; diff --git a/build/database/std/install/cbc_message.sql b/build/database/std/install/cbc_message.sql new file mode 100755 index 00000000..78d119b1 --- /dev/null +++ b/build/database/std/install/cbc_message.sql @@ -0,0 +1,16 @@ +-- ---------------------------- +-- Table structure for cbc_message +-- ---------------------------- +DROP TABLE IF EXISTS `cbc_message`; +CREATE TABLE `cbc_message` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `message_json` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'INACTIVE' COMMENT 'ACTIVE/INACTIVE', + `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` bigint DEFAULT NULL, + `updated_at` bigint DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_cbcm_ne_time` (`ne_type`,`ne_id`,`created_at`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='CDR事件_MF'; diff --git a/build/database/std/install/kpi_c_title.sql b/build/database/std/install/kpi_c_title.sql index 55fa97ad..7b4e5e10 100644 --- a/build/database/std/install/kpi_c_title.sql +++ b/build/database/std/install/kpi_c_title.sql @@ -25,7 +25,7 @@ INSERT INTO `kpi_c_title` VALUES (4, 'AMF', 'AMF.C.04', '5G Register Subscriber' INSERT INTO `kpi_c_title` VALUES (20, 'SMF', 'SMF.C.01', 'SA_MeanPduSession', '\'SMF.01\'', ' ', '', '1', 'admin', 1739362260083); INSERT INTO `kpi_c_title` VALUES (21, 'SMF', 'SMF.C.02', 'PDU Session Establishment Success Rate', '(\'SMF.02\'/\'SMF.03\')*100', '%', '', '1', 'admin', 1739362260083); INSERT INTO `kpi_c_title` VALUES (22, 'SMF', 'SMF.C.03', 'IMS Session Establishment Success Rate', '(\'SMF.04\'/\'SMF.05\')*100', '%', '', '1', 'admin', 1739362260083); -INSERT INTO `kpi_c_title` VALUES (23, 'SMF', 'SMF.C.06', 'IMS_DefaultBear_Success_Rate ', '(\'SMF.13\'/\'SMF.14\')*100', '%', '', '1', 'admin', 1739362260083); +INSERT INTO `kpi_c_title` VALUES (23, 'SMF', 'SMF.C.06', 'IMS_DefaultBear_Success_Rate', '(\'SMF.13\'/\'SMF.14\')*100', '%', '', '1', 'admin', 1739362260083); INSERT INTO `kpi_c_title` VALUES (24, 'SMF', 'SMF.C.07', 'Bear_Success_Rate_new', '((\'SMF.09\'+\'SMF.11\')/(\'SMF.10\'+\'SMF.12\') )*100', '%', '', '0', 'admin', 1739362260083); INSERT INTO `kpi_c_title` VALUES (40, 'MME', 'MME.C.01', 'Combine Attach Success Rate', '(\'MME.A.05\'/\'MME.A.04\')*100', '%', '', '1', 'admin', 1739362260083); @@ -46,3 +46,5 @@ INSERT INTO `kpi_c_title` VALUES (90, 'IMS', 'IMS.C.01', 'InitReg_Success_Rate', INSERT INTO `kpi_c_title` VALUES (91, 'IMS', 'IMS.C.02', 'MO_Success_Rate', '(\'SCSCF.05\'/\'SCSCF.06\')*100', '%', '', '1', 'admin', 1739362260083); INSERT INTO `kpi_c_title` VALUES (92, 'IMS', 'IMS.C.03', 'MT_Success_Rate', '(\'SCSCF.07\'/\'SCSCF.08\')*100', '%', '', '1', 'admin', 1739362260083); INSERT INTO `kpi_c_title` VALUES (93, 'IMS', 'IMS.C.04', 'Service_Success_Rate', '((\'SCSCF.05\'+\'SCSCF.07\')/(\'SCSCF.06\'+\'SCSCF.08\'))*100', '%', '', '1', 'admin', 1739362260083); +INSERT INTO `kpi_c_title` VALUES (94, 'IMS', 'IMS.C.05', 'IDDOutgoing_Success_Rate', '(\'IDD.03\'/\'IDD.01\')*100', '%', '', '1', 'admin', 1739362260083); +INSERT INTO `kpi_c_title` VALUES (95, 'IMS', 'IMS.C.06', 'IDDIncoming_Success_Rate', '(\'IDD.06\'/\'IDD.04\')*100', '%', '', '1', 'admin', 1739362260083); diff --git a/build/database/std/install/mml_log.sql b/build/database/std/install/mml_log.sql index e6a817c9..22c7ca66 100644 --- a/build/database/std/install/mml_log.sql +++ b/build/database/std/install/mml_log.sql @@ -1,47 +1,18 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -- -- Table structure for table `mml_log` -- DROP TABLE IF EXISTS `mml_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; CREATE TABLE `mml_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user` varchar(32) DEFAULT NULL, `ip` varchar(64) DEFAULT NULL, `ne_type` varchar(32) DEFAULT NULL, `ne_id` varchar(32) DEFAULT NULL, - `mml` varchar(1024) DEFAULT NULL, - `result` varchar(2048) DEFAULT NULL, - `log_time` datetime DEFAULT NULL, + `command` varchar(512) DEFAULT NULL COMMENT '命令 ; 分隔', + `result` varchar(255) DEFAULT NULL COMMENT '成功和有错误', + `log_time` bigint DEFAULT '0' COMMENT '记录时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=467 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; -- Dump completed on 2024-03-06 17:26:56 diff --git a/build/database/std/install/sys_config.sql b/build/database/std/install/sys_config.sql index ba790b85..3d8fc923 100644 --- a/build/database/std/install/sys_config.sql +++ b/build/database/std/install/sys_config.sql @@ -32,7 +32,7 @@ INSERT INTO `sys_config` VALUES (5, 'config.sys.user.lockTime', 'sys.user.lockTi INSERT INTO `sys_config` VALUES (6, 'config.sys.officialUrl', 'sys.officialUrl', '#', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.officialUrlRemark'); INSERT INTO `sys_config` VALUES (7, 'config.sys.helpDoc', 'sys.helpDoc', '/static/helpDoc/{language}_doc.pdf', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.helpDocRemark'); INSERT INTO `sys_config` VALUES (8, 'sys.account.captchaType', 'sys.account.captchaType', 'math', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'sys.account.captchaTypeRemark'); -INSERT INTO `sys_config` VALUES (9, 'config.sys.user.passwordPolicy', 'sys.user.passwordPolicy', '{\"minLength\":8,\"specialChars\":2,\"uppercase\":1,\"lowercase\":1}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwordPolicyRemark'); +INSERT INTO `sys_config` VALUES (9, 'config.sys.user.passwordPolicy', 'sys.user.passwordPolicy', '{\"minLength\":6,\"specialChars\":0,\"uppercase\":0,\"lowercase\":0}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwordPolicyRemark'); INSERT INTO `sys_config` VALUES (10, 'config.sys.user.passwdExpire', 'sys.user.passwdExpire', '{\"expHours\":0,\"alertHours\":360}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwdExpireRemark'); INSERT INTO `sys_config` VALUES (11, 'config.sys.user.fristPasswdChange', 'sys.user.fristPasswdChange', 'false', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.fristPasswdChangeRemark'); INSERT INTO `sys_config` VALUES (12, 'config.sys.user.passwdNotAllowedHistory', 'sys.user.passwdNotAllowedHistory', '0', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwdNotAllowedHistoryRemark'); diff --git a/build/database/std/install/sys_dict_data.sql b/build/database/std/install/sys_dict_data.sql index 6ae74908..0dbcda4f 100644 --- a/build/database/std/install/sys_dict_data.sql +++ b/build/database/std/install/sys_dict_data.sql @@ -56,28 +56,28 @@ INSERT INTO `sys_dict_data` VALUES (27, 'trace_type', 'dictData.trace.user', '3' INSERT INTO `sys_dict_data` VALUES (28, 'sys_job_save_log', 'dictData.jobSaveLog.no', '0', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (29, 'sys_job_save_log', 'dictData.jobSaveLog.yes', '1', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (30, 'ne_host_type', 'dictData.ne_host_type.redis', 'redis', 2, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (31, 'alarm_status', 'dictData.alarmStatus.history', '0', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (32, 'alarm_status', 'dictData.alarmStatus.active', '1', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (31, 'alarm_status', 'dictData.alarmStatus.history', 'Clear', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (32, 'alarm_status', 'dictData.alarmStatus.active', 'Active', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (33, 'sys_role_datascope', 'dictData.datascope.all', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (34, 'sys_role_datascope', 'dictData.datascope.custom', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (35, 'sys_role_datascope', 'dictData.datascope.dept', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (36, 'sys_role_datascope', 'dictData.datascope.deptAndChid', '4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (37, 'sys_role_datascope', 'dictData.datascope.self', '5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (38, 'active_alarm_type', 'dictData.active_alarm_type.communication', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (39, 'active_alarm_type', 'dictData.active_alarm_type.equipment', '2', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (40, 'active_alarm_type', 'dictData.active_alarm_type.processing', '3', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (41, 'active_alarm_type', 'dictData.active_alarm_type.environmental', '4', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (42, 'active_alarm_type', 'dictData.active_alarm_type.qualityOfService', '5', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (43, 'active_clear_type', 'dictData.active_clear_type.notCleared', '0', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (44, 'active_clear_type', 'dictData.active_clear_type.auto', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (45, 'active_clear_type', 'dictData.active_clear_type.hand', '2', 2, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (46, 'active_ack_state', 'dictData.active_ack_state.unconfirmed', '0', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (47, 'active_ack_state', 'dictData.active_ack_state.confirmed', '1', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (48, 'active_alarm_severity', 'dictData.active_alarm_severity.critical', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (49, 'active_alarm_severity', 'dictData.active_alarm_severity.major', '2', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (50, 'active_alarm_severity', 'dictData.active_alarm_severity.minor', '3', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (51, 'active_alarm_severity', 'dictData.active_alarm_severity.warning', '4', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (52, 'active_alarm_severity', 'dictData.active_alarm_severity.event', '5', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (38, 'active_alarm_type', 'dictData.active_alarm_type.communication', 'CommunicationAlarm', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (39, 'active_alarm_type', 'dictData.active_alarm_type.equipment', 'EquipmentAlarm', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (40, 'active_alarm_type', 'dictData.active_alarm_type.processing', 'ProcessingFailure', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (41, 'active_alarm_type', 'dictData.active_alarm_type.environmental', 'EnvironmentalAlarm', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (42, 'active_alarm_type', 'dictData.active_alarm_type.qualityOfService', 'QualityOfServiceAlarm', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (43, 'active_clear_type', 'dictData.active_clear_type.notCleared', 'NotClear', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (44, 'active_clear_type', 'dictData.active_clear_type.auto', 'AutoClear', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (45, 'active_clear_type', 'dictData.active_clear_type.hand', 'ManualClear', 2, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (46, 'active_ack_state', 'dictData.active_ack_state.unconfirmed', 'NotAck', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (47, 'active_ack_state', 'dictData.active_ack_state.confirmed', 'Ack', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (48, 'active_alarm_severity', 'dictData.active_alarm_severity.critical', 'Critical', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (49, 'active_alarm_severity', 'dictData.active_alarm_severity.major', 'Major', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (50, 'active_alarm_severity', 'dictData.active_alarm_severity.minor', 'Minor', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (51, 'active_alarm_severity', 'dictData.active_alarm_severity.warning', 'Warning', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (52, 'active_alarm_severity', 'dictData.active_alarm_severity.event', 'Event', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (53, 'index_status', 'dictType.index_status.normal', 'normal', 1, '#91cc75', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (54, 'index_status', 'dictType.index_status.abnormal', 'abnormal', 2, '#ee6666', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (55, 'cdr_sip_code', 'dictData.cdr_sip_code.200', '200', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); @@ -94,9 +94,9 @@ INSERT INTO `sys_dict_data` VALUES (65, 'ue_auth_code', 'dictData.ue_auth_code.0 INSERT INTO `sys_dict_data` VALUES (66, 'ue_auth_code', 'dictData.ue_auth_code.005', '005', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (67, 'ue_auth_code', 'dictData.ue_auth_code.006', '006', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (68, 'ue_auth_code', 'dictData.ue_auth_code.007', '007', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (69, 'ue_event_type', 'dictData.ue_event_type.auth', 'auth-result', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (70, 'ue_event_type', 'dictData.ue_event_type.detach', 'detach', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -INSERT INTO `sys_dict_data` VALUES (71, 'ue_event_type', 'dictData.ue_event_type.state', 'cm-state', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (69, 'ue_event_type', 'dictData.ue_event_type.auth', 'Auth', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (70, 'ue_event_type', 'dictData.ue_event_type.detach', 'Detach', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (71, 'ue_event_type', 'dictData.ue_event_type.state', 'CM', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (72, 'ue_event_cm_state', 'dictData.ue_event_cm_state.connected', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (73, 'ue_event_cm_state', 'dictData.ue_event_cm_state.idle', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (74, 'ue_event_cm_state', 'dictData.ue_event_cm_state.inactive', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); @@ -195,6 +195,10 @@ INSERT INTO `sys_dict_data` VALUES (166, 'cdr_sip_code_cause', 'dictData.cdr_sip INSERT INTO `sys_dict_data` VALUES (167, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (168, 'trace_interfaces', 'dictData.trace_interfaces.14', 'N14', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (169, 'trace_interfaces', 'dictData.trace_interfaces.5', 'N5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (170, 'sys_user_type', 'dictData.sys_user_type.system', 'System', 1, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/install/sys_dict_type.sql b/build/database/std/install/sys_dict_type.sql index 750c56d1..a03a372b 100644 --- a/build/database/std/install/sys_dict_type.sql +++ b/build/database/std/install/sys_dict_type.sql @@ -31,6 +31,7 @@ INSERT INTO `sys_dict_type` VALUES (5, 'dictType.sys_job_group', 'sys_job_group' INSERT INTO `sys_dict_type` VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_yes_no_remark'); INSERT INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_oper_type_remark'); INSERT INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_common_status_remark'); +INSERT INTO `sys_dict_type` VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_type` VALUES (50, 'dictType.trace_type', 'trace_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.trace_type_remark'); INSERT INTO `sys_dict_type` VALUES (51, 'dictType.alarm_status', 'alarm_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.alarm_status_remark'); INSERT INTO `sys_dict_type` VALUES (52, 'dictType.ne_version_status', 'ne_version_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.ne_version_status_remark'); diff --git a/build/database/std/install/sys_i18n.sql b/build/database/std/install/sys_i18n.sql index e58e4734..c7bc230d 100644 --- a/build/database/std/install/sys_i18n.sql +++ b/build/database/std/install/sys_i18n.sql @@ -559,7 +559,7 @@ INSERT INTO `sys_i18n` VALUES (541, 'dictData.cdr_sip_code.404', '404 找不到' INSERT INTO `sys_i18n` VALUES (542, 'dictData.cdr_sip_code.487', '487 请求已终止', '487 Request Terminated'); INSERT INTO `sys_i18n` VALUES (543, 'dictData.cdr_sip_code.503', '503 服务不可用', '503 Service Unavailable'); INSERT INTO `sys_i18n` VALUES (544, 'dictData.cdr_sip_code.504', '504 服务器超时', '504 Server Timeout'); -INSERT INTO `sys_i18n` VALUES (545, 'dictData.cdr_sip_code.603', '603 下降', '603 Decline'); +INSERT INTO `sys_i18n` VALUES (545, 'dictData.cdr_sip_code.603', '603 拒绝', '603 Decline'); INSERT INTO `sys_i18n` VALUES (546, 'dictData.cdr_sip_code.606', '606 不可接受', '606 Not Acceptable'); INSERT INTO `sys_i18n` VALUES (547, 'cache.name.token', '用户令牌', 'User Token'); INSERT INTO `sys_i18n` VALUES (548, 'cache.name.sys_config', '参数管理', 'Parameters Management'); @@ -747,13 +747,13 @@ INSERT INTO `sys_i18n` VALUES (729, 'dictData.cdr_sip_code_cause.200', '正常 INSERT INTO `sys_i18n` VALUES (730, 'dictData.cdr_sip_code_cause.202', '申请已被接受处理,但尚未完成 ', 'The request has been accepted for processing, but it hasn it completed yet'); INSERT INTO `sys_i18n` VALUES (731, 'dictData.cdr_sip_code_cause.302', '因其他原因呼叫失败', 'Call failure for other reason'); INSERT INTO `sys_i18n` VALUES (732, 'dictData.cdr_sip_code_cause.402', '因其他原因呼叫失败', 'Call failure for other reason'); -INSERT INTO `sys_i18n` VALUES (733, 'dictData.cdr_sip_code_cause.403', '拒绝 MO 用户', 'MO User Rejected'); -INSERT INTO `sys_i18n` VALUES (734, 'dictData.cdr_sip_code_cause.404', 'MT 用户离线', 'MT User Offline'); +INSERT INTO `sys_i18n` VALUES (733, 'dictData.cdr_sip_code_cause.403', '拒接主叫用户', 'MO User Rejected'); +INSERT INTO `sys_i18n` VALUES (734, 'dictData.cdr_sip_code_cause.404', '被叫用户离线', 'MT User Offline'); INSERT INTO `sys_i18n` VALUES (735, 'dictData.cdr_sip_code_cause.480', '因其他原因呼叫失败', 'Call failure for other reason'); INSERT INTO `sys_i18n` VALUES (736, 'dictData.cdr_sip_code_cause.481', '电话无法拨出', 'Call cannot be dialed'); INSERT INTO `sys_i18n` VALUES (737, 'dictData.cdr_sip_code_cause.482', '闪断', 'Flashback'); -INSERT INTO `sys_i18n` VALUES (738, 'dictData.cdr_sip_code_cause.486', 'MT 用户忙', 'MT User Busy'); -INSERT INTO `sys_i18n` VALUES (739, 'dictData.cdr_sip_code_cause.487', 'MO 用户断线', 'MO User Disconnected'); +INSERT INTO `sys_i18n` VALUES (738, 'dictData.cdr_sip_code_cause.486', '被叫用户忙', 'MT User Busy'); +INSERT INTO `sys_i18n` VALUES (739, 'dictData.cdr_sip_code_cause.487', '主叫挂断', 'MO User Disconnected'); INSERT INTO `sys_i18n` VALUES (740, 'dictData.cdr_sip_code_cause.408', '服务器等待响应的时间过长', 'The server waits too long for a response'); INSERT INTO `sys_i18n` VALUES (741, 'dictData.cdr_sip_code_cause.488', '媒体详细信息与服务器支持的内容不匹配', 'Media details didn’t match what the server supports'); INSERT INTO `sys_i18n` VALUES (742, 'dictData.cdr_sip_code_cause.489', '因其他原因呼叫失败', 'Call failure for other reason'); @@ -761,7 +761,7 @@ INSERT INTO `sys_i18n` VALUES (743, 'dictData.cdr_sip_code_cause.500', '服务 INSERT INTO `sys_i18n` VALUES (744, 'dictData.cdr_sip_code_cause.503', '服务器超载或因维护而停机,无法处理呼叫', 'The server is overloaded or down for maintenance and can it process the call'); INSERT INTO `sys_i18n` VALUES (745, 'dictData.cdr_sip_code_cause.504', '服务器尝试以您的名义与另一台服务器通信,但未及时收到回复,并超时了', 'The server tried to talk to another server on your behalf, didn’t get a reply in time, and timed out'); INSERT INTO `sys_i18n` VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其他原因呼叫失败', 'Call failure for other reason'); -INSERT INTO `sys_i18n` VALUES (747, 'dictData.cdr_sip_code_cause.603', 'MT 明确拒绝通话', 'MT explicitly rejected the call'); +INSERT INTO `sys_i18n` VALUES (747, 'dictData.cdr_sip_code_cause.603', '被叫拒接', 'MT explicitly rejected the call'); INSERT INTO `sys_i18n` VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the user’s device, but some parts of the session setup weren it acceptable'); INSERT INTO `sys_i18n` VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause'); INSERT INTO `sys_i18n` VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data'); @@ -772,5 +772,35 @@ INSERT INTO `sys_i18n` VALUES (754, 'job.ne_alarm_state_check_license', '网元 INSERT INTO `sys_i18n` VALUES (755, 'job.ne_alarm_state_check_license_remark', '检查网元的License是否即将到期,在出现过阈值时发出警报。\r\n\r\nAlarm type:\r\nCommunicationAlarm=1\r\nEquipmentAlarm=2\r\nProcessingFailure=3\r\nEnvironmentalAlarm=4\r\nQualityOfServiceAlarm=5\r\n\r\nSeverity:\r\nCritical=1\r\nMajor=2\r\nMinor=3\r\nWarning=4\r\n\r\nAddInfo: 告警补充信息\r\ndayLt: 天数小于,默认30天', 'Checks if the network element is License is about to expire and sends an alert if a threshold is crossed.\n\nAlarm type:\nCommunicationAlarm=1\nEquipmentAlarm=2\nProcessingFailure=3\nEnvironmentalAlarm=4\nQualityOfServiceAlarm=5\n\nSeverity:\nCritical=1\nMajor=2\nMinor=3\nWarning=4\r\n\r\nAddInfo: Additional information on alarms\r\ndayLt: Days less than, default 30 days'); INSERT INTO `sys_i18n` VALUES (756, 'dictData.trace_interfaces.14', 'N14', 'N14'); INSERT INTO `sys_i18n` VALUES (757, 'dictData.trace_interfaces.5', 'N5', 'N5'); +INSERT INTO `sys_i18n` VALUES (758, "alarm.export.alarmCode", "告警编码", "Alarm Code"); +INSERT INTO `sys_i18n` VALUES (759, "config.sys.user.fristPasswdChangeRemark", "关闭改为false 开启改为true, 建议同时设置密码有效期", "Off to false On to true, it is recommended to set the password expiration date at the same time."); +INSERT INTO `sys_i18n` VALUES (760, "menu.perf.kpiIMSOverview", "语音数据概览", "Voice Data Overview"); +INSERT INTO `sys_i18n` VALUES (761, "dictType.sys_user_type", "用户类型", "User Type"); +INSERT INTO `sys_i18n` VALUES (762, "dictData.sys_user_type.system", "系统", "System"); +INSERT INTO `sys_i18n` VALUES (763, "dictData.sys_user_type.ldap", "LDAP", "LDAP"); +INSERT INTO `sys_i18n` VALUES (764, "dictData.sys_user_type.smtp", "SMTP", "SMTP"); +INSERT INTO `sys_i18n` VALUES (765, "dictData.sys_user_type.oauth2", "OAuth2", "OAuth2"); +INSERT INTO `sys_i18n` VALUES (766, "user.export.userType", "用户类型", "User Type"); +INSERT INTO `sys_i18n` VALUES (767, "menu.system.loginSource", "第三方登录认证", "Third Party Login Source"); +INSERT INTO `sys_i18n` VALUES (768, "log.operate.title.sysLoginSource", "认证源", "Login Source"); + +INSERT INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); +INSERT INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); +INSERT INTO `sys_i18n` VALUES (2002, 'menu.psap.agent.callback', '回拨管理', 'Callback Management'); +INSERT INTO `sys_i18n` VALUES (2003, 'callback.status.NEW', '新建', 'New'); +INSERT INTO `sys_i18n` VALUES (2004, 'callback.status.IN_PROGRESS', '处理中', 'In Progress'); +INSERT INTO `sys_i18n` VALUES (2005, 'callback.status.NO_ANSWER_1', '未应答1', 'No Answer 1'); +INSERT INTO `sys_i18n` VALUES (2006, 'callback.status.NO_ANSWER_2', '未应答2', 'No Answer 2'); +INSERT INTO `sys_i18n` VALUES (2007, 'callback.status.TIMEOUT', '超时', 'Timeout'); +INSERT INTO `sys_i18n` VALUES (2008, 'callback.status.PENDING', '挂起', 'Pending'); +INSERT INTO `sys_i18n` VALUES (2009, 'callback.status.CLOSED', '关闭', 'Closed'); +INSERT INTO `sys_i18n` VALUES (2010, 'job.export.cdr.mf', '定期导出MF话单', 'Periodic Export of MF Call Records'); +INSERT INTO `sys_i18n` VALUES (2011, 'job.psap.ticket.monitor', '回拨工单监控', 'Callback Ticket Monitoring'); +INSERT INTO `sys_i18n` VALUES (2012, 'menu.omc.cdr', '话单', 'Call Records'); +INSERT INTO `sys_i18n` VALUES (2013, 'menu.omc.cdr.mf', '紧急呼叫话单', 'Emergency Call Records'); +INSERT INTO `sys_i18n` VALUES (2014, 'menu.omc.cdr.crbt', '彩铃话单', 'Color Ring Back Tone Records'); +INSERT INTO `sys_i18n` VALUES (2015, 'menu.omc.cdr.mms', '彩信话单', 'Multimedia Message Service Records'); +INSERT INTO `sys_i18n` VALUES (2016, 'menu.ue.cbc.cbe', '预警广播', 'Early Warning Broadcast'); +INSERT INTO `sys_i18n` VALUES (2017, 'log.operate.title.cbcMessage', '预警广播', 'Early Warning Broadcast'); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/install/sys_job.sql b/build/database/std/install/sys_job.sql index ae856654..f7ea93d8 100644 --- a/build/database/std/install/sys_job.sql +++ b/build/database/std/install/sys_job.sql @@ -36,9 +36,9 @@ INSERT INTO `sys_job` VALUES (10, 'job.delete_ne_config_backup', 'SYSTEM', 'dele INSERT INTO `sys_job` VALUES (11, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{\"storeDays\":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark'); INSERT INTO `sys_job` VALUES (12, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{\"storeDays\":7,\"neList\":[\"IMS\",\"AMF\",\"UDM\",\"UPF\",\"MME\",\"SMSC\",\"SMF\",\"MME\"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark'); -INSERT INTO `sys_job` VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{\"alarmTitle\":\"NE State Check Alarm\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"alarm cause: the system state of target NE has not been received\",\"specificProblemId\":\"AC10000\",\"addInfo\":\"\"}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark'); -INSERT INTO `sys_job` VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{\"alarmTitle\":\"NE State Check Alarm CPU/Menory/Disk\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold\",\"specificProblemId\":\"AC10100\",\"addInfo\":\"\",\"cpuUseGt\":70,\"memUseGt\":70,\"diskUseGt\":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark'); -INSERT INTO `sys_job` VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{\"alarmTitle\":\"NE State Check Alarm License\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"Alarm Cause: License received from target NE is about to expire\",\"specificProblemId\":\"AC10200\",\"addInfo\":\"\",\"dayLt\":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark'); +INSERT INTO `sys_job` VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{\"alarmTitle\":\"NE State Check Alarm\",\"alarmType\":\"EquipmentAlarm\",\"origSeverity\":\"Major\",\"specificProblem\":\"alarm cause: the system state of target NE has not been received\",\"specificProblemId\":\"AC10000\",\"addInfo\":\"\"}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark'); +INSERT INTO `sys_job` VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{\"alarmTitle\":\"NE State Check Alarm CPU/Menory/Disk\",\"alarmType\":\"EquipmentAlarm\",\"origSeverity\":\"Major\",\"specificProblem\":\"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold\",\"specificProblemId\":\"AC10100\",\"addInfo\":\"\",\"cpuUseGt\":70,\"memUseGt\":70,\"diskUseGt\":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark'); +INSERT INTO `sys_job` VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{\"alarmTitle\":\"NE State Check Alarm License\",\"alarmType\":\"EquipmentAlarm\",\"origSeverity\":\"Major\",\"specificProblem\":\"Alarm Cause: License received from target NE is about to expire\",\"specificProblemId\":\"AC10200\",\"addInfo\":\"\",\"dayLt\":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark'); INSERT INTO `sys_job` VALUES (30, 'job.backup_remove_file', 'SYSTEM', 'backup_remove_file', '[{\"backupPath\":\"/udm_data/auth\",\"storeDays\":30},{\"backupPath\":\"/udm_data/sub\",\"storeDays\":30},{\"backupPath\":\"/udm_data/voip\",\"storeDays\":30},{\"backupPath\":\"/udm_data/volte\",\"storeDays\":30},{\"backupPath\":\"/cdr/ims_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/smsc_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/smf_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/sgwc_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/log/sys_log_operate\",\"storeDays\":30,\"storeNum\":7},{\"backupPath\":\"/log/sys_log_login\",\"storeDays\":30,\"storeNum\":7}]', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_remove_file_remark'); INSERT INTO `sys_job` VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{\"dataType\":[\"auth\",\"sub\",\"voip\",\"volte\"],\"fileType\":\"txt\"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark'); diff --git a/build/database/std/install/sys_login_source.sql b/build/database/std/install/sys_login_source.sql new file mode 100644 index 00000000..073189af --- /dev/null +++ b/build/database/std/install/sys_login_source.sql @@ -0,0 +1,24 @@ +-- +-- Table structure for table `sys_login_source` +-- + +DROP TABLE IF EXISTS `sys_login_source`; +CREATE TABLE `sys_login_source` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UID 16位长度字符串', + `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证类型 LDAP SMTP OAuth2', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证名称', + `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '图标', + `active_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '激活标记(0未激活 1激活)', + `sync_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '同步标记(0未同步 1同步)', + `config` text COLLATE utf8mb4_general_ci COMMENT '认证配置', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_ls_type_name` (`type`,`name`) USING BTREE COMMENT '认证类型_认证名称' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统_认证源表'; + +-- Dump completed on 2025-08-05 16:20:56 diff --git a/build/database/std/install/sys_menu.sql b/build/database/std/install/sys_menu.sql index c1770d97..ec793c77 100644 --- a/build/database/std/install/sys_menu.sql +++ b/build/database/std/install/sys_menu.sql @@ -50,6 +50,7 @@ INSERT INTO `sys_menu` VALUES (105, 'menu.security.post', 2113, 6, 'post', 'syst INSERT INTO `sys_menu` VALUES (106, 'menu.system.dictType', 1, 30, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.dictTypeRemark'); INSERT INTO `sys_menu` VALUES (107, 'menu.system.dictData', 1, 31, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.dictDataRemark'); INSERT INTO `sys_menu` VALUES (108, 'menu.system.paramSet', 1, 59, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.paramSetRemark'); +INSERT INTO `sys_menu` VALUES (109, 'menu.system.loginSource', 2113, 12, 'login-source', 'system/login-source/index', '1', '1', 'M', '1', '1', 'system:loginSource:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (111, 'menu.system.systemLog', 1, 11, 'log', '', '1', '1', 'D', '0', '0', '', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.systemLogRemark'); INSERT INTO `sys_menu` VALUES (112, 'menu.system.systemInfo', 1, 5, 'system-info', 'monitor/system/info', '1', '1', 'M', '1', '1', 'monitor:system:info', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.systemInfoRemark'); INSERT INTO `sys_menu` VALUES (113, 'menu.system.cacheInfo', 1, 8, 'cache-info', 'monitor/cache/info', '1', '1', 'M', '1', '1', 'monitor:cache:info', 'icon-gongnengjieshao', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.cacheInfoRemark'); @@ -112,6 +113,10 @@ INSERT INTO `sys_menu` VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', ' INSERT INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (1057, 'menu.common.query', 109, 1, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (1058, 'menu.common.add', 109, 2, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (1059, 'menu.common.edit', 109, 3, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (1060, 'menu.common.delete', 109, 4, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); @@ -149,8 +154,8 @@ INSERT INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 12, 'kpiKey INSERT INTO `sys_menu` VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', '', '1', '0', 'D', '1', '1', '', 'icon-zhizuoliucheng', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.udmRemark'); -INSERT INTO `sys_menu` VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '1', '1', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.setRemark'); -INSERT INTO `sys_menu` VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.omcRemark'); +INSERT INTO `sys_menu` VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '0', '0', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.setRemark'); +INSERT INTO `sys_menu` VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '0', '0', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.omcRemark'); INSERT INTO `sys_menu` VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'sgwc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2113, 'menu.security', 0, 14, 'security', '', '1', '0', 'D', '1', '1', '', 'icon-suofang', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.securityRemark'); INSERT INTO `sys_menu` VALUES (2114, 'menu.system.systemSet', 1, 60, 'setting', 'system/setting/index', '1', '1', 'M', '1', '1', 'system:setting:index', 'icon-piliang', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.systemSetRemark'); @@ -158,8 +163,8 @@ INSERT INTO `sys_menu` VALUES (2115, 'menu.system.systemResource', 1, 6, 'monito INSERT INTO `sys_menu` VALUES (2116, 'menu.dashboard.smscCDR.content', 2157, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:smsc:content', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2117, 'menu.common.delete', 2140, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:ne:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588,'system', 1728641403588, ''); --- INSERT INTO `sys_menu` VALUES (2119, 'menu.ueUser.n3iwf', 5, 8, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); --- INSERT INTO `sys_menu` VALUES (2120, 'menu.ueUser.pcf', 5, 9, 'pcf', 'neUser/pcf/index', '1', '0', 'M', '1', '1', 'neUser:pcf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2119, 'Alarm Overview', 2129, 6, 'alarm-overview', 'faultManage/alarm-overview/index', '1', '1', 'M', '1', '1', 'faultManage:active-overview:index', 'icon-wenjian', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2120, 'DashboardV1', 2131, 8, 'dashboardV1', 'dashboard/overview/index', '1', '0', 'M', '1', '1', 'dashboard:overview:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2121, 'menu.system.user.editRole', 100, 8, '', '', '1', '1', 'B', '1', '1', 'system:user:editRole', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2122, 'menu.system.setting.i18n', 2114, 1, '', '', '1', '1', 'B', '1', '1', 'system:setting:i18n', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.setting.i18nRemark'); INSERT INTO `sys_menu` VALUES (2123, 'menu.log.neFile', 2089, 9, 'neFile', 'ne/neFile/index', '1', '0', 'M', '1', '1', 'ne:neFile:index', 'icon-tubiaohuizhi', '0', 'system', 1728641403588,'system', 1728641403588, ''); @@ -177,6 +182,7 @@ INSERT INTO `sys_menu` VALUES (2135, 'menu.ne.neHost', 4, 15, 'neHost', 'ne/neHo INSERT INTO `sys_menu` VALUES (2136, 'menu.ne.neHostCommand', 4, 18, 'neHostCommand', 'ne/neHostCommand/index', '1', '0', 'M', '1', '0', 'ne:neHostCommand:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2137, 'menu.ne.neInfo', 4, 10, 'neInfo', 'ne/neInfo/index', '1', '0', 'M', '1', '1', 'ne:neInfo:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2138, 'menu.dashboard.amfUE', 2141, 1, 'amfUE', 'dashboard/amfUE/index', '1', '0', 'M', '1', '1', 'amf#ue:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2139, 'menu.perf.kpiIMSOverview', 2099, 14, 'dashboard', 'perfManage/overview/index', '1', '0', 'M', '1', '1', 'ims#perfManage:dashboard:index', 'icon-fuzhichenggong', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2140, 'menu.monitor.cdr', 2089, 10, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2141, 'menu.monitor.event', 2089, 20, 'event', '', '1', '0', 'D', '1', '1', '', 'icon-gengduo', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2142, 'menu.ne.neQuickSetup', 4, 40, 'neQuickSetup', 'ne/neQuickSetup/index', '1', '1', 'M', '1', '1', 'ne:neQuickSetup:list', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, ''); @@ -208,6 +214,8 @@ INSERT INTO `sys_menu` VALUES (2167, 'menu.dashboard.overview.imsUeNum', 2132, 2 INSERT INTO `sys_menu` VALUES (2168, 'menu.dashboard.overview.gnbBase', 2132, 6, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:gnbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2169, 'menu.dashboard.overview.enbBase', 2132, 8, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:enbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (20000, 'menu.ue.cbc.cbe', 5, 20, 'cbe', 'cbc/cbe/index', '1', '0', 'M', '1', '1', 'cbc#dashboard:cdr:index', 'icon-tubiaoku', '0', 'system', 1711352709786, 'system', 1747796007372, ''); + SET FOREIGN_KEY_CHECKS = 1; -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/install/sys_role_menu.sql b/build/database/std/install/sys_role_menu.sql index d9a6ccc3..9b5a7d57 100644 --- a/build/database/std/install/sys_role_menu.sql +++ b/build/database/std/install/sys_role_menu.sql @@ -1,6 +1,3 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for sys_role_menu -- ---------------------------- @@ -14,9 +11,6 @@ CREATE TABLE `sys_role_menu` ( -- -- Dumping data for table `sys_role_menu` -- - -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); @@ -28,6 +22,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 101); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 103); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 108); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 109); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 111); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 116); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 117); @@ -47,9 +42,23 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1012); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1014); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1030); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1032); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1034); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1039); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1041); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1042); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1044); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1045); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1048); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1049); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1050); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1051); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1056); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1057); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1058); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1059); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1060); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2000); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2001); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2002); @@ -57,8 +66,8 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2003); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2004); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2005); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2007); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2008); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2083); @@ -91,6 +100,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2132); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2133); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2137); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2138); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2139); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2140); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2141); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2143); @@ -115,6 +125,8 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2167); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2168); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2169); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 20000); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 4); @@ -122,6 +134,15 @@ 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, 500); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 501); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1030); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1032); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1034); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1039); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1042); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2000); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2001); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2002); @@ -134,6 +155,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2010); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2083); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2084); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2088); @@ -143,8 +165,11 @@ 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, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2109); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2114); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2116); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2118); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2122); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2128); @@ -162,20 +187,40 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2147); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2148); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2152); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2153); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2158); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2167); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2168); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2169); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 20000); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 4); +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); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 501); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1039); +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, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2088); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2089); +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, 2112); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2116); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2118); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); @@ -196,10 +241,16 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2168); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 4); 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, 2126); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2130); +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; +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2166); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2167); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2168); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2169); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/install/sys_user.sql b/build/database/std/install/sys_user.sql index 7a237952..d73973d1 100644 --- a/build/database/std/install/sys_user.sql +++ b/build/database/std/install/sys_user.sql @@ -1,4 +1,3 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) -- -- Table structure for table `sys_user` -- @@ -14,6 +13,8 @@ CREATE TABLE `sys_user` ( `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0未选择 1男 2女)', `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址', `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码', + `user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'System' COMMENT '用户类型(System系统用户)', + `user_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '用户来源UID(#系统)', `status_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '账号状态(0停用 1正常)', `del_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标记(0存在 1删除)', `password_update_time` bigint NULL DEFAULT 0 COMMENT '密码更新时间', @@ -30,15 +31,10 @@ CREATE TABLE `sys_user` ( -- -- Dumping data for table `sys_user` --- - -LOCK TABLES `sys_user` WRITE; -/*!40000 ALTER TABLE `sys_user` DISABLE KEYS */; -INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$WVW6if2TNfR3OJmcaD9wX.gEd9TRymr5.Di2izFdDKUuiEGWuAqk6', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); - -UNLOCK TABLES; +-- +INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$WVW6if2TNfR3OJmcaD9wX.gEd9TRymr5.Di2izFdDKUuiEGWuAqk6', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/install/ue_event.sql b/build/database/std/install/ue_event.sql index 5e77c77d..7e5ad74e 100644 --- a/build/database/std/install/ue_event.sql +++ b/build/database/std/install/ue_event.sql @@ -7,8 +7,8 @@ CREATE TABLE `ue_event` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '可能没有', - `timestamp` bigint DEFAULT '48' COMMENT '接收到的timestamp秒级存储毫秒时间戳', - `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型 auth-result detach cm-state', + `timestamp` bigint DEFAULT '48' COMMENT '接收到的时间', + `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, diff --git a/build/database/std/install/ue_event_amf.sql b/build/database/std/install/ue_event_amf.sql index 78898c86..768e0826 100644 --- a/build/database/std/install/ue_event_amf.sql +++ b/build/database/std/install/ue_event_amf.sql @@ -7,8 +7,8 @@ CREATE TABLE `ue_event_amf` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '可能没有', - `timestamp` bigint DEFAULT '48' COMMENT '接收到的timestamp秒级存储毫秒时间戳', - `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型 auth-result detach cm-state', + `timestamp` bigint DEFAULT '48' COMMENT '接收到的时间', + `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, diff --git a/build/database/std/install/ue_event_mme.sql b/build/database/std/install/ue_event_mme.sql index 20026bc1..e6548fce 100644 --- a/build/database/std/install/ue_event_mme.sql +++ b/build/database/std/install/ue_event_mme.sql @@ -7,8 +7,8 @@ CREATE TABLE `ue_event_mme` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '可能没有', - `timestamp` bigint DEFAULT '48' COMMENT '接收到的timestamp秒级存储毫秒时间戳', - `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型 auth-result detach cm-state', + `timestamp` bigint DEFAULT '48' COMMENT '接收到的时间', + `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, diff --git a/build/database/std/upgrade/upg_alarm.sql b/build/database/std/upgrade/upg_alarm.sql index 68b3522e..e19327b9 100644 --- a/build/database/std/upgrade/upg_alarm.sql +++ b/build/database/std/upgrade/upg_alarm.sql @@ -11,31 +11,31 @@ CREATE TABLE IF NOT EXISTS `alarm` ( `ne_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元名称', `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元省份地域', `pv_flag` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元标识虚拟化标识', - `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', + `alarm_seq` int DEFAULT '0' COMMENT '告警序号 连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '告警ID', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级', - `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5', - `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', - `perceived_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '告警级别 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', + `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', + `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', + `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度', + `perceived_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '告警级别', `object_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象ID', `object_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象名称', `object_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象类型', `location_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警定位信息', - `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active', + `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', `specific_problem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警问题原因', `specific_problem_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警问题原因ID', `add_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警辅助信息', - `ack_state` int DEFAULT '0' COMMENT '确认状态 0: Unacked, 1: Acked', - `ack_time` bigint DEFAULT '0' COMMENT '确认时间 秒级', - `ack_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '确认用户', - `clear_type` int DEFAULT '0' COMMENT '清除状态 0: Unclear, 1: AutoClear, 2: ManualClear', + `ack_state` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotAck' COMMENT '确认状态', + `ack_time` bigint DEFAULT '0' COMMENT '确认时间', + `ack_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '确认用户', + `clear_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotClear' COMMENT '清除状态', `clear_time` bigint DEFAULT '0' COMMENT '清除时间', - `clear_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', + `clear_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', `timestamp` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_uni_aid_ne_aseq` (`ne_type`,`ne_id`,`alarm_id`,`alarm_seq`) USING BTREE, + UNIQUE KEY `uk_uni_ne_aid` (`ne_type`,`ne_id`,`alarm_id`) USING BTREE, KEY `idx_status_severity_time` (`alarm_status`,`orig_severity`,`event_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_记录表'; @@ -54,31 +54,49 @@ ALTER TABLE `alarm` MODIFY COLUMN `ne_id` varchar(64) CHARACTER SET utf8mb4 COLL ALTER TABLE `alarm` MODIFY COLUMN `ne_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '网元名称' AFTER `ne_id`; ALTER TABLE `alarm` MODIFY COLUMN `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '网元省份地域' AFTER `ne_name`; ALTER TABLE `alarm` MODIFY COLUMN `pv_flag` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '网元标识虚拟化标识' AFTER `province`; -ALTER TABLE `alarm` MODIFY COLUMN `alarm_seq` int(11) NULL DEFAULT 0 COMMENT '告警序号 同网元类型连续递增' AFTER `pv_flag`; +ALTER TABLE `alarm` MODIFY COLUMN `alarm_seq` int(11) NULL DEFAULT 0 COMMENT '告警序号 连续递增' AFTER `pv_flag`; ALTER TABLE `alarm` MODIFY COLUMN `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '告警ID' AFTER `alarm_seq`; ALTER TABLE `alarm` MODIFY COLUMN `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警标题' AFTER `alarm_id`; ALTER TABLE `alarm` MODIFY COLUMN `alarm_code` int(11) NULL DEFAULT 0 COMMENT '告警状态码' AFTER `alarm_title`; -ALTER TABLE `alarm` MODIFY COLUMN `event_time` bigint(20) NULL DEFAULT 0 COMMENT '事件产生时间 秒级' AFTER `alarm_code`; -ALTER TABLE `alarm` MODIFY COLUMN `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5' AFTER `event_time`; -ALTER TABLE `alarm` MODIFY COLUMN `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)' AFTER `alarm_type`; -ALTER TABLE `alarm` MODIFY COLUMN `perceived_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '3' COMMENT '告警级别 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)' AFTER `orig_severity`; +ALTER TABLE `alarm` MODIFY COLUMN `event_time` bigint(20) NULL DEFAULT 0 COMMENT '事件产生时间' AFTER `alarm_code`; +ALTER TABLE `alarm` MODIFY COLUMN `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警类型' AFTER `event_time`; +ALTER TABLE `alarm` MODIFY COLUMN `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度' AFTER `alarm_type`; +ALTER TABLE `alarm` MODIFY COLUMN `perceived_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '告警级别' AFTER `orig_severity`; ALTER TABLE `alarm` MODIFY COLUMN `object_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '对象ID' AFTER `perceived_severity`; ALTER TABLE `alarm` MODIFY COLUMN `object_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '对象名称' AFTER `object_uid`; ALTER TABLE `alarm` MODIFY COLUMN `object_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '对象类型' AFTER `object_name`; ALTER TABLE `alarm` MODIFY COLUMN `location_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警定位信息' AFTER `object_type`; -ALTER TABLE `alarm` MODIFY COLUMN `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '告警状态 0:clear, 1:active' AFTER `location_info`; +ALTER TABLE `alarm` MODIFY COLUMN `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态' AFTER `location_info`; ALTER TABLE `alarm` MODIFY COLUMN `specific_problem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警问题原因' AFTER `alarm_status`; ALTER TABLE `alarm` MODIFY COLUMN `specific_problem_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警问题原因ID' AFTER `specific_problem`; ALTER TABLE `alarm` MODIFY COLUMN `add_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警辅助信息' AFTER `specific_problem_id`; -ALTER TABLE `alarm` MODIFY COLUMN `ack_state` int(11) NULL DEFAULT 0 COMMENT '确认状态 0: Unacked, 1: Acked' AFTER `add_info`; -ALTER TABLE `alarm` MODIFY COLUMN `ack_time` bigint(20) NULL DEFAULT 0 COMMENT '确认时间 秒级' AFTER `ack_state`; -ALTER TABLE `alarm` MODIFY COLUMN `ack_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '确认用户' AFTER `ack_time`; -ALTER TABLE `alarm` MODIFY COLUMN `clear_type` int(11) NULL DEFAULT 0 COMMENT '清除状态 0: Unclear, 1: AutoClear, 2: ManualClear' AFTER `ack_user`; +ALTER TABLE `alarm` MODIFY COLUMN `ack_state` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotAck' COMMENT '确认状态' AFTER `add_info`; +ALTER TABLE `alarm` MODIFY COLUMN `ack_time` bigint(20) NULL DEFAULT 0 COMMENT '确认时间' AFTER `ack_state`; +ALTER TABLE `alarm` MODIFY COLUMN `ack_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '确认用户' AFTER `ack_time`; +ALTER TABLE `alarm` MODIFY COLUMN `clear_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotClear' COMMENT '清除状态' AFTER `ack_user`; ALTER TABLE `alarm` MODIFY COLUMN `clear_time` bigint(20) NULL DEFAULT 0 COMMENT '清除时间' AFTER `clear_type`; -ALTER TABLE `alarm` MODIFY COLUMN `clear_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '清除用户' AFTER `clear_time`; +ALTER TABLE `alarm` MODIFY COLUMN `clear_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户' AFTER `clear_time`; ALTER TABLE `alarm` MODIFY COLUMN `timestamp` bigint(20) NULL DEFAULT 0 COMMENT '创建时间' AFTER `clear_user`; -ALTER TABLE `alarm` ADD UNIQUE INDEX `uk_uni_aid_ne_aseq`(`ne_type`, `ne_id`, `alarm_id`, `alarm_seq`) USING BTREE; +ALTER TABLE `alarm` ADD UNIQUE INDEX `uk_uni_ne_aid`(`ne_type`, `ne_id`, `alarm_id`) USING BTREE; ALTER TABLE `alarm` ADD INDEX `idx_status_severity_time`(`alarm_status`, `orig_severity`, `event_time`) USING BTREE; +-- 更新数据 +UPDATE `alarm` SET `alarm_type` = 'CommunicationAlarm' WHERE `alarm_type` = '1'; +UPDATE `alarm` SET `alarm_type` = 'EquipmentAlarm' WHERE `alarm_type` = '2'; +UPDATE `alarm` SET `alarm_type` = 'ProcessingFailure' WHERE `alarm_type` = '3'; +UPDATE `alarm` SET `alarm_type` = 'EnvironmentalAlarm' WHERE `alarm_type` = '4'; +UPDATE `alarm` SET `alarm_type` = 'QualityOfServiceAlarm' WHERE `alarm_type` = '5'; +UPDATE `alarm` SET `orig_severity` = 'Critical', `perceived_severity` = 'Critical' WHERE `orig_severity` = '1'; +UPDATE `alarm` SET `orig_severity` = 'Major', `perceived_severity` = 'Major' WHERE `orig_severity` = '2'; +UPDATE `alarm` SET `orig_severity` = 'Minor', `perceived_severity` = 'Minor' WHERE `orig_severity` = '3'; +UPDATE `alarm` SET `orig_severity` = 'Warning', `perceived_severity` = 'Warning' WHERE `orig_severity` = '4'; +UPDATE `alarm` SET `orig_severity` = 'Event', `perceived_severity` = 'Event' WHERE `orig_severity` = '5'; +UPDATE `alarm` SET `alarm_status` = 'Clear' WHERE `alarm_status` = '0'; +UPDATE `alarm` SET `alarm_status` = 'Active' WHERE `alarm_status` = '1'; +UPDATE `alarm` SET `ack_state` = 'NotAck' WHERE `ack_state` = '0'; +UPDATE `alarm` SET `ack_state` = 'Ack' WHERE `ack_state` = '1'; +UPDATE `alarm` SET `clear_type` = 'NotClear' WHERE `clear_type` = '0'; +UPDATE `alarm` SET `clear_type` = 'AutoClear' WHERE `clear_type` = '1'; +UPDATE `alarm` SET `clear_type` = 'ManualClear' WHERE `clear_type` = '2'; SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/upgrade/upg_alarm_event.sql b/build/database/std/upgrade/upg_alarm_event.sql index e60f928d..94ce4024 100644 --- a/build/database/std/upgrade/upg_alarm_event.sql +++ b/build/database/std/upgrade/upg_alarm_event.sql @@ -8,25 +8,25 @@ CREATE TABLE IF NOT EXISTS `alarm_event` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', - `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', + `alarm_seq` int DEFAULT '0' COMMENT '告警序号 连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '告警ID', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级', + `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', `object_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象ID', `object_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象名称', `object_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '对象类型', `location_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警定位信息', - `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active', + `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', `specific_problem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警问题原因', `specific_problem_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警问题原因ID', `add_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警辅助信息', - `clear_type` int DEFAULT '0' COMMENT '清除状态 0: Unclear, 1: AutoClear, 2: ManualClear', + `clear_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotClear' COMMENT '清除状态', `clear_time` bigint DEFAULT '0' COMMENT '清除时间', - `clear_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', + `clear_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', `timestamp` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_ti_aid_aseq` (`ne_type`,`ne_id`,`alarm_id`,`alarm_seq`) USING BTREE, + UNIQUE KEY `uk_ti_aid` (`ne_type`,`ne_id`,`alarm_id`) USING BTREE, KEY `idx_astatus_etime` (`alarm_status`,`event_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_事件记录表'; @@ -51,25 +51,31 @@ ALTER TABLE `alarm_event` DROP INDEX `idx_severity_status`; ALTER TABLE `alarm_event` COMMENT = '告警_事件记录表'; ALTER TABLE `alarm_event` MODIFY COLUMN `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型' AFTER `id`; ALTER TABLE `alarm_event` MODIFY COLUMN `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID' AFTER `ne_type`; -ALTER TABLE `alarm_event` MODIFY COLUMN `alarm_seq` int(11) NULL DEFAULT 0 COMMENT '告警序号 同网元类型连续递增' AFTER `ne_id`; +ALTER TABLE `alarm_event` MODIFY COLUMN `alarm_seq` int(11) NULL DEFAULT 0 COMMENT '告警序号 连续递增' AFTER `ne_id`; ALTER TABLE `alarm_event` MODIFY COLUMN `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '告警ID' AFTER `alarm_seq`; ALTER TABLE `alarm_event` MODIFY COLUMN `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警标题' AFTER `alarm_id`; ALTER TABLE `alarm_event` MODIFY COLUMN `alarm_code` int(11) NULL DEFAULT 0 COMMENT '告警状态码' AFTER `alarm_title`; -ALTER TABLE `alarm_event` MODIFY COLUMN `event_time` bigint(20) NULL DEFAULT 0 COMMENT '事件产生时间 秒级' AFTER `alarm_code`; +ALTER TABLE `alarm_event` MODIFY COLUMN `event_time` bigint(20) NULL DEFAULT 0 COMMENT '事件产生时间' AFTER `alarm_code`; ALTER TABLE `alarm_event` MODIFY COLUMN `object_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '对象ID' AFTER `event_time`; ALTER TABLE `alarm_event` MODIFY COLUMN `object_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '对象名称' AFTER `object_uid`; ALTER TABLE `alarm_event` MODIFY COLUMN `object_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '对象类型' AFTER `object_name`; ALTER TABLE `alarm_event` MODIFY COLUMN `location_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警定位信息' AFTER `object_type`; -ALTER TABLE `alarm_event` MODIFY COLUMN `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '告警状态 0:clear, 1:active' AFTER `location_info`; +ALTER TABLE `alarm_event` MODIFY COLUMN `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态' AFTER `location_info`; ALTER TABLE `alarm_event` MODIFY COLUMN `specific_problem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警问题原因' AFTER `alarm_status`; ALTER TABLE `alarm_event` MODIFY COLUMN `specific_problem_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警问题原因ID' AFTER `specific_problem`; ALTER TABLE `alarm_event` MODIFY COLUMN `add_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警辅助信息' AFTER `specific_problem_id`; -ALTER TABLE `alarm_event` MODIFY COLUMN `clear_type` int(11) NULL DEFAULT 0 COMMENT '清除状态 0: Unclear, 1: AutoClear, 2: ManualClear' AFTER `add_info`; +ALTER TABLE `alarm_event` MODIFY COLUMN `clear_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotClear' COMMENT '清除状态' AFTER `add_info`; ALTER TABLE `alarm_event` MODIFY COLUMN `clear_time` bigint(20) NULL DEFAULT 0 COMMENT '清除时间' AFTER `clear_type`; -ALTER TABLE `alarm_event` MODIFY COLUMN `clear_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '清除用户' AFTER `clear_time`; +ALTER TABLE `alarm_event` MODIFY COLUMN `clear_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户' AFTER `clear_time`; ALTER TABLE `alarm_event` MODIFY COLUMN `timestamp` bigint(20) NULL DEFAULT 0 COMMENT '创建时间' AFTER `clear_user`; -ALTER TABLE `alarm_event` ADD UNIQUE INDEX `uk_ti_aid_aseq`(`ne_type`, `ne_id`, `alarm_id`, `alarm_seq`) USING BTREE; +ALTER TABLE `alarm_event` ADD UNIQUE INDEX `uk_ti_aid`(`ne_type`, `ne_id`, `alarm_id`) USING BTREE; ALTER TABLE `alarm_event` ADD INDEX `idx_astatus_etime`(`alarm_status`, `event_time`) USING BTREE; +-- 更新数据 +UPDATE `alarm_event` SET `alarm_status` = 'Clear' WHERE `alarm_status` = '0'; +UPDATE `alarm_event` SET `alarm_status` = 'Active' WHERE `alarm_status` = '1'; +UPDATE `alarm_event` SET `clear_type` = 'NotClear' WHERE `clear_type` = '0'; +UPDATE `alarm_event` SET `clear_type` = 'AutoClear' WHERE `clear_type` = '1'; +UPDATE `alarm_event` SET `clear_type` = 'ManualClear' WHERE `clear_type` = '2'; SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/upgrade/upg_alarm_forward_log.sql b/build/database/std/upgrade/upg_alarm_forward_log.sql index fd3c804c..918c29d9 100644 --- a/build/database/std/upgrade/upg_alarm_forward_log.sql +++ b/build/database/std/upgrade/upg_alarm_forward_log.sql @@ -8,16 +8,16 @@ CREATE TABLE IF NOT EXISTS `alarm_forward_log` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', + `alarm_seq` int DEFAULT '0' COMMENT '告警序号 连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警ID', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', - `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active', - `alarm_type` varchar(10) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5', - `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级', + `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', + `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', + `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度 ', + `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', `created_at` bigint DEFAULT '0' COMMENT '创建时间', - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '转发方式 SMS/EMAIL', + `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '转发方式 SMS/EMAIL', `target` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '发送目标用户', `result` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '发送结果', PRIMARY KEY (`id`) USING BTREE @@ -33,17 +33,32 @@ ALTER TABLE `alarm_forward_log` DROP COLUMN `log_time`; ALTER TABLE `alarm_forward_log` COMMENT = '告警_转发日志记录'; ALTER TABLE `alarm_forward_log` MODIFY COLUMN `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `id`; ALTER TABLE `alarm_forward_log` MODIFY COLUMN `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' AFTER `ne_type`; -ALTER TABLE `alarm_forward_log` MODIFY COLUMN `alarm_seq` int(11) NULL DEFAULT 0 COMMENT '告警序号 同网元类型连续递增' AFTER `ne_id`; +ALTER TABLE `alarm_forward_log` MODIFY COLUMN `alarm_seq` int(11) NULL DEFAULT 0 COMMENT '告警序号 连续递增' AFTER `ne_id`; ALTER TABLE `alarm_forward_log` MODIFY COLUMN `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警ID' AFTER `alarm_seq`; ALTER TABLE `alarm_forward_log` ADD COLUMN `alarm_code` int(11) NULL DEFAULT 0 COMMENT '告警状态码' AFTER `alarm_id`; ALTER TABLE `alarm_forward_log` MODIFY COLUMN `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警标题' AFTER `alarm_code`; -ALTER TABLE `alarm_forward_log` ADD COLUMN `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '告警状态 0:clear, 1:active' AFTER `alarm_title`; -ALTER TABLE `alarm_forward_log` ADD COLUMN `alarm_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5' AFTER `alarm_status`; -ALTER TABLE `alarm_forward_log` ADD COLUMN `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)' AFTER `alarm_type`; +ALTER TABLE `alarm_forward_log` ADD COLUMN `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态' AFTER `alarm_title`; +ALTER TABLE `alarm_forward_log` MODIFY COLUMN `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态' AFTER `alarm_title`; +ALTER TABLE `alarm_forward_log` ADD COLUMN `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型' AFTER `alarm_status`; +ALTER TABLE `alarm_forward_log` MODIFY COLUMN `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型' AFTER `alarm_status`; +ALTER TABLE `alarm_forward_log` ADD COLUMN `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度' AFTER `alarm_type`; ALTER TABLE `alarm_forward_log` MODIFY COLUMN `event_time` bigint(20) NULL DEFAULT 0 COMMENT '事件产生时间 秒级' AFTER `orig_severity`; ALTER TABLE `alarm_forward_log` ADD COLUMN `created_at` bigint(20) NULL DEFAULT 0 COMMENT '创建时间' AFTER `event_time`; -ALTER TABLE `alarm_forward_log` ADD COLUMN `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '转发方式 SMS/EMAIL' AFTER `created_at`; +ALTER TABLE `alarm_forward_log` ADD COLUMN `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '转发方式 SMS/EMAIL' AFTER `created_at`; ALTER TABLE `alarm_forward_log` ADD COLUMN `target` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '发送目标用户' AFTER `type`; ALTER TABLE `alarm_forward_log` ADD COLUMN `result` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '发送结果' AFTER `target`; +-- 更新数据 +UPDATE `alarm_forward_log` SET `alarm_type` = 'CommunicationAlarm' WHERE `alarm_type` = '1'; +UPDATE `alarm_forward_log` SET `alarm_type` = 'EquipmentAlarm' WHERE `alarm_type` = '2'; +UPDATE `alarm_forward_log` SET `alarm_type` = 'ProcessingFailure' WHERE `alarm_type` = '3'; +UPDATE `alarm_forward_log` SET `alarm_type` = 'EnvironmentalAlarm' WHERE `alarm_type` = '4'; +UPDATE `alarm_forward_log` SET `alarm_type` = 'QualityOfServiceAlarm' WHERE `alarm_type` = '5'; +UPDATE `alarm_forward_log` SET `orig_severity` = 'Critical' WHERE `orig_severity` = '1'; +UPDATE `alarm_forward_log` SET `orig_severity` = 'Major' WHERE `orig_severity` = '2'; +UPDATE `alarm_forward_log` SET `orig_severity` = 'Minor' WHERE `orig_severity` = '3'; +UPDATE `alarm_forward_log` SET `orig_severity` = 'Warning' WHERE `orig_severity` = '4'; +UPDATE `alarm_forward_log` SET `orig_severity` = 'Event' WHERE `orig_severity` = '5'; +UPDATE `alarm_forward_log` SET `alarm_status` = 'Clear' WHERE `alarm_status` = '0'; +UPDATE `alarm_forward_log` SET `alarm_status` = 'Active' WHERE `alarm_status` = '1'; SET FOREIGN_KEY_CHECKS=1; diff --git a/build/database/std/upgrade/upg_alarm_log.sql b/build/database/std/upgrade/upg_alarm_log.sql index 992f8d8f..1fe1620c 100644 --- a/build/database/std/upgrade/upg_alarm_log.sql +++ b/build/database/std/upgrade/upg_alarm_log.sql @@ -5,14 +5,14 @@ CREATE TABLE IF NOT EXISTS `alarm_log` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', + `alarm_seq` int DEFAULT '0' COMMENT '告警序号 连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警ID', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', - `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active', - `alarm_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5', - `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级', + `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', + `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', + `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度', + `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', `created_at` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_日志记录'; @@ -28,10 +28,25 @@ ALTER TABLE `alarm_log` MODIFY COLUMN `alarm_seq` int(11) NULL DEFAULT 0 COMMENT ALTER TABLE `alarm_log` MODIFY COLUMN `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警ID' AFTER `alarm_seq`; ALTER TABLE `alarm_log` MODIFY COLUMN `alarm_code` int(11) NULL DEFAULT 0 COMMENT '告警状态码' AFTER `alarm_id`; ALTER TABLE `alarm_log` ADD COLUMN `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警标题' AFTER `alarm_code`; -ALTER TABLE `alarm_log` MODIFY COLUMN `alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '告警状态 0:clear, 1:active' AFTER `alarm_title`; -ALTER TABLE `alarm_log` ADD COLUMN `alarm_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5' AFTER `alarm_status`; -ALTER TABLE `alarm_log` ADD COLUMN `orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)' AFTER `alarm_type`; -ALTER TABLE `alarm_log` MODIFY COLUMN `event_time` bigint(20) NULL DEFAULT 0 COMMENT '事件产生时间 秒级' AFTER `orig_severity`; +ALTER TABLE `alarm_log` MODIFY COLUMN `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态' AFTER `alarm_title`; +ALTER TABLE `alarm_log` ADD COLUMN `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型' AFTER `alarm_status`; +ALTER TABLE `alarm_log` MODIFY COLUMN `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型' AFTER `alarm_status`; +ALTER TABLE `alarm_log` ADD COLUMN `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度' AFTER `alarm_type`; +ALTER TABLE `alarm_log` MODIFY COLUMN `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度' AFTER `alarm_type`; +ALTER TABLE `alarm_log` MODIFY COLUMN `event_time` bigint(20) NULL DEFAULT 0 COMMENT '事件产生时间' AFTER `orig_severity`; ALTER TABLE `alarm_log` ADD COLUMN `created_at` bigint(20) NULL DEFAULT 0 COMMENT '创建时间' AFTER `event_time`; +-- 更新数据 +UPDATE `alarm_log` SET `alarm_type` = 'CommunicationAlarm' WHERE `alarm_type` = '1'; +UPDATE `alarm_log` SET `alarm_type` = 'EquipmentAlarm' WHERE `alarm_type` = '2'; +UPDATE `alarm_log` SET `alarm_type` = 'ProcessingFailure' WHERE `alarm_type` = '3'; +UPDATE `alarm_log` SET `alarm_type` = 'EnvironmentalAlarm' WHERE `alarm_type` = '4'; +UPDATE `alarm_log` SET `alarm_type` = 'QualityOfServiceAlarm' WHERE `alarm_type` = '5'; +UPDATE `alarm_log` SET `orig_severity` = 'Critical' WHERE `orig_severity` = '1'; +UPDATE `alarm_log` SET `orig_severity` = 'Major' WHERE `orig_severity` = '2'; +UPDATE `alarm_log` SET `orig_severity` = 'Minor' WHERE `orig_severity` = '3'; +UPDATE `alarm_log` SET `orig_severity` = 'Warning' WHERE `orig_severity` = '4'; +UPDATE `alarm_log` SET `orig_severity` = 'Event' WHERE `orig_severity` = '5'; +UPDATE `alarm_log` SET `alarm_status` = 'Clear' WHERE `alarm_status` = '0'; +UPDATE `alarm_log` SET `alarm_status` = 'Active' WHERE `alarm_status` = '1'; -- Dump completed on 2024-02-18 18:26:55 diff --git a/build/database/std/upgrade/upg_cbc_message.sql b/build/database/std/upgrade/upg_cbc_message.sql new file mode 100755 index 00000000..845c049a --- /dev/null +++ b/build/database/std/upgrade/upg_cbc_message.sql @@ -0,0 +1,15 @@ +-- ---------------------------- +-- Table structure for cbc_message +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `cbc_message` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `message_json` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'INACTIVE' COMMENT 'ACTIVE/INACTIVE', + `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` bigint DEFAULT NULL, + `updated_at` bigint DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_cbcm_ne_time` (`ne_type`,`ne_id`,`created_at`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='CDR事件_MF'; diff --git a/build/database/std/upgrade/upg_kpi_c_title.sql b/build/database/std/upgrade/upg_kpi_c_title.sql index 28e3c566..d7d08d68 100644 --- a/build/database/std/upgrade/upg_kpi_c_title.sql +++ b/build/database/std/upgrade/upg_kpi_c_title.sql @@ -19,6 +19,20 @@ CREATE TABLE IF NOT EXISTS `kpi_c_title` ( UNIQUE KEY `idx_ne_kpi_id` (`ne_type`,`kpi_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标标题'; +-- ---------------------------- +-- COLUMN for kpi_c_title +-- ---------------------------- +ALTER TABLE `kpi_c_title` MODIFY COLUMN `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `id`; +ALTER TABLE `kpi_c_title` MODIFY COLUMN `kpi_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `ne_type`; +ALTER TABLE `kpi_c_title` MODIFY COLUMN `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `kpi_id`; +ALTER TABLE `kpi_c_title` MODIFY COLUMN `expression` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `title`; +ALTER TABLE `kpi_c_title` MODIFY COLUMN `unit` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `expression`; +ALTER TABLE `kpi_c_title` MODIFY COLUMN `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `unit`; +ALTER TABLE `kpi_c_title` MODIFY COLUMN `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '0-Inactive/1-Active/2-Deleted' AFTER `description`; +ALTER TABLE `kpi_c_title` MODIFY COLUMN `created_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `status`; +ALTER TABLE `kpi_c_title` MODIFY COLUMN `updated_at` bigint(20) NULL DEFAULT 0 AFTER `created_by`; +ALTER TABLE `kpi_c_title` COMMENT = 'KPI_自定义指标标题'; + -- ---------------------------- -- Data for kpi_c_title -- ---------------------------- @@ -31,7 +45,7 @@ REPLACE INTO `kpi_c_title` VALUES (4, 'AMF', 'AMF.C.04', '5G Register Subscriber REPLACE INTO `kpi_c_title` VALUES (20, 'SMF', 'SMF.C.01', 'SA_MeanPduSession', '\'SMF.01\'', ' ', '', '1', 'admin', 1739362260083); REPLACE INTO `kpi_c_title` VALUES (21, 'SMF', 'SMF.C.02', 'PDU Session Establishment Success Rate', '(\'SMF.02\'/\'SMF.03\')*100', '%', '', '1', 'admin', 1739362260083); REPLACE INTO `kpi_c_title` VALUES (22, 'SMF', 'SMF.C.03', 'IMS Session Establishment Success Rate', '(\'SMF.04\'/\'SMF.05\')*100', '%', '', '1', 'admin', 1739362260083); -REPLACE INTO `kpi_c_title` VALUES (23, 'SMF', 'SMF.C.06', 'IMS_DefaultBear_Success_Rate ', '(\'SMF.13\'/\'SMF.14\')*100', '%', '', '1', 'admin', 1739362260083); +REPLACE INTO `kpi_c_title` VALUES (23, 'SMF', 'SMF.C.06', 'IMS_DefaultBear_Success_Rate', '(\'SMF.13\'/\'SMF.14\')*100', '%', '', '1', 'admin', 1739362260083); REPLACE INTO `kpi_c_title` VALUES (24, 'SMF', 'SMF.C.07', 'Bear_Success_Rate_new', '((\'SMF.09\'+\'SMF.11\')/(\'SMF.10\'+\'SMF.12\') )*100', '%', '', '0', 'admin', 1739362260083); REPLACE INTO `kpi_c_title` VALUES (40, 'MME', 'MME.C.01', 'Combine Attach Success Rate', '(\'MME.A.05\'/\'MME.A.04\')*100', '%', '', '1', 'admin', 1739362260083); @@ -52,19 +66,7 @@ REPLACE INTO `kpi_c_title` VALUES (90, 'IMS', 'IMS.C.01', 'InitReg_Success_Rate' REPLACE INTO `kpi_c_title` VALUES (91, 'IMS', 'IMS.C.02', 'MO_Success_Rate', '(\'SCSCF.05\'/\'SCSCF.06\')*100', '%', '', '1', 'admin', 1739362260083); REPLACE INTO `kpi_c_title` VALUES (92, 'IMS', 'IMS.C.03', 'MT_Success_Rate', '(\'SCSCF.07\'/\'SCSCF.08\')*100', '%', '', '1', 'admin', 1739362260083); REPLACE INTO `kpi_c_title` VALUES (93, 'IMS', 'IMS.C.04', 'Service_Success_Rate', '((\'SCSCF.05\'+\'SCSCF.07\')/(\'SCSCF.06\'+\'SCSCF.08\'))*100', '%', '', '1', 'admin', 1739362260083); - --- ---------------------------- --- COLUMN for kpi_c_title --- ---------------------------- -ALTER TABLE `kpi_c_title` MODIFY COLUMN `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `id`; -ALTER TABLE `kpi_c_title` MODIFY COLUMN `kpi_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `ne_type`; -ALTER TABLE `kpi_c_title` MODIFY COLUMN `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `kpi_id`; -ALTER TABLE `kpi_c_title` MODIFY COLUMN `expression` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `title`; -ALTER TABLE `kpi_c_title` MODIFY COLUMN `unit` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `expression`; -ALTER TABLE `kpi_c_title` MODIFY COLUMN `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `unit`; -ALTER TABLE `kpi_c_title` MODIFY COLUMN `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '0-Inactive/1-Active/2-Deleted' AFTER `description`; -ALTER TABLE `kpi_c_title` MODIFY COLUMN `created_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `status`; -ALTER TABLE `kpi_c_title` MODIFY COLUMN `updated_at` bigint(20) NULL DEFAULT 0 AFTER `created_by`; -ALTER TABLE `kpi_c_title` COMMENT = 'KPI_自定义指标标题'; +REPLACE INTO `kpi_c_title` VALUES (94, 'IMS', 'IMS.C.05', 'IDDOutgoing_Success_Rate', '(\'IDD.03\'/\'IDD.01\')*100', '%', '', '1', 'admin', 1739362260083); +REPLACE INTO `kpi_c_title` VALUES (95, 'IMS', 'IMS.C.06', 'IDDIncoming_Success_Rate', '(\'IDD.06\'/\'IDD.04\')*100', '%', '', '1', 'admin', 1739362260083); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/upgrade/upg_mml_log.sql b/build/database/std/upgrade/upg_mml_log.sql new file mode 100644 index 00000000..22c7ca66 --- /dev/null +++ b/build/database/std/upgrade/upg_mml_log.sql @@ -0,0 +1,18 @@ +-- +-- Table structure for table `mml_log` +-- + +DROP TABLE IF EXISTS `mml_log`; +CREATE TABLE `mml_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user` varchar(32) DEFAULT NULL, + `ip` varchar(64) DEFAULT NULL, + `ne_type` varchar(32) DEFAULT NULL, + `ne_id` varchar(32) DEFAULT NULL, + `command` varchar(512) DEFAULT NULL COMMENT '命令 ; 分隔', + `result` varchar(255) DEFAULT NULL COMMENT '成功和有错误', + `log_time` bigint DEFAULT '0' COMMENT '记录时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; + +-- Dump completed on 2024-03-06 17:26:56 diff --git a/build/database/std/upgrade/upg_sys_config.sql b/build/database/std/upgrade/upg_sys_config.sql index b7859ba5..d9236c58 100644 --- a/build/database/std/upgrade/upg_sys_config.sql +++ b/build/database/std/upgrade/upg_sys_config.sql @@ -41,7 +41,7 @@ REPLACE INTO `sys_config` VALUES (5, 'config.sys.user.lockTime', 'sys.user.lockT REPLACE INTO `sys_config` VALUES (6, 'config.sys.officialUrl', 'sys.officialUrl', '#', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.officialUrlRemark'); REPLACE INTO `sys_config` VALUES (7, 'config.sys.helpDoc', 'sys.helpDoc', '/static/helpDoc/{language}_doc.pdf', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.helpDocRemark'); REPLACE INTO `sys_config` VALUES (8, 'sys.account.captchaType', 'sys.account.captchaType', 'math', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'sys.account.captchaTypeRemark'); -REPLACE INTO `sys_config` VALUES (9, 'config.sys.user.passwordPolicy', 'sys.user.passwordPolicy', '{\"minLength\":8,\"specialChars\":2,\"uppercase\":1,\"lowercase\":1}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwordPolicyRemark'); +REPLACE INTO `sys_config` VALUES (9, 'config.sys.user.passwordPolicy', 'sys.user.passwordPolicy', '{\"minLength\":6,\"specialChars\":0,\"uppercase\":0,\"lowercase\":0}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwordPolicyRemark'); REPLACE INTO `sys_config` VALUES (10, 'config.sys.user.passwdExpire', 'sys.user.passwdExpire', '{\"expHours\":0,\"alertHours\":360}', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwdExpireRemark'); REPLACE INTO `sys_config` VALUES (11, 'config.sys.user.fristPasswdChange', 'sys.user.fristPasswdChange', 'false', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.fristPasswdChangeRemark'); REPLACE INTO `sys_config` VALUES (12, 'config.sys.user.passwdNotAllowedHistory', 'sys.user.passwdNotAllowedHistory', '0', 'Y', '0', 'system', 1704960008300, 'system', 1704960008300, 'config.sys.user.passwdNotAllowedHistoryRemark'); diff --git a/build/database/std/upgrade/upg_sys_dict_data.sql b/build/database/std/upgrade/upg_sys_dict_data.sql index 4ac4f59d..51ae420a 100644 --- a/build/database/std/upgrade/upg_sys_dict_data.sql +++ b/build/database/std/upgrade/upg_sys_dict_data.sql @@ -60,28 +60,28 @@ REPLACE INTO `sys_dict_data` VALUES (27, 'trace_type', 'dictData.trace.user', '3 REPLACE INTO `sys_dict_data` VALUES (28, 'sys_job_save_log', 'dictData.jobSaveLog.no', '0', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (29, 'sys_job_save_log', 'dictData.jobSaveLog.yes', '1', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (30, 'ne_host_type', 'dictData.ne_host_type.redis', 'redis', 2, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (31, 'alarm_status', 'dictData.alarmStatus.history', '0', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (32, 'alarm_status', 'dictData.alarmStatus.active', '1', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (31, 'alarm_status', 'dictData.alarmStatus.history', 'Clear', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (32, 'alarm_status', 'dictData.alarmStatus.active', 'Active', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (33, 'sys_role_datascope', 'dictData.datascope.all', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (34, 'sys_role_datascope', 'dictData.datascope.custom', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (35, 'sys_role_datascope', 'dictData.datascope.dept', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (36, 'sys_role_datascope', 'dictData.datascope.deptAndChid', '4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (37, 'sys_role_datascope', 'dictData.datascope.self', '5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (38, 'active_alarm_type', 'dictData.active_alarm_type.communication', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (39, 'active_alarm_type', 'dictData.active_alarm_type.equipment', '2', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (40, 'active_alarm_type', 'dictData.active_alarm_type.processing', '3', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (41, 'active_alarm_type', 'dictData.active_alarm_type.environmental', '4', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (42, 'active_alarm_type', 'dictData.active_alarm_type.qualityOfService', '5', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (43, 'active_clear_type', 'dictData.active_clear_type.notCleared', '0', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (44, 'active_clear_type', 'dictData.active_clear_type.auto', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (45, 'active_clear_type', 'dictData.active_clear_type.hand', '2', 2, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (46, 'active_ack_state', 'dictData.active_ack_state.unconfirmed', '0', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (47, 'active_ack_state', 'dictData.active_ack_state.confirmed', '1', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (48, 'active_alarm_severity', 'dictData.active_alarm_severity.critical', '1', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (49, 'active_alarm_severity', 'dictData.active_alarm_severity.major', '2', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (50, 'active_alarm_severity', 'dictData.active_alarm_severity.minor', '3', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (51, 'active_alarm_severity', 'dictData.active_alarm_severity.warning', '4', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (52, 'active_alarm_severity', 'dictData.active_alarm_severity.event', '5', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (38, 'active_alarm_type', 'dictData.active_alarm_type.communication', 'CommunicationAlarm', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (39, 'active_alarm_type', 'dictData.active_alarm_type.equipment', 'EquipmentAlarm', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (40, 'active_alarm_type', 'dictData.active_alarm_type.processing', 'ProcessingFailure', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (41, 'active_alarm_type', 'dictData.active_alarm_type.environmental', 'EnvironmentalAlarm', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (42, 'active_alarm_type', 'dictData.active_alarm_type.qualityOfService', 'QualityOfServiceAlarm', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (43, 'active_clear_type', 'dictData.active_clear_type.notCleared', 'NotClear', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (44, 'active_clear_type', 'dictData.active_clear_type.auto', 'AutoClear', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (45, 'active_clear_type', 'dictData.active_clear_type.hand', 'ManualClear', 2, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (46, 'active_ack_state', 'dictData.active_ack_state.unconfirmed', 'NotAck', 0, '', 'processing', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (47, 'active_ack_state', 'dictData.active_ack_state.confirmed', 'Ack', 1, '', 'success', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (48, 'active_alarm_severity', 'dictData.active_alarm_severity.critical', 'Critical', 1, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (49, 'active_alarm_severity', 'dictData.active_alarm_severity.major', 'Major', 2, '', 'cyan', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (50, 'active_alarm_severity', 'dictData.active_alarm_severity.minor', 'Minor', 3, '', 'blue ', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (51, 'active_alarm_severity', 'dictData.active_alarm_severity.warning', 'Warning', 4, '', 'yellow', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (52, 'active_alarm_severity', 'dictData.active_alarm_severity.event', 'Event', 5, '', 'purple', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (53, 'index_status', 'dictType.index_status.normal', 'normal', 1, '#91cc75', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (54, 'index_status', 'dictType.index_status.abnormal', 'abnormal', 2, '#ee6666', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (55, 'cdr_sip_code', 'dictData.cdr_sip_code.200', '200', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); @@ -98,9 +98,9 @@ REPLACE INTO `sys_dict_data` VALUES (65, 'ue_auth_code', 'dictData.ue_auth_code. REPLACE INTO `sys_dict_data` VALUES (66, 'ue_auth_code', 'dictData.ue_auth_code.005', '005', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (67, 'ue_auth_code', 'dictData.ue_auth_code.006', '006', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (68, 'ue_auth_code', 'dictData.ue_auth_code.007', '007', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (69, 'ue_event_type', 'dictData.ue_event_type.auth', 'auth-result', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (70, 'ue_event_type', 'dictData.ue_event_type.detach', 'detach', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); -REPLACE INTO `sys_dict_data` VALUES (71, 'ue_event_type', 'dictData.ue_event_type.state', 'cm-state', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (69, 'ue_event_type', 'dictData.ue_event_type.auth', 'Auth', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (70, 'ue_event_type', 'dictData.ue_event_type.detach', 'Detach', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (71, 'ue_event_type', 'dictData.ue_event_type.state', 'CM', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (72, 'ue_event_cm_state', 'dictData.ue_event_cm_state.connected', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (73, 'ue_event_cm_state', 'dictData.ue_event_cm_state.idle', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (74, 'ue_event_cm_state', 'dictData.ue_event_cm_state.inactive', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); @@ -199,6 +199,10 @@ REPLACE INTO `sys_dict_data` VALUES (166, 'cdr_sip_code_cause', 'dictData.cdr_si REPLACE INTO `sys_dict_data` VALUES (167, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (168, 'trace_interfaces', 'dictData.trace_interfaces.14', 'N14', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (169, 'trace_interfaces', 'dictData.trace_interfaces.5', 'N5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (170, 'sys_user_type', 'dictData.sys_user_type.system', 'System', 1, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/upgrade/upg_sys_dict_type.sql b/build/database/std/upgrade/upg_sys_dict_type.sql index baa43888..0dc114a0 100644 --- a/build/database/std/upgrade/upg_sys_dict_type.sql +++ b/build/database/std/upgrade/upg_sys_dict_type.sql @@ -31,6 +31,7 @@ REPLACE INTO `sys_dict_type` VALUES (5, 'dictType.sys_job_group', 'sys_job_group REPLACE INTO `sys_dict_type` VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_yes_no_remark'); REPLACE INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_oper_type_remark'); REPLACE INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_common_status_remark'); +REPLACE INTO `sys_dict_type` VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_type` VALUES (50, 'dictType.trace_type', 'trace_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.trace_type_remark'); REPLACE INTO `sys_dict_type` VALUES (51, 'dictType.alarm_status', 'alarm_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.alarm_status_remark'); REPLACE INTO `sys_dict_type` VALUES (52, 'dictType.ne_version_status', 'ne_version_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.ne_version_status_remark'); diff --git a/build/database/std/upgrade/upg_sys_i18n.sql b/build/database/std/upgrade/upg_sys_i18n.sql index 625f533a..45033918 100644 --- a/build/database/std/upgrade/upg_sys_i18n.sql +++ b/build/database/std/upgrade/upg_sys_i18n.sql @@ -556,7 +556,7 @@ REPLACE INTO `sys_i18n` VALUES (541, 'dictData.cdr_sip_code.404', '404 找不到 REPLACE INTO `sys_i18n` VALUES (542, 'dictData.cdr_sip_code.487', '487 请求已终止', '487 Request Terminated'); REPLACE INTO `sys_i18n` VALUES (543, 'dictData.cdr_sip_code.503', '503 服务不可用', '503 Service Unavailable'); REPLACE INTO `sys_i18n` VALUES (544, 'dictData.cdr_sip_code.504', '504 服务器超时', '504 Server Timeout'); -REPLACE INTO `sys_i18n` VALUES (545, 'dictData.cdr_sip_code.603', '603 下降', '603 Decline'); +REPLACE INTO `sys_i18n` VALUES (545, 'dictData.cdr_sip_code.603', '603 拒绝', '603 Decline'); REPLACE INTO `sys_i18n` VALUES (546, 'dictData.cdr_sip_code.606', '606 不可接受', '606 Not Acceptable'); REPLACE INTO `sys_i18n` VALUES (547, 'cache.name.token', '用户令牌', 'User Token'); REPLACE INTO `sys_i18n` VALUES (548, 'cache.name.sys_config', '参数管理', 'Parameters Management'); @@ -744,13 +744,13 @@ REPLACE INTO `sys_i18n` VALUES (729, 'dictData.cdr_sip_code_cause.200', '正常 REPLACE INTO `sys_i18n` VALUES (730, 'dictData.cdr_sip_code_cause.202', '申请已被接受处理,但尚未完成 ', 'The request has been accepted for processing, but it hasn it completed yet'); REPLACE INTO `sys_i18n` VALUES (731, 'dictData.cdr_sip_code_cause.302', '因其他原因呼叫失败', 'Call failure for other reason'); REPLACE INTO `sys_i18n` VALUES (732, 'dictData.cdr_sip_code_cause.402', '因其他原因呼叫失败', 'Call failure for other reason'); -REPLACE INTO `sys_i18n` VALUES (733, 'dictData.cdr_sip_code_cause.403', '拒绝 MO 用户', 'MO User Rejected'); -REPLACE INTO `sys_i18n` VALUES (734, 'dictData.cdr_sip_code_cause.404', 'MT 用户离线', 'MT User Offline'); +REPLACE INTO `sys_i18n` VALUES (733, 'dictData.cdr_sip_code_cause.403', '拒接主叫用户', 'MO User Rejected'); +REPLACE INTO `sys_i18n` VALUES (734, 'dictData.cdr_sip_code_cause.404', '被叫用户离线', 'MT User Offline'); REPLACE INTO `sys_i18n` VALUES (735, 'dictData.cdr_sip_code_cause.480', '因其他原因呼叫失败', 'Call failure for other reason'); REPLACE INTO `sys_i18n` VALUES (736, 'dictData.cdr_sip_code_cause.481', '电话无法拨出', 'Call cannot be dialed'); REPLACE INTO `sys_i18n` VALUES (737, 'dictData.cdr_sip_code_cause.482', '闪断', 'Flashback'); -REPLACE INTO `sys_i18n` VALUES (738, 'dictData.cdr_sip_code_cause.486', 'MT 用户忙', 'MT User Busy'); -REPLACE INTO `sys_i18n` VALUES (739, 'dictData.cdr_sip_code_cause.487', 'MO 用户断线', 'MO User Disconnected'); +REPLACE INTO `sys_i18n` VALUES (738, 'dictData.cdr_sip_code_cause.486', '被叫用户忙', 'MT User Busy'); +REPLACE INTO `sys_i18n` VALUES (739, 'dictData.cdr_sip_code_cause.487', '主叫挂断', 'MO User Disconnected'); REPLACE INTO `sys_i18n` VALUES (740, 'dictData.cdr_sip_code_cause.408', '服务器等待响应的时间过长', 'The server waits too long for a response'); REPLACE INTO `sys_i18n` VALUES (741, 'dictData.cdr_sip_code_cause.488', '媒体详细信息与服务器支持的内容不匹配', 'Media details didn’t match what the server supports'); REPLACE INTO `sys_i18n` VALUES (742, 'dictData.cdr_sip_code_cause.489', '因其他原因呼叫失败', 'Call failure for other reason'); @@ -758,7 +758,7 @@ REPLACE INTO `sys_i18n` VALUES (743, 'dictData.cdr_sip_code_cause.500', '服务 REPLACE INTO `sys_i18n` VALUES (744, 'dictData.cdr_sip_code_cause.503', '服务器超载或因维护而停机,无法处理呼叫', 'The server is overloaded or down for maintenance and can it process the call'); REPLACE INTO `sys_i18n` VALUES (745, 'dictData.cdr_sip_code_cause.504', '服务器尝试以您的名义与另一台服务器通信,但未及时收到回复,并超时了', 'The server tried to talk to another server on your behalf, didn’t get a reply in time, and timed out'); REPLACE INTO `sys_i18n` VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其他原因呼叫失败', 'Call failure for other reason'); -REPLACE INTO `sys_i18n` VALUES (747, 'dictData.cdr_sip_code_cause.603', 'MT 明确拒绝通话', 'MT explicitly rejected the call'); +REPLACE INTO `sys_i18n` VALUES (747, 'dictData.cdr_sip_code_cause.603', '被叫拒接', 'MT explicitly rejected the call'); REPLACE INTO `sys_i18n` VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the user’s device, but some parts of the session setup weren it acceptable'); REPLACE INTO `sys_i18n` VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause'); REPLACE INTO `sys_i18n` VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data'); @@ -769,5 +769,35 @@ REPLACE INTO `sys_i18n` VALUES (754, 'job.ne_alarm_state_check_license', '网元 REPLACE INTO `sys_i18n` VALUES (755, 'job.ne_alarm_state_check_license_remark', '检查网元的License是否即将到期,在出现过阈值时发出警报。\r\n\r\nAlarm type:\r\nCommunicationAlarm=1\r\nEquipmentAlarm=2\r\nProcessingFailure=3\r\nEnvironmentalAlarm=4\r\nQualityOfServiceAlarm=5\r\n\r\nSeverity:\r\nCritical=1\r\nMajor=2\r\nMinor=3\r\nWarning=4\r\n\r\nAddInfo: 告警补充信息\r\ndayLt: 天数小于,默认30天', 'Checks if the network element is License is about to expire and sends an alert if a threshold is crossed.\n\nAlarm type:\nCommunicationAlarm=1\nEquipmentAlarm=2\nProcessingFailure=3\nEnvironmentalAlarm=4\nQualityOfServiceAlarm=5\n\nSeverity:\nCritical=1\nMajor=2\nMinor=3\nWarning=4\r\n\r\nAddInfo: Additional information on alarms\r\ndayLt: Days less than, default 30 days'); REPLACE INTO `sys_i18n` VALUES (756, 'dictData.trace_interfaces.14', 'N14', 'N14'); REPLACE INTO `sys_i18n` VALUES (757, 'dictData.trace_interfaces.5', 'N5', 'N5'); +REPLACE INTO `sys_i18n` VALUES (758, "alarm.export.alarmCode", "告警编码", "Alarm Code"); +REPLACE INTO `sys_i18n` VALUES (759, "config.sys.user.fristPasswdChangeRemark", "关闭改为false 开启改为true, 建议同时设置密码有效期", "Off to false On to true, it is recommended to set the password expiration date at the same time."); +REPLACE INTO `sys_i18n` VALUES (760, "menu.perf.kpiIMSOverview", "语音数据概览", "Voice Data Overview"); +REPLACE INTO `sys_i18n` VALUES (761, "dictType.sys_user_type", "用户类型", "User Type"); +REPLACE INTO `sys_i18n` VALUES (762, "dictData.sys_user_type.system", "系统", "System"); +REPLACE INTO `sys_i18n` VALUES (763, "dictData.sys_user_type.ldap", "LDAP", "LDAP"); +REPLACE INTO `sys_i18n` VALUES (764, "dictData.sys_user_type.smtp", "SMTP", "SMTP"); +REPLACE INTO `sys_i18n` VALUES (765, "dictData.sys_user_type.oauth2", "OAuth2", "OAuth2"); +REPLACE INTO `sys_i18n` VALUES (766, "user.export.userType", "用户类型", "User Type"); +REPLACE INTO `sys_i18n` VALUES (767, "menu.system.loginSource", "第三方登录认证", "Third Party Login Source"); +REPLACE INTO `sys_i18n` VALUES (768, "log.operate.title.sysLoginSource", "认证源", "Login Source"); + +REPLACE INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); +REPLACE INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); +REPLACE INTO `sys_i18n` VALUES (2002, 'menu.psap.agent.callback', '回拨管理', 'Callback Management'); +REPLACE INTO `sys_i18n` VALUES (2003, 'callback.status.NEW', '新建', 'New'); +REPLACE INTO `sys_i18n` VALUES (2004, 'callback.status.IN_PROGRESS', '处理中', 'In Progress'); +REPLACE INTO `sys_i18n` VALUES (2005, 'callback.status.NO_ANSWER_1', '未应答1', 'No Answer 1'); +REPLACE INTO `sys_i18n` VALUES (2006, 'callback.status.NO_ANSWER_2', '未应答2', 'No Answer 2'); +REPLACE INTO `sys_i18n` VALUES (2007, 'callback.status.TIMEOUT', '超时', 'Timeout'); +REPLACE INTO `sys_i18n` VALUES (2008, 'callback.status.PENDING', '挂起', 'Pending'); +REPLACE INTO `sys_i18n` VALUES (2009, 'callback.status.CLOSED', '关闭', 'Closed'); +REPLACE INTO `sys_i18n` VALUES (2010, 'job.export.cdr.mf', '定期导出MF话单', 'Periodic Export of MF Call Records'); +REPLACE INTO `sys_i18n` VALUES (2011, 'job.psap.ticket.monitor', '回拨工单监控', 'Callback Ticket Monitoring'); +REPLACE INTO `sys_i18n` VALUES (2012, 'menu.omc.cdr', '话单', 'Call Records'); +REPLACE INTO `sys_i18n` VALUES (2013, 'menu.omc.cdr.mf', '紧急呼叫话单', 'Emergency Call Records'); +REPLACE INTO `sys_i18n` VALUES (2014, 'menu.omc.cdr.crbt', '彩铃话单', 'Color Ring Back Tone Records'); +REPLACE INTO `sys_i18n` VALUES (2015, 'menu.omc.cdr.mms', '彩信话单', 'Multimedia Message Service Records'); +REPLACE INTO `sys_i18n` VALUES (2016, 'menu.ue.cbc.cbe', '预警广播', 'Early Warning Broadcast'); +REPLACE INTO `sys_i18n` VALUES (2017, 'log.operate.title.cbcMessage', '预警广播', 'Early Warning Broadcast'); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/upgrade/upg_sys_job.sql b/build/database/std/upgrade/upg_sys_job.sql index 9019ce6f..9752e55c 100644 --- a/build/database/std/upgrade/upg_sys_job.sql +++ b/build/database/std/upgrade/upg_sys_job.sql @@ -52,9 +52,9 @@ REPLACE INTO `sys_job` VALUES (10, 'job.delete_ne_config_backup', 'SYSTEM', 'del REPLACE INTO `sys_job` VALUES (11, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{\"storeDays\":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark'); REPLACE INTO `sys_job` VALUES (12, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{\"storeDays\":7,\"neList\":[\"IMS\",\"AMF\",\"UDM\",\"UPF\",\"MME\",\"SMSC\",\"SMF\",\"MME\"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark'); -REPLACE INTO `sys_job` VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{\"alarmTitle\":\"NE State Check Alarm\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"alarm cause: the system state of target NE has not been received\",\"specificProblemId\":\"AC10000\",\"addInfo\":\"\"}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark'); -REPLACE INTO `sys_job` VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{\"alarmTitle\":\"NE State Check Alarm CPU/Menory/Disk\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold\",\"specificProblemId\":\"AC10100\",\"addInfo\":\"\",\"cpuUseGt\":70,\"memUseGt\":70,\"diskUseGt\":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark'); -REPLACE INTO `sys_job` VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{\"alarmTitle\":\"NE State Check Alarm License\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"Alarm Cause: License received from target NE is about to expire\",\"specificProblemId\":\"AC10200\",\"addInfo\":\"\",\"dayLt\":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark'); +REPLACE INTO `sys_job` VALUES (20, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{\"alarmTitle\":\"NE State Check Alarm\",\"alarmType\":\"EquipmentAlarm\",\"origSeverity\":\"Major\",\"specificProblem\":\"alarm cause: the system state of target NE has not been received\",\"specificProblemId\":\"AC10000\",\"addInfo\":\"\"}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark'); +REPLACE INTO `sys_job` VALUES (21, 'job.ne_alarm_state_check_cmd', 'SYSTEM', 'ne_alarm_state_check_cmd', '{\"alarmTitle\":\"NE State Check Alarm CPU/Menory/Disk\",\"alarmType\":\"EquipmentAlarm\",\"origSeverity\":\"Major\",\"specificProblem\":\"Alarm Cause: CPU/Menory/Disk status received from target NE reaches the threshold\",\"specificProblemId\":\"AC10100\",\"addInfo\":\"\",\"cpuUseGt\":70,\"memUseGt\":70,\"diskUseGt\":70}', '0/15 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_cmd_remark'); +REPLACE INTO `sys_job` VALUES (22, 'job.ne_alarm_state_check_license', 'SYSTEM', 'ne_alarm_state_check_license', '{\"alarmTitle\":\"NE State Check Alarm License\",\"alarmType\":\"EquipmentAlarm\",\"origSeverity\":\"Major\",\"specificProblem\":\"Alarm Cause: License received from target NE is about to expire\",\"specificProblemId\":\"AC10200\",\"addInfo\":\"\",\"dayLt\":7}', '0 5 0 * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_license_remark'); REPLACE INTO `sys_job` VALUES (30, 'job.backup_remove_file', 'SYSTEM', 'backup_remove_file', '[{\"backupPath\":\"/udm_data/auth\",\"storeDays\":30},{\"backupPath\":\"/udm_data/sub\",\"storeDays\":30},{\"backupPath\":\"/udm_data/voip\",\"storeDays\":30},{\"backupPath\":\"/udm_data/volte\",\"storeDays\":30},{\"backupPath\":\"/cdr/ims_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/smsc_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/smf_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/cdr/sgwc_cdr_event\",\"storeDays\":30},{\"backupPath\":\"/log/sys_log_operate\",\"storeDays\":30,\"storeNum\":7},{\"backupPath\":\"/log/sys_log_login\",\"storeDays\":30,\"storeNum\":7}]', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_remove_file_remark'); REPLACE INTO `sys_job` VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{\"dataType\":[\"auth\",\"sub\",\"voip\",\"volte\"],\"fileType\":\"txt\"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark'); diff --git a/build/database/std/upgrade/upg_sys_login_source.sql b/build/database/std/upgrade/upg_sys_login_source.sql new file mode 100644 index 00000000..e68e205a --- /dev/null +++ b/build/database/std/upgrade/upg_sys_login_source.sql @@ -0,0 +1,23 @@ +-- +-- Table structure for table `sys_login_source` +-- + +CREATE TABLE IF NOT EXISTS `sys_login_source` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UID 16位长度字符串', + `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证类型 LDAP SMTP OAuth2', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证名称', + `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '图标', + `active_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '激活标记(0未激活 1激活)', + `sync_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '同步标记(0未同步 1同步)', + `config` text COLLATE utf8mb4_general_ci COMMENT '认证配置', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_ls_type_name` (`type`,`name`) USING BTREE COMMENT '认证类型_认证名称' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统_认证源表'; + +-- Dump completed on 2025-08-05 16:20:56 diff --git a/build/database/std/upgrade/upg_sys_menu.sql b/build/database/std/upgrade/upg_sys_menu.sql index b083b531..6f2770ed 100644 --- a/build/database/std/upgrade/upg_sys_menu.sql +++ b/build/database/std/upgrade/upg_sys_menu.sql @@ -72,6 +72,7 @@ REPLACE INTO `sys_menu` VALUES (105, 'menu.security.post', 2113, 6, 'post', 'sys REPLACE INTO `sys_menu` VALUES (106, 'menu.system.dictType', 1, 30, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.dictTypeRemark'); REPLACE INTO `sys_menu` VALUES (107, 'menu.system.dictData', 1, 31, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.dictDataRemark'); REPLACE INTO `sys_menu` VALUES (108, 'menu.system.paramSet', 1, 59, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.paramSetRemark'); +REPLACE INTO `sys_menu` VALUES (109, 'menu.system.loginSource', 2113, 12, 'login-source', 'system/login-source/index', '1', '1', 'M', '1', '1', 'system:loginSource:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (111, 'menu.system.systemLog', 1, 11, 'log', '', '1', '1', 'D', '0', '0', '', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.systemLogRemark'); REPLACE INTO `sys_menu` VALUES (112, 'menu.system.systemInfo', 1, 5, 'system-info', 'monitor/system/info', '1', '1', 'M', '1', '1', 'monitor:system:info', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.systemInfoRemark'); REPLACE INTO `sys_menu` VALUES (113, 'menu.system.cacheInfo', 1, 8, 'cache-info', 'monitor/cache/info', '1', '1', 'M', '1', '1', 'monitor:cache:info', 'icon-gongnengjieshao', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.cacheInfoRemark'); @@ -134,6 +135,10 @@ REPLACE INTO `sys_menu` VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', REPLACE INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (1057, 'menu.common.query', 109, 1, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (1058, 'menu.common.add', 109, 2, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (1059, 'menu.common.edit', 109, 3, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (1060, 'menu.common.delete', 109, 4, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); @@ -171,8 +176,8 @@ REPLACE INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 12, 'kpiKe REPLACE INTO `sys_menu` VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', '', '1', '0', 'D', '1', '1', '', 'icon-zhizuoliucheng', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.udmRemark'); -REPLACE INTO `sys_menu` VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '1', '1', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.setRemark'); -REPLACE INTO `sys_menu` VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.omcRemark'); +REPLACE INTO `sys_menu` VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '0', '0', 'mmlManage:mmlSet:index', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.setRemark'); +REPLACE INTO `sys_menu` VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '0', '0', 'mmlManage:omcOperate:index', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.mml.omcRemark'); REPLACE INTO `sys_menu` VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'sgwc#cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2113, 'menu.security', 0, 14, 'security', '', '1', '0', 'D', '1', '1', '', 'icon-suofang', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.securityRemark'); REPLACE INTO `sys_menu` VALUES (2114, 'menu.system.systemSet', 1, 60, 'setting', 'system/setting/index', '1', '1', 'M', '1', '1', 'system:setting:index', 'icon-piliang', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.systemSetRemark'); @@ -180,8 +185,8 @@ REPLACE INTO `sys_menu` VALUES (2115, 'menu.system.systemResource', 1, 6, 'monit REPLACE INTO `sys_menu` VALUES (2116, 'menu.dashboard.smscCDR.content', 2157, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:smsc:content', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2117, 'menu.common.delete', 2140, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:ne:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'smf#cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588,'system', 1728641403588, ''); --- REPLACE INTO `sys_menu` VALUES (2119, 'menu.ueUser.n3iwf', 5, 8, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); --- REPLACE INTO `sys_menu` VALUES (2120, 'menu.ueUser.pcf', 5, 9, 'pcf', 'neUser/pcf/index', '1', '0', 'M', '1', '1', 'neUser:pcf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (2119, 'Alarm Overview', 2129, 6, 'alarm-overview', 'faultManage/alarm-overview/index', '1', '1', 'M', '1', '1', 'faultManage:active-overview:index', 'icon-wenjian', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (2120, 'DashboardV1', 2131, 8, 'dashboardV1', 'dashboard/overview/index', '1', '0', 'M', '1', '1', 'dashboard:overview:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2121, 'menu.system.user.editRole', 100, 8, '', '', '1', '1', 'B', '1', '1', 'system:user:editRole', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2122, 'menu.system.setting.i18n', 2114, 1, '', '', '1', '1', 'B', '1', '1', 'system:setting:i18n', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.setting.i18nRemark'); REPLACE INTO `sys_menu` VALUES (2123, 'menu.log.neFile', 2089, 9, 'neFile', 'ne/neFile/index', '1', '0', 'M', '1', '1', 'ne:neFile:index', 'icon-tubiaohuizhi', '0', 'system', 1728641403588,'system', 1728641403588, ''); @@ -193,12 +198,13 @@ REPLACE INTO `sys_menu` VALUES (2128, 'menu.monitor.topologyArchitecture', 2130, REPLACE INTO `sys_menu` VALUES (2129, 'menu.alarm', 2087, 20, 'alarm', '', '1', '0', 'D', '1', '1', '', 'icon-jinggao', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2130, 'menu.topology', 2087, 10, 'topology', '', '1', '0', 'D', '1', '1', '', 'icon-anzhuo', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2131, 'menu.dashboard', 2087, 15, 'dashboard', '', '1', '0', 'D', '1', '1', '', 'icon-soutubiao', '0', 'system', 1728641403588,'system', 1728641403588, ''); -REPLACE INTO `sys_menu` VALUES (2132, 'menu.dashboard.overview', 2131, 1, 'overview', 'dashboard/overview/index', '1', '0', 'M', '1', '1', 'dashboard:overview:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (2132, 'menu.dashboard.overview', 2131, 1, 'overview', 'dashboard/overview2/index', '1', '0', 'M', '1', '1', 'dashboard:overview:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2133, 'menu.dashboard.imsCDR', 2140, 3, 'imsCDR', 'dashboard/imsCDR/index', '1', '0', 'M', '1', '1', 'ims#cdr:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2135, 'menu.ne.neHost', 4, 15, 'neHost', 'ne/neHost/index', '1', '1', 'M', '1', '0', 'ne:neHost:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2136, 'menu.ne.neHostCommand', 4, 18, 'neHostCommand', 'ne/neHostCommand/index', '1', '0', 'M', '1', '0', 'ne:neHostCommand:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2137, 'menu.ne.neInfo', 4, 10, 'neInfo', 'ne/neInfo/index', '1', '0', 'M', '1', '1', 'ne:neInfo:list', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2138, 'menu.dashboard.amfUE', 2141, 1, 'amfUE', 'dashboard/amfUE/index', '1', '0', 'M', '1', '1', 'amf#ue:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (2139, 'menu.perf.kpiIMSOverview', 2099, 14, 'dashboard', 'perfManage/overview/index', '1', '0', 'M', '1', '1', 'ims#perfManage:dashboard:index', 'icon-fuzhichenggong', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2140, 'menu.monitor.cdr', 2089, 10, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2141, 'menu.monitor.event', 2089, 20, 'event', '', '1', '0', 'D', '1', '1', '', 'icon-gengduo', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2142, 'menu.ne.neQuickSetup', 4, 40, 'neQuickSetup', 'ne/neQuickSetup/index', '1', '1', 'M', '1', '1', 'ne:neQuickSetup:list', 'icon-wofaqi', '0', 'system', 1728641403588,'system', 1728641403588, ''); @@ -230,6 +236,8 @@ REPLACE INTO `sys_menu` VALUES (2167, 'menu.dashboard.overview.imsUeNum', 2132, REPLACE INTO `sys_menu` VALUES (2168, 'menu.dashboard.overview.gnbBase', 2132, 6, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:gnbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2169, 'menu.dashboard.overview.enbBase', 2132, 8, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:enbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (20000, 'menu.ue.cbc.cbe', 5, 20, 'cbe', 'cbc/cbe/index', '1', '0', 'M', '1', '1', 'cbc#dashboard:cdr:index', 'icon-tubiaoku', '0', 'system', 1711352709786, 'system', 1747796007372, ''); + SET FOREIGN_KEY_CHECKS = 1; -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/upgrade/upg_sys_role_menu.sql b/build/database/std/upgrade/upg_sys_role_menu.sql index e236b3e4..8733307c 100644 --- a/build/database/std/upgrade/upg_sys_role_menu.sql +++ b/build/database/std/upgrade/upg_sys_role_menu.sql @@ -1,6 +1,3 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for sys_role_menu -- ---------------------------- @@ -10,12 +7,10 @@ CREATE TABLE IF NOT EXISTS `sys_role_menu` ( PRIMARY KEY (`role_id`, `menu_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统_角色和菜单关联表' ROW_FORMAT = Dynamic; +DELETE FROM `sys_role_menu` WHERE `role_id` IN (2,3,4,5); -- -- Dumping data for table `sys_role_menu` -- - -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); @@ -32,6 +27,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 103); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 104); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 105); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 108); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 109); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 111); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 115); @@ -68,10 +64,8 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1030); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1032); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1034); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1039); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1040); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1042); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1043); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1045); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1048); @@ -83,6 +77,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1054); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1056); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1057); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1058); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1059); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1060); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2000); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2001); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2002); @@ -90,8 +88,8 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2003); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2004); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2005); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2007); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2008); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2083); @@ -134,6 +132,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2132); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2133); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2137); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2138); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2139); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2140); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2141); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2142); @@ -162,6 +161,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2167); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2168); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2169); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 20000); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 4); @@ -171,7 +171,6 @@ 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); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 500); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 501); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1030); @@ -179,7 +178,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1032); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1034); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1039); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1042); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1048); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2000); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2001); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2002); @@ -192,6 +190,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2010); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2083); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2084); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2088); @@ -203,11 +202,12 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2097); 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, 2112); 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, 2116); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2118); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2122); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2128); @@ -228,22 +228,19 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2149); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2153); -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, 2158); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2167); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2168); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2169); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 20000); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); 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); @@ -253,17 +250,18 @@ 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, 2083); -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); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2089); +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, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2116); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); @@ -277,11 +275,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2141); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2147); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2148); 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, 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 (4, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2167); @@ -293,10 +287,15 @@ 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, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2115); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2126); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2128); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2130); 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; +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2166); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2167); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2168); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2169); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/upgrade/upg_sys_user.sql b/build/database/std/upgrade/upg_sys_user.sql index eb89d6b1..d8baa5e8 100644 --- a/build/database/std/upgrade/upg_sys_user.sql +++ b/build/database/std/upgrade/upg_sys_user.sql @@ -1,6 +1,7 @@ -- -- Table structure for table `sys_user` -- + CREATE TABLE IF NOT EXISTS `sys_user` ( `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `dept_id` bigint NULL DEFAULT 0 COMMENT '部门ID', @@ -11,6 +12,8 @@ CREATE TABLE IF NOT EXISTS `sys_user` ( `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0未选择 1男 2女)', `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址', `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码', + `user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'System' COMMENT '用户类型(System系统用户)', + `user_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '用户来源UID (系统#)', `status_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '账号状态(0停用 1正常)', `del_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标记(0存在 1删除)', `password_update_time` bigint NULL DEFAULT 0 COMMENT '密码更新时间', @@ -28,10 +31,6 @@ CREATE TABLE IF NOT EXISTS `sys_user` ( -- ---------------------------- -- COLUMN for sys_user -- ---------------------------- -ALTER TABLE `sys_user` DROP COLUMN `user_type`; -ALTER TABLE `sys_user` DROP COLUMN `phonenumber`; -ALTER TABLE `sys_user` DROP COLUMN `status`; -ALTER TABLE `sys_user` DROP COLUMN `login_date`; ALTER TABLE `sys_user` MODIFY COLUMN `user_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号' AFTER `dept_id`; ALTER TABLE `sys_user` MODIFY COLUMN `nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称' AFTER `user_name`; ALTER TABLE `sys_user` ADD COLUMN `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码' AFTER `email`; @@ -45,15 +44,18 @@ ALTER TABLE `sys_user` ADD COLUMN `login_time` bigint(20) NULL DEFAULT 0 COMMENT ALTER TABLE `sys_user` MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者' AFTER `login_time`; ALTER TABLE `sys_user` MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者' AFTER `create_time`; ALTER TABLE `sys_user` MODIFY COLUMN `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注' AFTER `update_time`; +ALTER TABLE `sys_user` ADD COLUMN `user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'System' COMMENT '用户类型(System系统用户)' AFTER `password`; +ALTER TABLE `sys_user` ADD COLUMN `user_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '用户来源UID (系统#)' AFTER `user_type`; ALTER TABLE `sys_user` COMMENT = '系统_用户信息表'; -- ---------------------------- -- Data for sys_user -- ---------------------------- -INSERT IGNORE INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT IGNORE INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT IGNORE INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT IGNORE INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -UPDATE `sys_user` SET `status_flag` = '1' WHERE `user_id` in (1,2,3,4); +INSERT IGNORE INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT IGNORE INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT IGNORE INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT IGNORE INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +UPDATE `sys_user` SET `status_flag` = '1', `user_type` = 'System', `user_source` = '#' WHERE `user_id` in (1,2,3,4); +UPDATE `sys_user` SET `user_type` = 'System', `user_source` = '#' WHERE `user_type` = 'sys'; -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/upgrade/upg_ue_event.sql b/build/database/std/upgrade/upg_ue_event.sql index 77d78a61..26e84ca2 100644 --- a/build/database/std/upgrade/upg_ue_event.sql +++ b/build/database/std/upgrade/upg_ue_event.sql @@ -6,8 +6,8 @@ CREATE TABLE IF NOT EXISTS `ue_event` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '可能没有', - `timestamp` bigint DEFAULT '48' COMMENT '接收到的timestamp秒级存储毫秒时间戳', - `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型 auth-result detach cm-state', + `timestamp` bigint DEFAULT '0' COMMENT '接收到时间', + `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, @@ -22,8 +22,8 @@ ALTER TABLE `ue_event` DROP INDEX `idx_type_timestamp`; ALTER TABLE `ue_event` MODIFY COLUMN `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `id`; ALTER TABLE `ue_event` MODIFY COLUMN `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `ne_type`; ALTER TABLE `ue_event` MODIFY COLUMN `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '可能没有' AFTER `ne_name`; -ALTER TABLE `ue_event` MODIFY COLUMN `timestamp` bigint(20) NULL DEFAULT 48 COMMENT '接收到的timestamp秒级存储毫秒时间戳' AFTER `rm_uid`; -ALTER TABLE `ue_event` MODIFY COLUMN `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '事件类型 auth-result detach cm-state' AFTER `timestamp`; +ALTER TABLE `ue_event` MODIFY COLUMN `timestamp` bigint(20) NULL DEFAULT 0 COMMENT '接收到时间' AFTER `rm_uid`; +ALTER TABLE `ue_event` MODIFY COLUMN `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '事件类型' AFTER `timestamp`; ALTER TABLE `ue_event` MODIFY COLUMN `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'data JSON String' AFTER `event_type`; ALTER TABLE `ue_event` MODIFY COLUMN `created_at` bigint(20) NULL DEFAULT 0 COMMENT '记录创建存储毫秒' AFTER `event_json`; ALTER TABLE `ue_event` ADD INDEX `idx_type_t`(`event_type`, `timestamp`) USING BTREE; diff --git a/build/database/std/upgrade/upg_ue_event_amf.sql b/build/database/std/upgrade/upg_ue_event_amf.sql index 59a07c6d..5da30e00 100644 --- a/build/database/std/upgrade/upg_ue_event_amf.sql +++ b/build/database/std/upgrade/upg_ue_event_amf.sql @@ -6,8 +6,8 @@ CREATE TABLE IF NOT EXISTS `ue_event_amf` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '可能没有', - `timestamp` bigint DEFAULT '48' COMMENT '接收到的timestamp秒级存储毫秒时间戳', - `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型 auth-result detach cm-state', + `timestamp` bigint DEFAULT '0' COMMENT '接收到时间', + `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, @@ -22,11 +22,15 @@ ALTER TABLE `ue_event_amf` DROP INDEX `idx_type_timestamp`; ALTER TABLE `ue_event_amf` MODIFY COLUMN `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `id`; ALTER TABLE `ue_event_amf` MODIFY COLUMN `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `ne_type`; ALTER TABLE `ue_event_amf` MODIFY COLUMN `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '可能没有' AFTER `ne_name`; -ALTER TABLE `ue_event_amf` MODIFY COLUMN `timestamp` bigint(20) NULL DEFAULT 48 COMMENT '接收到的timestamp秒级存储毫秒时间戳' AFTER `rm_uid`; -ALTER TABLE `ue_event_amf` MODIFY COLUMN `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '事件类型 auth-result detach cm-state' AFTER `timestamp`; +ALTER TABLE `ue_event_amf` MODIFY COLUMN `timestamp` bigint(20) NULL DEFAULT 0 COMMENT '接收到时间' AFTER `rm_uid`; +ALTER TABLE `ue_event_amf` MODIFY COLUMN `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '事件类型' AFTER `timestamp`; ALTER TABLE `ue_event_amf` MODIFY COLUMN `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'data JSON String' AFTER `event_type`; ALTER TABLE `ue_event_amf` MODIFY COLUMN `created_at` bigint(20) NULL DEFAULT 0 COMMENT '记录创建存储毫秒' AFTER `event_json`; ALTER TABLE `ue_event_amf` ADD INDEX `idx_amf_type_t`(`event_type`, `timestamp`) USING BTREE; ALTER TABLE `ue_event_amf` COMMENT = 'UE事件_AMF终端接入'; +-- 更新数据 +UPDATE `ue_event_amf` SET `event_type` = 'Auth' WHERE `event_type` = 'auth-result'; +UPDATE `ue_event_amf` SET `event_type` = 'Detach' WHERE `event_type` = 'detach'; +UPDATE `ue_event_amf` SET `event_type` = 'CM' WHERE `event_type` = 'cm-state'; -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/upgrade/upg_ue_event_mme.sql b/build/database/std/upgrade/upg_ue_event_mme.sql index 6a306fff..60acbb36 100644 --- a/build/database/std/upgrade/upg_ue_event_mme.sql +++ b/build/database/std/upgrade/upg_ue_event_mme.sql @@ -6,8 +6,8 @@ CREATE TABLE IF NOT EXISTS `ue_event_mme` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '可能没有', - `timestamp` bigint DEFAULT '48' COMMENT '接收到的timestamp秒级存储毫秒时间戳', - `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型 auth-result detach cm-state', + `timestamp` bigint DEFAULT '0' COMMENT '接收到时间', + `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, @@ -22,11 +22,15 @@ ALTER TABLE `ue_event_mme` DROP INDEX `idx_type_timestamp`; ALTER TABLE `ue_event_mme` MODIFY COLUMN `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `id`; ALTER TABLE `ue_event_mme` MODIFY COLUMN `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' AFTER `ne_type`; ALTER TABLE `ue_event_mme` MODIFY COLUMN `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '可能没有' AFTER `ne_name`; -ALTER TABLE `ue_event_mme` MODIFY COLUMN `timestamp` bigint(20) NULL DEFAULT 48 COMMENT '接收到的timestamp秒级存储毫秒时间戳' AFTER `rm_uid`; -ALTER TABLE `ue_event_mme` MODIFY COLUMN `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '事件类型 auth-result detach cm-state' AFTER `timestamp`; +ALTER TABLE `ue_event_mme` MODIFY COLUMN `timestamp` bigint(20) NULL DEFAULT 0 COMMENT '接收到时间' AFTER `rm_uid`; +ALTER TABLE `ue_event_mme` MODIFY COLUMN `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '事件类型' AFTER `timestamp`; ALTER TABLE `ue_event_mme` MODIFY COLUMN `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'data JSON String' AFTER `event_type`; ALTER TABLE `ue_event_mme` MODIFY COLUMN `created_at` bigint(20) NULL DEFAULT 0 COMMENT '记录创建存储毫秒' AFTER `event_json`; ALTER TABLE `ue_event_mme` ADD INDEX `idx_mme_type_t`(`event_type`, `timestamp`) USING BTREE; ALTER TABLE `ue_event_mme` COMMENT = 'UE事件_MME终端接入'; +-- 更新数据 +UPDATE `ue_event_mme` SET `event_type` = 'Auth' WHERE `event_type` = 'auth-result'; +UPDATE `ue_event_mme` SET `event_type` = 'Detach' WHERE `event_type` = 'detach'; +UPDATE `ue_event_mme` SET `event_type` = 'CM' WHERE `event_type` = 'cm-state'; -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/default/omc.yaml b/build/default/omc.yaml index ef20aadc..f4291c9d 100644 --- a/build/default/omc.yaml +++ b/build/default/omc.yaml @@ -7,21 +7,15 @@ serverVersion: "lite" # interface encryption, default false # serverCryptoApi: false - +# route service configuration # service listen ipv4/v6 and port, support multiple routines -# ip: 0.0.0.0 or ::0, support IPv4/v6 -server: - - ipv4: 0.0.0.0 - ipv6: "" - port: 33080 # http listen port - schema: http - - ipv4: 0.0.0.0 - ipv6: "" - port: 33443 # https listen port - schema: https - certFile: /usr/local/etc/omc/certs/www.omc.net.crt - keyFile: /usr/local/etc/omc/certs/www.omc.net.key - +routeServer: + - addr: "0.0.0.0:33080" # route http port + schema: "http" + - addr: "0.0.0.0:33443" # route https port + schema: "https" + certFile: "/usr/local/etc/omc/certs/www.omc.net.crt" + keyFile: "/usr/local/etc/omc/certs/www.omc.net.key" # web service configuration # if you are using nginx to take over, you can disable the @@ -29,12 +23,12 @@ webServer: enabled: true # web server enabled, default false rootDir: /usr/local/etc/omc/web listen: - - addr: 0.0.0.0:44080 - schema: http - - addr: 0.0.0.0:44443 - schema: https - certFile: /usr/local/etc/omc/certs/www.omc.net.crt - keyFile: /usr/local/etc/omc/certs/www.omc.net.key + - addr: "0.0.0.0:44080" # web http port + schema: "http" + - addr: "0.0.0.0:44443" # web https port + schema: "https" + certFile: "/usr/local/etc/omc/certs/www.omc.net.crt" + keyFile: "/usr/local/etc/omc/certs/www.omc.net.key" # track configuration for NE signaling trace # host fill in the specific IP address @@ -61,7 +55,6 @@ database: # default data source name defaultDataSourceName: "lite" - # redis cached data redis: dataSource: @@ -73,136 +66,11 @@ redis: # default data source name defaultDataSourceName: "default" - -# file: log file name -# level: /trace/debug/info/warn/error/fatal, default: debug -# duration: rotation time with xx hours, example: 1/12/24 hours -# count: rotation count of log, default is 30 rotation +# log logger: - file: /var/log/omc_restagent.log - level: warn - duration: 24 - count: 90 + fileDir: "/var/log" # Log File Dir + fileName: "omc.log" # Log File Name + level: 2 # Log Level of 0:silent<1:info<2:warn<3:error + maxDay: 7 # Log retention Days + maxSize: 10 # Log File cutting by size -# sleep: time delay for after write buffer (millisecond) -# deadLine: timeout for io read and write (second) -mml: - sleep: 200 - deadLine: 10 - sizeRow: 600 - sizeCol: 128 - bufferSize: 65535 - mmlHome: ./mmlhome - -# NE config -ne: - user: omcuser - etcdir: /usr/local/etc - bindir: /usr/local/bin - omcdir: /usr/local/omc - scpdir: /tmp - licensedir: /usr/local/etc/{neType}/license - # backup etc list of IMS, does not contain spaces - etcListIMS: "{*.yaml,mmtel,vars.cfg}" - etcListDefault: "{*.yaml,*.conf,*.cfg}" - # true/false to overwrite config file when dpkg ne software - dpkgOverwrite: false - # dpkg timeout (second) - dpkgTimeout: 180 - -# chk2ne: true/false, if put OmcNeConfig parameters to NE -omc: - uriPrefix: "/omc/rest" - neType: OMC - neId: 001 - rmUID: 4400HX101 - neName: OMC - province: "" - vendor: "" - dn: "" - chk2ne: false - capability: 50 - sn: "-" - expiryDate: "-" - checksign: false - rootDir: /usr/local/omc - binDir: /usr/local/omc/bin - backup: /usr/local/omc/backup - upload: /usr/local/omc/upload - frontUpload: /usr/local/omc/htdocs/front/upload - frontTraceDir: /usr/local/omc/htdocs/front/trace - software: /usr/local/omc/software - license: /usr/local/omc/license - gtpUri: gtp:192.168.2.119:32152 - checkContentType: false - testMode: false - rbacMode: true - runDir: /usr/local/omc/run - cmdTimeout: 120 - -# Alarm module setting -# Forward interface: -# TLS Skip verify: true/false -# email/sms -# smProxy: sms(Short Message Service)/smsc(SMS Centre) -# dataCoding: 0:GSM7BIT, 1:ASCII, 2:BINARY8BIT1, 3:LATIN1, -# 4:BINARY8BIT2, 6:CYRILLIC, 7:HEBREW, 8:UCS2 -alarm: - alarmEmailForward: - enable: false - emailList: "" - title: "Alarm from OMC" - smtp: mail.smtp.com - port: 25 - user: smtpext@smtp.com - password: "1000smtp@omc!" - tlsSkipVerify: true - alarmSMSForward: - enable: false - mobileList: "" - smscAddr: "192.168.13.114:2775" - systemID: "omc" - password: "omc123" - systemType: "UTRAN" - dataCoding: 0 - serviceNumber: "OMC" - sms: - apiURL: http://smsc.xxx.com/ - accessKeyID: xxxx - accessKeySecret: xxxx - signName: xxx SMSC - templateCode: 1000 - smProxy: smsc - -# User authorized information -# crypt: mysql/md5/bcrypt -# token: true/false to check accessToken -# expires for session, unit: second -# Support single/multiple session of user -# -auth: - crypt: bcrypt - token: true - expires: 1800 - session: multiple - publicKey: /usr/local/omc/etc/certs/omc - privateKey: /usr/local/omc/etc/certs/omc - -# Parameter for limit number -# rmuid_maxnum: the max number of rmUID, default: 50 -# alarmid_maxnum: the max number of AlarmID, default: 50 -# pmid_maxnum: the max number of pmID, default: 50 -# subid_maxnum: the max number of subscription ID, default: 20 -# uri_maxlen: the max length of uri, default: 8192 -# rmuid_regexp: regexp pattern of rmUID -params: - rmuidmaxnum: 50 - alarmidmaxnum: 50 - pmidmaxnum: 50 - subidmaxnum: 20 - urimaxlen: 2100000 - rmuidregexp: "[0-9]{4}[A-Z]{2}[A-Z]{2}[0-9A-Z]{1}[0-9A-Z]{3}[0-9A-Z]{1,16}" - -testConfig: - enabled: false - file: /usr/local/omc/etc/testconfig.yaml diff --git a/build/default/sshsvc.yaml b/build/default/sshsvc.yaml deleted file mode 100644 index cf555d98..00000000 --- a/build/default/sshsvc.yaml +++ /dev/null @@ -1,87 +0,0 @@ -# file: log file name -# level: /trace/debug/info/warn/error/fatal, default: debug -# duration: rotation time with xx hours, example: 1/12/24 hours -# count: rotation count of log, default is 30 rotation -logger: - file: /var/log/omc_sshsvc.log - level: warn - duration: 24 - count: 30 - -# file: MML log file name -# duration: rotation time with xx hours, example: 1/12/24 hours -# count: rotation count of log, default is 30 rotation -# level: cmd/ret log cmd/log cmd & result -logmml: - file: /var/log/omc_mml.log - duration: 24 - count: 30 - level: cmd - -# ssh service listen ipv4/v6 and port, support multiple routines -# ip: 0.0.0.0 or ::0, support IPv4/v6 -# session: single/multiple session for one user -sshd: - listenAddr: 0.0.0.0 - listenPort: 32222 - privateKey: /root/.ssh/id_rsa - maxConnNum: 2 - timeout: 1800 - session: multiple - mmlHome: /usr/local/omc/mmlhome - userName: manager - password: pass123 - authType: local - tagNE: omc - -# authType: local/omc -telnetServer: - listenAddr: 0.0.0.0 - listenPort: 32323 - maxConnNum: 2 - timeout: 1800 - session: multiple - mmlHome: /usr/local/omc/mmlhome - userName: manager - password: pass123 - authType: local - tagNE: omc - -# authproto: NoAuth/MD5/SHA -# privProto: NoPriv/DES/AES/AES192/AES256 -snmpServer: - listenAddr: '[::]' - listenPort: 34957 - userName: manager - authPass: pass123 - authproto: MD5 - privPass: "3F2A1B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2C3D4E" - privProto: DES - engineID: "8000000004323030313a6462383a3a39313636" - trapPort: 34958 - trapListen: false - trapBool: false - trapTick: 60 - timeOut: 5 - trapTarget: "" - -database: - type: mysql - user: root - password: 1000omc@kp! - host: 127.0.0.1 - port: 33066 - name: omc_db - connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True - -omc: - httpUri: http://127.0.0.1:33030 - userCrypt: bcrypt - -ne: - port: 4100 - sleep: 200 - user: admin - password: admin - - diff --git a/features/aaaa/aaaa.go b/features/aaaa/aaaa.go deleted file mode 100644 index c6dde188..00000000 --- a/features/aaaa/aaaa.go +++ /dev/null @@ -1,142 +0,0 @@ -package aaaa - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "github.com/go-resty/resty/v2" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/log" - "be.ems/lib/oauth" - "be.ems/lib/services" -) - -var ( - UriAAAASSO = config.DefaultUriPrefix + "/aaaa/{apiVersion}/security/sso" // for 4A external - - CustomUriAAAASSO = config.UriPrefix + "/aaaa/{apiVersion}/security/sso" // for 4A external -) - -var client = resty.New() - -func init() { - /* - client. - SetTimeout(10 * time.Second). - SetRetryCount(1). - SetRetryWaitTime(1 * time.Second). - SetRetryMaxWaitTime(2 * time.Second). - SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) { - return 0, errors.New("quota exceeded") - }) - */ - client.SetTimeout(3 * time.Second) -} - -type AAAATicket struct { - Ticket string `json:"ticket"` -} - -type SSOResult struct { - SSO struct { - Result string `json:"result"` - ResultMsg string `json:"result_msg"` - Ticket string `json:"ticket"` - ResultMsgcode string `json:"result_msgcode"` - Account []struct { - Accid string `json:"accid"` - } `json:"account"` - } `json:"sso"` -} - -// Get system state from NF/NFs -func GetSSOFromAAAA(w http.ResponseWriter, r *http.Request) { - log.Info("GetSSOFromAAAA processing... ") - - vars := r.URL.Query() - ticket := vars["ticket"] - if len(ticket) == 0 { - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Debug("ticket:", ticket) - - log.Debugf("r.RemoteAddr:%s r.Host: %s", r.RemoteAddr, r.Host) - - aaaaIp := r.RemoteAddr[:strings.Index(r.RemoteAddr, ":")] - omcIp := r.Host[:strings.Index(r.Host, ":")] - - log.Debugf("aaaaIp=%s omcIp=%s", aaaaIp, omcIp) - requestURI2NF := fmt.Sprintf("http://%s:8080/qryUserByTicket", aaaaIp) - - log.Debug("requestURI2NF:", requestURI2NF) - - aaaaTicket := &AAAATicket{ - Ticket: ticket[0], - } - - body, err := json.Marshal(aaaaTicket) - if err != nil { - log.Error("Failed to json.Marshal:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(body). - Post(requestURI2NF) - if err != nil { - log.Error("Failed to Post:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("response:", response) - - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - ssoResult := new(SSOResult) - json.Unmarshal(response.Body(), ssoResult) - var accid string - if len(ssoResult.SSO.Account) != 0 { - accid = ssoResult.SSO.Account[0].Accid - } - - log.Debug("accid:", accid) - exist, err := dborm.XormIsExistUser(accid) - if err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - token := oauth.GenRandToken("aaaa") // Generate new token to session ID - affected, err := dborm.XormInsertSession(accid, r.RemoteAddr, token, - config.GetExpiresFromConfig(), config.GetYamlConfig().Auth.Session) - if err != nil { - log.Error("Failed to XormInsertSession:", err) - if affected == -1 { - services.ResponseForbidden403MultiLoginNotAllowed(w) - } else { - services.ResponseBadRequest400IncorrectLogin(w) - } - return - } - if exist == true { - redirectUrl := fmt.Sprintf("http://%s:8888/home.html?user=%s&token=%s", omcIp, accid, token) - services.ResponseRedirect(w, redirectUrl, accid, token) - return - } else { - services.ResponseBadRequest400IncorrectLogin(w) - return - } - default: - services.ResponseForbidden403NotPermission(w) - return - } -} diff --git a/features/cdr/cdrevent.go b/features/cdr/cdrevent.go deleted file mode 100644 index 47a74f5c..00000000 --- a/features/cdr/cdrevent.go +++ /dev/null @@ -1,102 +0,0 @@ -package cdr - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - neService "be.ems/src/modules/network_element/service" - wsService "be.ems/src/modules/ws/service" -) - -var ( - UriCDREvent = config.DefaultUriPrefix + "/cdrManagement/v1/elementType/{elementTypeValue}/objectType/cdrEvent" - UriCDRFile = config.DefaultUriPrefix + "/cdrManagement/v1/elementType/{elementTypeValue}/objectType/cdrFile" - - CustomUriCDREvent = config.UriPrefix + "/cdrManagement/v1/elementType/{elementTypeValue}/objectType/cdrEvent" - CustomUriCDRFile = config.UriPrefix + "/cdrManagement/v1/elementType/{elementTypeValue}/objectType/cdrFile" -) - -// PostCDREventFrom 接收CDR数据请求 -func PostCDREventFrom(w http.ResponseWriter, r *http.Request) { - log.Info("PostCDREventFrom processing... ") - neType := ctx.GetParam(r, "elementTypeValue") - var body struct { - NeType string `json:"neType" ` - NeName string `json:"neName" ` - RmUID string `json:"rmUID" ` - Timestamp int `json:"timestamp" ` - CDR map[string]any `json:"CDR" ` - } - if err := ctx.ShouldBindJSON(r, &body); err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - neTypeLower := strings.ToLower(body.NeType) - if neType == "" || neType != neTypeLower { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("inconsistent network element types")) - return - } - - // 是否存在网元 - neInfo := neService.NewNeInfo.FindByRmuid(body.RmUID) - if neInfo.NeType != body.NeType || neInfo.RmUID != body.RmUID { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("network element does not exist")) - return - } - - cdrByte, err := json.Marshal(body.CDR) - if err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 执行插入表 - type CDREvent struct { - ID int64 `json:"-" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUid string `json:"rmUid" gorm:"column:rm_uid"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String - CreatedAt int64 `json:"-" gorm:"column:created_at"` // 记录创建存储毫秒 - } - data := CDREvent{ - NeType: body.NeType, - NeName: body.NeName, - RmUid: body.RmUID, - Timestamp: int64(body.Timestamp) * 1000, - CdrJson: string(cdrByte), - CreatedAt: time.Now().UnixMilli(), - } - tableName := fmt.Sprintf("cdr_event_%s", neTypeLower) - if err := db.DB("").Table(tableName).Create(&data).Error; err != nil { - log.Error("Failed to insert "+tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 推送到ws订阅组 - switch neInfo.NeType { - case "IMS": - if v, ok := body.CDR["recordType"]; ok && (v == "MOC" || v == "MTSM") { - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_IMS_CDR, neInfo.NeId), data) - } - case "SMF": - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMF_CDR, neInfo.NeId), data) - case "SMSC": - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMSC_CDR, neInfo.NeId), data) - case "SGWC": - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SGWC_CDR, neInfo.NeId), data) - } - - services.ResponseStatusOK204NoContent(w) -} diff --git a/features/cm/exec_linux.go b/features/cm/exec_linux.go deleted file mode 100644 index b8b7b36f..00000000 --- a/features/cm/exec_linux.go +++ /dev/null @@ -1,95 +0,0 @@ -//go:build linux -// +build linux - -package cm - -import ( - "bytes" - "context" - "os/exec" - "time" - - "be.ems/lib/log" -) - -func ExecCmd(command string) error { - log.Debug("Exec command:", command) - - cmd := exec.Command("/bin/bash", "-c", command) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - /* - if err := cmd.Start(); err != nil { - log.Error("Start error: ", err) - return err - } - if err := cmd.Wait(); err != nil { - log.Error("Wait error: ", err) - return err - } - */ - return nil -} - -func ExecShell(command string) error { - in := bytes.NewBuffer(nil) - cmd := exec.Command("sh") - cmd.Stdin = in - in.WriteString(command) - in.WriteString("exit\n") - if err := cmd.Start(); err != nil { - return err - } - return nil -} - -func ExecOsCmd(command, os string) error { - log.Debugf("Exec %s command:%s", os, command) - - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - return nil -} - -func StartSSHCmdWithTimeout(duration int, sshHost, cmdStr string) error { - timeout := time.Duration(duration) * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) // 设置超时 - defer cancel() - cmd := exec.CommandContext(ctx, "ssh", sshHost, cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Start() - if err != nil { - return err - } - return nil -} - -func RunSSHCmd(sshHost, cmdStr string) error { - cmd := exec.Command("ssh", sshHost, cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if err != nil { - return err - } - return nil -} diff --git a/features/cm/exec_windows.go b/features/cm/exec_windows.go deleted file mode 100644 index 9e151bf7..00000000 --- a/features/cm/exec_windows.go +++ /dev/null @@ -1,83 +0,0 @@ -//go:build windows -// +build windows - -package cm - -import ( - "bytes" - "context" - "os/exec" - "time" - - "be.ems/lib/log" -) - -func ExecCmd(command string) error { - log.Debug("Exec command:", command) - - cmd := exec.Command("cmd", "/C", command) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - /* - if err := cmd.Start(); err != nil { - log.Error("Start error: ", err) - return err - } - if err := cmd.Wait(); err != nil { - log.Error("Wait error: ", err) - return err - } - */ - return nil -} - -func ExecOsCmd(command, os string) error { - log.Debugf("Exec %s command:%s", os, command) - - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - return nil -} - -func StartSSHCmdWithTimeout(duration int, sshHost, cmdStr string) error { - timeout := time.Duration(duration) * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) // 设置超时 - defer cancel() - cmd := exec.CommandContext(ctx, "ssh", sshHost, cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Start() - if err != nil { - return err - } - return nil -} - -func RunSSHCmd(sshHost, cmdStr string) error { - cmd := exec.Command("ssh", sshHost, cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if err != nil { - return err - } - return nil -} diff --git a/features/cm/ne.go b/features/cm/ne.go deleted file mode 100644 index f9cc9670..00000000 --- a/features/cm/ne.go +++ /dev/null @@ -1,991 +0,0 @@ -package cm - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "os/exec" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/constants" - "be.ems/src/framework/database/db" - neService "be.ems/src/modules/network_element/service" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" -) - -var ( - // NE CM export/import - NeCmUri = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm" - // NE info - UriNeInfo = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo" - // NE backup file - UriNeCmFile = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}" - // service action uri, action: start/stop/restart - UriNeService = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/service/{action}" - // nf instance action uri, action: start/stop/restart - UriNeInstance = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/instance/{action}" - - CustomNeCmUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm" - CustomUriNeInfo = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo" - CustomUriNeCmFile = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}" - // service action uri, action: start/stop/restart - CustomUriNeService = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/service/{action}" - // nf instance action uri, action: start/stop/restart - CustomUriNeInstance = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/instance/{action}" -) - -const ( - NEStatusActive = 0 - NEStatusOffline = 1 - NEStatusStandby = 2 - NEStatusMaintain = 3 -) - -var client = resty.New() - -func init() { - /* - client. - SetTimeout(10 * time.Second). - SetRetryCount(1). - SetRetryWaitTime(1 * time.Second). - SetRetryMaxWaitTime(2 * time.Second). - SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) { - return 0, errors.New("quota exceeded") - }) - */ - client. - SetTimeout(time.Duration(1 * time.Second)) -} - -func GetNeInfo(w http.ResponseWriter, r *http.Request) { - log.Debug("GetNeInfo processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neId := services.GetUriParamString(r, "ne_id", ",", false, false) - - // no, _ := strconv.ParseInt(neId, 10, 64) - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - var response services.DataResponse - response.Data = neInfo - services.ResponseWithJson(w, http.StatusOK, response) -} - -type OmcNeConfig struct { - NeId string `json:"neId" xorm:"ne_id"` // 网元标识(内部), - RmUID string `json:"rmUID" xorm:"rm_uid"` // rmUID 网元唯一标识 - NeName string `json:"neName" xorm:"ne_name"` // 网元名称(内部)/友好名称(北向资源/性能等使用) - PvFlag string `json:"pvFlag" xorm:"pv_flag"` // 网元虚实性标识 VNF/PNF: 虚拟/物理 - Province string `json:"province" xorm:"province"` // 网元所在省份 - VendorName string `json:"vendorName" xorm:"vendor_name"` // 厂商名称 - // ManagedBy string `json:"managedBy" xorm:"managed_by"` // 管理ManagedElement的ManagementNode对象类的DN值 - Dn string `json:"dn" xorm:"dn"` // 资源里边的ManagedBy,性能的Dn,网络唯一标识 -} - -func PostNeInfo(w http.ResponseWriter, r *http.Request) { - log.Debug("PostNeInfo processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("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) - syncFlag := services.GetUriParamString(r, "sync2ne", ",", false, false) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to o.ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - neInfo := new(dborm.NeInfo) - err = json.Unmarshal(body, neInfo) - if err != nil { - log.Error("Failed to json.Unmarshal:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - //neInfo.UpdateTime = time.Now().Format(time.DateTime) - neInfo.UpdateTime = time.Now() - log.Debug("NE info:", neInfo) - - //if !config.GetYamlConfig().OMC.Chk2Ne { - if syncFlag == "false" || neTypeUpper == config.GetYamlConfig().OMC.NeType { - neInfo.Status = NEStatusMaintain - affected, err := dborm.XormInsertNeInfo(neInfo) - if err != nil { - log.Error("Failed to insert Ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) - return - } else { - hostUri := global.CombineHostUri(neInfo.Ip, neInfo.Port) - //hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - apiUri := fmt.Sprintf("%s/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig?ne_id=%s", config.DefaultUriPrefix, strings.ToLower(neInfo.NeType), neInfo.NeId) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri) - log.Debug("requestURI2NF:", requestURI2NF) - - omcNeConfig := &OmcNeConfig{ - NeId: neInfo.NeId, - RmUID: neInfo.RmUID, - NeName: neInfo.NeName, - PvFlag: neInfo.PvFlag, - Province: neInfo.Province, - VendorName: neInfo.VendorName, - Dn: neInfo.Dn, - } - body, _ = json.Marshal(omcNeConfig) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(body). - Put(requestURI2NF) - if err != nil { - log.Error("Failed to Put:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Info("StatusCode: ", response.StatusCode()) - - respMsg := make(map[string]interface{}) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - neInfo.Status = NEStatusActive - affected, err := dborm.XormInsertNeInfo(neInfo) - if err != nil { - log.Error("Failed to dborm.XormInsertNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if affected <= 0 { - log.Infof("Not record affected to insert ne_info") - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - services.ResponseStatusOK204NoContent(w) - return - default: - log.Info("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) - return - } -} - -func PutNeInfo(w http.ResponseWriter, r *http.Request) { - log.Debug("PutNeInfo processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeLower := strings.ToLower(neType) - neTypeUpper := strings.ToUpper(neType) - syncFlag := services.GetUriParamString(r, "sync2ne", ",", false, false) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to io.ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := new(dborm.NeInfo) - _ = json.Unmarshal(body, neInfo) - neInfo.NeType = strings.ToUpper(neType) - neInfo.UpdateTime = time.Now() - log.Debug("NE info:", neInfo) - - //if !config.GetYamlConfig().OMC.Chk2Ne { - if syncFlag == "false" || neTypeUpper == config.GetYamlConfig().OMC.NeType { - neInfo.Status = NEStatusMaintain - affected, err := dborm.XormUpdateNeInfo(neInfo) - if err != nil { - log.Error("Failed to update Ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) - return - } else { - hostUri := global.CombineHostUri(neInfo.Ip, neInfo.Port) - //hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - apiUri := fmt.Sprintf("%s/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig?ne_id=%s", config.DefaultUriPrefix, neTypeLower, neInfo.NeId) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri) - log.Debug("requestURI2NF:", requestURI2NF) - - omcNeConfig := &OmcNeConfig{ - NeId: neInfo.NeId, - RmUID: neInfo.RmUID, - NeName: neInfo.NeName, - PvFlag: neInfo.PvFlag, - Province: neInfo.Province, - VendorName: neInfo.VendorName, - Dn: neInfo.Dn, - } - body, _ = json.Marshal(omcNeConfig) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(body). - Put(requestURI2NF) - if err != nil { - log.Error("Failed to Put:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Info("StatusCode: ", response.StatusCode()) - - respMsg := make(map[string]interface{}) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - neInfo.Status = NEStatusActive - affected, err := dborm.XormUpdateNeInfo(neInfo) - if err != nil { - log.Error("Failed to dborm.XormUpdateNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if affected <= 0 { - log.Infof("Not record affected to insert ne_info") - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - services.ResponseStatusOK204NoContent(w) - return - default: - log.Info("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) - return - } -} - -func DeleteNeInfo(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteNeInfo processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - 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 - } - - neInfo := new(dborm.NeInfo) - _ = json.Unmarshal(body, neInfo) - neInfo.NeType = strings.ToUpper(neType) - neInfo.NeId = services.GetUriParamString(r, "ne_id", ",", false, false) - neInfo, err = dborm.XormGetNeInfo(neInfo.NeType, neInfo.NeId) - if err != nil || neInfo == nil { - log.Error("Failed to delete Ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("NE info:", neInfo) - - // if NE in active status, can't delete NE - if !IsActiveNF(neInfo) { - affected, err := dborm.XormDeleteNeInfo(neInfo) - if err != nil { - log.Error("Failed to delete Ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) - return - } - err = global.ErrCMCannotDeleteActiveNE - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) -} - -func IsActiveNF(neInfo *dborm.NeInfo) bool { - log.Debug("IsActiveNF processing... ") - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI := fmt.Sprintf(config.UriPrefix+"/systemManagement/v1/elementType/%s/objectType/systemState", - strings.ToLower(neInfo.NeType)) - - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Get(hostUri + requestURI) - if err != nil { - log.Error("Failed to Get:", err) - return false - } - - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - return true - } - return false -} - -func ExportCmFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("ExportCmFromNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("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) - - neId := services.GetUriParamString(r, "ne_id", ",", false, false) - - // neInfo := new(dborm.NeInfo) - 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) - nePath := fmt.Sprintf("%s/etc/%s", config.GetYamlConfig().OMC.Backup, neTypeLower) - isExist, err := global.PathExists(nePath) - if err != nil { - log.Errorf("Failed to stat:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if isExist { - err = os.RemoveAll(nePath) - if err != nil { - log.Errorf("Failed to RemoveAll:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - err = os.MkdirAll(nePath, os.ModePerm) - if err != nil { - log.Errorf("Failed to MkdirAll:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - var scpCmd string - ipType := global.ParseIPAddr(neInfo.Ip) - omcNetypeLower := strings.ToLower(config.GetYamlConfig().OMC.NeType) - etcListIMS := "{*.yaml,mmtel,vars.cfg}" - if config.GetYamlConfig().NE.EtcListIMS != "" { - etcListIMS = config.GetYamlConfig().NE.EtcListIMS - } - switch neTypeLower { - case omcNetypeLower: - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/etc/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.OmcDir, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/etc/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.OmcDir, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - - case "ims": - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/%s/%s %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, neTypeLower, - etcListIMS, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/%s/%s %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, neTypeLower, - etcListIMS, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - - case "mme": - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/%s/*.conf %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/%s/*.conf %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - - default: - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/%s/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/%s/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - - } - - zipFile := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, strings.ToLower(neInfo.NeId), time.Now().Format(global.DateData)) - zipFilePath := config.GetYamlConfig().OMC.Backup + "/" + zipFile - zipCmd := fmt.Sprintf("cd %s/etc && zip -r %s %s/*", config.GetYamlConfig().OMC.Backup, zipFilePath, neTypeLower) - - command := fmt.Sprintf("%s&&%s", scpCmd, zipCmd) - - log.Debug("command:", command) - err = ExecCmd(command) - if err != nil { - log.Error("Faile to exec command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - md5Sum, err := global.GetFileMD5Sum(zipFilePath) - if err != nil { - log.Error("Faile to md5sum:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - //log.Debug("md5Str:", md5Sum) - path := config.GetYamlConfig().OMC.Backup - neBackup := dborm.NeBackup{NeType: neTypeUpper, NeId: neId, FileName: zipFile, Path: path, Md5Sum: md5Sum} - _, err = dborm.XormInsertTableOne("ne_backup", neBackup) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - //services.ResponseFileWithNameAndMD5(w, http.StatusOK, zipFile, path, md5Sum) - services.ResponseStatusOK204NoContent(w) -} - -type ImportCMJson struct { - FileName string `json:"fileName"` -} - -func ImportCmToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("ImportCmToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("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) - - neId := services.GetUriParamString(r, "ne_id", ",", false, false) - - var fileName, path string - if services.IsJsonContentType(r) { - 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.Debug("Body:", string(body)) - - importCMJson := new(ImportCMJson) - _ = json.Unmarshal(body, importCMJson) - fileName = importCMJson.FileName - path = config.GetYamlConfig().OMC.Backup - } else { - path = config.GetYamlConfig().OMC.Upload - fileNamePath, err := services.HandleUploadFile(r, path, "") - if err != nil { - log.Error("Faile to HandleUploadFile:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - fileName = fileNamePath - } - filePath := fmt.Sprintf("%s/%s", path, fileName) - - // neInfo := new(dborm.NeInfo) - 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) - - md5Sum, err := global.GetFileMD5Sum(filePath) - if err != nil { - log.Error("Faile to GetFileMD5Sum:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - //neBackup := dborm.NeBackup{NeType: neType, NeId: neId, Md5Sum: md5Sum} - //log.Debug("neBackup:", neBackup) - where := fmt.Sprintf("ne_type='%s' and ne_id='%s' and md5_sum='%s'", neTypeUpper, neId, md5Sum) - has, err := dborm.XormExistTableOne("ne_backup", where) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if !has { - err = global.ErrCMInvalidBackupFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // nePath := fmt.Sprintf("%s/etc/%s", config.GetYamlConfig().OMC.Upload, neTypeLower) - // isExist, err := global.PathExists(nePath) - // if err != nil { - // log.Errorf("Failed to stat:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // if isExist { - // err = os.RemoveAll(nePath) - // if err != nil { - // log.Errorf("Failed to remove:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } - // unzipCmd := fmt.Sprintf("unzip -o %s -d %s", filePath, config.GetYamlConfig().OMC.Upload) - - // var scpCmd string - // ipType := global.ParseIPAddr(neInfo.Ip) - // if ipType == global.IsIPv4 { - // scpCmd = fmt.Sprintf("scp -r %s/etc/%s %s@%s:%s", config.GetYamlConfig().OMC.Upload, - // neTypeLower, config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.EtcDir) - // } else { - // scpCmd = fmt.Sprintf("scp -r %s/etc/%s %s@[%s]:%s", config.GetYamlConfig().OMC.Upload, - // neTypeLower, config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.EtcDir) - // } - - // err = ExecCmd(fmt.Sprintf("%s && %s", unzipCmd, scpCmd)) - // if err != nil { - // log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // nePath := fmt.Sprintf("%s/etc/%s", config.GetYamlConfig().OMC.Upload, neTypeLower) - // isExist, err := global.PathExists(nePath) - // if err != nil { - // log.Errorf("Failed to stat:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // if isExist { - // err = os.RemoveAll(nePath) - // if err != nil { - // log.Errorf("Failed to remove:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } - var scpZipCmd string - ipType := global.ParseIPAddr(neInfo.Ip) - if ipType == global.IsIPv4 { - scpZipCmd = fmt.Sprintf("scp -r %s %s@%s:%s", filePath, - config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - } else { - scpZipCmd = fmt.Sprintf("scp -r %s %s@[%s]:%s", filePath, - config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - } - err = ExecCmd(scpZipCmd) - if err != nil { - log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - neFilePath := config.GetYamlConfig().NE.ScpDir + "/" + fileName - var unzipCmd string - if neTypeLower != "omc" { - unzipCmd = fmt.Sprintf("sudo unzip -o %s -d %s", neFilePath, config.GetYamlConfig().NE.EtcDir) - } else { - unzipCmd = fmt.Sprintf("sudo unzip -oj %s -d %s/etc", neFilePath, config.GetYamlConfig().NE.OmcDir) - } - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - cmd := exec.Command("ssh", sshHost, unzipCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func DownloadNeBackupFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadNeBackupFile 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) - - fileName := vars["fileName"] - if fileName == "" { - log.Error("fileName is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - sql := fmt.Sprintf("select * from ne_backup where ne_type='%s' and file_name='%s'", neTypeUpper, fileName) - neBackup, err := db.RawDB("", sql, nil) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(neBackup) == 0 { - err := global.ErrCMNotFoundTargetBackupFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - path := fmt.Sprint(neBackup[0]["path"]) - md5Sum := fmt.Sprint(neBackup[0]["md5_sum"]) - - services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, md5Sum) -} - -func DeleteNeBackupFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteNeBackupFile 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) - - fileName := vars["fileName"] - if fileName == "" { - log.Error("fileName is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - sql := fmt.Sprintf("select * from ne_backup where ne_type='%s' and file_name='%s'", neTypeUpper, fileName) - neBackup, err := db.RawDB("", sql, nil) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(neBackup) == 0 { - err := global.ErrCMNotFoundTargetBackupFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - where := fmt.Sprintf("ne_type='%s' and file_name='%s'", neTypeUpper, fileName) - affected, err := dborm.XormDeleteDataByWhere(where, "ne_backup") - if err != nil || affected == 0 { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - path := neBackup[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) -} - -func PostNeServiceAction(w http.ResponseWriter, r *http.Request) { - log.Debug("PostNeServiceAction processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("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) - action := vars["action"] - - neId := services.GetUriParamString(r, "neId", ",", false, false) - - // neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to get ne_info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neInfo:", neInfo) - - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - switch neTypeLower { - case "omc": - // send 204 to fe firstly - services.ResponseStatusOK204NoContent(w) - //actionCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh %s", config.GetYamlConfig().NE.OmcDir, action) - actionCmd := fmt.Sprintf("sudo systemctl %s omc", action) - go RunSSHCmd(sshHost, actionCmd) - return - // cmd := exec.Command("ssh", sshHost, actionCmd) - // out, err := cmd.CombinedOutput() - // log.Debugf("Exec output: %v", string(out)) - // if err != nil { - // log.Errorf("Faile to execute ssh %s omc:%v", action, err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - case "ims": - switch action { - case "start", "stop": - actionCmd := fmt.Sprintf("sudo ims-%s", action) - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to execute %s command:%v", actionCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "restart": - actionCmd := "sudo ims-stop && sudo ims-start" - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to execute %s command:%v", actionCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - err = global.ErrCMUnknownServiceAction - log.Errorf("%v, action:%s", err, action) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - actionCmd := fmt.Sprintf("sudo systemctl %s %s.service", action, neTypeLower) - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - services.ResponseStatusOK204NoContent(w) -} - -func PostNeInstanceAction(w http.ResponseWriter, r *http.Request) { - log.Debug("PostNeInstanceAction processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("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) - action := vars["action"] - - neId := services.GetUriParamString(r, "neId", ",", false, false) - - // neInfo := new(dborm.NeInfo) - 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) - - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - switch action { - case "poweron": - actionCmd := "sudo poweron" - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh %s omc:", action, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "poweroff": - actionCmd := "sudo poweroff" - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo poweroff:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "reboot": - actionCmd := "sudo reboot" - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo reboot:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - err = global.ErrCMUnknownInstanceAction - log.Errorf("%v, action:%s", err, action) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} diff --git a/features/cm/omc/controller.go b/features/cm/omc/controller.go deleted file mode 100644 index 888f182f..00000000 --- a/features/cm/omc/controller.go +++ /dev/null @@ -1,46 +0,0 @@ -package cm_omc - -import ( - "fmt" - "net/http" - - "be.ems/lib/services" - "github.com/gin-gonic/gin" -) - -func (o *ConfigOMC) Get(c *gin.Context) { - paramName := c.Param("paramName") - results, err := o.Query(paramName) - if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusOK, services.DataResp(results)) -} - -func (o *ConfigOMC) Post(c *gin.Context) { - err := fmt.Errorf("method not allowed") - c.JSON(http.StatusMethodNotAllowed, services.ErrResp(err.Error())) -} - -func (o *ConfigOMC) Put(c *gin.Context) { - paramName := c.Param("paramName") - var paramData map[string]any - - if err := c.ShouldBindJSON(¶mData); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) - return - } - - result, err := o.Modify(paramName, paramData) - if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusOK, services.DataResp(result)) -} - -func (o *ConfigOMC) Delete(c *gin.Context) { - err := fmt.Errorf("method not allowed") - c.JSON(http.StatusMethodNotAllowed, services.ErrResp(err.Error())) -} diff --git a/features/cm/omc/implement.go b/features/cm/omc/implement.go deleted file mode 100644 index 9d7a4300..00000000 --- a/features/cm/omc/implement.go +++ /dev/null @@ -1,69 +0,0 @@ -package cm_omc - -import ( - "fmt" - - "be.ems/lib/config" -) - -const ( - PASSWORD_MASK = "********" -) - -func (o *ConfigOMC) Query(paramName string) (any, error) { - var results []any - - switch paramName { - case "alarmEmailForward": - result := config.GetYamlConfig().Alarm.EmailForward - result.Password = PASSWORD_MASK - results = append(results, result) - case "alarmSMSForward": - result := config.GetYamlConfig().Alarm.SMSCForward - result.Password = PASSWORD_MASK - results = append(results, result) - default: - return nil, fmt.Errorf("invalid source parameter") - } - - return results, nil -} - -func (o *ConfigOMC) Add() { - -} - -func (o *ConfigOMC) Modify(paramName string, paramData map[string]any) (any, error) { - var results []any - - switch paramName { - case "alarmEmailForward": - param := &(config.GetYamlConfig().Alarm.EmailForward) - config.UpdateStructFromMap(param, paramData) - result := *param - results = append(results, result) - err := config.WriteOrignalConfig(config.YamlConfigInfo.FilePath, paramName, paramData) - if err != nil { - fmt.Println("failed to write config yaml file:", err) - return results, err - } - case "alarmSMSForward": - param := &(config.GetYamlConfig().Alarm.SMSCForward) - config.UpdateStructFromMap(param, paramData) - result := *param - results = append(results, result) - err := config.WriteOrignalConfig(config.YamlConfigInfo.FilePath, paramName, paramData) - if err != nil { - fmt.Println("failed to write config yaml file:", err) - return results, err - } - default: - return nil, fmt.Errorf("invalid source parameter") - } - - return results, nil -} - -func (o *ConfigOMC) Remove() { - -} diff --git a/features/cm/omc/model.go b/features/cm/omc/model.go deleted file mode 100644 index 967c84c6..00000000 --- a/features/cm/omc/model.go +++ /dev/null @@ -1,26 +0,0 @@ -package cm_omc - -type ConfigOMC struct{} - -type SystemConfig struct { - ForwardFlag bool `json:"forwardFlag"` -} - -type AlarmEmailForward struct { - Enable bool `json:"enable"` - EmailList string `json:"emailList"` - SMTP string `json:"smtp"` - Port uint16 `json:"port"` - User string `json:"user"` - Password string `json:"password"` - TLSSkipVerify bool `json:"tlsSkipVerify"` -} - -type AlarmSMSForward struct { - Enable bool `json:"enable"` - MobileList string `json:"mobileList"` - SMSCAddr string `json:"smscAddr"` - SystemID string `json:"systemID"` - Password string `json:"password"` - SystemType string `json:"systemType"` -} diff --git a/features/cm/omc/route.go b/features/cm/omc/route.go deleted file mode 100644 index e97f7b5f..00000000 --- a/features/cm/omc/route.go +++ /dev/null @@ -1,30 +0,0 @@ -package cm_omc - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for file_export -func Register(r *gin.RouterGroup) { - cmOMC := r.Group("/omc") - { - var o *ConfigOMC - cmOMC.GET("/config/:paramName", - middleware.AuthorizeUser(nil), - o.Get, - ) - cmOMC.POST("/config/:paramName", - middleware.AuthorizeUser(nil), - o.Post, - ) - cmOMC.PUT("/config/:paramName", - middleware.AuthorizeUser(nil), - o.Put, - ) - cmOMC.DELETE("/config/:paramName", - middleware.AuthorizeUser(nil), - o.Delete, - ) - } -} diff --git a/features/cm/param.go b/features/cm/param.go deleted file mode 100644 index 1b1266d0..00000000 --- a/features/cm/param.go +++ /dev/null @@ -1,208 +0,0 @@ -package cm - -import ( - "strings" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - - "encoding/json" - "fmt" - "io" - "net/http" - - neService "be.ems/src/modules/network_element/service" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" -) - -var ( - // parameter config management - ParamConfigUri = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/config/{paraName}" - - CustomParamConfigUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/config/{paraName}" -) - -func GetParamConfigFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetParamConfigFromNF processing... ") - - neId := ctx.GetQuery(r, "ne_id") - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" || neId == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - var response services.DataResponse - if neInfo.NeId == neId && neInfo.NeId != "" { - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - 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 from NF:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - _ = json.Unmarshal(resp.Body(), &response) - } - log.Debug("response:", response) - } - - services.ResponseWithJson(w, http.StatusOK, response) -} - -func PostParamConfigToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostParamConfigToNF processing... ") - - neId := ctx.GetQuery(r, "ne_id") - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" || neId == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - if neInfo.NeId != neId || neInfo.NeId == "" { - log.Error("neId is empty") - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: POST ", requestURI2NF) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - client := resty.New() - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(body). - Post(requestURI2NF) - if err != nil { - log.Error("Failed to POST to NF:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseWithJson(w, http.StatusNoContent, response) -} - -func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PutParamConfigToNF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // OMC配置接口 /api/rest/systemManagement/v1/elementType/omc/objectType/config/omcNeConfig - if v, ok := vars["paraName"]; ok && v == "omcNeConfig" && strings.ToLower(neType) == "omc" { - PutOMCNeConfig(w, r) - return - } - - neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - if neInfo.NeId != neId || neInfo.NeId == "" { - log.Error("neId is empty") - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: PUT ", requestURI2NF) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - client := resty.New() - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(body). - Put(requestURI2NF) - if err != nil { - log.Error("Failed to Put to NF:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseWithJson(w, http.StatusNoContent, response) -} - -// PutOMCNeConfig 网元OMC配置 -// -// 目前没配置,返回204 -func PutOMCNeConfig(w http.ResponseWriter, r *http.Request) { - services.ResponseStatusOK204NoContent(w) -} - -func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteParamConfigToNF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - if neInfo.NeId != neId || neInfo.NeId == "" { - log.Error("neId is empty") - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: DELETE ", requestURI2NF) - - client := resty.New() - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Delete(requestURI2NF) - if err != nil { - log.Error("Failed to delete parameter:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - - services.ResponseWithJson(w, http.StatusNoContent, response) -} diff --git a/features/cm/service.go b/features/cm/service.go deleted file mode 100644 index f5d8b692..00000000 --- a/features/cm/service.go +++ /dev/null @@ -1,17 +0,0 @@ -package cm - -import ( - cm_omc "be.ems/features/cm/omc" - "be.ems/lib/log" - "github.com/gin-gonic/gin" -) - -func InitSubServiceRoute(r *gin.Engine) { - log.Info("======init PM group gin.Engine") - - cmGroup := r.Group("/cm") - // register sub modules routes - cm_omc.Register(cmGroup) - - // return featuresGroup -} diff --git a/features/cm/software.go b/features/cm/software.go deleted file mode 100644 index fd873702..00000000 --- a/features/cm/software.go +++ /dev/null @@ -1,1052 +0,0 @@ -package cm - -import ( - "bytes" - "fmt" - "io" - "net/http" - "os" - "os/exec" - "strconv" - "strings" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - - "github.com/gorilla/mux" -) - -const ( - SoftwareStatusUploaded = "3" - SoftwareStatusInactive = "3" - SoftwareStatusActive = "1" - DigestsSignOkString = "digests signatures OK" - SoftwareVerifiedOk = "Verified OK" -) - -var ( - UriSoftware = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{neType}/software/{version}" - UriSoftwareNE = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{neType}/software/{version}/{neId}" - - CustomUriSoftware = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/software/{version}" - CustomUriSoftwareNE = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/software/{version}/{neId}" -) - -// 验证签名 -func verify_signature(public_key_name string, source_cms_file string, source_file string) bytes.Buffer { - cmd := exec.Command("/usr/local/omc/run/iv", "verify_signature", public_key_name, source_cms_file, source_file) - var out bytes.Buffer - cmd.Stdout = &out - cmd.Env = append(os.Environ(), - "FOO=duplicate_value", // 重复被忽略 - "FOO=actual_value", // 实际被使用 - ) - err := cmd.Run() - if err != nil { - log.Error(err) - } - - return out -} - -func UploadSoftwareFile(w http.ResponseWriter, r *http.Request) { - log.Debug("UploadSoftwareFile 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) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - md5Param := services.GetUriParamString(r, "md5Sum", ",", false, false) - - // 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 - // } - // neSWBody := new(dborm.NeSoftware) - // _ = json.Unmarshal(body, neSWBody) - // log.Trace("neSoftware:", neSWBody) - - softwarePath := fmt.Sprintf("%s/%s", config.GetYamlConfig().OMC.Software, neTypeLower) - fileName, err := services.HandleUploadFile(r, softwarePath, "") - if err != nil { - log.Error("Faile to HandleUploadFile:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - filePrefix := fileName[:strings.Index(fileName, ".zip")] - filePath := fmt.Sprintf("%s/%s", softwarePath, fileName) - log.Debugf("filePath:%s filePrefix:%s softwarePath:%s", filePath, filePrefix, softwarePath) - cmd := exec.Command("unzip", "-o", filePath) - cmd.Dir = softwarePath - out, err := cmd.CombinedOutput() - log.Debugf("Exec outpout:%s", string(out)) - if err != nil { - log.Error("Failed to unzip:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - md5File, err := global.GetFileMD5Sum(filePath) - if err != nil { - log.Error("Faile to GetFileMD5Sum:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - if md5File != md5Param { - err = global.ErrCMNotMatchMD5File - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - rpmFileName := filePrefix + ".rpm" - if config.GetYamlConfig().OMC.CheckSign { - rpmFilePath := softwarePath + "/" + rpmFileName - cmsFileName := rpmFileName + ".cms" - cmsFilePath := softwarePath + "/" + cmsFileName - log.Debugf("cmsFilePath:%s rpmFilePath:%s publicKey:%s", rpmFilePath, cmsFilePath, config.GetYamlConfig().Auth.PublicKey) - result := verify_signature(config.GetYamlConfig().Auth.PublicKey, cmsFilePath, rpmFilePath) - log.Debug("result:", result.String()) - if !strings.Contains(result.String(), SoftwareVerifiedOk) { - err = global.ErrCMNotMatchSignFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // cmd := exec.Command("rpm", "-K", filePath) - // out, err := cmd.CombinedOutput() - // log.Debugf("Exec outpout:%s", string(out)) - // if err != nil { - // log.Error("Failed to execute rpm:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // if !strings.Contains(string(out), DigestsSignOkString) { - // err = global.ErrCMNotMatchSignFile - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - } - - //neBackup := dborm.NeBackup{NeType: neType, NeId: neId, Md5Sum: md5Sum} - //log.Debug("neBackup:", neBackup) - where := fmt.Sprintf("ne_type='%s' and version='%s'", neTypeUpper, version) - has, err := dborm.XormExistTableOne("ne_software", where) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if has { - err = global.ErrCMExistSoftwareFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - neSoftware := dborm.NeSoftware{ - NeType: neTypeUpper, - FileName: rpmFileName, - Path: softwarePath, - Version: version, - Md5Sum: md5Param, - Comment: neType + " 5GC " + version, - //Comment: neSWBody.Comment, - } - - _, err = dborm.XormInsertTableOne("ne_software", neSoftware) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func UploadSoftwareMultiFile(w http.ResponseWriter, r *http.Request) { - log.Info("UploadSoftwareMultiFile 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) - - 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) - neSoftwareInfo, _ := dborm.XormGetDataBySQL(sql) - if len(*neSoftwareInfo) >= 1 { - services.ResponseWithJson(w, 200, map[string]any{ - "code": 0, - "msg": "Software version already exists", - }) - return - } - - md5Param := services.GetUriParamString(r, "md5Sum", ",", false, false) - - softwarePath := fmt.Sprintf("%s/%s", config.GetYamlConfig().OMC.Software, neTypeLower) - err := os.MkdirAll(softwarePath, 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(1000 << 20) // 1000MB - if err != nil { - log.Error("Faile to ParseMultipartForm:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 获取文件和数据 - swFile := r.MultipartForm.File["file"] - cmsFile := r.MultipartForm.File["cms"] - data := r.MultipartForm.Value["comment"] - - var softwareFileName, cmsFileName, comment string - - // 处理软件rpm/deb文件 - if len(swFile) > 0 { - file := swFile[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(softwarePath + "/" + file.Filename) - if err != nil { - log.Error("Faile to Create:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer dst.Close() - - softwareFileName = file.Filename - // 将文件内容拷贝到本地文件 - _, err = io.Copy(dst, f) - if err != nil { - log.Error("Faile to Copy:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // 处理cms文件 - if len(cmsFile) > 0 { - file := cmsFile[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(softwarePath + "/" + file.Filename) - if err != nil { - log.Error("Faile to Create:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer dst.Close() - - cmsFileName = 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] - } - - if config.GetYamlConfig().OMC.CheckSign && cmsFileName != "" { - rpmFilePath := softwarePath + "/" + softwareFileName - cmsFileName := cmsFileName - cmsFilePath := softwarePath + "/" + cmsFileName - log.Debugf("cmsFilePath:%s rpmFilePath:%s publicKey:%s", rpmFilePath, cmsFilePath, config.GetYamlConfig().Auth.PublicKey) - result := verify_signature(config.GetYamlConfig().Auth.PublicKey, cmsFilePath, rpmFilePath) - log.Debug("result:", result.String()) - if !strings.Contains(result.String(), SoftwareVerifiedOk) { - err = global.ErrCMNotMatchSignFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // cmd := exec.Command("rpm", "-K", filePath) - // out, err := cmd.CombinedOutput() - // log.Debugf("Exec outpout:%s", string(out)) - // if err != nil { - // log.Error("Failed to execute rpm:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // if !strings.Contains(string(out), DigestsSignOkString) { - // err = global.ErrCMNotMatchSignFile - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - } - - // //neBackup := dborm.NeBackup{NeType: neType, NeId: neId, Md5Sum: md5Sum} - // //log.Debug("neBackup:", neBackup) - // where := fmt.Sprintf("ne_type='%s' and version='%s'", neTypeUpper, version) - // has, err := dborm.XormExistTableOne("ne_software", where) - // if err != nil { - // log.Error("Faile to XormInsertTableOne:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if has == true { - // err = global.ErrCMExistSoftwareFile - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - neSoftware := dborm.NeSoftware{ - NeType: neTypeUpper, - FileName: softwareFileName, - Path: softwarePath, - Version: version, - Md5Sum: md5Param, - Comment: comment, - } - - _, err = dborm.XormInsertTableOne("ne_software", neSoftware) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func DownloadSoftwareFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadSoftwareFile 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]["name"] - path := (*neSoftware)[0]["path"] - md5Sum := (*neSoftware)[0]["md5_sum"] - - services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, md5Sum) -} - -func DeleteSoftwareFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteSoftwareFile 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]["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) -} - -func DistributeSoftwareToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("DistributeSoftwareFile 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) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neId := vars["neId"] - if version == "" { - log.Error("neId is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo, err := dborm.XormGetNeInfo(neTypeUpper, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - 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 - } - log.Trace("neSoftware:", neSoftware) - - sql = fmt.Sprintf("select * from ne_version where ne_type='%s' and ne_id='%s'", neTypeUpper, neId) - neVersion, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neVersion:", neVersion) - - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - mkdirCmd := fmt.Sprintf("sudo mkdir -p %s/software/%s", config.GetYamlConfig().NE.OmcDir, neTypeLower) - cmd := exec.Command("ssh", sshHost, mkdirCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to mkdir:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - fileName := (*neSoftware)[0]["name"] - path := (*neSoftware)[0]["path"] - srcFile := fmt.Sprintf("%s/%s", path, fileName) - - 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.Tracef("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 - } - neFilePath := config.GetYamlConfig().NE.ScpDir + "/" + fileName - cpCmd := fmt.Sprintf("sudo mv -f %s %s/software/%s", neFilePath, - config.GetYamlConfig().NE.OmcDir, neTypeLower) - cmd = exec.Command("ssh", sshHost, cpCmd) - out, err = cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute cp command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - if len(*neVersion) == 0 { - neVersionData := dborm.NeVersion{ - NeType: neTypeUpper, - NeId: neInfo.NeId, - Version: (*neSoftware)[0]["version"], - FilePath: fmt.Sprintf("%s/software/%s/%s", config.GetYamlConfig().NE.OmcDir, neTypeLower, fileName), - PreVersion: "", - PreFile: "", - Status: SoftwareStatusInactive, - } - - _, err = dborm.XormInsertTableOne("ne_version", neVersionData) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } else { - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - NeType: neTypeUpper, - NeId: neInfo.NeId, - Version: (*neSoftware)[0]["version"], - FilePath: fmt.Sprintf("%s/software/%s/%s", config.GetYamlConfig().NE.OmcDir, neTypeLower, fileName), - PreVersion: (*neVersion)[0]["version"], - PreFile: (*neVersion)[0]["path"], - Status: SoftwareStatusInactive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - services.ResponseStatusOK204NoContent(w) -} - -func ActiveSoftwareToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("ActiveSoftwareToNF 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) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neId := vars["neId"] - if version == "" { - log.Error("neId is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo, err := dborm.XormGetNeInfo(neTypeUpper, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - 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 - } - log.Trace("neSoftware:", neSoftware) - - sql = fmt.Sprintf("select * from ne_version where ne_type='%s' and ne_id='%s' and version='%s'", neTypeUpper, neId, version) - neVersion, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(*neVersion) == 0 { - err := global.ErrCMNotFoundTargetNeVersion - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neVersion:", neVersion) - - if !config.GetYamlConfig().OMC.TestMode { - filePath := (*neVersion)[0]["path"] - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - - runCmd := fmt.Sprintf("sudo rm -f %s/actpkg.sh", config.GetYamlConfig().NE.ScpDir) - err = RunSSHCmd(sshHost, runCmd) - if err != nil { - log.Errorf("Failed to run cmd: %s", runCmd) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - srcFile := fmt.Sprintf("%s/actpkg.sh", config.GetYamlConfig().OMC.BinDir) - scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - cmd := exec.Command("scp", "-r", srcFile, scpDir) - _, err := cmd.CombinedOutput() - if err != nil { - log.Errorf("Failed to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - runCmd = fmt.Sprintf("sudo %s/actpkg.sh '%s' %s", - config.GetYamlConfig().NE.ScpDir, filePath, neTypeUpper) - if neTypeLower == "omc" { - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - Status: SoftwareStatusActive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) - go RunSSHCmd(sshHost, runCmd) - return - } - err = RunSSHCmd(sshHost, runCmd) - if err != nil { - log.Errorf("Faile to execute command: %s, error: %v", runCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // fileType := global.IsRpmOrDebPackage(filePath) - // if fileType == 1 { - // srcFile := fmt.Sprintf("%s/spawnrpm.sh", config.GetYamlConfig().OMC.BinDir) - - // scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - // neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - // cmd := exec.Command("scp", "-r", srcFile, scpDir) - // _, err := cmd.CombinedOutput() - // if err != nil { - // log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // dpkgCmd := fmt.Sprintf("sudo %s/spawnrpm.sh '%s'", - // config.GetYamlConfig().NE.ScpDir, filePath) - // err = RunSSHCmd(sshHost, dpkgCmd) - // if err != nil { - // log.Errorf("Faile to execute dpkg command: %s, error: %v", dpkgCmd, err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } else if fileType == 2 { - // srcFile := fmt.Sprintf("%s/spawndpkg.sh", config.GetYamlConfig().OMC.BinDir) - - // scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - // neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - // cmd := exec.Command("scp", "-r", srcFile, scpDir) - // _, err := cmd.CombinedOutput() - // if err != nil { - // log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // dpkgCmd := fmt.Sprintf("sudo %s/spawndpkg.sh '%s'", - // config.GetYamlConfig().NE.ScpDir, filePath) - // err = RunSSHCmd(sshHost, dpkgCmd) - // if err != nil { - // log.Errorf("Faile to execute dpkg command: %s, error: %v", dpkgCmd, err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } else { - // err := global.ErrCMUnknownSoftwareFormat - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - 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.Tracef("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.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh command: %s, error: %v", restartCmd, 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.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - Status: SoftwareStatusActive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func RollBackSoftwareToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("ActiveSoftwareToNF 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) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neId := vars["neId"] - if version == "" { - log.Error("neId is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo, err := dborm.XormGetNeInfo(neTypeUpper, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - sql := fmt.Sprintf("select * from ne_version where ne_type='%s' and ne_id='%s'", neTypeUpper, neId) - neVersion, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(*neVersion) == 0 { - err := global.ErrCMNotFoundTargetNeVersion - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neVersion:", neVersion) - - filePath := (*neVersion)[0]["pre_file"] - if filePath == "" { - err := global.ErrCMNotFoundRollbackNeVersion - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - if !config.GetYamlConfig().OMC.TestMode { - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - runCmd := fmt.Sprintf("sudo rm -f %s/rbkpkg.sh", config.GetYamlConfig().NE.ScpDir) - err = RunSSHCmd(sshHost, runCmd) - if err != nil { - log.Errorf("Failed to run cmd: %s", runCmd) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - srcFile := fmt.Sprintf("%s/rbkpkg.sh", config.GetYamlConfig().OMC.BinDir) - - scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - cmd := exec.Command("scp", "-r", srcFile, scpDir) - _, err := cmd.CombinedOutput() - if err != nil { - log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - runCmd = fmt.Sprintf("sudo %s/rbkpkg.sh '%s' %s", - config.GetYamlConfig().NE.ScpDir, filePath, neTypeUpper) - if neTypeLower == "omc" { - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - Version: (*neVersion)[0]["pre_version"], - FilePath: (*neVersion)[0]["pre_file"], - PreVersion: "-", - PreFile: "-", - NewVersion: (*neVersion)[0]["version"], - NewFile: (*neVersion)[0]["path"], - Status: SoftwareStatusActive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - services.ResponseStatusOK204NoContent(w) - go RunSSHCmd(sshHost, runCmd) - return - } - err = RunSSHCmd(sshHost, runCmd) - if err != nil { - log.Errorf("Faile to execute command: %s, error: %v", runCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // fileType := global.IsRpmOrDebPackage(filePath) - // if fileType == 1 { - // rpmCmd := fmt.Sprintf("sudo rpm -Uvh --oldpackage '%s'", filePath) - // cmd := exec.Command("ssh", sshHost, rpmCmd) - // _, err := cmd.CombinedOutput() - // if err != nil { - // log.Error("Faile to execute rpm command:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } else if fileType == 2 { - // srcFile := fmt.Sprintf("%s/spawndpkg.sh", config.GetYamlConfig().OMC.BinDir) - - // scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - // neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - // cmd := exec.Command("scp", "-r", srcFile, scpDir) - // _, err := cmd.CombinedOutput() - // if err != nil { - // log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // var inputStr string = "n" - // if config.GetYamlConfig().NE.DpkgOverwrite { - // inputStr = "y" - // } - // dpkgCmd := fmt.Sprintf("sudo %s/spawndpkg.sh %s '%s'", - // config.GetYamlConfig().NE.ScpDir, inputStr, filePath) - // err = RunSSHCmd(sshHost, dpkgCmd) - // if err != nil { - // log.Errorf("Faile to execute dpkg command: %s, error: %v", dpkgCmd, err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } else { - // err := global.ErrCMUnknownSoftwareFormat - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - 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.Tracef("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.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh command: %s, error: %v", restartCmd, 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.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - } - } - - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - Version: (*neVersion)[0]["pre_version"], - FilePath: (*neVersion)[0]["pre_file"], - PreVersion: "-", - PreFile: "-", - NewVersion: (*neVersion)[0]["version"], - NewFile: (*neVersion)[0]["path"], - Status: SoftwareStatusActive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} diff --git a/features/dbrest/dbrest.go b/features/dbrest/dbrest.go deleted file mode 100644 index d11f981a..00000000 --- a/features/dbrest/dbrest.go +++ /dev/null @@ -1,859 +0,0 @@ -package dbrest - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "regexp" - "strings" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - - "github.com/gorilla/mux" -) - -type XormResponse struct { - Data interface{} `json:"data"` -} - -type XormInsertResponse struct { - Data interface{} `json:"data"` -} - -var ( - // database management rest pattern, discard - XormGetDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" - XormSelectDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/select/{elementTypeValue}/{objectTypeValue}" - XormInsertDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/insert/{elementTypeValue}/{objectTypeValue}" - XormUpdateDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/update/{elementTypeValue}/{objectTypeValue}" - XormDeleteDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/delete/{elementTypeValue}/{objectTypeValue}" - - CustomXormGetDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" - CustomXormSelectDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/select/{elementTypeValue}/{objectTypeValue}" - CustomXormInsertDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/insert/{elementTypeValue}/{objectTypeValue}" - CustomXormUpdateDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/update/{elementTypeValue}/{objectTypeValue}" - CustomXormDeleteDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/delete/{elementTypeValue}/{objectTypeValue}" - - XormCommonUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for internal - XormDatabaseUri = config.DefaultUriPrefix + "/database/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for crontask - XormDataRestUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" - XormExtDataUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for external - XormDataSQLUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for external - - CustomXormCommonUri = config.UriPrefix + "/databaseManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for internal - CustomXormExtDataUri = config.UriPrefix + "/dataManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for external - CustomXormDataSQLUri = config.UriPrefix + "/dataManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for external - - // 查询数据库连接情况 - UriDbConnection = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/dbConnection" - CustomUriDbConnection = config.UriPrefix + "/dataManagement/{apiVersion}/dbConnection" // for external - - // 终结非法的数据库连接 - UriDbStop = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/dbStop" - CustomUriDbStop = config.UriPrefix + "/dataManagement/{apiVersion}/dbStop" // for external - -) - -func GetUriSQLArray(r *http.Request) []string { - var sa []string - vars := r.URL.Query() - - // 默认SQL - if s, ok := vars["SQL"]; ok { - for _, r := range s { - if r != "" { - sa = append(sa, r) - } - } - } - - // 查询总数 - if totalSQL, ok := vars["totalSQL"]; ok { - if totalSQL[0] != "" { - sa = append(sa, totalSQL[0]) - } - } - // 查询列表 - if rowsSQL, ok := vars["rowsSQL"]; ok { - if rowsSQL[0] != "" { - sa = append(sa, rowsSQL[0]) - } - } - - if len(sa) == 0 { - log.Info("SQL is not exist") - return nil - } - - log.Debug("SQL array:", sa) - return sa -} - -// Get table name from SQL -func GetTableNameFromSQL(s string) string { - ls := strings.ToLower(s) - i1 := strings.Index(ls, "from") - i2 := strings.Index(ls, "where") - - var ts string - if i1 > 0 { - if i2 > 0 && i2 > i1 { - ts = ls[i1+4 : i2] - } - if i2 < 0 { - ts = ls[i1+4:] - } - } - - tn := strings.Trim(ts, " ") - log.Debug("i1:", i1, "i2:", i2, "tn:", tn) - return tn -} - -func GetTableName(sql string) string { - ls := strings.ToLower(sql) - - re := regexp.MustCompile(`from\s+(\S+)`) - matches := re.FindStringSubmatch(ls) - if len(matches) < 2 { - return "" - } - return matches[1] -} - -func IsQuerySQL(s string) bool { - ts := strings.Trim(strings.ToLower(s), " ") - return strings.Index(ts, "select") == 0 -} - -// xorm Get data from database -func ExtDatabaseExecSQL(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseExecSQL processing... ") - - // var err error - - // _, err = services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - //vars := mux.Vars(r) - //tblName := vars["objectTypeValue"] - var sql = GetUriSQLArray(r) - // select as must, todo ... - - ls := services.ExtGetUriPageLimitString(r) - - // data := make([]map[string]interface{}, 0) - // xormResponse := make([]map[string]interface{}, len(sql)) - var xormResponse XormResponse - data := make([]map[string]interface{}, 0) - for i, s := range sql { - log.Tracef("SQL[%d]: %s", i, sql[i]) - - //rows := make([]map[string]interface{}, 0) - mapRows := make(map[string]interface{}) - - if s != "" { - // err = XEngine.SQL(s).Find(&rows) - // if IsQuerySQL(s) == false { - // services.ResponseNotAcceptable406QuerySQLError(w) - // return - // } - - querySQL := s - if i == (len(sql) - 1) { - querySQL = querySQL + " " + ls - } - log.Debug("querySQL:", querySQL) - rows, err := db.RawDB("", querySQL, nil) - if err != nil { - log.Error("SQL failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - tableName := GetTableName(s) - log.Debugf("s:%s tableName:%s", s, tableName) - mapRows[tableName] = rows - data = append(data, mapRows) - log.Trace("data:", data) - } - i++ - } - xormResponse.Data = data - - services.ResponseWithJson(w, http.StatusOK, xormResponse) -} - -// xorm Get data from database -func ExtDatabaseGetData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseGetData processing... ") - - var sql []string - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - pack := "dbrest" - vars := mux.Vars(r) - module := "" - dbname := vars["elementTypeValue"] - tbname := vars["objectTypeValue"] - - log.Debugf("method:%s, module:%s, dbname:%s, tbname:%s, pack:%s", r.Method, module, dbname, tbname, pack) - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("Not permission!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - sql = GetUriSQLArray(r) - // select as must, todo ... - if sql == nil { - wc := services.GetUriLocString(r) - if wc == "" { - sql = append(sql, fmt.Sprintf("select * from %s", tbname)) - } else { - sql = append(sql, fmt.Sprintf("select * from %s where %s", tbname, wc)) - } - } - - ls := services.ExtGetUriPageLimitString(r) - - // data := make([]map[string]interface{}, 0) - // xormResponse := make([]map[string]interface{}, len(sql)) - var xormResponse XormResponse - data := make([]map[string]interface{}, 0) - for i, s := range sql { - log.Tracef("SQL[%d]: %s", i, sql[i]) - - mapRows := make(map[string]interface{}) - - if s != "" { - // err = XEngine.SQL(s).Find(&rows) - if !IsQuerySQL(s) { - services.ResponseNotAcceptable406QuerySQLError(w) - return - } - - querySQL := s - if i == (len(sql) - 1) { - querySQL = querySQL + " " + ls - } - log.Debug("querySQL:", querySQL) - rows, err := db.RawDB("", querySQL, nil) - if err != nil { - log.Error("SQL failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - tableName := GetTableName(s) - log.Debugf("s:%s tableName:%s", s, tableName) - mapRows[tableName] = rows - data = append(data, mapRows) - log.Trace("data:", data) - } - i++ - } - xormResponse.Data = data - - services.ResponseWithJson(w, http.StatusOK, xormResponse) -} - -func ExtDatabaseInsertData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseInsertData processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - vars := mux.Vars(r) - module := "" - dbname := vars["elementTypeValue"] - tbname := vars["objectTypeValue"] - pack := "dbrest" - - log.Debugf("method:%s, module:%s, dbname:%s, tbname:%s, pack:%s", r.Method, module, dbname, tbname, pack) - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("permission deny!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - log.Debug("Request body:", string(body), "dataObject:", tbname) - insertData := make(map[string]interface{}) - _ = json.Unmarshal(body, &insertData) - - tn, sql := dborm.ConstructInsertSQL(tbname, insertData) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Insert failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - // affected, err := InsertDataWithJson(insertData) - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - // xormResponse.Data = mapRow - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func ExtDatabaseUpdateData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseUpdateData processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - module := "" - dbname := vars["elementTypeValue"] - tbname := vars["objectTypeValue"] - pack := "dbrest" - - log.Debugf("method:%s, module:%s, dbname:%s, tbname:%s, pack:%s", r.Method, module, dbname, tbname, pack) - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("Not permission!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - 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 - } - - wc := services.GetUriLocString(r) - - log.Debug("Request body:", string(body), "Tablename:", tbname, "wc:", wc) - updateData := make(map[string]interface{}) - _ = json.Unmarshal(body, &updateData) - - tn, sql := dborm.ConstructUpdateSQL(tbname, updateData, wc) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Update failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func ExtDatabaseDeleteData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseDeleteData processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - module := "" - dbname := vars["elementTypeValue"] - tbname := vars["objectTypeValue"] - pack := "dbreset" - - log.Debugf("method:%s, module:%, dbname:%s, tbname:%s pack:%s", r.Method, module, dbname, tbname, pack) - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("Not permission!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - wc := services.GetUriLocString(r) - - log.Debug("Table name:", tbname, "wc:", wc) - - sql := dborm.ConstructDeleteSQL(tbname, wc) - - affected, err := db.ExecDB("", sql, nil) - if err != nil { - log.Error("Update failed, err:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -// xorm Get data from database -func DatabaseGetData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseGetData processing... ") - - var sql []string - - // _, err = services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - sql = GetUriSQLArray(r) - // select as must, todo ... - - if sql == nil { - wc := services.GetUriWhereString(r) - if wc == "" { - sql = append(sql, fmt.Sprintf("select * from %s", tblName)) - } else { - sql = append(sql, fmt.Sprintf("select * from %s where %s", tblName, wc)) - } - } - - ls := services.GetUriPageLimitString(r) - - // data := make([]map[string]interface{}, 0) - // xormResponse := make([]map[string]interface{}, len(sql)) - var xormResponse XormResponse - data := make([]map[string]interface{}, 0) - for i, s := range sql { - log.Tracef("SQL[%d]: %s", i, sql[i]) - - mapRows := make(map[string]interface{}) - - if s != "" { - // err = XEngine.SQL(s).Find(&rows) - if !IsQuerySQL(s) { - services.ResponseNotAcceptable406QuerySQLError(w) - return - } - - querySQL := s - if i == (len(sql) - 1) { - querySQL = querySQL + " " + ls - } - log.Debug("querySQL:", querySQL) - rows, err := db.RawDB("", querySQL, nil) - if err != nil { - log.Error("QueryInterface failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - tableName := GetTableName(s) - log.Debugf("s:%s tableName:%s", s, tableName) - mapRows[tableName] = rows - data = append(data, mapRows) - log.Trace("data:", data) - } - i++ - } - xormResponse.Data = data - - services.ResponseWithJson(w, http.StatusOK, xormResponse) -} - -func DatabaseInsertData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseInsertData processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - vars := mux.Vars(r) - tableName := vars["objectTypeValue"] - log.Debug("Request body:", string(body), "tableName:", tableName) - insertData := make(map[string]interface{}) - _ = json.Unmarshal(body, &insertData) - - // 操作日志的IP - if tableName == "operation_log" || tableName == "security_log" { - ipAddr := strings.Split(r.RemoteAddr, ":")[0] - s := insertData["data"].([]any) - a := s[0].(map[string]any) - a["op_ip"] = ipAddr - } else if tableName == "mml_log" { - ipAddr := strings.Split(r.RemoteAddr, ":")[0] - s := insertData["data"].([]any) - a := s[0].(map[string]any) - a["ip"] = ipAddr - } - - tn, sql := dborm.ConstructInsertSQL(tableName, insertData) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Insert failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - // affected, err := InsertDataWithJson(insertData) - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - // xormResponse.Data = mapRow - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func DatabaseUpdateData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseUpdateData processing... ") - - 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 - } - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - wc := services.GetUriWhereString(r) - - log.Debug("Request body:", string(body), "Table name:", tblName, "wc:", wc) - updateData := make(map[string]interface{}) - _ = json.Unmarshal(body, &updateData) - - tn, sql := dborm.ConstructUpdateSQL(tblName, updateData, wc) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Update failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func DatabaseDeleteData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseDeleteData processing... ") - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - wc := services.GetUriWhereString(r) - - log.Debug("Table name:", tblName, "wc:", wc) - - sql := dborm.ConstructDeleteSQL(tblName, wc) - - affected, err := db.ExecDB("", sql, nil) - if err != nil { - log.Error("Update failed, err:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -// 连接用户实例 -func DbConnection(w http.ResponseWriter, r *http.Request) { - // 获取底层 SQL 数据库连接 - sqlDB, err := db.DB("").DB() - if err != nil { - services.ResponseErrorWithJson(w, 400, "无连接") - return - } - // 测试数据库连接 - err = sqlDB.Ping() - if err != nil { - services.ResponseErrorWithJson(w, 400, "无连接") - return - } - - // 查询实例 - result, err := db.RawDB("", "SHOW PROCESSLIST;", nil) - if err != nil { - services.ResponseErrorWithJson(w, 500, err.Error()) - } - filterData := []map[string]any{} - for _, r := range result { - if r["User"] != "system user" { - filterData = append(filterData, r) - } - } - // Sleep:连接处于空闲状态,没有执行任何操作。 - // Query:连接正在执行一个查询语句。 - // Execute:连接正在执行一个准备好的 SQL 语句。 - // Connect:连接正在建立但尚未完成。 - services.ResponseWithJson(w, 200, filterData) -} - -// 关闭数据库连接 -func DbStop(w http.ResponseWriter, r *http.Request) { - // 获取底层 SQL 数据库连接 - sqlDB, err := db.DB("").DB() - if err != nil { - services.ResponseErrorWithJson(w, 400, "无连接") - return - } - // 测试数据库连接 - err = sqlDB.Ping() - if err != nil { - services.ResponseErrorWithJson(w, 400, "无连接") - return - } - - // json 請求參數獲取 - var bodyArgs struct { - ID string `json:"ID" validate:"required"` - } - err = ctx.ShouldBindJSON(r, &bodyArgs) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseErrorWithJson(w, 400, err.Error()) - return - } - - // 关闭 - rse, err := db.ExecDB("", "KILL ?;", []any{bodyArgs.ID}) - if err != nil { - services.ResponseErrorWithJson(w, 500, err.Error()) - return - } - services.ResponseWithJson(w, 200, rse) -} - -// xorm Get data from database -func TaskDatabaseGetData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseGetData processing... ") - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - var sql = GetUriSQLArray(r) - // select as must, todo ... - - if sql == nil { - wc := services.GetUriWhereString(r) - if wc == "" { - sql = append(sql, fmt.Sprintf("select * from %s", tblName)) - } else { - sql = append(sql, fmt.Sprintf("select * from %s where %s", tblName, wc)) - } - } - - ls := services.GetUriPageLimitString(r) - - // data := make([]map[string]interface{}, 0) - // xormResponse := make([]map[string]interface{}, len(sql)) - var xormResponse XormResponse - data := make([]map[string]interface{}, 0) - for i, s := range sql { - log.Tracef("SQL[%d]: %s", i, sql[i]) - - mapRows := make(map[string]interface{}) - - if s != "" { - // err = XEngine.SQL(s).Find(&rows) - if !IsQuerySQL(s) { - services.ResponseNotAcceptable406QuerySQLError(w) - return - } - - querySQL := s - if i == (len(sql) - 1) { - querySQL = querySQL + " " + ls - } - log.Debug("querySQL:", querySQL) - rows, err := db.RawDB("", querySQL, nil) - if err != nil { - log.Error("SQL failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - tableName := GetTableName(s) - log.Debugf("s:%s tableName:%s", s, tableName) - mapRows[tableName] = rows - data = append(data, mapRows) - log.Trace("data:", data) - } - i++ - } - xormResponse.Data = data - - services.ResponseWithJson(w, http.StatusOK, xormResponse) -} - -func TaskDatabaseInsertData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseInsertData processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - vars := mux.Vars(r) - tableName := vars["objectTypeValue"] - log.Debug("Request body:", string(body), "tableName:", tableName) - insertData := make(map[string]interface{}) - _ = json.Unmarshal(body, &insertData) - - tn, sql := dborm.ConstructInsertSQL(tableName, insertData) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Insert failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - // affected, err := InsertDataWithJson(insertData) - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - // xormResponse.Data = mapRow - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func TaskDatabaseUpdateData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseUpdateData processing... ") - - 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 - } - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - wc := services.GetUriWhereString(r) - - log.Debug("Request body:", string(body), "Table name:", tblName, "wc:", wc) - updateData := make(map[string]interface{}) - _ = json.Unmarshal(body, &updateData) - - tn, sql := dborm.ConstructUpdateSQL(tblName, updateData, wc) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Update failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func TaskDatabaseDeleteData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseDeleteData processing... ") - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - wc := services.GetUriWhereString(r) - - log.Debug("Table name:", tblName, "wc:", wc) - - sql := dborm.ConstructDeleteSQL(tblName, wc) - - affected, err := db.ExecDB("", sql, nil) - if err != nil { - log.Error("Update failed, err:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} diff --git a/features/event/event.go b/features/event/event.go deleted file mode 100644 index 5e3853f1..00000000 --- a/features/event/event.go +++ /dev/null @@ -1,248 +0,0 @@ -package event - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/log" - "be.ems/lib/services" - - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/parse" - neService "be.ems/src/modules/network_element/service" - wsService "be.ems/src/modules/ws/service" - - "github.com/gin-gonic/gin" -) - -var ( - // 走Gin - UriUEEventAMF = "/upload-ue/v1/:eventType" - // 走Mux - UriUEEvent = config.DefaultUriPrefix + "/logManagement/v1/elementType/{elementTypeValue}/objectType/ueEvent" - CustomUriUEEvent = config.UriPrefix + "/logManagement/v1/elementType/{elementTypeValue}/objectType/ueEvent" -) - -// 旧AMF上报处理 -func PostUEEventFromAMF(c *gin.Context) { - log.Info("PostUEEventFromAMF processing... ") - eventType := c.Param("eventType") - if eventType == "" { - log.Error("eventType is empty") - services.ResponseNotFound404UriNotExist(c.Writer, c.Request) - return - } - var body map[string]any - if err := c.ShouldBindBodyWithJSON(&body); err != nil { - log.Error("Failed to Unmarshal ueEvent:", err) - services.ResponseInternalServerError500ProcessError(c.Writer, err) - return - } - - // 执行插入表 - type UEEvent struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 - } - timestamp := time.Now().UnixMilli() - data := UEEvent{ - NeType: "AMF", - NeName: "", - RmUID: "", - Timestamp: timestamp, - EventType: eventType, - EventJSONStr: "", - CreatedAt: timestamp, - } - - // 从eventJson中获取rmUID - if v, ok := body["rmUID"]; ok { - data.RmUID = fmt.Sprint(v) - } else { - data.RmUID = "4400HXAMF001" - } - if v, ok := body["neName"]; ok { - data.NeName = fmt.Sprint(v) - } else { - data.NeName = "AMF_001" - } - - // 是否存在网元 - neInfo := neService.NewNeInfo.FindByRmuid(data.RmUID) - if neInfo.NeType != "AMF" || neInfo.RmUID != data.RmUID { - services.ResponseInternalServerError500ProcessError(c.Writer, fmt.Errorf("network element does not exist")) - return - } - - // 统一格式 - eventJson := map[string]any{"cellID": 0, "gNBID": "", "imsi": "", "onlineNumber": 0, "result": "", "tacID": 0, "timestamp": 0, "time": 0, "type": eventType} - switch eventType { - case "auth-result": - // {"authCode":"200","authMessage":"成功","authTime":"2024-12-07 16:48:37","cellID":"3","gNBID":"1","imsi":"460002082100000","onlineNumber":1,"tacID":"81"} - if v, ok := body["imsi"]; ok { - eventJson["imsi"] = fmt.Sprint(v) - } - if v, ok := body["cellID"]; ok { - eventJson["cellID"] = fmt.Sprint(v) - } - if v, ok := body["gNBID"]; ok { - eventJson["gNBID"] = fmt.Sprint(v) - } - if v, ok := body["tacID"]; ok { - eventJson["tacID"] = fmt.Sprint(v) - } - if v, ok := body["onlineNumber"]; ok { - eventJson["onlineNumber"] = parse.Number(v) - } - if v, ok := body["authCode"]; ok { - eventJson["result"] = fmt.Sprint(v) - } - if v, ok := body["authTime"]; ok { - authTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) - eventJson["timestamp"] = authTime.Unix() - eventJson["time"] = fmt.Sprint(v) - } - case "detach": - // {"detachResult":0,"detachTime":"2024-12-07 18:00:47","imsi":"460002082100000"} - if v, ok := body["imsi"]; ok { - eventJson["imsi"] = fmt.Sprint(v) - } - if v, ok := body["detachResult"]; ok { - if fmt.Sprint(v) == "0" { - eventJson["result"] = "200" - } else { - eventJson["result"] = "500" - } - } - if v, ok := body["detachTime"]; ok { - detachTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) - eventJson["timestamp"] = detachTime.Unix() - eventJson["time"] = fmt.Sprint(v) - } - case "cm-state": - // {"changeTime":"2024-12-07 17:07:52","imsi":"460002082100000","onlineNumber":1,"status":2} - if v, ok := body["imsi"]; ok { - eventJson["imsi"] = fmt.Sprint(v) - } - if v, ok := body["onlineNumber"]; ok { - eventJson["onlineNumber"] = parse.Number(v) - } - if v, ok := body["status"]; ok { - eventJson["result"] = fmt.Sprint(v) - } - if v, ok := body["changeTime"]; ok { - changeTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) - eventJson["timestamp"] = changeTime.Unix() - eventJson["time"] = fmt.Sprint(v) - } - } - - ueByte, err := json.Marshal(eventJson) - if err != nil { - services.ResponseInternalServerError500ProcessError(c.Writer, err) - return - } - data.EventJSONStr = string(ueByte) - - if err := db.DB("").Table("ue_event_amf").Create(&data).Error; err != nil { - log.Error("Failed to insert ue_event_amf", err) - services.ResponseInternalServerError500ProcessError(c.Writer, err) - return - } - - // 推送到ws订阅组 - if data.NeType == "AMF" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, data) - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, data) - } - - services.ResponseStatusOK204NoContent(c.Writer) -} - -// UE上报处理 -func PostUEEvent(w http.ResponseWriter, r *http.Request) { - log.Info("PostUEEvent processing... ") - neType := ctx.GetParam(r, "elementTypeValue") - var body struct { - NeType string `json:"neType" ` - NeName string `json:"neName" ` - RmUID string `json:"rmUID" ` - Timestamp int64 `json:"timestamp" ` - EventType string `json:"eventType" ` - EventJson map[string]any `json:"eventJSON" ` - } - if err := ctx.ShouldBindJSON(r, &body); err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - neTypeLower := strings.ToLower(body.NeType) - if neType == "" || neType != neTypeLower { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("inconsistent network element types")) - return - } - - // 是否存在网元 - neInfo := neService.NewNeInfo.FindByRmuid(body.RmUID) - if neInfo.NeType != body.NeType || neInfo.RmUID != body.RmUID { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("network element does not exist")) - return - } - - ueByte, err := json.Marshal(body.EventJson) - if err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 执行插入表 - type UEEvent struct { - ID string `json:"-" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String - CreatedAt int64 `json:"-" gorm:"column:created_at"` // 记录创建存储毫秒 - } - data := UEEvent{ - NeType: body.NeType, - NeName: body.NeName, - RmUID: body.RmUID, - Timestamp: int64(body.Timestamp) * 1000, - EventType: body.EventType, - EventJSONStr: string(ueByte), - CreatedAt: time.Now().UnixMilli(), - } - tableName := fmt.Sprintf("ue_event_%s", neTypeLower) - if err := db.DB("").Table(tableName).Create(&data).Error; err != nil { - log.Error("Failed to insert "+tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 推送到ws订阅组 - if body.NeType == "MME" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE, data) - wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+"_"+neInfo.NeId, data) - } - if body.NeType == "AMF" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, data) - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, data) - } - - services.ResponseStatusOK204NoContent(w) -} diff --git a/features/features.go b/features/features.go deleted file mode 100644 index e4f68c75..00000000 --- a/features/features.go +++ /dev/null @@ -1,22 +0,0 @@ -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" -) - -func InitServiceEngine(r *gin.Engine) { - log.Info("======init feature group gin.Engine") - - // featuresGroup := r.Group("/") - // register features routers - pm.InitSubServiceRoute(r) - lm.InitSubServiceRoute(r) - cm.InitSubServiceRoute(r) - nbi.InitSubServiceRoute(r) - // return featuresGroup -} diff --git a/features/file/file.go b/features/file/file.go deleted file mode 100644 index bdd971f8..00000000 --- a/features/file/file.go +++ /dev/null @@ -1,141 +0,0 @@ -package file - -import ( - "net/http" - "path/filepath" - - "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/services" - "github.com/gorilla/mux" -) - -var ( - // parameter config management - UriFile = config.DefaultUriPrefix + "/fileManagement/{apiVersion}/{location}/file" - CustomUriFile = config.UriPrefix + "/fileManagement/{apiVersion}/{location}/file" -) - -// func init() { -// routes.Register("POST", UriFile, UploadFile, nil) -// routes.Register("GET", UriFile, DownloadFile, nil) -// routes.Register("DELETE", UriFile, DeleteFile, nil) -// } - -func UploadFile(w http.ResponseWriter, r *http.Request) { - log.Debug("UploadFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - location := vars["location"] - if location == "" { - log.Error("location is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - params := r.URL.Query() - rename, ok := params["rename"] - if !ok { - log.Info("rename parameter is not exist") - } - log.Debug("rename:", rename) - - var path, fileName string - if len(rename) > 0 { - fileName = rename[0] - } - if location == "upload" { - path = config.GetYamlConfig().OMC.Upload - fileNamePath, err := services.HandleUploadFile(r, path, fileName) - if err != nil { - log.Error("Faile to HandleUploadFile:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - fileName = fileNamePath - } else { - path = config.GetYamlConfig().OMC.FrontUpload - fileNamePath, err := services.HandleUploadFile(r, path, fileName) - if err != nil { - log.Error("Faile to HandleUploadFile:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - fileName = fileNamePath - } - log.Debugf("upload file=%s to path=%s", fileName, path) - - services.ResponseStatusOK204NoContent(w) - return -} - -func DownloadFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - location := vars["location"] - if location == "" { - log.Error("location is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // 全路径文件下载 - filePath := r.URL.Query().Get("path") - if location == "path" && filePath != "" { - // 截取文件路径 - dir := filepath.Dir(filePath) - // 截取文件名 - fileName := filepath.Base(filePath) - services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, dir, "") - return - } - - params := r.URL.Query() - fileNames, ok := params["loc"] - if !ok { - log.Info("loc parameter is not exist") - } - var path string - if location == "upload" { - path = config.GetYamlConfig().OMC.Upload - } else { - path = config.GetYamlConfig().OMC.FrontUpload - } - for _, fileName := range fileNames { - services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, "") - } - return -} - -func DeleteFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteFile 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 - } - - services.ResponseStatusOK204NoContent(w) - return -} diff --git a/features/fm/alarm.go b/features/fm/alarm.go deleted file mode 100644 index e5f624fe..00000000 --- a/features/fm/alarm.go +++ /dev/null @@ -1,567 +0,0 @@ -package fm - -import ( - "database/sql" - "encoding/json" - "fmt" - "net/http" - "strings" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - - "be.ems/src/framework/constants" - "be.ems/src/framework/resp" - "be.ems/src/framework/utils/date" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" - neFetchlink "be.ems/src/modules/network_element/fetch_link" - neModel "be.ems/src/modules/network_element/model" - neService "be.ems/src/modules/network_element/service" - traceService "be.ems/src/modules/trace/service" - wsService "be.ems/src/modules/ws/service" -) - -const ( - AlarmStatusClear = 0 - AlarmStatusActive = 1 - AlarmStatusClearString = "0" - AlarmStatusActiveString = "1" -) - -const ( - ClearTypeUnclear = 0 - ClearTypeAutoClear = 1 - ClearTypeManualClear = 2 -) - -const ( - AckStateUnacked = 0 - AckStateAcked = 1 -) - -const ( - AlarmTypeCommunicationAlarm = 1 - AlarmTypeEquipmentAlarm = 2 - AlarmTypeProcessingFailure = 3 - AlarmTypeEnvironmentalAlarm = 4 - AlarmTypeQualityOfServiceAlarm = 5 -) - -const ( - AlarmPerceivedSeverityCritical = 1 - AlarmPerceivedSeverityMajor = 2 - AlarmPerceivedSeverityMinor = 3 - AlarmPerceivedSeverityWarning = 4 - AlarmPerceivedSeverityEvent = 5 -) - -const ( - AlarmSeqBeginNumber = 1 -) - -type Alarm struct { - AlarmSeq int `json:"alarmSeq"` - AlarmId string `json:"alarmId" xorm:"alarm_id"` - NeId string `json:"neId"` // 收到实际是rmUID - AlarmCode int `json:"alarmCode"` - AlarmTitle string `json:"alarmTitle"` - EventTime string `json:"eventTime"` - AlarmType string `json:"alarmType"` - OrigSeverity string `json:"origSeverity"` - PerceivedSeverity string `json:"perceivedSeverity"` - PVFlag string `json:"pvFlag" xorm:"pv_flag"` - NeName string `json:"neName"` - NeType string `json:"neType"` - ObjectUid string `json:"objectUid" xorm:"object_uid"` - ObjectName string `json:"objectName" xorm:"object_name"` - ObjectType string `json:"objectType" xorm:"object_type"` - LocationInfo string `json:"locationInfo"` - Province string `json:"province"` - AlarmStatus int `json:"alarmStatus"` - SpecificProblem string `json:"specificProblem"` - SpecificProblemID string `json:"specificProblemID" xorm:"specific_problem_id"` - AddInfo string `json:"addInfo"` - - AckState int `json:"ackState"` - AckTime sql.NullTime `json:"ackTime"` - AckUser string `json:"ackUser"` - ClearType int `json:"clearType"` // 0: Unclear, 1: Auto clear, 2: Manual clear - ClearTime sql.NullTime `json:"clearTime"` -} - -var ( - // alarm management - UriAlarms = config.DefaultUriPrefix + "/faultManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/alarms" - UriAlarmsFmt = config.DefaultUriPrefix + "/faultManagement/v1/elementType/%s/objectType/alarms" - - CustomUriAlarms = config.UriPrefix + "/faultManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/alarms" - CustomUriAlarmsFmt = config.UriPrefix + "/faultManagement/v1/elementType/%s/objectType/alarms" -) - -// PostAlarmFromNF 网元告警数据上报接收 -func PostAlarmFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostAlarmFromNF processing... ") - apiVer := ctx.GetParam(r, "apiVersion") - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseWithJson(w, 422, resp.CodeMsg(40422, "api version is invalid")) - return - } - - var body []Alarm - if err := ctx.ShouldBindJSON(r, &body); err != nil { - services.ResponseWithJson(w, 422, resp.ErrMsg(err.Error())) - return - } - - // service object - neService := neService.NewNeInfo - - for _, v := range body { - log.Debug("alarmData:", v) - - // 是否存在网元 neId实际是rmUID - neInfo := neService.FindByRmuid(v.NeId) - if neInfo.NeType != v.NeType { - msg := fmt.Sprintf("network element does not exist %s", v.NeId) - services.ResponseWithJson(w, 400, resp.ErrMsg(msg)) - return - } - - // 记录日志 - alarmSaveLog(neInfo, v) - - // 补充默认信息 - if v.LocationInfo == "" { - v.LocationInfo = fmt.Sprintf("Remote Host:%s", r.RemoteAddr) - } - if v.AddInfo == "" { - v.AddInfo = fmt.Sprintf("NeInfo:%s", v.NeType) - } - if v.ObjectUid == "" { - v.ObjectUid = neInfo.RmUID - } - if v.ObjectName == "" { - v.ObjectName = neInfo.NeName - } - if v.ObjectType == "" { - v.ObjectType = neInfo.NeType - } - - // 告警事件 - if v.OrigSeverity == "Event" || v.OrigSeverity == "5" { - if v.AlarmStatus == AlarmStatusClear { - // 进行清除 - clearAlarmEvent, err := alarmEventClear(neInfo, v) - if err != nil { - services.ResponseWithJson(w, 400, resp.ErrMsg(err.Error())) - return - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM_EVENT, neInfo.NeType, neInfo.NeId) - wsService.NewWSSend.ByGroupID(groupID, clearAlarmEvent) - } - if v.AlarmStatus == AlarmStatusActive { - // 进行新增 - newAlarmEvent, err := alarmEventNew(neInfo, v) - if err != nil { - services.ResponseWithJson(w, 400, resp.ErrMsg(err.Error())) - return - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM_EVENT, neInfo.NeType, neInfo.NeId) - wsService.NewWSSend.ByGroupID(groupID, newAlarmEvent) - } - continue - } - - if v.AlarmStatus == AlarmStatusClear { - // 进行清除 - clearAlarm, err := alarmClear(neInfo, v) - if err != nil { - services.ResponseWithJson(w, 400, resp.ErrMsg(err.Error())) - return - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - wsService.NewWSSend.ByGroupID(groupID, clearAlarm) - } - if v.AlarmStatus == AlarmStatusActive { - // 进行新增 - newAlarm, err := alarmNew(neInfo, v) - if err != nil { - services.ResponseWithJson(w, 400, resp.ErrMsg(err.Error())) - return - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - wsService.NewWSSend.ByGroupID(groupID, newAlarm) - } - - // for alarm forward 告警转发 - alarmForward(v) - } - - services.ResponseStatusOK204NoContent(w) -} - -// alarmTypeValue 映射值 -func alarmTypeValue(str string) string { - arr := []string{"CommunicationAlarm", "EquipmentAlarm", "ProcessingFailure", "EnvironmentalAlarm", "QualityOfServiceAlarm"} - for k, v := range arr { - if v == str { - return fmt.Sprint(k + 1) - } - } - return str -} - -// origSeverityValue 映射值 -func origSeverityValue(str string) string { - arr := []string{"Critical", "Major", "Minor", "Warning", "Event"} - for k, v := range arr { - if v == str { - return fmt.Sprint(k + 1) - } - } - return str -} - -// alarmClear 清除告警 -func alarmClear(neInfo neModel.NeInfo, v Alarm) (neDataModel.Alarm, error) { - alarmService := neDataService.NewAlarm - // 检查网元告警ID是否唯一 - alarmIdArr := alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: v.AlarmId, - }) - if len(alarmIdArr) != 1 { - return neDataModel.Alarm{}, fmt.Errorf("[%s %s] clear alarm not exists alarmId:%s", neInfo.NeType, neInfo.NeId, v.AlarmId) - } - - // 产生时间 - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - - alarm := neDataModel.Alarm{ - ID: alarmIdArr[0].ID, - NeType: neInfo.NeType, - NeId: neInfo.NeId, - NeName: neInfo.NeName, - Province: neInfo.Province, - PvFlag: neInfo.PvFlag, - AlarmSeq: alarmIdArr[0].AlarmSeq, // seq 告警序号 - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - EventTime: eventTime.UnixMilli(), - AlarmType: alarmTypeValue(v.AlarmType), - OrigSeverity: origSeverityValue(v.OrigSeverity), - PerceivedSeverity: origSeverityValue(v.PerceivedSeverity), - ObjectUid: v.ObjectUid, - ObjectName: v.ObjectName, - ObjectType: v.ObjectType, - LocationInfo: v.LocationInfo, - AlarmStatus: fmt.Sprint(v.AlarmStatus), - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - - // 告警清除 - alarm.ClearType = ClearTypeAutoClear - alarm.ClearTime = eventTime.UnixMilli() - alarm.ClearUser = neInfo.NeName - rows := alarmService.Update(alarm) - if rows > 0 { - return alarm, nil - } - return neDataModel.Alarm{}, fmt.Errorf("[%s %s] clear alarm fail", neInfo.NeType, neInfo.NeId) -} - -// alarmNew 新增告警 -func alarmNew(neInfo neModel.NeInfo, v Alarm) (neDataModel.Alarm, error) { - alarmService := neDataService.NewAlarm - // 检查网元告警ID是否唯一 - alarmIdArr := alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: v.AlarmId, - }) - if len(alarmIdArr) > 0 { - return neDataModel.Alarm{}, fmt.Errorf("[%s %s] new alarm already exists alarmId:%s", neInfo.NeType, neInfo.NeId, v.AlarmId) - } - // seq 告警序号 - lastSeq := alarmService.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId) - // 产生时间 - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - - alarm := neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - NeName: neInfo.NeName, - Province: neInfo.Province, - PvFlag: neInfo.PvFlag, - AlarmSeq: lastSeq + 1, - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - EventTime: eventTime.UnixMilli(), - AlarmType: alarmTypeValue(v.AlarmType), - OrigSeverity: origSeverityValue(v.OrigSeverity), - PerceivedSeverity: origSeverityValue(v.PerceivedSeverity), - ObjectUid: v.ObjectUid, - ObjectName: v.ObjectName, - ObjectType: v.ObjectType, - LocationInfo: v.LocationInfo, - AlarmStatus: fmt.Sprint(v.AlarmStatus), - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - insertId := alarmService.Insert(alarm) - if insertId > 0 { - alarm.ID = insertId - return alarm, nil - } - return neDataModel.Alarm{}, fmt.Errorf("[%s %s] new alarm fail", neInfo.NeType, neInfo.NeId) -} - -// alarmSaveLog 保存告警日志 -func alarmSaveLog(neInfo neModel.NeInfo, v Alarm) int64 { - alarmLogService := neDataService.NewAlarmLog - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - alarmLog := neDataModel.AlarmLog{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmSeq: int64(v.AlarmSeq), - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - AlarmStatus: fmt.Sprint(v.AlarmStatus), - AlarmType: alarmTypeValue(v.AlarmType), - OrigSeverity: origSeverityValue(v.OrigSeverity), - EventTime: eventTime.UnixMilli(), - } - return alarmLogService.Insert(alarmLog) -} - -// alarmForward 告警转发 -func alarmForward(v Alarm) { - if config.GetYamlConfig().Alarm.EmailForward.Enable { - if err := AlarmEmailForward(&v); err != nil { - log.Error("Failed to AlarmEmailForward:", err) - } - } - if config.GetYamlConfig().Alarm.SMSCForward.Enable { - if err := AlarmSMSForward(&v); err != nil { - log.Error("Failed to AlarmSMSForward:", err) - } - } -} - -// alarmEventClear 清除告警事件 -func alarmEventClear(neInfo neModel.NeInfo, v Alarm) (neDataModel.AlarmEvent, error) { - alarmEventService := neDataService.NewAlarmEvent - // 检查网元告警ID是否唯一 - alarmIdArr := alarmEventService.Find(neDataModel.AlarmEvent{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: v.AlarmId, - }) - if len(alarmIdArr) != 1 { - return neDataModel.AlarmEvent{}, fmt.Errorf("[%s %s] clear alarm event not exists alarmId:%s", neInfo.NeType, neInfo.NeId, v.AlarmId) - } - - // 产生时间 - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - - alarmEvent := neDataModel.AlarmEvent{ - ID: alarmIdArr[0].ID, - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmSeq: alarmIdArr[0].AlarmSeq, // seq 告警序号 - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - EventTime: eventTime.UnixMilli(), - ObjectUid: v.ObjectUid, - ObjectName: v.ObjectName, - ObjectType: v.ObjectType, - LocationInfo: v.LocationInfo, - AlarmStatus: fmt.Sprint(v.AlarmStatus), - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - - // 告警清除 - alarmEvent.ClearType = ClearTypeAutoClear - alarmEvent.ClearTime = eventTime.UnixMilli() - alarmEvent.ClearUser = neInfo.NeName - rows := alarmEventService.Update(alarmEvent) - if rows > 0 { - return alarmEvent, nil - } - return neDataModel.AlarmEvent{}, fmt.Errorf("[%s %s] clear alarm event fail", neInfo.NeType, neInfo.NeId) -} - -// alarmEventNew 新增告警事件 -func alarmEventNew(neInfo neModel.NeInfo, v Alarm) (neDataModel.AlarmEvent, error) { - alarmEventService := neDataService.NewAlarmEvent - // 检查网元告警ID是否唯一 - alarmIdArr := alarmEventService.Find(neDataModel.AlarmEvent{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: v.AlarmId, - }) - if len(alarmIdArr) > 0 { - return neDataModel.AlarmEvent{}, fmt.Errorf("[%s %s] new alarm event already exists alarmId:%s", neInfo.NeType, neInfo.NeId, v.AlarmId) - } - // seq 告警序号 - lastSeq := alarmEventService.FindAlarmEventSeqLast(neInfo.NeType, neInfo.NeId) - // 产生时间 - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - - alarmEvent := neDataModel.AlarmEvent{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmSeq: lastSeq + 1, - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - EventTime: eventTime.UnixMilli(), - ObjectUid: v.ObjectUid, - ObjectName: v.ObjectName, - ObjectType: v.ObjectType, - LocationInfo: v.LocationInfo, - AlarmStatus: fmt.Sprint(v.AlarmStatus), - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - insertId := alarmEventService.Insert(alarmEvent) - if insertId > 0 { - alarmEvent.ID = insertId - // 网元重启后,清除活动告警 - if v.AlarmCode == constants.ALARM_EVENT_REBOOT { - alarmService := neDataService.NewAlarm - rows := alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmStatus: "1", - }) - for _, v := range rows { - alarmService.AlarmClearByIds([]int64{v.ID}, "system") - } - } - // 网元重启后,有跟踪任务的需要重新补发启动任务 - if v.AlarmCode == constants.ALARM_EVENT_REBOOT { - traceService.NewTraceTask.RunUnstopped(neInfo.NeType, neInfo.NeId) - } - return alarmEvent, nil - } - return neDataModel.AlarmEvent{}, fmt.Errorf("[%s %s] new alarm event fail", neInfo.NeType, neInfo.NeId) -} - -// mapToAlarm 将 []map[string]any 转换为 []Alarm -func mapToAlarm(data []map[string]any) []Alarm { - var result []Alarm - - // 将 []map[string]any 序列化为 JSON 字符串 - jsonData, err := json.Marshal(data) - if err != nil { - log.Error("Error marshaling data:", err) - return result - } - - // 反序列化到结构体 - err = json.Unmarshal(jsonData, &result) - if err != nil { - log.Error("Error unmarshaling data:", err) - return result - } - return result -} - -// GetAlarmFromNF 告警历史数据,从网元获取 -func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetAlarmFromNF processing... ") - neType := ctx.GetParam(r, "elementTypeValue") - neTypeLower := strings.ToLower(neType) - - // Get alarms from OMC return 204 - if neTypeLower == strings.ToLower(config.GetYamlConfig().OMC.NeType) { - log.Infof("Return no content alarms from %s", neType) - services.ResponseWithJson(w, 200, resp.ErrMsg("omc alarms no content")) - return - } - - neInfos := neService.NewNeInfo.Find(neModel.NeInfo{}, false, false) - for _, neInfo := range neInfos { - data, err := neFetchlink.AlarmHistory(neInfo) - if err != nil { - log.Error("Failed to fetch alarm history:", err) - continue - } - if len(data) == 0 { - log.Infof("Not found sync alarms, neType=%s, neId=%s", neInfo.NeType, neInfo.NeId) - continue - } - - alarms := mapToAlarm(data) - for _, v := range alarms { - // 补充默认信息 - if v.LocationInfo == "" { - v.LocationInfo = fmt.Sprintf("Remote Host:%s", r.RemoteAddr) - } - if v.AddInfo == "" { - v.AddInfo = fmt.Sprintf("NeInfo:%s", v.NeType) - } - if v.ObjectUid == "" { - v.ObjectUid = neInfo.RmUID - } - if v.ObjectName == "" { - v.ObjectName = neInfo.NeName - } - if v.ObjectType == "" { - v.ObjectType = neInfo.NeType - } - - // 告警事件 - if v.OrigSeverity == "Event" || v.OrigSeverity == "5" { - if v.AlarmStatus == AlarmStatusClear { - // 进行清除 - if _, err := alarmEventClear(neInfo, v); err != nil { - log.Error("Failed to alarmEventClear:", err) - continue - } - } - if v.AlarmStatus == AlarmStatusActive { - // 进行新增 - if _, err := alarmEventNew(neInfo, v); err != nil { - log.Error("Failed to alarmEventNew:", err) - continue - } - } - continue - } - - if v.AlarmStatus == AlarmStatusClear { - // 进行清除 - if _, err := alarmClear(neInfo, v); err != nil { - log.Error("Failed to alarmClear:", err) - continue - } - } - if v.AlarmStatus == AlarmStatusActive { - // 进行新增 - if _, err := alarmNew(neInfo, v); err != nil { - log.Error("Failed to alarmNew:", err) - continue - } - } - } - } - services.ResponseWithJson(w, 200, resp.OkMsg("sync alarms success")) -} diff --git a/features/fm/email.go b/features/fm/email.go deleted file mode 100644 index eacca7d1..00000000 --- a/features/fm/email.go +++ /dev/null @@ -1,129 +0,0 @@ -package fm - -import ( - "crypto/tls" - "fmt" - "strings" - - "be.ems/lib/config" - neService "be.ems/src/modules/network_element/service" - systemService "be.ems/src/modules/system/service" - - "gopkg.in/gomail.v2" -) - -func AlarmEmailForward(alarmData *Alarm) error { - neInfo := neService.NewNeInfo.FindByRmuid(alarmData.NeId) - - alarmStatus := "Clear" - if alarmData.AlarmStatus == 1 { - alarmStatus = "Active" - } - severity := origSeverityValue(alarmData.OrigSeverity) - dictAlarmSeverity := systemService.NewSysDictData.FindByType("active_alarm_severity") - for _, v := range dictAlarmSeverity { - if v.DataValue == severity { - severity = v.DataLabel - } - } - subjectTitle := config.GetYamlConfig().Alarm.EmailForward.Title - if subjectTitle == "" { - subjectTitle = fmt.Sprintf("%s-%s-%s", alarmData.OrigSeverity, alarmData.NeName, alarmData.AlarmTitle) - } - message := fmt.Sprintf(` -

Alarm information

-

Sequence: %d

-

NE Name: %s

-

NE IP: %s

-

Title: %s

-

Severity: %s

-

Event Time: %s

-

Alarm Status: %s

-

Automatic sent by OMC, please do not reply!

- `, - alarmData.AlarmSeq, - alarmData.NeName, - neInfo.IP, - alarmData.AlarmTitle, - severity, - alarmData.EventTime, - alarmStatus, - ) - - // message := fmt.Sprintf(` - // Alarm information - - // Sequence: %d - // NE name: %s - // Title: %s - // Severity: %s - // Event Time: %s - - // Automatic send by OMC, don't reply! - // `, alarmData.AlarmSeq, alarmData.NeName, alarmData.AlarmTitle, alarmData.OrigSeverity, alarmData.EventTime) - - // QQ 邮箱: - // SMTP 服务器地址:smtp.qq.com(SSL协议端口:465/994 | 非SSL协议端口:25) - // 163 邮箱: - // SMTP 服务器地址:smtp.163.com(端口:25) - // host := "mail.agrandtech.com" - // port := 25 - // userName := "smtpext@agrandtech.com" - // password := "1000smtp@omc!" - - host := config.GetYamlConfig().Alarm.EmailForward.SMTP - port := int(config.GetYamlConfig().Alarm.EmailForward.Port) - userName := config.GetYamlConfig().Alarm.EmailForward.User - password := config.GetYamlConfig().Alarm.EmailForward.Password - - m := gomail.NewMessage() - m.SetHeader("From", userName) // 发件人 - //m.SetHeader("From", "alias"+"<"+"aliastest"+">") // 增加发件人别名 - - // emails, err := dborm.XormGetAlarmForward("Email") - // if err != nil { - // log.Error("Failed to XormGetAlarmForward:", err) - // return err - // } else if emails == nil || len(*emails) == 0 { - // err := errors.New("not found forward email list") - // log.Error(err) - // return err - // } - emails := strings.Split(config.GetYamlConfig().Alarm.EmailForward.EmailList, ",") - if len(emails) == 0 { - return fmt.Errorf("not found forward email list") - } - m.SetHeader("To", emails...) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 - //m.SetHeader("To", strings.Join(*emails, " ")) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 - //m.SetHeader("To", "zhangshuzhong@agrandtech.com", "simonzhangsz@outlook.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 - //m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个 - //m.SetHeader("Bcc", "******@qq.com") // 暗送,可以多个 - m.SetHeader("Subject", subjectTitle) // 邮件主题 - - // text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。 - // 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等 - //m.SetBody("text/html", fmt.Sprintf(message, *alarm)) - m.SetBody("text/html", message) - - // text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理 - //m.SetBody("text/plain", message) - // m.Attach("test.sh") // 附件文件,可以是文件,照片,视频等等 - // m.Attach("lolcatVideo.mp4") // 视频 - // m.Attach("lolcat.jpg") // 照片 - - d := gomail.NewDialer( - host, - port, - userName, - password, - ) - // 关闭SSL协议认证 - d.TLSConfig = &tls.Config{InsecureSkipVerify: true} - if !config.GetYamlConfig().Alarm.EmailForward.TLSSkipVerify { - // 打开SSL协议认证 - d.TLSConfig = &tls.Config{InsecureSkipVerify: false} - } - - err := d.DialAndSend(m) - return writeLog(alarmData, config.GetYamlConfig().Alarm.EmailForward.EmailList, "EMAIL", err) -} diff --git a/features/fm/smsforward.go b/features/fm/smsforward.go deleted file mode 100644 index 642e0ed3..00000000 --- a/features/fm/smsforward.go +++ /dev/null @@ -1,271 +0,0 @@ -package fm - -import ( - "errors" - "fmt" - "net/http" - "net/url" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/log" - "be.ems/src/framework/utils/date" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" - neService "be.ems/src/modules/network_element/service" - "github.com/linxGnu/gosmpp" - "github.com/linxGnu/gosmpp/data" - "github.com/linxGnu/gosmpp/pdu" -) - -func AlarmSMSForward(alarmData *Alarm) error { - switch config.GetYamlConfig().Alarm.SMProxy { - case "sms": - users, err := AlarmForwardBySMS(alarmData) - writeLog(alarmData, users, "SMS", err) - return err - case "smsc": - users, err := AlarmForwardBySMPP(alarmData) - writeLog(alarmData, users, "SMS", err) - return err - default: - users, err := AlarmForwardBySMPP(alarmData) - writeLog(alarmData, users, "SMS", err) - return err - } -} - -func AlarmForwardBySMS(alarmData *Alarm) (string, error) { - log.Info("AlarmForwardBySMS processing... ") - - SMSFforwardconfig := config.GetYamlConfig().Alarm.SMS - // 阿里云短信API的请求地址 - apiURL := SMSFforwardconfig.ApiURL - - // 阿里云短信API的AccessKey ID和AccessKey Secret - //accessKeyID := SMSFforwardconfig.AccessKeyID - accessKeySecret := SMSFforwardconfig.AccessKeySecret - - toUsers, err := dborm.XormGetAlarmForward("SMS") - if err != nil { - log.Error("Failed to XormGetAlarmForward:", err) - return "", err - } - if toUsers == nil { - err := errors.New("not found forward phone number") - log.Error(err) - return "", err - } - userList := strings.Join(*toUsers, ",") - if len(userList) == 0 { - err := errors.New("not found forward phone number") - log.Error(err) - return "", err - } - // 短信相关参数 - params := url.Values{} - params.Set("PhoneNumbers", userList) - params.Set("SignName", SMSFforwardconfig.SignName) - params.Set("TemplateCode", SMSFforwardconfig.TemplateCode) - params.Set("TemplateParam", `{"message":"alarm"}`) - - // 构建请求URL - reqURL := apiURL + "?Action=SendSms&" + params.Encode() - - // 创建HTTP请求 - req, err := http.NewRequest("GET", reqURL, nil) - if err != nil { - log.Error("Failed to create request:", err) - return userList, err - } - - // 添加请求头部 - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - req.Header.Set("Authorization", "APPCODE "+accessKeySecret) - - // 发送请求 - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - log.Error("Failed to send request:%v", err) - return userList, err - } - defer resp.Body.Close() - - // 解析响应 - switch resp.StatusCode { - case http.StatusOK, http.StatusAccepted, http.StatusNoContent, http.StatusCreated: - return userList, nil - default: - log.Error(fmt.Errorf("failed to send SMS: %s(Code=%d)", resp.Status, resp.StatusCode)) - return userList, err - } -} - -var smsForward = &(config.GetYamlConfig().Alarm.SMSCForward) - -func AlarmForwardBySMPP(alarmData *Alarm) (string, error) { - log.Info("AlarmForwardBySMPP processing... ") - - if smsForward == nil { - err := errors.New("smsForward configuration is nil") - log.Error(err) - return "", err - } - userList := smsForward.MobileList - if len(userList) == 0 { - err := errors.New("not found forward phone number") - log.Error(err) - return "", err - } - auth := gosmpp.Auth{ - SMSC: smsForward.SMSCAddr, - SystemID: smsForward.SystemID, - Password: smsForward.Password, - SystemType: smsForward.SystemType, - } - - trans, err := gosmpp.NewSession( - gosmpp.TXConnector(gosmpp.NonTLSDialer, auth), - gosmpp.Settings{ - ReadTimeout: 2 * time.Second, - - OnPDU: func(p pdu.PDU, _ bool) { - log.Debug("%+v", p) - }, - - OnSubmitError: func(_ pdu.PDU, err error) { - log.Error(err) - }, - - OnRebindingError: func(err error) { - log.Error(err) - }, - - OnClosed: func(state gosmpp.State) { - log.Error(state) - }, - }, -1) - if err != nil { - log.Error("Failed to create SMPP new session:", err) - return "", err - } - defer func() { - if err := trans.Close(); err != nil { - log.Error(err) - } - }() - - message := "Alarm Notification: " + alarmData.AlarmTitle + - " from " + alarmData.NeType + "_" + alarmData.NeId + - " at " + alarmData.EventTime - users := strings.Split(userList, ",") - for _, user := range users { - if user == "" { - continue - } - sm, err := newSubmitSM(user, message) - if err != nil { - log.Errorf("Failed to newSubmitSM %s short message: %v", user, err) - writeLog(alarmData, user, "SMS", err) - continue - } - if err = trans.Transceiver().Submit(sm); err != nil { - log.Errorf("Failed to Submit %s short message: %v", user, err) - writeLog(alarmData, user, "SMS", err) - continue - } - writeLog(alarmData, user, "SMS", nil) - } - - return userList, nil -} - -func writeLog(alarmData *Alarm, toUser, forwardBy string, err error) error { - var result string = fmt.Sprintf("%s Sent Successfully!", forwardBy) - if err != nil { - result = err.Error() - } - neInfo := neService.NewNeInfo.FindByRmuid(alarmData.NeId) - eventTime := date.ParseStrToDate(alarmData.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - alarmForwardLog := neDataModel.AlarmForwardLog{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmSeq: int64(alarmData.AlarmSeq), - AlarmId: alarmData.AlarmId, - AlarmTitle: alarmData.AlarmTitle, - AlarmCode: int64(alarmData.AlarmCode), - AlarmStatus: fmt.Sprint(alarmData.AlarmStatus), - AlarmType: alarmTypeValue(alarmData.AlarmType), - OrigSeverity: origSeverityValue(alarmData.OrigSeverity), - EventTime: eventTime.UnixMilli(), - Type: forwardBy, - Target: toUser, - Result: result, - } - - // 记录日志 - insertId := neDataService.NewAlarmForwardLog.Insert(alarmForwardLog) - if insertId <= 0 { - return fmt.Errorf("failed to insert data") - } - return nil -} - -func newSubmitSM(phoneNumber string, message string) (*pdu.SubmitSM, error) { - // build up submitSM - srcAddr := pdu.NewAddress() - srcAddr.SetTon(5) - srcAddr.SetNpi(0) - err := srcAddr.SetAddress(smsForward.ServiceNumber) - if err != nil { - return nil, err - } - destAddr := pdu.NewAddress() - destAddr.SetTon(1) - destAddr.SetNpi(1) - err = destAddr.SetAddress(phoneNumber) - if err != nil { - return nil, err - } - submitSM := pdu.NewSubmitSM().(*pdu.SubmitSM) - submitSM.SourceAddr = srcAddr - submitSM.DestAddr = destAddr - dataCoding := data.FromDataCoding(smsForward.DataCoding) - err = submitSM.Message.SetMessageWithEncoding(message, dataCoding) - if err != nil { - return nil, err - } - submitSM.ProtocolID = 0 - submitSM.RegisteredDelivery = 1 - submitSM.ReplaceIfPresentFlag = 0 - submitSM.EsmClass = 0 - - return submitSM, nil -} - -// const ( -// // Short message data coding type -// SMS_CODING_GSM7BIT byte = iota -// SMS_CODING_ASCII -// SMS_CODING_BINARY8BIT1 -// SMS_CODING_LATIN1 -// SMS_CODING_BINARY8BIT2 -// SMS_CODING_NODEF -// SMS_CODING_CYRILLIC -// SMS_CODING_HEBREW -// SMS_CODING_UCS2 -// ) - -// var codingMap = map[byte]data.Encoding{ -// SMS_CODING_GSM7BIT: data.GSM7BIT, -// SMS_CODING_ASCII: data.ASCII, -// SMS_CODING_BINARY8BIT1: data.BINARY8BIT1, -// SMS_CODING_LATIN1: data.LATIN1, -// SMS_CODING_BINARY8BIT2: data.BINARY8BIT2, -// SMS_CODING_CYRILLIC: data.CYRILLIC, -// SMS_CODING_HEBREW: data.HEBREW, -// SMS_CODING_UCS2: data.UCS2, -// } diff --git a/features/handle/handle.go b/features/handle/handle.go deleted file mode 100644 index daeaf726..00000000 --- a/features/handle/handle.go +++ /dev/null @@ -1,565 +0,0 @@ -package handle - -import ( - "bytes" - "encoding/json" - "io" - "net/http" - "strconv" - "strings" - - "github.com/gorilla/mux" - g "github.com/gosnmp/gosnmp" - - "be.ems/lib/config" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/oauth" - "be.ems/lib/services" - "be.ems/lib/session" -) - -var TodoList []stTodo - -type stTodo struct { - No string - Item string - Value string -} - -type ErrorOAuthResponse struct { - Error map[string]interface{} -} - -type FailOAuthResponse struct { - Error struct { - ErrorCode string - ErrorInfo string - } -} - -type ApiResponse struct { - ResultCode string - ResultMessage interface{} -} - -var globalSession = session.NewSessManager("restagent") - -func init() { - conf := config.GetYamlConfig() - // Default is a pointer to a GoSNMP struct that contains sensible defaults - // eg port 161, community public, etc - g.Default.Target = conf.NE.Addr - g.Default.Port = conf.NE.Port - err := g.Default.Connect() - if err != nil { - log.Fatalf("Connect() err: %v", err) - } - //defer g.Default.Conn.Close() -} - -/* -func IsValidOAuthInfo(oAuthBody OAuthBody) bool { - log.Debug("IsValidOAuthInfo processing... ") - - conf := config.GetYamlConfig() - for _, o := range conf.Auth { - if oAuthBody.GrantType == o.Type && oAuthBody.UserName == o.User && oAuthBody.Value == o.Password { - return true - } - } - - return false -} - -func IsWrongOAuthInfo(oAuthBody OAuthBody) bool { - log.Debug("IsWrongOAuthInfo processing... ") - - if oAuthBody.GrantType == "" || strings.ToLower(oAuthBody.GrantType) != "password" || oAuthBody.UserName == "" || oAuthBody.Value == "" { - return true - } - - return false -} -*/ - -func IsValidOAuthUri(r *http.Request) bool { - vars := mux.Vars(r) - Uri := vars["apiCategory"] + "/" + vars["apiVersion"] // 获取Uri - return Uri == "securityManagement/v1" -} - -func IsVallidContentType(r *http.Request) bool { - log.Debug("IsVallidContentType processing ...") - - ctype := r.Header["Content-Type"] - if len(ctype) != 0 && !strings.Contains(ctype[0], "application/json") { - return false - } - - return true -} - -func LoginFromOMC(w http.ResponseWriter, r *http.Request) { - log.Debug("LoginFromOMC processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Debug(err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // check media type(content type) only support "application/json" - /* if !IsVallidContentType(r) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // check extend uri, response 404 - if !IsValidOAuthUri(r) { - log.Debug("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - */ - // Error process .... - // response 400-7 - if !json.Valid([]byte(body)) { - log.Debug("Invalid Json Format") - services.ResponseBadRequest400InvalidJson(w) - return - } - - var oAuthBody oauth.OAuthBody - _ = json.Unmarshal(body, &oAuthBody) //转为json - log.Debug("body:", string(body), "oAuthBody:", oAuthBody) - - defer r.Body.Close() - // response 400-5 - if oauth.IsWrongOAuthInfo(oAuthBody) { - log.Debug("Wrong parameter value") - services.ResponseBadRequest400WrongParamValue(w) - return - } - /* - if oauth.IsValidOAuthInfo(oAuthBody) { - plist := config.GetPermissionFromConfig(oAuthBody.UserName, oAuthBody.GrantType) - log.Debug("Permission list:", plist) - - token := globalSession.NewSession(w, r, plist) - services.ResponseStatusOK200Login(w, token) - } else { - // response 400-4 - log.Debug("Authentication failed, mismatch user or password") - - services.ResponseBadRequest400IncorrectLogin(w) - } - */ - // response 400-4 - log.Error("Authentication failed, mismatch user or password") - - services.ResponseBadRequest400IncorrectLogin(w) -} - -func LogoutFromOMC(w http.ResponseWriter, r *http.Request) { - - // check media type(content type) only support "application/json" - if !IsVallidContentType(r) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // check extend uri, response 404 - if !IsValidOAuthUri(r) { - log.Debug("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // error processing ... - // 401-1 response - token, ret := globalSession.IsCarriedToken(r) - if ret { - log.Debug("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - // 401-2 response - if globalSession.IsValidToken(token) { - log.Debug("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } - - globalSession.EndSession(w, r) - services.ResponseStatusOK200Null(w) -} - -func HandshakeFromOMC(w http.ResponseWriter, r *http.Request) { - log.Debug("HandshakeFromOMC processing... ") - - // check media type(content type) only support "application/json" - if !IsVallidContentType(r) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // check extend uri, response 404 - if !IsValidOAuthUri(r) { - log.Debug("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // error processing ... - // 401-1 response - token, ret := globalSession.IsCarriedToken(r) - if !ret { - log.Debug("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - if !globalSession.ShakeSession(token) { - // 401-2 response - log.Debug("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } - - // 200 response - services.ResponseStatusOK200Null(w) -} - -var ( - MAX_RMUID_NUM = config.GetRmUIDMaxNumFromConfig() - MAX_ALARMID_NUM = config.GetAlarmIDMaxNumFromConfig() - MAX_PMUID_NUM = config.GetPmIDMaxNumFromConfig() - MAX_SUBID_NUM = config.GetSubIDMaxNumFromConfig() - MAX_URI_LEN = config.GetUriMaxLenFromConfig() - RMUID_REGEXP = config.GetRmUIDRegexpFromConfig() -) - -func CheckParameterName(r *http.Request) []string { - var errorParams []string - vars := r.URL.Query() - for k, v := range vars { - log.Debug("vars:", k, v) - if k != "rmUIDs" && k != "fields" { - errorParams = append(errorParams, k) - } - } - - return errorParams -} - -func GetRmUIDArr(r *http.Request) []string { - vars := r.URL.Query() - rmUIDs, ok := vars["rmUIDs"] - if !ok { - log.Debug("rmUIDs is not exist") - return nil - } - - var rmUIDValues []string - for _, r := range rmUIDs { - if r != "" { - rmUIDValues = global.MergeStringArr(rmUIDValues, strings.Split(r, `,`)) - } - } - - return rmUIDValues -} - -func GetAttrNameArr(r *http.Request) []string { - vars := r.URL.Query() - fields, ok := vars["fields"] - if !ok { - log.Debug("attributeNames does not exist") - return nil - } - var attrNames []string - for _, a := range fields { - if a != "" { - attrNames = global.MergeStringArr(attrNames, strings.Split(a, `,`)) - } - } - - return attrNames -} - -func CheckValidRmUID(rmUIDs []string) []string { - log.Debug("GetLocalRmUID processing... ") - - var invalidRmUIDs []string - for _, r := range rmUIDs { - if !global.MatchRmUID(RMUID_REGEXP, r) { - invalidRmUIDs = append(invalidRmUIDs, r) - } - } - - return invalidRmUIDs -} - -func CheckLocalRmUID(rmUIDs []string) string { - log.Debug("GetLocalRmUID processing... ") - - rmUID := config.GetRmUIDFromConfig() - for _, r := range rmUIDs { - if r == rmUID { - return rmUID - } - } - - return "" -} - -func GetNRMByUri(w http.ResponseWriter, r *http.Request) { - log.Debug("GetNRMByUri processing... ") - - // response 414-4 uri too long ? (optional) - // todo ... ? - if bytes.Count([]byte(r.RequestURI), nil) > MAX_URI_LEN { - log.Debug("Request Uri too long:", bytes.Count([]byte(r.RequestURI), nil)) - services.ResponseRequestURITooLong414UriTooLong(w) - return - } - - // check media type(content type) only support "application/json" - // response 415-1 - if !IsVallidContentType(r) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // error processing ... - // 401-1 response - token, ret := globalSession.IsCarriedToken(r) - if !ret { - log.Debug("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - // 401-2 response - if globalSession.IsValidToken(token) { - log.Debug("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] { - log.Debug("User permission deny") - services.ResponseForbidden403NotPermission(w) - return - } - - vars := mux.Vars(r) - qeuryUri := vars["apiCategory"] + "/" + vars["elementTypeValue"] + "/" + vars["objectTypeValue"] - log.Debug("Get by Uri: ", qeuryUri) - - apiVer := vars["apiVersion"] - if apiVer != "v1" { - log.Debug("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 406-1 - rmUIDValues := GetRmUIDArr(r) - if rmUIDValues == nil { - log.Debug("missing parameter: rmUIDs") - services.ResponseNotAcceptable406MissingParam(w) - return - } - - // response 406-2 - errorParams := CheckParameterName(r) - if errorParams != nil { - log.Debug("parameter name error: ", errorParams) - services.ResponseNotAcceptable406ParamError(w, errorParams) - return - } - - // response 400-5 - if len(rmUIDValues) == 0 { - log.Debug("rmUIDs is wrong or NULL") - services.ResponseBadRequest400WrongParamValue(w) - return - } - - // response 414-1 - if len(rmUIDValues) > MAX_RMUID_NUM { - log.Debug("rmUID greater than", MAX_RMUID_NUM) - services.ResponseRequestURITooLong414NRMNumExceed(w, MAX_RMUID_NUM) - return - } - - // response 400-1 - // check rmUID is valid - // todo ... - invalidRmUIDs := CheckValidRmUID(rmUIDValues) - if len(invalidRmUIDs) != 0 { - log.Debug("rmUID is invalid") - services.ResponseBadRequest400RmUIDsIsInvalid(w, invalidRmUIDs) - return - } - - // response 404-2 - rmUID := CheckLocalRmUID(rmUIDValues) - if rmUID == "" { - log.Debug("rmUID does not exist") - services.ResponseNotFound404NRMNotExist(w, rmUIDValues) - return - } - - // response 404-1, uri is not exist in map - attrNames := GetAttrNameArr(r) - var Oids []string - Oids = *config.GetOidByFileds(qeuryUri, attrNames, &Oids) - if len(Oids) == 0 { - log.Debug("Nothing of config map") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 404-1, uri is not exist in map - var nameOids []config.NameOid - nameOids = *config.GetDataOidByFields(qeuryUri, attrNames, &nameOids) - if len(nameOids) == 0 { - log.Debug("Nothing of config map") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - result, err2 := g.Default.Get(Oids) // Get() accepts up to g.MAX_OIDS - if err2 != nil { - log.Fatalf("Get() err: %v", err2) - - } - - // var nameValues []config.NameValue - var nameValue config.NameValue - - nameValues := make(map[string]interface{}) - nameValues["rmUID"] = rmUID - for i, variable := range result.Variables { - nameValue.Name = nameOids[i].Name - log.Debugf("%d: oid: %s name: %s\n", i, variable.Name, nameValue.Name) - // if nameOids[i].Oid == variable.Name && global.IsContain(attributeNames, nameValue.Name) { - if nameOids[i].Oid == variable.Name { - // the Value of each variable returned by Get() implements - // interface{}. You could do a type switch... - switch variable.Type { - case g.OctetString: - bytes := variable.Value.([]byte) - log.Debugf("string: %s\n", string(bytes)) - nameValue.Value = string(bytes) - nameValues[nameValue.Name] = nameValue.Value - case g.Integer: - value := variable.Value.(int) - log.Debugf("integer: %d\n", value) - nameValue.Value = strconv.Itoa(value) - nameValues[nameValue.Name] = nameValue.Value - case g.IPAddress: - value := variable.Value.(string) - log.Debugf("IPAddress: %s\n", variable.Value) - nameValue.Value = value - nameValues[nameValue.Name] = nameValue.Value - default: - // ... or often you're just interested in numeric values. - // ToBigInt() will return the Value as a BigInt, for plugging - // into your calculations. - log.Debugf("number: %d\n", g.ToBigInt(variable.Value)) - } - } - } - - getResponse := services.DataResponse{Data: nameValues} - services.ResponseWithJson(w, http.StatusOK, getResponse) -} - -func RestfulPut(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - queryNo := vars["no"] - var targetTodo stTodo - for _, Todo := range TodoList { - if Todo.No == queryNo { - targetTodo = Todo - } - } - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func RestfulHead(w http.ResponseWriter, r *http.Request) { - var targetTodo stTodo - - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) - -} - -func RemoveElement(TodoList []stTodo, No string) stTodo { - // var targetTodo stTodo - j := 0 - if len(TodoList) == 0 { - return TodoList[j] - } - - for i := 0; i < len(TodoList); i++ { - if TodoList[i].No != No { - if i != j { - TodoList[i], TodoList[j] = TodoList[j], TodoList[i] - } - j++ - } - } - log.Debug(TodoList[j].No, TodoList[j].Item) - return TodoList[j] -} - -func RestfulDelete(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - queryNo := vars["no"] //获取No - - log.Debug("RestfulDelete processing... ") - - targetTodo := RemoveElement(TodoList, queryNo) - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func RestfulOptions(w http.ResponseWriter, r *http.Request) { - var targetTodo stTodo - - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) - -} - -func RestfulTrace(w http.ResponseWriter, r *http.Request) { - var targetTodo stTodo - - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) - -} - -func RestfulPatch(w http.ResponseWriter, r *http.Request) { - var targetTodo stTodo - - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) - -} diff --git a/features/lm/file_export/controller.go b/features/lm/file_export/controller.go deleted file mode 100644 index 54eeed7c..00000000 --- a/features/lm/file_export/controller.go +++ /dev/null @@ -1,138 +0,0 @@ -package file_export - -import ( - "encoding/json" - "net/http" - "os" - "path/filepath" - - "be.ems/lib/file" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - "be.ems/src/framework/i18n" - "be.ems/src/framework/reqctx" - "github.com/gin-gonic/gin" -) - -type SysJobResponse struct { - SysJob - TableName string `json:"tableName"` - TableDisplay string `json:"tableDisplay"` - FilePath string `json:"filePath"` -} - -type TargetParams struct { - Hour int `json:"hour"` // hour - TableName string `json:"tableName"` - Columns []string `json:"columns"` - FilePath string `json:"filePath"` // file path -} - -func (m *SysJob) GetFileExportTable(c *gin.Context) { - var results []SysJob - - tx := db.DB("").Table("sys_job").Where("invoke_target=?", INVOKE_FILE_EXPORT) - if err := tx.Find(&results).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - language := reqctx.AcceptLanguage(c) - var response []SysJobResponse - for _, job := range results { - var params TargetParams - if err := json.Unmarshal([]byte(job.TargetParams), ¶ms); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - TableDisplay := i18n.TKey(language, "table."+params.TableName) - if TableDisplay == "" { - TableDisplay = params.TableName - } - response = append(response, SysJobResponse{ - SysJob: job, - TableName: params.TableName, - TableDisplay: TableDisplay, - FilePath: params.FilePath, - }) - } - c.JSON(http.StatusOK, services.DataResp(response)) -} - -func (m *FileExport) GetFileList(c *gin.Context) { - var querys FileExportQuery - - if err := c.ShouldBindQuery(&querys); 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 *FileExport) 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 *FileExport) DownloadHandler(c *gin.Context) { - dir := c.Query("path") - fileName := c.Param("fileName") - filePath := filepath.Join(dir, 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 *FileExport) Delete(c *gin.Context) { - fileName := c.Param("fileName") - dir := c.Query("path") - filePath := filepath.Join(dir, fileName) - - if err := os.Remove(filePath); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusNoContent, nil) // 204 No Content -} diff --git a/features/lm/file_export/model.go b/features/lm/file_export/model.go deleted file mode 100644 index 33a611f9..00000000 --- a/features/lm/file_export/model.go +++ /dev/null @@ -1,30 +0,0 @@ -package file_export - -import ( - "be.ems/lib/file" -) - -const ( - INVOKE_FILE_EXPORT = "exportTable" -) - -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 (m *SysJob) TableName() string { - return "sys_job" -} - -type FileExport struct { - file.FileInfo -} - -type FileExportQuery struct { - Path string `form:"path" binding:"required"` - Suffix string `form:"suffix"` - PageNum int64 `form:"pageNum" binding:"required"` - PageSize int64 `form:"pageSize" binding:"required"` -} diff --git a/features/lm/file_export/route.go b/features/lm/file_export/route.go deleted file mode 100644 index de9a05e6..00000000 --- a/features/lm/file_export/route.go +++ /dev/null @@ -1,39 +0,0 @@ -package file_export - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for file_export -func Register(r *gin.RouterGroup) { - - lmTable := r.Group("/table") - { - var m *SysJob - lmTable.GET("/list", - middleware.AuthorizeUser(nil), - m.GetFileExportTable, - ) - } - lmFile := r.Group("/file") - { - var f *FileExport - lmFile.GET("/list", - middleware.AuthorizeUser(nil), - f.GetFileList, - ) - lmFile.GET("/total", - middleware.AuthorizeUser(nil), - f.Total, - ) - lmFile.GET("/:fileName", - middleware.AuthorizeUser(nil), - f.DownloadHandler, - ) - lmFile.DELETE("/:fileName", - middleware.AuthorizeUser(nil), - f.Delete, - ) - } -} diff --git a/features/lm/logbak.go b/features/lm/logbak.go deleted file mode 100644 index 99a36ae6..00000000 --- a/features/lm/logbak.go +++ /dev/null @@ -1,103 +0,0 @@ -package lm - -import ( - "fmt" - "net/http" - "os/exec" - "time" - - "be.ems/lib/config" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - - "github.com/gorilla/mux" -) - -type XormResponse struct { - Data interface{} `json:"data"` -} - -type XormInsertResponse struct { - Data interface{} `json:"data"` -} - -var ( - ExtBackupDataUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}/backup" // for external - - CustomExtBackupDataUri = config.UriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}/backup" // for external -) - -// func init() { -// conf := config.GetYamlConfig() -// InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, -// conf.Database.Host, conf.Database.Port, conf.Database.Name) -// } - -func ExtDatabaseBackupData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseBackupData processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - module := vars["managementModule"] - dbname := vars["dataStorage"] - tbname := vars["dataObject"] - pack := "lm" - log.Debugf("method:%s, module:%s dbname:%s, tbname:%s pack:%s", r.Method, module, dbname, tbname, pack) - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("permission deny!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - var sql string - var filePath string - switch tbname { - case "operation_log": - filePath = fmt.Sprintf("/tmp/%s-%s.csv", tbname, time.Now().Local().Format(global.DateData)) - sql = fmt.Sprintf("select * into outfile '%s' fields terminated by ',' escaped by '' optionally enclosed by '' lines terminated by '\n' from (select 'op_id','account_name','op_ip','subsys_tag','op_type','op_content','op_result','begin_time','end_time','vnf_flag','log_time' union select op_id,account_name,op_ip,subsys_tag,op_type,op_content,op_result,begin_time,end_time,vnf_flag,log_time from operation_log) b", filePath) - case "security_log": - filePath = fmt.Sprintf("/tmp/%s-%s.csv", tbname, time.Now().Local().Format(global.DateData)) - sql = fmt.Sprintf("select * into outfile '%s' fields terminated by ',' escaped by '' optionally enclosed by '' lines terminated by '\n' from (select 'id','account_name','account_type','op_ip','op_type','op_content','op_result','op_time' union select id,account_name,account_type,op_ip,op_type,op_content,op_result,op_time from security_log) b", filePath) - case "alarm_log": - filePath = fmt.Sprintf("/tmp/%s-%s.csv", tbname, time.Now().Local().Format(global.DateData)) - sql = fmt.Sprintf("select * into outfile '%s' fields terminated by ',' escaped by '' optionally enclosed by '' lines terminated by '\n' from (select 'id','ne_type','ne_id','alarm_seq','alarm_id','alarm_code','alarm_status','event_time','log_time' union select id,ne_type,ne_id,alarm_seq,alarm_id,alarm_code,alarm_status,event_time,log_time from alarm_log) b", filePath) - default: - log.Error("error target table") - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - affected, err := db.ExecDB("", sql, nil) - if err != nil { - log.Error("Failed to exec SQL:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - log.Debugf("filePath:%s backup dir:%s", filePath, config.GetYamlConfig().OMC.Backup) - cmd := exec.Command("cp", "-rf", filePath, config.GetYamlConfig().OMC.Backup) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to exec:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tbname] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} diff --git a/features/lm/service.go b/features/lm/service.go deleted file mode 100644 index 5cdaa943..00000000 --- a/features/lm/service.go +++ /dev/null @@ -1,17 +0,0 @@ -// log management package - -package lm - -import ( - "be.ems/features/lm/file_export" - "be.ems/lib/log" - "github.com/gin-gonic/gin" -) - -func InitSubServiceRoute(r *gin.Engine) { - log.Info("======init Log management group gin.Engine") - - lmGroup := r.Group("/lm") - // register sub modules routes - file_export.Register(lmGroup) -} diff --git a/features/mml/mml.go b/features/mml/mml.go deleted file mode 100644 index 867c41e6..00000000 --- a/features/mml/mml.go +++ /dev/null @@ -1,705 +0,0 @@ -package mml - -import ( - "encoding/json" - "fmt" - "io" - "net" - "net/http" - "regexp" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/mmlp" - "be.ems/lib/services" - "be.ems/src/framework/constants" - neModel "be.ems/src/modules/network_element/model" - neService "be.ems/src/modules/network_element/service" -) - -// const ( -// //经过测试,linux下,延时需要大于100ms -// TIME_DELAY_AFTER_WRITE = 200 -// TIME_DEAD_LINE = 10 -// ) - -type Response struct { - Data []string `json:"data"` -} - -type MMLRequest struct { - MML []string `json:"mml"` -} - -var ( - // MML interface - UriMML = config.DefaultUriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" - UriMML2 = config.DefaultUriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml2" - UriMMLDiscard = config.DefaultUriPrefix + "/opeartionManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" - UriNeOmMml = config.DefaultUriPrefix + "/omManagement/{apiVersion}/mml/{netype}/{neid}" - UriOmMmlExt = config.DefaultUriPrefix + "/{managedType}/{apiVersion}/elementType/OMC/objectType/mml" - UriOmMmlInt = config.DefaultUriPrefix + "/omManagement/{apiVersion}/mml/{neType}/{neId}" - - CustomUriMML = config.UriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" - CustomUriMML2 = config.UriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml2" - CustomUriNeOmMml = config.UriPrefix + "/omManagement/{apiVersion}/mml/{netype}/{neid}" - CustomUriOmMmlExt = config.UriPrefix + "/opeartionManagement/{apiVersion}/elementType/OMC/objectType/mml" - CustomUriOmMmlInt = config.UriPrefix + "/omManagement/{apiVersion}/mml/{neType}/{neId}" -) - -var ( - TIME_DELAY_AFTER_WRITE time.Duration = 200 - TIME_DEAD_LINE time.Duration = 10 - WIN_ROW_SIZE int16 = 200 - WIN_COL_SIZE int16 = 120 - BUFFER_SIZE int = 65535 -) - -func InitMML() { - 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) - } - WIN_ROW_SIZE = config.GetYamlConfig().MML.SizeRow - WIN_COL_SIZE = config.GetYamlConfig().MML.SizeCol - BUFFER_SIZE = config.GetYamlConfig().MML.BufferSize -} - -func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { - log.Info("PostMML2ToNF processing... ") - - 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.NewNeInfo.Find(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 - hostMML := net.JoinHostPort(telnetHost.Addr, fmt.Sprintf("%d", 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 - } - - 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.NewNeInfo.Find(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 := net.JoinHostPort(telnetHost.Addr, fmt.Sprintf("%d", 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 := net.JoinHostPort(telnetHost.Addr, fmt.Sprintf("%d", 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 := net.JoinHostPort(telnetHost.Addr, fmt.Sprintf("%d", 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)) - 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 - } - - 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) - - // UDM 特殊命令处理 - if neType == "UDM" && mml == "dec key" { - output, err := neService.NewNeInfo.NeRunSSHCmd(neInfo.NeType, neInfo.NeId, "cat /usr/local/etc/udm/ueKeyProfile.tmp") - if err != nil { - mmlResult = append(mmlResult, err.Error()) - } else { - mmlResult = append(mmlResult, output) - } - } - } - } - - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMMLToOMC processing... ") - - 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) - - neInfoArr := neService.NewNeInfo.Find(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) - if len(neInfoArr) < 1 { - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - 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 { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - hostUri := fmt.Sprintf("http://%s:%d", neInfo.IP, neInfo.Port) - omcMmlVar := &mmlp.MmlVar{ - Version: global.Version, - Output: mmlp.DefaultFormatType, - MmlHome: config.GetYamlConfig().MML.MmlHome, - Limit: 50, - User: "", - SessionToken: "", // 旧token - Authorization: r.Header.Get(constants.HEADER_KEY), // 请求Token - HttpUri: hostUri, - UserAgent: config.GetDefaultUserAgent(), - } - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - var mmlResult []string - mmlLine := strings.Join(mmlRequest.MML, ";") - - var mmlCmds []mmlp.MmlCommand - if err = mmlp.ParseMMLCommand(mmlLine, &mmlCmds); err != nil { - response := fmt.Sprintf("parse command error: %v\n", err) - mmlResult = append(mmlResult, response) - } - - for _, mmlCmd := range mmlCmds { - output, err := mmlp.TransMml2HttpReq(omcMmlVar, &mmlCmd) - if err != nil { - response := fmt.Sprintf("translate MML command error: %v]\n", err) - mmlResult = append(mmlResult, response) - } - mmlResult = append(mmlResult, string(*output)) - } - - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) -} diff --git a/features/nbi/file/controller.go b/features/nbi/file/controller.go deleted file mode 100644 index cc5edc88..00000000 --- a/features/nbi/file/controller.go +++ /dev/null @@ -1,257 +0,0 @@ -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 deleted file mode 100644 index 5dcdd9fa..00000000 --- a/features/nbi/file/model.go +++ /dev/null @@ -1,47 +0,0 @@ -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 deleted file mode 100644 index 45c87e62..00000000 --- a/features/nbi/file/route.go +++ /dev/null @@ -1,26 +0,0 @@ -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.AuthorizeUser(nil), - f.GetFileList, - ) - fileNBI.GET("/:category/:type/:dateIndex", - middleware.AuthorizeUser(nil), - f.GetSingleFileHandler, - ) - fileNBI.GET("/:category/:type", - middleware.AuthorizeUser(nil), - f.GetMultiFileHandler, - ) - } -} diff --git a/features/nbi/nbi.go b/features/nbi/nbi.go deleted file mode 100644 index 44ce90dd..00000000 --- a/features/nbi/nbi.go +++ /dev/null @@ -1,258 +0,0 @@ -package nbi - -import ( - "bytes" - "fmt" - "net/http" - "strings" - - "be.ems/lib/dborm" - "github.com/go-resty/resty/v2" - - "github.com/gorilla/mux" - - "be.ems/lib/config" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/oauth" - "be.ems/lib/services" -) - -type ErrorOAuthResponse struct { - Error map[string]interface{} -} - -type FailOAuthResponse struct { - Error struct { - ErrorCode string - ErrorInfo string - } -} - -type ApiResponse struct { - ResultCode string - ResultMessage interface{} -} - -//var globalSession = session.NewSessManager("restagent") - -var ( - MAX_RMUID_NUM int - MAX_ALARMID_NUM int - MAX_PMUID_NUM int - MAX_SUBID_NUM int - MAX_URI_LEN int - RMUID_REGEXP string -) - -var ( - // Northbound interface - GetNRMUri = config.DefaultUriPrefix + "/resourceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" - NorthboundGetAlarmUri = config.DefaultUriPrefix + "/faultManagement/{apiVersion}/alarms" // ?alarmIds={alarmIdValues} - - CustomGetNRMUri = config.UriPrefix + "/resourceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" -) - -func CheckParameterName(r *http.Request) []string { - var errorParams []string - vars := r.URL.Query() - for k, v := range vars { - log.Debug("vars:", k, v) - if k != "rmUIDs" && k != "fields" { - errorParams = append(errorParams, k) - } - } - - return errorParams -} - -func GetRmUIDArr(r *http.Request) []string { - vars := r.URL.Query() - rmUIDs, ok := vars["rmUIDs"] - if !ok { - log.Debug("rmUIDs is not exist") - return nil - } - - var rmUIDValues []string - for _, r := range rmUIDs { - if r != "" { - rmUIDValues = global.MergeStringArr(rmUIDValues, strings.Split(r, `,`)) - } - } - - return rmUIDValues -} - -func GetAttrNameArr(r *http.Request) []string { - vars := r.URL.Query() - fields, ok := vars["fields"] - if !ok { - log.Debug("attributeNames does not exist") - return nil - } - var attrNames []string - for _, a := range fields { - if a != "" { - attrNames = global.MergeStringArr(attrNames, strings.Split(a, `,`)) - } - } - - return attrNames -} - -func CheckValidRmUID(rmUIDs []string) []string { - log.Debug("CheckValidRmUID processing... ") - - var invalidRmUIDs []string - for _, r := range rmUIDs { - if !global.MatchRmUID(RMUID_REGEXP, r) { - invalidRmUIDs = append(invalidRmUIDs, r) - } - } - - return invalidRmUIDs -} - -func CheckLocalRmUID(rmUIDs []string) string { - log.Debug("GetLocalRmUID processing... ") - - rmUID := config.GetRmUIDFromConfig() - for _, r := range rmUIDs { - if r == rmUID { - return rmUID - } - } - - return "" -} - -func NBIGetNRMFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("NBIGetNRMFromNF processing... ") - - // response 414-4 uri too long ? (optional) - // todo ... ? - if bytes.Count([]byte(r.RequestURI), nil) > config.GetUriMaxLenFromConfig() { - log.Error("Request Uri too long:", bytes.Count([]byte(r.RequestURI), nil), config.GetUriMaxLenFromConfig()) - services.ResponseRequestURITooLong414UriTooLong(w) - return - } - - // check media type(content type) only support "application/json" - // response 415-1 - if !services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // error processing ... - // 401-1 response - token, ret := oauth.IsCarriedToken(r) - if ret == false { - log.Error("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - // 401-2 response - if dborm.XormExistValidToken(token, config.GetExpiresFromConfig()) == false { - log.Error("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } - - _, err := dborm.XormUpdateSessionShakeTime(token) - if err != nil { - log.Error("Failed to update session table:", err) - 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.Debug("User permission deny") - services.ResponseForbidden403NotPermission(w) - return - } - */ - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - - apiVer := vars["apiVersion"] - if apiVer != "v1" { - log.Error("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 406-1 - rmUIDValues := GetRmUIDArr(r) - if rmUIDValues == nil { - log.Error("missing parameter: rmUIDs") - services.ResponseNotAcceptable406MissingParam(w) - return - } - - // response 406-2 - errorParams := CheckParameterName(r) - if errorParams != nil { - log.Error("parameter name error: ", errorParams) - services.ResponseNotAcceptable406ParamError(w, errorParams) - return - } - - // response 400-5 - if len(rmUIDValues) == 0 { - log.Error("rmUIDs is wrong or NULL") - services.ResponseBadRequest400WrongParamValue(w) - return - } - - // response 414-1 - if len(rmUIDValues) > config.GetYamlConfig().Params.RmUIDMaxNum { - log.Error("rmUID greater than", config.GetYamlConfig().Params.RmUIDMaxNum) - services.ResponseRequestURITooLong414NRMNumExceed(w, config.GetYamlConfig().Params.RmUIDMaxNum) - return - } - - var response *resty.Response - respMsg := make(map[string]interface{}) - for _, rmUID := range rmUIDValues { - neInfo, err := dborm.XormGetNeInfoByRmUID(neType, rmUID) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: GET ", requestURI2NF) - - client := resty.New() - response, err = client.R(). - EnableTrace(). - 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 from NF:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - switch response.StatusCode() { - case http.StatusOK, http.StatusAccepted, http.StatusNoContent, http.StatusCreated: - respMsg["data"] = response - default: - if response != nil { - services.TransportResponse(w, response.StatusCode(), response.Body()) - } - } - } - - services.TransportResponse(w, response.StatusCode(), response.Body()) -} diff --git a/features/nbi/service.go b/features/nbi/service.go deleted file mode 100644 index 7b913d5c..00000000 --- a/features/nbi/service.go +++ /dev/null @@ -1,16 +0,0 @@ -// 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/features/nbi/snmp.go b/features/nbi/snmp.go deleted file mode 100644 index 9e5e727b..00000000 --- a/features/nbi/snmp.go +++ /dev/null @@ -1,203 +0,0 @@ -package nbi - -import ( - "bytes" - "fmt" - "net/http" - "strconv" - - "github.com/gorilla/mux" - g "github.com/gosnmp/gosnmp" - - "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/services" -) - -func init() { - conf := config.GetYamlConfig() - // Default is a pointer to a GoSNMP struct that contains sensible defaults - // eg port 161, community public, etc - g.Default.Target = conf.NE.Addr - g.Default.Port = conf.NE.Port - err := g.Default.Connect() - if err != nil { - fmt.Printf("Connect() err: %v", err) - } - //defer g.Default.Conn.Close() - MAX_RMUID_NUM = config.GetRmUIDMaxNumFromConfig() - MAX_ALARMID_NUM = config.GetAlarmIDMaxNumFromConfig() - MAX_PMUID_NUM = config.GetPmIDMaxNumFromConfig() - MAX_SUBID_NUM = config.GetSubIDMaxNumFromConfig() - MAX_URI_LEN = config.GetUriMaxLenFromConfig() - RMUID_REGEXP = config.GetRmUIDRegexpFromConfig() -} - -func GetNRMByUri(w http.ResponseWriter, r *http.Request) { - log.Debug("GetNRMByUri processing... ") - - // response 414-4 uri too long ? (optional) - // todo ... ? - if bytes.Count([]byte(r.RequestURI), nil) > MAX_URI_LEN { - log.Error("Request Uri too long:", bytes.Count([]byte(r.RequestURI), nil)) - services.ResponseRequestURITooLong414UriTooLong(w) - return - } - - // check media type(content type) only support "application/json" - // response 415-1 - if !services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // error processing ... - // 401-1 response - // 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 - // } - // 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 - // } - - vars := mux.Vars(r) - qeuryUri := vars["apiCategory"] + "/" + vars["elementTypeValue"] + "/" + vars["objectTypeValue"] - log.Debug("Get by Uri: ", qeuryUri) - - apiVer := vars["apiVersion"] - if apiVer != "v1" { - log.Error("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 406-1 - rmUIDValues := GetRmUIDArr(r) - if rmUIDValues == nil { - log.Error("missing parameter: rmUIDs") - services.ResponseNotAcceptable406MissingParam(w) - return - } - - // response 406-2 - errorParams := CheckParameterName(r) - if errorParams != nil { - log.Error("parameter name error: ", errorParams) - services.ResponseNotAcceptable406ParamError(w, errorParams) - return - } - - // response 400-5 - if len(rmUIDValues) == 0 { - log.Error("rmUIDs is wrong or NULL") - services.ResponseBadRequest400WrongParamValue(w) - return - } - - // response 414-1 - if len(rmUIDValues) > MAX_RMUID_NUM { - log.Error("rmUID greater than", MAX_RMUID_NUM) - services.ResponseRequestURITooLong414NRMNumExceed(w, MAX_RMUID_NUM) - return - } - - // response 400-1 - // check rmUID is valid - // todo ... - invalidRmUIDs := CheckValidRmUID(rmUIDValues) - if len(invalidRmUIDs) != 0 { - log.Error("rmUID is invalid") - services.ResponseBadRequest400RmUIDsIsInvalid(w, invalidRmUIDs) - return - } - - // response 404-2 - rmUID := CheckLocalRmUID(rmUIDValues) - if rmUID == "" { - log.Error("rmUID does not exist") - services.ResponseNotFound404NRMNotExist(w, rmUIDValues) - return - } - - // response 404-1, uri is not exist in map - attrNames := GetAttrNameArr(r) - var Oids []string - Oids = *config.GetOidByFileds(qeuryUri, attrNames, &Oids) - if len(Oids) == 0 { - log.Error("Nothing of config map") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 404-1, uri is not exist in map - var nameOids []config.NameOid - nameOids = *config.GetDataOidByFields(qeuryUri, attrNames, &nameOids) - if len(nameOids) == 0 { - log.Error("Nothing of config map") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - result, err2 := g.Default.Get(Oids) // Get() accepts up to g.MAX_OIDS - if err2 != nil { - log.Fatalf("Get() err: %v", err2) - - } - - // var nameValues []config.NameValue - var nameValue config.NameValue - - nameValues := make(map[string]interface{}) - nameValues["rmUID"] = rmUID - for i, variable := range result.Variables { - nameValue.Name = nameOids[i].Name - log.Debugf("%d: oid: %s name: %s\n", i, variable.Name, nameValue.Name) - // if nameOids[i].Oid == variable.Name && global.IsContain(attributeNames, nameValue.Name) { - if nameOids[i].Oid == variable.Name { - // the Value of each variable returned by Get() implements - // interface{}. You could do a type switch... - switch variable.Type { - case g.OctetString: - bytes := variable.Value.([]byte) - log.Debugf("string: %s\n", string(bytes)) - nameValue.Value = string(bytes) - nameValues[nameValue.Name] = nameValue.Value - case g.Integer: - value := variable.Value.(int) - log.Debugf("integer: %d\n", value) - nameValue.Value = strconv.Itoa(value) - nameValues[nameValue.Name] = nameValue.Value - case g.IPAddress: - value := variable.Value.(string) - log.Debugf("IPAddress: %s\n", variable.Value) - nameValue.Value = value - nameValues[nameValue.Name] = nameValue.Value - default: - // ... or often you're just interested in numeric values. - // ToBigInt() will return the Value as a BigInt, for plugging - // into your calculations. - log.Debugf("number: %d\n", g.ToBigInt(variable.Value)) - } - } - } - - getResponse := services.DataResponse{nameValues} - services.ResponseWithJson(w, http.StatusOK, getResponse) -} diff --git a/features/pm/kpi_c_report/controller.go b/features/pm/kpi_c_report/controller.go deleted file mode 100644 index 63350aa9..00000000 --- a/features/pm/kpi_c_report/controller.go +++ /dev/null @@ -1,349 +0,0 @@ -package kpi_c_report - -import ( - "encoding/json" - "fmt" - "net/http" - "strconv" - "strings" - - "be.ems/lib/services" - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/parse" - "github.com/gin-gonic/gin" -) - -func (k *KpiCReport) Get(c *gin.Context) { - var reports []KpiCReport - var conditions []string - var params []any - - var querys KpiCReportQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) - return - } - - // construct condition to get - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(querys.NeType)) - } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found NE type")) - return - } - tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dbg := db.DB("").Model(&KpiCReport{}).Table(tableName) - - if querys.NeID != "" { - conditions = append(conditions, "rm_uid = (select n.rm_uid from ne_info n where n.ne_type=? and n.ne_id=?)") - params = append(params, strings.ToUpper(querys.NeType), querys.NeID) - } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found required parameter NE ID")) - return - } - if querys.StartTime != "" { - conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") - params = append(params, querys.EndTime) - } - conditions = append(conditions, "kpi_values != 'null'") - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - // page number and size - if pageSize := querys.PageSize; pageSize > 0 { - dbg = dbg.Limit(pageSize) - if pageNum := querys.PageNum; pageNum > 0 { - dbg = dbg.Offset((pageNum - 1) * pageSize) - } - } - - // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } - - //err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error - err := dbg.Find(&reports).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusOK, services.DataResp(reports)) -} - -func (k *KpiCReport) GetReport2FE(c *gin.Context) { - var results []KpiCReport - var conditions []string - var params []any - - var querys KpiCReportQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // construct condition to get - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(querys.NeType)) - } else { - c.JSON(http.StatusOK, services.ErrResp("Not found required parameter NE type")) - return - } - tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dbg := db.DB("").Model(&KpiCReport{}).Table(tableName) - - if querys.NeID != "" { - conditions = append(conditions, "rm_uid = (select n.rm_uid from ne_info n where n.ne_type=? and n.ne_id=?)") - params = append(params, querys.NeType, querys.NeID) - } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found required parameter NE ID")) - return - } - if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") - params = append(params, querys.EndTime) - } - conditions = append(conditions, "kpi_values != 'null'") - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - // page number and size - if pageSize := querys.PageSize; pageSize > 0 { - dbg = dbg.Limit(pageSize) - if pageNum := querys.PageNum; pageNum > 0 { - dbg = dbg.Offset((pageNum - 1) * pageSize) - } - } - - // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } - - //err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error - err := dbg.Find(&results).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - reports := []map[string]any{} - for _, r := range results { - report := map[string]any{ - // kip_id ... - "neType": *r.NeType, - "neId": querys.NeID, - "neName": *r.NeName, - "rmUID": *r.RmUID, - "startIndex": r.Index, - "timeGroup": r.Date[:10] + " " + *r.EndTime, - "createdAt": r.CreatedAt, - "granularity": r.Granularity, - } - // 解析 JSON 字符串为 map - var kpiValues []map[string]any - err := json.Unmarshal([]byte(r.KpiValues), &kpiValues) - if err != nil { - continue - } - - // 遍历 kpiValues 数组 - for _, k := range kpiValues { - kpiId := fmt.Sprint(k["kpiId"]) - value := parse.Number(k["value"]) - - formatted := fmt.Sprintf("%.3d", value) - formattedFloat, err := strconv.ParseFloat(formatted, 64) - if err != nil { - formattedFloat = 0 - } - report[kpiId] = formattedFloat - } - reports = append(reports, report) - } - c.JSON(http.StatusOK, services.DataResp(reports)) -} - -func (k *KpiCReport) GetTotalList(c *gin.Context) { - var reports []KpiCReport - var conditions []string - var params []any - - var querys KpiCReportQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // construct condition to get - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(querys.NeType)) - } else { - c.JSON(http.StatusOK, services.ErrResp("Not found NE type")) - return - } - tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dbg := db.DB("").Model(&KpiCReport{}).Table(tableName) - - if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") - params = append(params, querys.EndTime) - } - conditions = append(conditions, "kpi_values != 'null'") - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - - // get total number - var total int64 = 0 - err := dbg.Count(&total).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // page number and size - if pageSize := querys.PageSize; pageSize > 0 { - dbg = dbg.Limit(pageSize) - if pageNum := querys.PageNum; pageNum > 0 { - dbg = dbg.Offset((pageNum - 1) * pageSize) - } - } - - // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } - - //err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error - err = dbg.Find(&reports).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.JSON(http.StatusOK, services.TotalDataResp(reports, total)) -} - -func (k *KpiCReport) Total(c *gin.Context) { - var conditions []string - var params []any - - var querys KpiCReportQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // construct condition to get - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(querys.NeType)) - } else { - c.JSON(http.StatusOK, services.ErrResp("Not found NE type")) - return - } - tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dbg := db.DB("").Model(&KpiCReport{}).Table(tableName) - if querys.StartTime != "" { - conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") - params = append(params, querys.EndTime) - } - conditions = append(conditions, "kpi_values != 'null'") - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - var total int64 = 0 - err := dbg.Count(&total).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.JSON(http.StatusOK, services.TotalResp(total)) -} - -func (k *KpiCReport) Post(c *gin.Context) { - var report KpiCReport - - if err := c.ShouldBindJSON(&report); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - dbg := db.DB("").Model(&KpiCReport{}) - if err := dbg.Create(&report).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusCreated, services.DataResp(report)) -} - -func (k *KpiCReport) Put(c *gin.Context) { - var report KpiCReport - id := c.Param("id") - dbg := db.DB("").Model(&KpiCReport{}) - if err := dbg.First(&report, id).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp("custom indicator report not found")) - return - } - - if err := c.ShouldBindJSON(&report); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - db.DB("").Model(&KpiCReport{}).Save(&report) - c.JSON(http.StatusOK, services.DataResp(report)) -} - -func (k *KpiCReport) Delete(c *gin.Context) { - id := c.Param("id") - - if err := db.DB("").Delete(&KpiCReport{}, id).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp("custom indicator report not found")) - return - } - - c.JSON(http.StatusNoContent, nil) // 204 No Content -} - -func InsertKpiCReport(neType string, report KpiCReport) { - tableName := TableName() + "_" + strings.ToLower(neType) - dbg := db.DB("").Model(&KpiCReport{}) - if err := dbg.Table(tableName).Create(&report).Error; err != nil { - return - } -} diff --git a/features/pm/kpi_c_report/model.go b/features/pm/kpi_c_report/model.go deleted file mode 100644 index 82a3c505..00000000 --- a/features/pm/kpi_c_report/model.go +++ /dev/null @@ -1,42 +0,0 @@ -package kpi_c_report - -type KpiCReport struct { - ID int `gorm:"column:id;primary_key;auto_increment" json:"id"` - NeType *string `gorm:"column:ne_type;default:NULL" json:"neType,omitempty"` - NeName *string `gorm:"column:ne_name;default:" json:"neName,omitempty"` - RmUID *string `gorm:"column:rm_uid;" json:"rmUid,omitempty"` - Date string `gorm:"column:date" json:"date"` // time.Time `gorm:"column:date" json:"date"` - StartTime *string `gorm:"column:start_time" json:"startTime,omitempty"` - EndTime *string `gorm:"column:end_time" json:"endTime,omitempty"` - Index int64 `gorm:"column:index" json:"index"` - Granularity *int64 `gorm:"column:granularity" json:"granularity,omitempty"` //Time granualarity: 5/10/.../60/300 (second) - KpiValues string `gorm:"column:kpi_values" json:"kpiValues,omitempty"` - CreatedAt *int64 `gorm:"column:created_at" json:"createdAt,omitempty"` -} - -type KpiCReportQuery struct { - NeType string `json:"neType" form:"neType" binding:"required"` - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` - UserName string `json:"userName" form:"userName"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=created_at"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int `json:"pageNum" form:"pageNum"` - PageSize int `json:"pageSize" form:"pageSize"` -} - -type KpiCReport2FE struct { - NeType string `json:"neType" gorm:"column:ne_type"` - NeId string `json:"neId"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUid" gorm:"column:rm_uid"` - TimeGroup string `json:"timeGroup"` - StartIndex int16 `json:"startIndex" gorm:"column:index"` - Granularity int8 `json:"granularity" gorm:"column:granularity"` -} - -func TableName() string { - return "kpi_c_report" -} diff --git a/features/pm/kpi_c_report/route.go b/features/pm/kpi_c_report/route.go deleted file mode 100644 index 037d936c..00000000 --- a/features/pm/kpi_c_report/route.go +++ /dev/null @@ -1,43 +0,0 @@ -package kpi_c_report - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for kpi_c_report -func Register(r *gin.RouterGroup) { - - pmKPIC := r.Group("/kpiC") - { - var k *KpiCReport - pmKPIC.GET("/report", - middleware.AuthorizeUser(nil), - k.GetReport2FE, - ) - pmKPIC.GET("/report/list", - middleware.AuthorizeUser(nil), - k.Get, - ) - pmKPIC.GET("/report/totalList", - middleware.AuthorizeUser(nil), - k.Total, - ) - pmKPIC.GET("/report/total", - middleware.AuthorizeUser(nil), - k.Total, - ) - pmKPIC.POST("/report", - middleware.AuthorizeUser(nil), - k.Post, - ) - pmKPIC.PUT("/report/:id", - middleware.AuthorizeUser(nil), - k.Put, - ) - pmKPIC.DELETE("/report/:id", - middleware.AuthorizeUser(nil), - k.Delete, - ) - } -} diff --git a/features/pm/kpi_c_title/controller.go b/features/pm/kpi_c_title/controller.go deleted file mode 100644 index 50c2b685..00000000 --- a/features/pm/kpi_c_title/controller.go +++ /dev/null @@ -1,312 +0,0 @@ -package kpi_c_title - -import ( - "fmt" - "net/http" - "regexp" - "sort" - "strconv" - "strings" - "time" - - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - "be.ems/src/framework/reqctx" - - "github.com/gin-gonic/gin" -) - -// get customize kpi total and list -func (k *KpiCTitle) GetToalList(c *gin.Context) { - var titles []KpiCTitle - var conditions []string - var params []any - i18n := reqctx.AcceptLanguage(c) - - var querys KpiCTitleQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - dbg := db.DB("").Model(&KpiCTitle{}) - // construct condition to get - if neType := querys.NeType; neType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(neType)) - } - if status := querys.Status; status != "" { - conditions = append(conditions, "status = ?") - params = append(params, status) - } else { - conditions = append(conditions, "status != '2'") - } - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - - // Get total number - var total int64 = 0 - if err := dbg.Count(&total).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // page number and size - if pageSize := querys.PageSize; pageSize > 0 { - dbg = dbg.Limit(pageSize) - if pageNum := querys.PageNum; pageNum > 0 { - dbg = dbg.Offset((pageNum - 1) * pageSize) - } - } - - // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } - if err := dbg.Find(&titles).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - k.expressionAlias(titles, i18n) - - c.JSON(http.StatusOK, services.TotalDataResp(titles, total)) - //c.JSON(http.StatusOK, titles) -} - -func (k *KpiCTitle) Get(c *gin.Context) { - var titles []KpiCTitle - var conditions []string - var params []any - i18n := reqctx.AcceptLanguage(c) - - // construct condition to get - if neType := c.Query("neType"); neType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(neType)) - } - if status := c.Query("status"); status != "" { - conditions = append(conditions, "status = ?") - params = append(params, status) - } else { - conditions = append(conditions, "status != '2'") - } - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - } - if err := db.DB("").Where(whereSql, params...).Find(&titles).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - k.expressionAlias(titles, i18n) - - c.JSON(http.StatusOK, services.DataResp(titles)) - //c.JSON(http.StatusOK, titles) -} - -// alias customized kpi expression with cn/en title -func (k *KpiCTitle) expressionAlias(titles []KpiCTitle, i18n string) { - var title *KpiCTitle - for i := 0; i < len(titles); i++ { - title = &titles[i] - title.ExprAlias = *title.Expression - re := regexp.MustCompile(`'([^']+)'`) - matches := re.FindAllStringSubmatch(title.ExprAlias, -1) - - for _, match := range matches { - var alias, sql string - if i18n == "zh" { - sql = fmt.Sprintf("SELECT cn_title FROM kpi_title WHERE kpi_id='%s'", match[1]) - } else { - sql = fmt.Sprintf("SELECT en_title FROM kpi_title WHERE kpi_id='%s'", match[1]) - } - m, err := db.RawDB("", sql, nil) - if err != nil { - log.Warn("Failed to QueryRow:", err) - continue - } - if len(m) > 0 { - if i18n == "zh" { - alias = fmt.Sprintf("%v", m[0]["cn_title"]) - } else { - alias = fmt.Sprintf("%v", m[0]["en_title"]) - } - } - title.ExprAlias = regexp.MustCompile(match[1]).ReplaceAllString(title.ExprAlias, alias) - } - } -} - -func (k *KpiCTitle) Total(c *gin.Context) { - var conditions []string - var params []any - - // construct condition to get - if neType := c.Query("neType"); neType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(neType)) - } - if status := c.Query("status"); status != "" { - conditions = append(conditions, "status = ?") - params = append(params, status) - } else { - conditions = append(conditions, "status != '2'") - } - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - } - var total int64 = 0 - if err := db.DB("").Table(k.TableName()).Where(whereSql, params...).Count(&total).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.JSON(http.StatusOK, services.TotalResp(total)) -} - -func (k *KpiCTitle) Post(c *gin.Context) { - var title KpiCTitle - if err := c.ShouldBindJSON(&title); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - userName := reqctx.LoginUserToUserName(c) - title.CreatedBy = &userName - tx := db.DB("").Model(&KpiCTitle{}) - result := tx.Where("ne_type=? and (kpi_id=? or title=?) and status!='2'", title.NeType, title.KpiID, title.Title).First(&title) - if result.RowsAffected > 0 { - c.JSON(http.StatusOK, services.ErrResp("custom indicator already exist")) - return - } - - // Regexp match like AMF.C.01 - // kpiIDRegexp := "^" + *title.NeType + "\\.C\\.[0-9]{2}$" - // ret := db.DB("").Table("kpi_c_title"). - // Where("ne_type=? and kpi_id REGEXP ? ORDER BY kpi_id DESC LIMIT 1", title.NeType, kpiIDRegexp).Scan(&res) - // if err := ret.Error; err != nil { - // c.JSON(http.StatusOK, services.ErrResp(err.Error())) - // return - // } - - titles := []KpiCTitle{} - ret := db.DB("").Model(&KpiCTitle{}) - ret = ret.Select("kpi_id").Where("ne_type=?", title.NeType).Find(&titles) - - newKpiID := *title.NeType + ".C" + ".01" - if ret.RowsAffected != 0 { - suffixInt := 1 - prefixStr := fmt.Sprintf("%s.C.", *title.NeType) - sort.SliceStable(titles, func(i, j int) bool { - vi := *titles[i].KpiID - vj := *titles[j].KpiID - if strings.HasPrefix(vi, prefixStr) && strings.HasPrefix(vj, prefixStr) { - vvi := strings.Replace(vi, prefixStr, "", 1) - vvii, err := strconv.Atoi(vvi) - if err != nil { - return false - } - vvj := strings.Replace(vj, prefixStr, "", 1) - vvjj, err := strconv.Atoi(vvj) - if err != nil { - return false - } - return vvii > vvjj // desc - } - return false - }) - maxKpiID := *titles[0].KpiID - prefix := maxKpiID[:len(maxKpiID)-2] - suffix := maxKpiID[len(maxKpiID)-2:] - suffixInt, err := strconv.Atoi(suffix) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - if suffixInt >= MAX_KPI_C_ID { - err := fmt.Errorf("exceed the max customized KPI ID") - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - suffixInt++ - newSuffix := fmt.Sprintf("%02d", suffixInt) - newKpiID = prefix + newSuffix - } - title.KpiID = &newKpiID - txx := db.DB("").Model(&KpiCTitle{}) - if err := txx.Create(&title).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - kpiCReportTable := "kpi_c_report_" + strings.ToLower(*title.NeType) - if !db.DB("").Migrator().HasTable(kpiCReportTable) { - // clone table "kpi_c_report" to "kpi_c_report_{neType}" - sql := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s AS SELECT * FROM %s WHERE 1=0", kpiCReportTable, "kpi_c_report") - if _, err := db.ExecDB("", sql, nil); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - sql = fmt.Sprintf("ALTER TABLE %s MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY IF NOT EXISTS (`id`)", kpiCReportTable) - if _, err := db.ExecDB("", sql, nil); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - sql = fmt.Sprintf("ALTER TABLE %s ADD INDEX IF NOT EXISTS `idx_timestamp`(`created_at`) USING BTREE, ADD INDEX IF NOT EXISTS `idx_uid_datetime`(`rm_uid`, `date`, `start_time`) USING BTREE", kpiCReportTable) - if _, err := db.ExecDB("", sql, nil); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - } - c.JSON(http.StatusCreated, services.DataResp(title)) -} - -func (k *KpiCTitle) Put(c *gin.Context) { - var title KpiCTitle - id := c.Param("id") - - if err := db.DB("").First(&title, id).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp("custom indicator not found")) - return - } - - if err := c.ShouldBindJSON(&title); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - title.UpdatedAt = time.Now().UnixMilli() - db.DB("").Save(&title) - - c.JSON(http.StatusOK, services.DataResp(title)) -} - -func (k *KpiCTitle) Delete(c *gin.Context) { - id := c.Param("id") - - if err := db.DB("").Table(k.TableName()).Where("id=?", id).Update("status", "2").Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.JSON(http.StatusNoContent, nil) // 204 No Content -} - -func GetActiveKPICList(neType string) []KpiCTitle { - k := new([]KpiCTitle) - - err := db.DB("").Where("`ne_type` = ? and `status` = '1'", neType).Find(&k).Error - if err != nil { - return nil - } - return *k -} diff --git a/features/pm/kpi_c_title/model.go b/features/pm/kpi_c_title/model.go deleted file mode 100644 index 05170c4b..00000000 --- a/features/pm/kpi_c_title/model.go +++ /dev/null @@ -1,33 +0,0 @@ -package kpi_c_title - -const ( - MAX_KPI_C_ID = 99 -) - -type KpiCTitle struct { - ID int `gorm:"column:id;primary_key;auto_increment" json:"id"` - NeType *string `gorm:"column:ne_type" json:"neType,omitempty"` - KpiID *string `gorm:"column:kpi_id" json:"kpiId,omitempty"` - Title *string `gorm:"column:title" json:"title,omitempty"` - Expression *string `gorm:"column:expression" json:"expression,omitempty"` - ExprAlias string `gorm:"-" json:"exprAlias"` - Status string `gorm:"column:status" json:"status"` // 0-Inactive/1-Active/2-Deleted - Unit *string `gorm:"column:unit" json:"unit,omitempty"` - Description *string `gorm:"column:description" json:"description,omitempty"` - CreatedBy *string `gorm:"column:created_by" json:"createdBy,omitempty"` - UpdatedAt int64 `gorm:"column:updated_at" json:"updatedAt,omitempty"` -} - -type KpiCTitleQuery struct { - ID int `json:"id" form:"id"` - NeType string `json:"neType" form:"neType"` - Status string `json:"status" form:"status"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=created_at"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int `json:"pageNum" form:"pageNum"` - PageSize int `json:"pageSize" form:"pageSize"` -} - -func (k *KpiCTitle) TableName() string { - return "kpi_c_title" -} diff --git a/features/pm/kpi_c_title/route.go b/features/pm/kpi_c_title/route.go deleted file mode 100644 index 485f3f93..00000000 --- a/features/pm/kpi_c_title/route.go +++ /dev/null @@ -1,39 +0,0 @@ -package kpi_c_title - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for kpi_c_title -func Register(r *gin.RouterGroup) { - - pmKPIC := r.Group("/kpiC") - { - var k *KpiCTitle - pmKPIC.GET("/title", - middleware.AuthorizeUser(nil), - k.Get, - ) - pmKPIC.GET("/title/total", - middleware.AuthorizeUser(nil), - k.Total, - ) - pmKPIC.GET("/title/totalList", - middleware.AuthorizeUser(nil), - k.GetToalList, - ) - pmKPIC.POST("/title", - middleware.AuthorizeUser(nil), - k.Post, - ) - pmKPIC.PUT("/title/:id", - middleware.AuthorizeUser(nil), - k.Put, - ) - pmKPIC.DELETE("/title/:id", - middleware.AuthorizeUser(nil), - k.Delete, - ) - } -} diff --git a/features/pm/performance.go b/features/pm/performance.go deleted file mode 100644 index 0a779084..00000000 --- a/features/pm/performance.go +++ /dev/null @@ -1,1227 +0,0 @@ -package pm - -import ( - "encoding/json" - "fmt" - "io" - "math" - "net/http" - "strconv" - "strings" - "time" - - "be.ems/features/pm/kpi_c_report" - "be.ems/features/pm/kpi_c_title" - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/dborm" - evaluate "be.ems/lib/eval" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/parse" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" - neService "be.ems/src/modules/network_element/service" - wsService "be.ems/src/modules/ws/service" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" -) - -type Response struct { - Data interface{} `json:"data"` -} - -type KpiReport struct { - Timestamp string `json:"TimeStamp"` - Task struct { - Period struct { - StartTime string `json:"StartTime"` - EndTime string `json:"EndTime"` - } `json:"Period"` - NE struct { - NEName string `json:"NEName"` - RmUID string `json:"rmUID"` - NeType string `json:"NeType"` - KPIs []struct { - KPIID string `json:"KPIID"` - Value int64 `json:"Value"` - Err string `json:"Err"` - } `json:"KPIs"` - } `json:"NE"` - } `json:"Task"` -} - -type GoldKpi struct { - // Id int `json:"-" xorm:"pk 'id' autoincr"` - Date string `json:"date" xorm:"date"` - Index int `json:"index"` - Granularity int8 `json:"granularity"` - StartTime string `json:"startTime"` - EndTime string `json:"endTime"` - NEName string `json:"neName" xorm:"ne_name"` - RmUid string `json:"rmUid" xorm:"rm_uid"` - NEType string `json:"neType" xorm:"ne_type"` - KpiId string `json:"kpiId" xorm:"kpi_id"` - Value int64 `json:"value"` - Error string `json:"error"` - Timestamp string `json:"timestamp"` -} - -type KpiData struct { - ID int `json:"id" xorm:"pk 'id' '<-' autoincr"` - NEType string `json:"neType" xorm:"ne_type"` - NEName string `json:"neName" xorm:"ne_name"` - RmUid string `json:"rmUid" xorm:"rm_uid"` - Date string `json:"date" xorm:"date"` - StartTime string `json:"startTime" xorm:"start_time"` - EndTime string `json:"endTime" xorm:"end_time"` - Index int `json:"index" xorm:"index"` - Granularity int64 `json:"granularity" xorm:"granularity"` - KPIValues []KPIVal `json:"kpiValues" xorm:"json 'kpi_values'"` - //CreatedAt int64 `json:"createdAt" xorm:"created 'created_at'"` - CreatedAt int64 `json:"createdAt" xorm:"'created_at'"` -} -type KPIVal struct { - KPIID string `json:"kpi_id" xorm:"kpi_id"` - Value int64 `json:"value" xorm:"value"` - Err string `json:"err" xorm:"err"` -} - -var ( - // performance management - PerformanceUri = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/kpiReport/{index}" - MeasureTaskUri = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measureTask" - MeasureReportUri = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measureReport" - MeasureReportFmt = config.DefaultUriPrefix + "/performanceManagement/v1/elementType/%s/objectType/measureReport" - MeasurementUri = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measurement/{index}" - UriMeasureTask = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/measureTask/{netype}" - - // performance management - CustomPerformanceUri = config.UriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/kpiReport/{index}" - CustomMeasureTaskUri = config.UriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measureTask" - CustomMeasureReportUri = config.UriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measureReport" - CustomMeasureReportFmt = config.UriPrefix + "/performanceManagement/v1/elementType/%s/objectType/measureReport" - CustomMeasurementUri = config.UriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measurement/{index}" - CustomUriMeasureTask = config.UriPrefix + "/performanceManagement/{apiVersion}/measureTask/{netype}" -) - -func GetDateFromTimeString(fmtString string, timeString string) string { - t, _ := time.ParseInLocation(fmtString, timeString, time.Local) - return t.Format("2006-01-02") -} - -func GetDateTimeFromTimeString(fmtString string, timeString string) string { - t, _ := time.ParseInLocation(fmtString, timeString, time.Local) - return t.Format(global.DateTime) -} - -// process KPI report post message from NFs -func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostKPIReportFromNF processing... ") - - apiVer := ctx.GetParam(r, "apiVersion") - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - var kpiReport KpiReport - if err := ctx.ShouldBindJSON(r, &kpiReport); err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - kpiIndexStr := ctx.GetParam(r, "index") - - // insert kpi_report table, no session - saveKPIData(kpiReport, parse.Number(kpiIndexStr)) - saveKPIDataC(kpiReport, parse.Number(kpiIndexStr)) - - services.ResponseStatusOK204NoContent(w) -} - -// saveKPIData 存储KPI数据并推送到ws订阅组 -func saveKPIData(kpiReport KpiReport, index int64) int64 { - timestamp := kpiReport.Timestamp - taskPeriod := kpiReport.Task.Period - taskNe := kpiReport.Task.NE - taskNeKPIs := kpiReport.Task.NE.KPIs - // 时间数据处理 - receiverTime := date.ParseStrToDate(timestamp, date.YYYY_MM_DDTHH_MM_SSZ) - startTime := date.ParseStrToDate(taskPeriod.StartTime, date.YYYY_MM_DDTHH_MM_SSZ) - endTime := date.ParseStrToDate(taskPeriod.EndTime, date.YYYY_MM_DDTHH_MM_SSZ) - granularity := parse.Number(endTime.Sub(startTime).Seconds()) - // kpi data数据json - KpiValues := make([]map[string]any, 0) - for _, v := range taskNeKPIs { - KpiValues = append(KpiValues, map[string]any{ - "kpiId": v.KPIID, - "value": v.Value, - "err": v.Err, - }) - } - KpiValuesByte, _ := json.Marshal(KpiValues) - kpiData := neDataModel.KpiReport{ - NeType: taskNe.NeType, - NeName: taskNe.NEName, - RmUid: taskNe.RmUID, - Date: date.ParseDateToStr(receiverTime, "2006-01-02"), - StartTime: date.ParseDateToStr(startTime, "15:04:05"), - EndTime: date.ParseDateToStr(endTime, "15:04:05"), - Index: index, - Granularity: granularity, - KpiValues: string(KpiValuesByte), - CreatedAt: receiverTime.UnixMilli(), // 时间戳毫秒实际记录到秒 - } - insertId := neDataService.NewKpiReport.Insert(kpiData) - if insertId > 0 { - // 指标事件对象 - kpiEvent := map[string]any{ - "neType": kpiData.NeType, - "neName": kpiData.NeName, - "rmUID": kpiData.RmUid, - "startIndex": kpiData.Index, - "timeGroup": kpiData.CreatedAt, - // kip_id ... - } - for _, v := range taskNeKPIs { - kpiEvent[v.KPIID] = v.Value - } - - // 发送到匹配的网元 - neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid) - if neInfo.RmUID == kpiData.RmUid { - // 推送到ws订阅组 - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent) - if neInfo.NeType == "UPF" { - // 更新UPF总流量 - upValue := parse.Number(kpiEvent["UPF.03"]) - downValue := parse.Number(kpiEvent["UPF.06"]) - neDataService.NewKpiReport.UPFTodayFlowUpdate(neInfo.RmUID, upValue, downValue) - } - } - } - return insertId -} - -// saveKPIDataC 存储自定义KPI数据并推送到ws订阅组 -func saveKPIDataC(kpiReport KpiReport, index int64) int64 { - timestamp := kpiReport.Timestamp - taskPeriod := kpiReport.Task.Period - taskNe := kpiReport.Task.NE - taskNeKPIs := kpiReport.Task.NE.KPIs - // 时间数据处理 - receiverTime := date.ParseStrToDate(timestamp, date.YYYY_MM_DDTHH_MM_SSZ) - startTime := date.ParseStrToDate(taskPeriod.StartTime, date.YYYY_MM_DDTHH_MM_SSZ) - endTime := date.ParseStrToDate(taskPeriod.EndTime, date.YYYY_MM_DDTHH_MM_SSZ) - granularity := parse.Number(endTime.Sub(startTime).Seconds()) - // kpi data数据 - KpiValues := make([]map[string]any, 0) - kpiValMap := map[string]any{} - for _, v := range taskNeKPIs { - kpiValMap[v.KPIID] = v.Value - } - // 自定义kpiId数据 - cTitles := kpi_c_title.GetActiveKPICList(taskNe.NeType) - for _, v := range cTitles { - item := map[string]any{ - "kpiId": *v.KpiID, - "value": 0, - "err": "", - } - // 计算结果 - result, err := evaluate.CalcExpr(*v.Expression, kpiValMap) - if err != nil { - item["value"] = 0 - item["err"] = err.Error() - } else { - if *v.Unit == "%" && result > 100 { - result = 100 - } - if *v.Unit == "%" && result < 0 { - result = 0 - } - item["value"] = result - } - KpiValues = append(KpiValues, item) - } - - KpiValuesByte, _ := json.Marshal(KpiValues) - kpiData := neDataModel.KpiCReport{ - NeType: taskNe.NeType, - NeName: taskNe.NEName, - RmUid: taskNe.RmUID, - Date: date.ParseDateToStr(receiverTime, "2006-01-02"), - StartTime: date.ParseDateToStr(startTime, "15:04:05"), - EndTime: date.ParseDateToStr(endTime, "15:04:05"), - Index: index, - Granularity: granularity, - KpiValues: string(KpiValuesByte), - CreatedAt: receiverTime.UnixMilli(), // 时间戳毫秒实际记录到秒 - } - insertId := neDataService.NewKpiCReport.Insert(kpiData) - if insertId > 0 { - // 指标事件对象 - kpiEvent := map[string]any{ - "neType": kpiData.NeType, - "neName": kpiData.NeName, - "rmUID": kpiData.RmUid, - "startIndex": kpiData.Index, - "timeGroup": kpiData.CreatedAt, - // kip_id ... - } - for _, v := range KpiValues { - kpiEvent[fmt.Sprint(v["kpiId"])] = v["value"] - } - - // 发送到匹配的网元 - neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid) - if neInfo.RmUID == kpiData.RmUid { - // 推送自定义KPI到ws订阅组 - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiEvent) - } - } - return insertId -} - -// process KPI report post message from NFs 旧版 -func PostKPIReportFromNFOld(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) - - layout := time.RFC3339Nano - //kpiDate := GetDateFromTimeString(layout, kpiReport.Task.Period.StartTime) - kpiIndex, _ := strconv.Atoi(vars["index"]) - startTime := global.GetFmtTimeString(layout, kpiReport.Task.Period.StartTime, time.DateTime) - endTime := global.GetFmtTimeString(layout, kpiReport.Task.Period.EndTime, time.DateTime) - // get time granularity from startTime and endTime - seconds, _ := global.GetSecondDuration(startTime, endTime) - var granularity int64 = 60 - if seconds != 0 && seconds <= math.MaxInt8 && seconds >= math.MinInt8 { - granularity = int64(seconds) - } - - // insert into new kpi_report_xxx table - kpiData := new(KpiData) - kpiData.Date = startTime - kpiData.Index = kpiIndex - //stime, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.StartTime, time.Local) - //etime, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.EndTime, time.Local) - kpiData.StartTime = startTime - kpiData.EndTime = endTime - kpiData.Granularity = granularity - kpiData.NEName = kpiReport.Task.NE.NEName - kpiData.NEType = kpiReport.Task.NE.NeType - kpiData.RmUid = kpiReport.Task.NE.RmUID - kpiVal := new(KPIVal) - kpiData.CreatedAt = time.Now().UnixMilli() - - // 黄金指标事件对象 - kpiEvent := map[string]any{ - // kip_id ... - "neType": kpiReport.Task.NE.NeType, - "neName": kpiReport.Task.NE.NEName, - "rmUID": kpiReport.Task.NE.RmUID, - "startIndex": kpiIndex, - "timeGroup": kpiData.CreatedAt, - } - - // for custom kpi - kpiValMap := map[string]any{} - for _, k := range kpiReport.Task.NE.KPIs { - kpiEvent[k.KPIID] = k.Value // kip_id - - kpiVal.KPIID = k.KPIID - kpiVal.Value = int64(k.Value) - kpiVal.Err = k.Err - kpiData.KPIValues = append(kpiData.KPIValues, *kpiVal) - kpiValMap[k.KPIID] = k.Value - } - kpiValMap["granularity"] = kpiData.Granularity - - // insert kpi_report table, no session - tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType) - // affected, err := xEngine.Table(tableName).Insert(kpiData) - tx := db.DB("").Table(tableName).Create(kpiData) - if tx.Error != nil && tx.RowsAffected <= 0 { - log.Errorf("Failed to insert %s:%v", tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - report := kpi_c_report.KpiCReport{ - NeType: &kpiData.NEType, - NeName: &kpiData.NEName, - RmUID: &kpiData.RmUid, - Date: kpiData.Date, - StartTime: &kpiData.StartTime, - EndTime: &kpiData.EndTime, - Index: int64(kpiData.Index), - Granularity: &kpiData.Granularity, - } - - // 发送到匹配的网元 - neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid) - // custom kpi report to FE - kpiCEvent := map[string]any{ - // kip_id ... - "neType": kpiData.NEType, - "neId": neInfo.NeId, - "neName": kpiData.NEName, - "rmUID": kpiData.RmUid, - "startIndex": kpiData.Index, - "timeGroup": kpiData.Date[:10] + " " + kpiData.EndTime, - "createdAt": kpiData.CreatedAt, - "granularity": kpiData.Granularity, - } - // kpiCList := kpi_c_title.GetActiveKPICList(kpiData.NEType) - // for _, k := range kpiCList { - // result, err := evaluate.CalcExpr(*k.Expression, kpiValMap) - // kpiCVal := new(kpi_c_report.KpiCVal) - // kpiCVal.KPIID = *k.KpiID - // if err != nil { - // kpiCVal.Value = 0.0 - // kpiCVal.Err = err.Error() - // } else { - // kpiCVal.Value = result - // } - - // report.KpiValues = append(report.KpiValues, *kpiCVal) - - // // set KPIC event kpiid and value - // kpiCEvent[kpiCVal.KPIID] = kpiCVal.Value - // } - - // KPI自定义指标入库 - kpi_c_report.InsertKpiCReport(kpiData.NEType, report) - - if neInfo.RmUID == kpiData.RmUid { - // 推送到ws订阅组 - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent) - // 推送自定义KPI到ws订阅组 - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent) - } - - 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 */ -// } -type ScheduleJ struct { - Type string `json:"Type"` - Days []int `json:"Days"` -} - -type Period struct { - Start string `json:"Start"` - End string `json:"End"` -} -type Task struct { - Id int `json:"Id"` - - StartTime string `json:"StartTime"` - EndTime string `json:"EndTime"` - - Schedule struct { - Type string `json:"Type"` // 计划类型:Weekly/Monthly, 如果type为"", 则任务以StartTime和EndTime为条件进行统计, 否则以Shedule方式进行 - Days []int `json:"Days"` // Weekly: [0,1,...,5,6] 星期日为0, Monthly: [1,2,3,...,30,31] - Periods []Period `json:"Periods"` - /* - Periods []struct { - Start string `json:"Start"` // 零点或者零点加测量粒度的整数倍 - End string `json:"End"` //零点加测量粒度的整数倍 - } `json:"Periods"` - */ - } `json:"Schedule"` - - GranulOption string `json:"GranulOption"` // 测量粒度选项:15M/30M/60M/24H - KPISet []KpiSetJ `json:"KPISet"` - /* - KPISet []struct { - Code string `json:"Code"` // 统计编码 如:SMFHA01 - KPIs []string `json:"KPIs` // 指标项集合 ["SMF.AttCreatePduSession", "SMF.AttCreatePduSession._Dnn"] - } `json:"KPISet"` - */ -} -type KpiSetJ struct { - Code string `json:"Code"` // 统计编码 如:SMFHA01 - KPIs []string `json:"KPIs"` // 指标项集合 ["SMF.AttCreatePduSession", "SMF.AttCreatePduSession._Dnn"] -} - -type MeasureTask struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeIds []string `json:"neIds" xorm:"ne_ids"` - KpiSet []KpiSetJ `json:"KPISet" xorm:"kpi_set"` - StartTime string `json:"startTime" xorm:"start_time"` - EndTime string `json:"endTime" xorm:"end_time"` - Periods []Period `json:"Periods" xorm:"periods"` - Schedule []ScheduleJ `json:"Schedule" xorm:"schedule"` - GranulOption string `json:"granulOption" xorm:"granul_option"` - Status string `json:"status" xorm:"status"` - AccountID string `json:"accountId" xorm:"account_id"` - Comment string `json:"comment" xorm:"comment"` - CreateTime string `json:"createTime" xorm:"create_time"` - UpdateTime string `json:"updateTime" xorm:"update_time"` - DeleteTime string `json:"deleteTime" xorm:"delete_time"` - - Tasks []Task `json:"Tasks"` - NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */ -} -type MeasureReport struct { - Id int `json:"Id"` - TimeStamp string `json:"TimeStamp"` - NeName string `json:"NeName"` - RmUID string `json:"rmUID"` - NeType string `json:"NeType"` - - Report struct { - Period struct { - StartTime string `json:"StartTime"` - EndTime string `json:"EndTime"` - } `json:"Period"` - - Datas []struct { - Code string `json:"Code"` // 统计编码 如:SMFHA01 - KPIs []struct { - KPIID string `json:"KPIID"` // 指标项, 如: SMF.AttCreatePduSession._Dnn - KPIValues []struct { - Name string `json:"Name"` // 单个的写"Total", 或者指标项有多个测量项,如Dnn的名称写对应的Dnn"cmnet"/"ims" - Value int64 `json:"Value"` - } `json:"KPIValues"` - } `json:"KPIs"` - } `json:"Datas"` - } `json:"Report"` -} - -func GetMeasureTask(taskId int) (*MeasureTask, error) { - log.Debug("GetMeasureTask processing... ") - - measureTask := new(MeasureTask) - tx := db.DB("").Table("measure_task").Where("id=?", taskId).Find(measureTask) - if tx.Error != nil { - log.Error("Failed to get table measure_task from database:", tx.Error) - - return nil, tx.Error - } - - log.Debug("Measure Task:", measureTask) - return measureTask, nil -} - -func XormGetActiveMeasureTask(measureTasks *[]MeasureTask) (*[]MeasureTask, error) { - log.Debug("XormGetActiveMeasureTask processing... ") - tx := db.DB("").Table("measure_task").Where("status='Active'").Find(measureTasks) - if tx.Error != nil { - log.Error("Failed to get table measure_task:", tx.Error) - return nil, tx.Error - } - - log.Debug("measureTasks:", measureTasks) - return measureTasks, nil -} - -type MeasureData struct { - // Id int `json:"id" xorm:"pk 'id' autoincr"` - Id int `json:"id" xorm:"-"` - Date string `json:"date" xorm:"date"` - TaskId int `json:"taskId"` - NeType string `json:"neType" xorm:"ne_type"` - NeName string `json:"neName" xorm:"ne_name"` - RmUid string `json:"rmUid" xorm:"rm_uid"` - GranulOption string `json:"granulOption" xorm:"granul_option"` - StartTime string `json:"startTime"` - EndTime string `json:"endTime"` - KpiCode string `json:"kpiCode" xorm:"kpi_code"` - KpiId string `json:"kpiId" xorm:"kpi_id"` - KpiExt string `json:"kpiExt" xorm:"kpi_ext"` - Value int64 `json:"value"` - Timestamp string `json:"timestamp"` -} - -// process measure report from NFs -func PostMeasureReportFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMeasureReportFromNF processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - 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.Debug("Request body:", string(body)) - measureReport := new(MeasureReport) - _ = json.Unmarshal(body, &measureReport) - log.Debug("measureReport:", measureReport) - - measureData := new(MeasureData) - layout := global.DateTime - measureData.Date = GetDateFromTimeString(layout, measureReport.Report.Period.StartTime) - measureData.TaskId = measureReport.Id - measureData.StartTime = measureReport.Report.Period.StartTime - measureData.EndTime = measureReport.Report.Period.EndTime - measureData.NeType = measureReport.NeType - measureData.NeName = measureReport.NeName - measureData.RmUid = measureReport.RmUID - measureData.GranulOption, _ = dborm.XormGetSingleCol("measure_task", "granul_option", fmt.Sprintf("id=%d", measureReport.Id)) - t, _ := strconv.ParseInt(measureReport.TimeStamp, 10, 64) - timestamp := time.Unix(t, 0) - log.Debug("timestamp:", timestamp.Format(layout)) - measureData.Timestamp = timestamp.Format(layout) - log.Debug("Datas:", measureReport.Report.Datas) - for _, d := range measureReport.Report.Datas { - measureData.KpiCode = d.Code - - log.Debug("KPIs:", d.KPIs) - for _, k := range d.KPIs { - measureData.KpiId = k.KPIID - - log.Debug("KPIValues:", k.KPIValues) - if len(k.KPIValues) != 0 { - for _, v := range k.KPIValues { - measureData.KpiExt = v.Name - measureData.Value = v.Value - log.Debug("measureData:", measureData) - - err := db.DB("").Create(measureData).Error - if err != nil { - log.Error("Failed to insert measure_data:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - } - } else { - measureData.Value = 0 - log.Debug("measureData:", measureData) - - err := db.DB("").Create(measureData).Error - if err != nil { - log.Error("Failed to insert measure_data:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - } - } - } - - services.ResponseStatusOK204NoContent(w) -} - -func PostMeasureTaskToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMeasureTaskToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - params := r.URL.Query() - taskIds := params["id"] - log.Debug("taskIds:", taskIds) - - var response *resty.Response - client := resty.New() - measureTask := new(MeasureTask) - measureTask.Tasks = make([]Task, 1) - for _, taskId := range taskIds { - id, _ := strconv.Atoi(taskId) - task, err := GetMeasureTask(id) - if err != nil { - log.Error("Failed to connect database: ", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - log.Debug("Table Task:", task) - - measureTask.Tasks[0].Id = task.Id - measureTask.Tasks[0].StartTime = task.StartTime - measureTask.Tasks[0].EndTime = task.EndTime - // v := new(dborm.ScheduleJson) - // _ = json.Unmarshal(task.Schedule, v) - // measureTask.Task[0].Schedule.Type = v.Type - // measureTask.Task[0].Schedule.Days = v.Days - if len(task.Schedule) >= 1 { - measureTask.Tasks[0].Schedule.Type = task.Schedule[0].Type - measureTask.Tasks[0].Schedule.Days = task.Schedule[0].Days - } - //v := new(dborm.ScheduleJ) - //_ = json.Unmarshal(task.Schedule, v) - measureTask.Tasks[0].Schedule.Periods = task.Periods - measureTask.Tasks[0].GranulOption = task.GranulOption - - measureTask.Tasks[0].KPISet = task.KpiSet - ips, err := global.GetIps() - if err != nil { - log.Error("Failed to get local IP:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("ips:", ips) - - measureTask.NotifyUrl = global.SetNotifyUrl(ips[0], 33030, fmt.Sprintf(MeasureReportFmt, neType)) - log.Debug("Measure Task to NF:", measureTask) - - if len(task.NeIds) == 0 { - var neInfos []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType(neType, &neInfos) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - for _, neInfo := range neInfos { - task.NeIds = append(task.NeIds, neInfo.NeId) - } - } - - for _, neId := range task.NeIds { - var err error - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if neInfo == nil { - err := fmt.Errorf("not found target NE neType=%s, neId=%s", neType, neId) - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: POST ", requestURI2NF) - - switch task.Status { - case dborm.MeasureTaskStatusInactive: - body, _ := json.Marshal(measureTask) - log.Debug("body: ", string(body)) - - log.Debug("User-Agent: ", config.GetDefaultUserAgent()) - response, err = client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(body). - SetContentLength(true). - Post(requestURI2NF) - - if err != nil { - log.Error("Post to NF failed:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - log.Debug("response info: ") - log.Debug("Status Code:", response.StatusCode()) - log.Debug("Status:", response.Status()) - log.Debug("Proto:", response.Proto()) - log.Debug("Time:", response.Time()) - log.Debug("Received At:", response.ReceivedAt()) - log.Debug("Size:", response.Size()) - - case dborm.MeasureTaskStatusSuspend: - body, _ := json.Marshal(measureTask) - log.Debug("body: ", string(body)) - response, err = client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(body). - SetContentLength(true). - Put(requestURI2NF) - - if err != nil { - log.Error("Put to NF failed:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - default: - err = fmt.Errorf("measure task status must be inactive id=%d", id) - log.Error("Unable to active measure task:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - log.Debug("StatusCode: ", response.StatusCode()) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusActive - taskInfo.CreateTime = time.Now().Format(time.DateTime) - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - default: - log.Error("NF return failure to active measure task") - if response != nil { - log.Info("response body:", string(response.Body())) - services.TransportResponse(w, response.StatusCode(), response.Body()) - return - } else { - err = fmt.Errorf("failed to active measure task, NF return error status=%v", response.Status()) - log.Error("Unable to active measure task:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - } - - services.ResponseStatusOK204NoContent(w) -} - -func PutMeasureTaskToNF(w http.ResponseWriter, r *http.Request) { - - services.ResponseStatusOK200Null(w) -} - -func DeleteMeasureTaskToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteMeasureTaskToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - params := r.URL.Query() - taskIds := params["id"] - log.Debug("taskIds:", taskIds) - - var response *resty.Response - respMsg := make(map[string]interface{}) - for _, taskId := range taskIds { - id, _ := strconv.Atoi(taskId) - task, err := GetMeasureTask(id) - if err != nil { - log.Error("Failed to connect database: ", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - log.Debug("Measure Task:", task) - - if len(task.NeIds) == 0 { - var neInfos []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType(neType, &neInfos) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - for _, neInfo := range neInfos { - task.NeIds = append(task.NeIds, neInfo.NeId) - } - } - log.Debug("neIds:", task.NeIds) - if len(task.NeIds) == 0 { - log.Warn("Not found target NE in the measure task") - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusDeleted - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - } - - for _, neId := range task.NeIds { - var err error - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - if neInfo != nil { - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: DELETE ", requestURI2NF) - client := resty.New() - response, err = client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Delete(requestURI2NF) - if err != nil { - // to avoid can't delete the task for abnormal NF - log.Error("Failed to resty delete:", err) - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusDeleted - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - } - - log.Info("StatusCode: ", response.StatusCode()) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusDeleted - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Infof("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - default: - log.Info("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - } else { - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusDeleted - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - } - } - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) -} - -func PatchMeasureTaskToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PatchMeasureTaskToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - params := r.URL.Query() - taskIds := params["id"] - log.Debug("taskIds:", taskIds) - - var response *resty.Response - respMsg := make(map[string]interface{}) - for _, taskId := range taskIds { - id, _ := strconv.Atoi(taskId) - task, err := GetMeasureTask(id) - if err != nil { - log.Error("Failed to connect database: ", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - log.Debug("Measure Task:", task) - - // for neType - if len(task.NeIds) == 0 { - var neInfos []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType(neType, &neInfos) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - for _, neInfo := range neInfos { - task.NeIds = append(task.NeIds, neInfo.NeId) - } - } - - if len(task.NeIds) == 0 { - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusInactive - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - } - - for _, neId := range task.NeIds { - var err error - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - if neInfo == nil { - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusInactive - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - //services.ResponseInternalServerError500ProcessError(w, em) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: PATCH ", requestURI2NF) - client := resty.New() - response, err = client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Patch(requestURI2NF) - if err != nil { - log.Error("Patch to NF failed:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - - log.Debug("StatusCode: ", response.StatusCode()) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusInactive - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - default: - log.Debug("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - } - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) -} - -type Measurement struct { - Id int `json:"-" xorm:"pk 'id' autoincr"` - Date string `json:"-" xorm:"date"` - Index int `json:"Index"` // 1天中测量时间粒度(如15分钟)的切片索引: 0~95 - Timestamp string `json:"TimeStamp" xorm:"-"` - NeName string `json:"NeName"` // UserLabel - RmUID string `json:"RmUID" xorm:"rm_uid"` - NeType string `json:"NeType"` // 网元类型 - PmVersion string `json:"PmVersion"` // 性能数据版本号 - Dn string `json:"Dn"` // (???)网元标识, 如:RJN-CMZJ-TZ,SubNetwork=5GC88,ManagedElement=SMF53456,SmfFunction=53456 - Period string `json:"Period"` // 测量时间粒度选项:5/15/30/60 - TimeZone string `json:"TimeZone"` - StartTime string `json:"StartTime"` - - Datas []Data `json:"Datas"` -} - -type KPIValue struct { - Name string `json:"Name"` // 单个的写"Total", 或者指标项有多个测量项,如Dnn的名称写对应的Dnn"cmnet"/"ims" - Value int64 `json:"Value"` -} - -type KPI struct { - KPIID string `json:"KPIID"` // 指标项, 如: SMF.AttCreatePduSession._Dnn - KPIValues []KPIValue `json:"KPIValues"` -} - -type Data struct { - ObjectType string `json:"ObjectType"` // 网络资源类别名称, Pm指标项列表中为空间粒度 如:SmfFunction - KPIs []KPI `json:"KPIs"` // 指标项, 如: SMF.AttCreatePduSession._Dnn -} - -// process measurement post message from NFs -func PostMeasurementFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMeasurementFromNF 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)) - if err != nil { - log.Error("Faile to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Debug("Request body:", string(body)) - // measurement := new(dborm.NorthboundPm) - measurement := new(dborm.NorthboundPm) - _ = json.Unmarshal(body, &measurement) - log.Debug("measurement:", measurement) - - // layout := global.DateTime - layout := time.RFC3339 - measurement.Date = GetDateFromTimeString(layout, measurement.StartTime) - measurement.StartTime = GetDateTimeFromTimeString(layout, measurement.StartTime) - // tx := db.DB("").Table("nbi_pm").Create(measurement) - // if tx.Error != nil && tx.RowsAffected <= 0 { - // log.Error("Failed to insert nbi_pm:", err) - // services.ResponseInternalServerError500DatabaseOperationFailed(w) - // return - // } - - services.ResponseStatusOK204NoContent(w) -} - -// get measurement message from NFs -func GetMeasurementFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetMeasurementFromNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - 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 - } - - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is null.") - services.ResponseNotFound404UriNotExist(w, r) - return - } - params := r.URL.Query() - neIds := params["ne_id"] - if len(neIds) == 0 { - log.Error("ne_id NOT FOUND") - services.ResponseBadRequest400WrongParamValue(w) - return - } - log.Debugf("neType: %s neId:%s", neType, neIds) - - //var neInfo *dborm.NeInfo - neInfo := new(dborm.NeInfo) - - neInfo, err := dborm.XormGetNeInfo(neType, neIds[0]) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: GET ", requestURI2NF) - - client := resty.New() - response, err := client.R(). - EnableTrace(). - 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 from NF:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - - respMsg := make(map[string]interface{}) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - log.Debug("response:", response) - // measurement := new(dborm.NorthboundPm) - measurement := new(dborm.NorthboundPm) - _ = json.Unmarshal(response.Body(), &measurement) - log.Debug("measurement:", measurement) - - layout := time.RFC3339 - measurement.Date = GetDateFromTimeString(layout, measurement.StartTime) - measurement.StartTime = GetDateTimeFromTimeString(layout, measurement.StartTime) - // tx := db.DB("").Table("nbi_pm").Create(measurement) - // if tx.Error != nil && tx.RowsAffected <= 0 { - // log.Error("Failed to insert nbi_pm:", err) - // services.ResponseInternalServerError500DatabaseOperationFailed(w) - // return - // } - default: - log.Debug("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) -} diff --git a/features/pm/service.go b/features/pm/service.go deleted file mode 100644 index ff2a6539..00000000 --- a/features/pm/service.go +++ /dev/null @@ -1,19 +0,0 @@ -package pm - -import ( - "be.ems/features/pm/kpi_c_report" - "be.ems/features/pm/kpi_c_title" - "be.ems/lib/log" - "github.com/gin-gonic/gin" -) - -func InitSubServiceRoute(r *gin.Engine) { - log.Info("======init PM group gin.Engine") - - pmGroup := r.Group("/pm") - // register sub modules routes - kpi_c_title.Register(pmGroup) - kpi_c_report.Register(pmGroup) - - // return featuresGroup -} diff --git a/features/security/account.go b/features/security/account.go deleted file mode 100644 index 919b2bc7..00000000 --- a/features/security/account.go +++ /dev/null @@ -1,176 +0,0 @@ -package security - -import ( - "encoding/json" - "io" - "net/http" - "strings" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/oauth" - "be.ems/lib/services" -) - -var ( - UriOauthToken = config.DefaultUriPrefix + "/securityManagement/{apiVersion}/{elementTypeValue}/token" - UriOauthHandshake = config.DefaultUriPrefix + "/securityManagement/{apiVersion}/{elementTypeValue}/handshake" - - CustomUriOauthToken = config.UriPrefix + "/securityManagement/{apiVersion}/{elementTypeValue}/token" - CustomUriOauthHandshake = config.UriPrefix + "/securityManagement/{apiVersion}/{elementTypeValue}/handshake" -) - -func LoginFromOMC(w http.ResponseWriter, r *http.Request) { - log.Info("LoginFromOMC processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("Failed to ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // check media type(content type) only support "application/json" - if !services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // // check extend uri, response 404 - // if !IsValidOAuthUri(r) { - // log.Debug("Uri is invalid") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // Error process .... - // response 400-7 - if !json.Valid([]byte(body)) { - log.Error("Invalid Json Format") - services.ResponseBadRequest400InvalidJson(w) - return - } - - var oAuthBody oauth.OAuthBody - _ = json.Unmarshal(body, &oAuthBody) //转为json - //log.Debug("body:", string(body), "oAuthBody:", oAuthBody) - - defer r.Body.Close() - // response 400-5 - if oauth.IsWrongOAuthInfo(oAuthBody) { - log.Error("Wrong parameter value") - services.ResponseBadRequest400WrongParamValue(w) - return - } - /* - if oauth.IsValidOAuthInfo(oAuthBody) { - plist := config.GetPermissionFromConfig(oAuthBody.UserName, oAuthBody.GrantType) - log.Debug("Permission list:", plist) - - token := globalSession.NewSession(w, r, plist) - services.ResponseStatusOK200Login(w, token) - } else { - // response 400-4 - log.Debug("Authentication failed, mismatch user or password") - - services.ResponseBadRequest400IncorrectLogin(w) - } - */ - - token := oauth.GenRandToken("omc") // Generate new token to session ID - sourceAddr := r.RemoteAddr[:strings.Index(r.RemoteAddr, ":")] - affected, err := dborm.XormInsertSession(oAuthBody.UserName, sourceAddr, token, - config.GetExpiresFromConfig(), config.GetYamlConfig().Auth.Session) - if err != nil { - log.Error("Failed to XormInsertSession:", err) - if affected == -1 { - services.ResponseForbidden403MultiLoginNotAllowed(w) - } else { - services.ResponseBadRequest400IncorrectLogin(w) - } - - return - } - - services.ResponseBadRequest400IncorrectLogin(w) -} - -func LogoutFromOMC(w http.ResponseWriter, r *http.Request) { - log.Info("LogoutFromOMC processing... ") - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // // check media type(content type) only support "application/json" - // if services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) == false { - // log.Error("Invalid Content-Type") - // services.ResponseUnsupportedMediaType415(w) - // return - // } - - // // check extend uri, response 404 - // if !services.IsValidOAuthUri(r) { - // log.Error("Uri is invalid") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // // error processing ... - // // 401-1 response - // token, ret := oauth.IsCarriedToken(r) - // if ret == false { - // log.Error("AccessToken is not carried") - // services.ResponseUnauthorized401AccessTokenNotCarried(w) - // return - // } - - // se, err := dborm.XormLogoutUpdateSession(token) - // if err != nil { - // log.Error("Uri is invalid") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - // 清除缓存用户信息 - // account.ClearLoginUser(se.AccountId) - services.ResponseStatusOK200Null(w) -} - -func HandshakeFromOMC(w http.ResponseWriter, r *http.Request) { - log.Info("HandshakeFromOMC processing... ") - - // check media type(content type) only support "application/json" - if !services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // check extend uri, response 404 - if !services.IsValidOAuthUri(r) { - log.Error("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // error processing ... - // 401-1 response - token, ret := oauth.IsCarriedToken(r) - if !ret { - log.Error("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - _, err := dborm.XormUpdateSessionShakeTime(token) - if err != nil { - log.Error("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - services.ResponseStatusOK200Null(w) -} diff --git a/features/sm/backup.go b/features/sm/backup.go deleted file mode 100644 index 6795c10c..00000000 --- a/features/sm/backup.go +++ /dev/null @@ -1,45 +0,0 @@ -package sm - -import ( - "net/http" - "time" - - "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/services" - _ "github.com/go-sql-driver/mysql" -) - -var ( - // Get OMC local time - UriOMCLocalTime = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/OMC/objectType/time" - - CustomUriOMCLocalTime = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/OMC/objectType/time" -) - -type OMCLocalTime struct { - Timestamp int64 `json:"timestamp"` // 时间戳 (单位:毫秒) - TimeZone int `json:"timeZone"` // 本地时区偏移(单位:秒) -} - -func GetOMCLocalTime(w http.ResponseWriter, r *http.Request) { - log.Debug("GetOMCLocalTime processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - t := time.Now() - _, offset := t.Zone() - - localTime := OMCLocalTime{ - Timestamp: t.UnixMilli(), - TimeZone: offset, - } - response := services.DataResponse{ - Data: localTime, - } - services.ResponseWithJson(w, http.StatusOK, response) -} diff --git a/features/state/getstate.go b/features/state/getstate.go deleted file mode 100644 index 9e7519e3..00000000 --- a/features/state/getstate.go +++ /dev/null @@ -1,1012 +0,0 @@ -package state - -import ( - "encoding/json" - "fmt" - "net/http" - "os" - "strconv" - "strings" - "time" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" - "github.com/shirou/gopsutil/v4/net" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - cfg "be.ems/src/framework/config" - "be.ems/src/framework/constants" - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/parse" -) - -type CpuUsage struct { - NfCpuUsage uint16 `json:"nfCpuUsage"` - SysCpuUsage uint16 `json:"sysCpuUsage"` -} - -type MemUsage struct { - TotalMem uint32 `json:"totalMem"` - NfUsedMem uint32 `json:"nfUsedMem"` - SysMemUsage uint16 `json:"sysMemUsage"` -} - -type PartitionInfo struct { - Total uint32 `json:"total"` // MB - Used uint32 `json:"used"` // MB -} - -type DiskSpace struct { - PartitionNum uint8 `json:"partitionNum"` - PartitionInfo []PartitionInfo `json:"partitionInfo"` -} - -type HardwareInfo struct { - CPUs int `json:"cpus"` - Memory int `json:"memory"` -} - -type SysState struct { - HostName string `json:"hostName"` // linux命令: hostname - OsInfo string `json:"osInfo"` // linux命令: uname -a - DbInfo string `json:"dbInfo"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version - Version string `json:"version"` // 软件版本信息: 16.1.1 - IpAddr []string `json:"ipAddr"` // 网管的ipv4和ipv6列表 - Port uint16 `json:"port"` // 用于网管的port - Capability uint32 `json:"capability"` - SerialNum string `json:"serialNum"` - ExpiryDate string `json:"expiryDate"` - HardwareInfo HardwareInfo `json:"hardwareInfo"` - CpuUsage CpuUsage `json:"cpuUsage"` - MemUsage MemUsage `json:"memUsage"` - DiskSpace DiskSpace `json:"diskSpace"` - //Timestamp string `json:"timestamp"` -} - -type SystemState struct { - HostName string `json:"hostName"` // linux命令: hostname - OsInfo string `json:"osInfo"` // linux命令: uname -a - DbInfo string `json:"dbInfo"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version - Version string `json:"version"` // 软件版本信息: 16.1.1 - IpAddr []string `json:"ipAddr"` // 网管的ipv4和ipv6列表 - Port uint16 `json:"port"` // 用于网管的port - Capability uint32 `json:"capability"` - SerialNum string `json:"serialNum"` - ExpiryDate string `json:"expiryDate"` - HardwareInfo struct { - CPUs int `json:"cpus"` // 主机(裸机/虚拟机)的cpu个数 - Memory int `json:"memory"` // 主机(裸机/虚拟机): 配置的内存 - } `json:"hardwareInfo"` - CpuUsage struct { - NfCpuUsage uint16 `json:"nfCpuUsage"` - SysCpuUsage uint16 `json:"sysCpuUsage"` - } `json:"cpuUsage"` - MemUsage struct { - TotalMem uint32 `json:"totalMem"` - NfUsedMem uint32 `json:"nfUsedMem"` - SysMemUsage uint16 `json:"sysMemUsage"` - } `json:"memUsage"` - DiskSpace struct { - PartitionNum uint8 `json:"partitionNum"` - PartitionInfo []struct { - Total uint32 `json:"total"` // MB - Used uint32 `json:"used"` // MB - } `json:"partitionInfo"` - } `json:"diskSpace"` - //Timestamp string `json:"timestamp"` -} - -type SystemInfo struct { - NeType string `json:"neType" map:"neType, omitempty"` - NeId string `json:"neId" map:"neId, omitempty"` - HostName string `json:"hostName" map:"hostName, omitempty"` // linux命令: hostname - OsInfo string `json:"osInfo" map:"osInfo, omitempty"` // linux命令: uname -a - DbInfo string `json:"dbInfo" map:"dbInfo, omitempty"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version - Version string `json:"version" map:"version, omitempty"` // 软件版本信息: 16.1.1 - IpAddr string `json:"ipAddr" map:"ipAddr, omitempty"` // 网管的ipv4和ipv6列表 - Port uint16 `json:"port" map:"port, omitempty"` // 用于网管的port - CPUs int `json:"cpus" map:"cpus, omitempty"` - TotalMem int `json:"totalMem" map:"totalMem, omitempty"` - PvFlag string `json:"pvFlag" map:"pvFlag, omitempty"` - Status string `json:"status" map:"status, omitempty"` -} - -type LicenseInfo struct { - NeType string `json:"neType"` - NeId string `json:"neId"` - SerialNum string `json:"serialNum"` - Capability uint32 `json:"capability"` - CapUsed uint32 `json:"capUsed"` - FeatureEnabled []string `json:"featureEnabled"` - ExpiryDate string `json:"expiryDate"` -} - -type Response struct { - Data interface{} `json:"data"` -} - -var ( - UriSysState = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/systemState" - UriSysState2 = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/systemState" - UriSysInfoAll = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/sysInfo" - UriSysInfoOne = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/sysInfo/{neType}/{neId}" - UriLicenseInfoAll = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/licenseInfo" - UriLicenseInfoOne = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/licenseInfo/{neType}/{neId}" - - CustomUriSysState = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/systemState" - CustomUriSysState2 = config.UriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/systemState" - CustomUriSysInfoAll = config.UriPrefix + "/systemManagement/{apiVersion}/sysInfo" - CustomUriSysInfoOne = config.UriPrefix + "/systemManagement/{apiVersion}/sysInfo/{neType}/{neId}" - CustomUriLicenseInfoAll = config.UriPrefix + "/systemManagement/{apiVersion}/licenseInfo" - CustomUriLicenseInfoOne = config.UriPrefix + "/systemManagement/{apiVersion}/licenseInfo/{neType}/{neId}" -) - -var client = resty.New() - -func init() { - /* - client. - SetTimeout(10 * time.Second). - SetRetryCount(1). - SetRetryWaitTime(1 * time.Second). - SetRetryMaxWaitTime(2 * time.Second). - SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) { - return 0, errors.New("quota exceeded") - }) - */ - client. - SetTimeout(time.Duration(400 * time.Millisecond)) - // SetRetryCount(1). - // SetRetryWaitTime(time.Duration(1 * time.Second)). - // SetRetryMaxWaitTime(time.Duration(2 * time.Second)) - //client.SetTimeout(2 * time.Second) -} - -func NeStatusEnumToStr(intStatus int) string { - switch intStatus { - case 0: - return "active" - case 1: - return "offline" - case 2: - return "standby" - case 3: - return "maintain" - default: - return "unkown" - } -} - -// Get system state from NF/NFs -func GetOneLicenseInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetOneLicenseInfoFromNF processing... ") - - data := make([]map[string]interface{}, 0) - - vars := mux.Vars(r) - neType := vars["neType"] - neId := vars["neId"] - if neType == "" || neId == "" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("AccessToken:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - //systemState := make(map[string]interface{}) - systemState := &SysState{} - var result map[string]interface{} - //sysInfo := &SystemInfo{} - omcNeTypeLower := "omc" - if config.GetYamlConfig().OMC.NeType != "" { - omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType) - } - if neType != omcNeTypeLower { - log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower) - var requestURI2NF string - if config.GetYamlConfig().OMC.TestMode && strings.ToLower(neType) != "udm" { - var udmNEs []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs) - if err != nil { - log.Error("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if len(udmNEs) > 0 { - udmNe := udmNEs[0] - hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(udmNe.NeType)) - } - } else { - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(neInfo.NeType)) - } - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - log.Trace("resp.Body():", string(resp.Body())) - _ = json.Unmarshal(resp.Body(), &systemState) - - log.Trace("systemState:", systemState) - capUsed := config.TDatas[neInfo.NeType].CapUsed - log.Tracef("neInfo.NeType:%s capUsed: %v", capUsed) - licenseInfo := &LicenseInfo{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - SerialNum: systemState.SerialNum, - Capability: systemState.Capability, - CapUsed: capUsed, - FeatureEnabled: config.TDatas[neInfo.NeType].FeatureEnabled, - ExpiryDate: systemState.ExpiryDate, - } - //neItem := strings.ToUpper(neType) + "/" + neId - result, err = global.ToMap(*licenseInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - } - } else { - systemState := GetEMSState(neInfo.Ip) - licenseInfo := &LicenseInfo{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - SerialNum: systemState.SerialNum, - Capability: systemState.Capability, - CapUsed: config.TDatas[neInfo.NeType].CapUsed, - FeatureEnabled: config.TDatas[neInfo.NeType].FeatureEnabled, - ExpiryDate: systemState.ExpiryDate, - } - result, err = global.ToMap(*licenseInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - // neItem := strings.ToUpper(neType) + "/" + neId - // result[neItem] = sysInfo - } - - data = append(data, result) - log.Trace("data:", data) - - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) -} - -// Get system state from NF/NFs -func GetAllLicenseInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetAllLicenseInfoFromNF processing... ") - - data := make([]map[string]interface{}, 0) - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("AccessToken:", token) - - var neList []dborm.NeInfo - _, err := dborm.XormGetAllNeInfo(&neList) - if err != nil { - log.Error("Failed to XormGetAllNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - omcNeTypeLower := "omc" - if config.GetYamlConfig().OMC.NeType != "" { - omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType) - } - - for _, ne := range neList { - var result map[string]interface{} - log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower) - log.Debug("ne: ", ne) - //if strings.ToLower(ne.NeType) != omcNeTypeLower || !strings.Contains(r.RemoteAddr, ne.Ip) { - if strings.ToLower(ne.NeType) != omcNeTypeLower { - // hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port) - // requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - // hostUri, strings.ToLower(ne.NeType)) - var requestURI2NF string - if config.GetYamlConfig().OMC.TestMode && strings.ToLower(ne.NeType) != "udm" { - var udmNEs []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs) - if err != nil { - log.Error("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if len(udmNEs) > 0 { - udmNe := udmNEs[0] - hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(udmNe.NeType)) - } - } else { - hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(ne.NeType)) - } - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.SetTimeout(time.Duration(1 * time.Second)).R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Get system state from NF is failed:", err) - // errorMessage := services.ErrorMessage{ - // ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused", - // } - // //result["error"] = errorMessage - continue - } else { - systemState := &SysState{} - _ = json.Unmarshal(resp.Body(), &systemState) - licenseInfo := &LicenseInfo{ - NeType: ne.NeType, - NeId: ne.NeId, - SerialNum: systemState.SerialNum, - Capability: systemState.Capability, - CapUsed: config.TDatas[ne.NeType].CapUsed, - FeatureEnabled: config.TDatas[ne.NeType].FeatureEnabled, - ExpiryDate: systemState.ExpiryDate, - } - result, err = global.ToMap(*licenseInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - // neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - // result[neItem] = sysInfo - } - } else { - systemState := GetEMSState(ne.Ip) - licenseInfo := &LicenseInfo{ - NeType: ne.NeType, - NeId: ne.NeId, - SerialNum: systemState.SerialNum, - Capability: systemState.Capability, - CapUsed: config.TDatas[ne.NeType].CapUsed, - FeatureEnabled: config.TDatas[ne.NeType].FeatureEnabled, - ExpiryDate: systemState.ExpiryDate, - } - result, err = global.ToMap(*licenseInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - // neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - // result[neItem] = sysInfo - } - - data = append(data, result) - log.Trace("data:", data) - } - - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) -} - -// Get system state from NF/NFs -func GetOneSysinfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetOneSysinfoFromNF processing... ") - - data := make([]map[string]interface{}, 0) - - vars := mux.Vars(r) - neType := vars["neType"] - neId := vars["neId"] - if neType == "" || neId == "" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("AccessToken:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - //systemState := make(map[string]interface{}) - systemState := &SysState{} - var result map[string]interface{} - //sysInfo := &SystemInfo{} - omcNeTypeLower := "omc" - if config.GetYamlConfig().OMC.NeType != "" { - omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType) - } - if neType != omcNeTypeLower { - log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower) - var requestURI2NF string - if config.GetYamlConfig().OMC.TestMode && strings.ToLower(neType) != "udm" { - var udmNEs []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs) - if err != nil { - log.Error("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if len(udmNEs) > 0 { - udmNe := udmNEs[0] - hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(udmNe.NeType)) - } - } else { - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(neInfo.NeType)) - } - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - log.Trace("resp.Body():", string(resp.Body())) - _ = json.Unmarshal(resp.Body(), &systemState) - - log.Trace("systemState:", systemState) - hostName := "5gc" - if systemState.HostName != "" { - hostName = systemState.HostName - } - osInfo := "Linux 5gc 4.15.0-29-generic SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 GNU/Linux" - if systemState.OsInfo != "" { - osInfo = systemState.OsInfo - } - dbInfo := "db v1.4.15" - if systemState.OsInfo != "" { - dbInfo = systemState.DbInfo - } - port, _ := strconv.Atoi(neInfo.Port) - cpus := 4 - if systemState.HardwareInfo.CPUs != 0 { - cpus = systemState.HardwareInfo.CPUs - } - totalMem := 34029125632 - if systemState.HardwareInfo.Memory != 0 { - totalMem = systemState.HardwareInfo.Memory - } - sysInfo := &SystemInfo{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - HostName: hostName, - OsInfo: osInfo, - DbInfo: dbInfo, - Version: systemState.Version, - IpAddr: neInfo.Ip, - Port: uint16(port), - CPUs: cpus, - TotalMem: totalMem, - PvFlag: neInfo.PvFlag, - Status: NeStatusEnumToStr(neInfo.Status), - } - //neItem := strings.ToUpper(neType) + "/" + neId - result, err = global.ToMap(*sysInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - } - } else { - systemState := GetEMSState(neInfo.Ip) - sysInfo := &SystemInfo{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - HostName: systemState.HostName, - OsInfo: systemState.OsInfo, - DbInfo: systemState.DbInfo, - Version: systemState.Version, - IpAddr: neInfo.Ip, - Port: systemState.Port, - CPUs: systemState.HardwareInfo.CPUs, - TotalMem: systemState.HardwareInfo.Memory, - PvFlag: neInfo.PvFlag, - Status: NeStatusEnumToStr(neInfo.Status), - } - result, err = global.ToMap(*sysInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - // neItem := strings.ToUpper(neType) + "/" + neId - // result[neItem] = sysInfo - } - - data = append(data, result) - log.Trace("data:", data) - - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) -} - -// Get system state from NF/NFs -func GetAllSysinfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetAllSysinfoFromNF processing... ") - - data := make([]map[string]interface{}, 0) - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("AccessToken:", token) - - var neList []dborm.NeInfo - _, err := dborm.XormGetAllNeInfo(&neList) - if err != nil { - log.Error("Failed to XormGetAllNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - omcNeTypeLower := "omc" - if config.GetYamlConfig().OMC.NeType != "" { - omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType) - } - - for _, ne := range neList { - var result map[string]interface{} - log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower) - log.Debug("ne: ", ne) - //if strings.ToLower(ne.NeType) != omcNeTypeLower || !strings.Contains(r.RemoteAddr, ne.Ip) { - if strings.ToLower(ne.NeType) != omcNeTypeLower { - // hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port) - // requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - // hostUri, strings.ToLower(ne.NeType)) - var requestURI2NF string - if config.GetYamlConfig().OMC.TestMode && strings.ToLower(ne.NeType) != "udm" { - var udmNEs []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs) - if err != nil { - log.Error("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if len(udmNEs) > 0 { - udmNe := udmNEs[0] - hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(udmNe.NeType)) - } - } else { - hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(ne.NeType)) - } - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.SetTimeout(time.Duration(1 * time.Second)).R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Get system state from NF is failed:", err) - // errorMessage := services.ErrorMessage{ - // ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused", - // } - // //result["error"] = errorMessage - continue - } else { - systemState := &SysState{} - _ = json.Unmarshal(resp.Body(), &systemState) - hostName := "5gc" - if systemState.HostName != "" { - hostName = systemState.HostName - } - osInfo := "Linux 5gc 4.15.0-29-generic SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 GNU/Linux" - if systemState.OsInfo != "" { - osInfo = systemState.OsInfo - } - dbInfo := "db v1.4.15" - if systemState.OsInfo != "" { - dbInfo = systemState.DbInfo - } - port, _ := strconv.Atoi(ne.Port) - cpus := 4 - if systemState.HardwareInfo.CPUs != 0 { - cpus = systemState.HardwareInfo.CPUs - } - totalMem := 34029125632 - if systemState.HardwareInfo.Memory != 0 { - totalMem = systemState.HardwareInfo.Memory - } - sysInfo := &SystemInfo{ - NeType: ne.NeType, - NeId: ne.NeId, - HostName: hostName, - OsInfo: osInfo, - DbInfo: dbInfo, - Version: systemState.Version, - IpAddr: ne.Ip, - Port: uint16(port), - CPUs: cpus, - TotalMem: totalMem, - PvFlag: ne.PvFlag, - Status: NeStatusEnumToStr(ne.Status), - } - // neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - // result[neItem] = sysInfo - result, err = global.ToMap(*sysInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - } - } else { - port, _ := strconv.Atoi(ne.Port) - systemState := GetEMSState(ne.Ip) - sysInfo := &SystemInfo{ - NeType: ne.NeType, - NeId: ne.NeId, - HostName: systemState.HostName, - OsInfo: systemState.OsInfo, - DbInfo: systemState.DbInfo, - Version: systemState.Version, - IpAddr: ne.Ip, - Port: (uint16(port)), - CPUs: systemState.HardwareInfo.CPUs, - TotalMem: systemState.HardwareInfo.Memory, - PvFlag: ne.PvFlag, - Status: NeStatusEnumToStr(ne.Status), - } - // neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - // result[neItem] = sysInfo - result, err = global.ToMap(*sysInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - } - - data = append(data, result) - log.Trace("data:", data) - } - - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) -} - -// Get system state from NF/NFs -func GetStateFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetStateFromNF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - neType = strings.ToLower(neType) - - if neType == "" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - if neType == "all" { - var neList []dborm.NeInfo - _, err := dborm.XormGetAllNeInfo(&neList) - if err != nil { - log.Error("Failed to get all ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - data := make([]map[string]interface{}, 0) - for _, ne := range neList { - result := make(map[string]interface{}) - hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port) - requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(ne.NeType)) - log.Debug("requestURI2NF:", requestURI2NF) - - result["ipAddress"] = ne.Ip - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Fail to get state:", err) - - errorMessage := services.ErrorMessage{ - ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused", - } - systemState := make(map[string]interface{}) - systemState["error"] = errorMessage - result["systemState"] = systemState - } else { - systemState := make(map[string]interface{}) - _ = json.Unmarshal(resp.Body(), &systemState) - result["systemState"] = systemState - } - - neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - mapState := make(map[string]interface{}) - mapState[neItem] = result - data = append(data, mapState) - log.Trace("data:", data) - } - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) - return - } - - if neType == "omc" { - emsState := GetEMSState("127.0.0.1") - services.ResponseWithJson(w, http.StatusOK, emsState) - return - } - - // only support omc and all elementType - err := fmt.Errorf("only support omc or all elementTypeValue") - log.Error("Fail to get state:", err) - services.ResponseInternalServerError500ProcessError(w, err) - - // var neList []dborm.NeInfo - // err := dborm.XormGetNeInfoByNeType(neType, &neList) - // if err != nil { - // log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // var omcList []dborm.NeInfo - // err = dborm.XormGetNeInfoByNeType("omc", &omcList) - // if err != nil { - // log.Error("Failed to omc ne list:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // for i, ne := range neList { - - // } - // data := make([]map[string]interface{}, 0) - // for _, ne := range neList { - // hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port) - // requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - // hostUri, strings.ToLower(ne.NeType)) - // log.Debug("requestURI2NF:", requestURI2NF) - - // resp, err := client.R(). - // EnableTrace(). - // 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("Get system state from NF is failed:", err) - // } else { - // systemState := make(map[string]interface{}) - // _ = json.Unmarshal(resp.Body(), &systemState) - // data = append(data, systemState) - // } - // } - - // if len(data) == 1 { - // services.ResponseWithJson(w, http.StatusOK, data[0]) - // return - // } - // var response Response - // response.Data = data - // services.ResponseWithJson(w, http.StatusOK, response) -} - -func GetEMSState(ip string) *SysState { - log.Debug("GetEMSState processing... ") - - sysInfo := new(SysInfo) - err := GetSysInfo(sysInfo) - if err != nil { - log.Error("Failed to GetSysInfo:", err) - return nil - } - - cpuUsage := &CpuUsage{ - NfCpuUsage: sysInfo.MyCpuPercent, - SysCpuUsage: sysInfo.SysCpuPercent, - } - - memUsage := &MemUsage{ - TotalMem: sysInfo.SysTotalRam, - NfUsedMem: sysInfo.MyUsedRam, - SysMemUsage: sysInfo.SysRamUsedPercent, - } - - diskSpace := &DiskSpace{ - PartitionNum: sysInfo.PartitionNum, - PartitionInfo: sysInfo.PartitionInfo, - } - - // 获取主机的 IP 地址列表 - ipAddrs := []string{ip} - if ip == "" || ip == "127.0.0.1" { - ipAddrs = []string{} - interfaces, err := net.Interfaces() - if err == nil { - for _, iface := range interfaces { - for _, v := range iface.Addrs { - 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 - } - prefix := strings.Split(v.Addr, "/")[0] - if strings.Contains(prefix, "::") { - ipAddrs = append(ipAddrs, prefix) - } - if strings.Contains(prefix, ".") { - ipAddrs = append(ipAddrs, prefix) - } - } - } - } - } - - CapabilityInt := config.GetYamlConfig().OMC.Capability - if CapabilityInt == 0 { - CapabilityInt = 5000 - } - snStr := config.GetYamlConfig().OMC.Sn - if snStr == "" { - snStr = "-" - } - expiryDateStr := config.GetYamlConfig().OMC.ExpiryDate - if expiryDateStr == "" { - expiryDateStr = "-" - } - var port uint16 = 33030 - httpArr := cfg.Get("server") - if httpArr != nil { - arr := httpArr.([]any) - if len(arr) > 1 { - rest := arr[0].(map[string]any) - port = uint16(parse.Number(rest["port"])) - } - } - hostName, _ := os.Hostname() - dbInfo := getDbInfo() - emsState := &SysState{ - HostName: hostName, - OsInfo: getUnameStr(), - DbInfo: dbInfo, - IpAddr: ipAddrs, - Port: port, - Version: cfg.Version, - Capability: CapabilityInt, - SerialNum: snStr, - ExpiryDate: expiryDateStr, - HardwareInfo: HardwareInfo{CPUs: getCpuNumber(), Memory: getTotalMemory()}, - CpuUsage: *cpuUsage, - MemUsage: *memUsage, - DiskSpace: *diskSpace, - } - - //getSystemInfo() - return emsState -} - -func getDbInfo() string { - var dbConfig map[string]any - defSource := cfg.Get("database.defaultDataSourceName").(string) - datasource := cfg.Get("database.datasource").(map[string]any) - for key, value := range datasource { - item := value.(map[string]any) - if key == defSource { - dbConfig = item - break - } - } - - if dbConfig["type"] == "mysql" { - return getMySQLVersion() - } - if dbConfig["type"] == "sqlite" { - return "3.35.5 SQLite3" - } - return "" -} - -func getMySQLVersion() string { - var info string = "" - - var ver, verComment, verCompileOS, verCompile string - - // 版本 - m, err := db.RawDB("", "SHOW VARIABLES LIKE 'version'", nil) - if err != nil || len(m) != 1 { - return info - } - if v, ok := m[0]["Value"]; ok { - ver = v.(string) - } - - // 详细版本 - m, err = db.RawDB("", "SHOW VARIABLES LIKE 'version_comment'", nil) - if err != nil || len(m) != 1 { - return info - } - if v, ok := m[0]["Value"]; ok { - verComment = v.(string) - } - - // 编译操作系统 - m, err = db.RawDB("", "SHOW VARIABLES LIKE 'version_compile_os'", nil) - if err != nil || len(m) != 1 { - return info - } - if v, ok := m[0]["Value"]; ok { - verCompileOS = v.(string) - } - - // 编译机器 - m, err = db.RawDB("", "SHOW VARIABLES LIKE 'version_compile_machine'", nil) - if err != nil || len(m) != 1 { - return info - } - if v, ok := m[0]["Value"]; ok { - verCompileOS = v.(string) - } - - return fmt.Sprintf("%s %s, for %s (%s)", ver, verComment, verCompileOS, verCompile) -} diff --git a/features/state/state_linux.go b/features/state/state_linux.go deleted file mode 100644 index 30ed20d8..00000000 --- a/features/state/state_linux.go +++ /dev/null @@ -1,243 +0,0 @@ -//go:build linux -// +build linux - -package state - -import ( - "encoding/binary" - "fmt" - "os" - "runtime" - "syscall" - "time" - - "be.ems/lib/log" - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/disk" - "github.com/shirou/gopsutil/v4/mem" - "github.com/shirou/gopsutil/v4/process" -) - -type SysInfo struct { - SysCpuPercent uint16 // x% - MyCpuPercent uint16 // x%, CPU percent of current proccess - - SysTotalRam uint32 // KB - MyUsedRam uint32 // RAM usage of current proccess, KB - SysRamUsedPercent uint16 // x% - - PartitionNum byte - PartitionInfo []PartitionInfo // usage of each partition -} - -const MAX_PARTITION_NUM byte = 32 - -func GetSysStat() ([]byte, int) { - // Get sys info - var sysInfo SysInfo - err := GetSysInfo(&sysInfo) - if err != nil { - return nil, 0 - } - - //log.Tracef("current sys info: %v", sysInfo) - - // build ems buffer - var data []byte = make([]byte, 1024) - var len int - var i byte - binary.BigEndian.PutUint16(data[0:], sysInfo.MyCpuPercent) //x% * 100 - binary.BigEndian.PutUint16(data[2:], sysInfo.SysCpuPercent) //x% * 100 - binary.BigEndian.PutUint32(data[4:], sysInfo.SysTotalRam) // KB - binary.BigEndian.PutUint32(data[8:], sysInfo.MyUsedRam) // KB - binary.BigEndian.PutUint16(data[12:], sysInfo.SysRamUsedPercent) //x% * 100 - data[14] = sysInfo.PartitionNum - for i = 0; i < sysInfo.PartitionNum; i++ { - binary.BigEndian.PutUint32(data[15+8*(i):], sysInfo.PartitionInfo[i].Total) // MB - binary.BigEndian.PutUint32(data[15+8*(i)+4:], sysInfo.PartitionInfo[i].Used) // MB - } - len = int(15 + 8*sysInfo.PartitionNum) - - //log.Tracef("current sys stat buf: %v, len: %d", data, len) - - return data, len -} - -var pProc *process.Process = nil - -func GetSYsCpuPercent() float64 { - totalPercent, err := cpu.Percent(0, false) //(2*time.Second, false) - if err != nil { - return 0.0 - } else { - return totalPercent[0] - } -} - -func GetSysInfo(sysInfo *SysInfo) error { - // sys cpu percent - totalPercent, err := cpu.Percent(0, false) //(2*time.Second, false) - if err != nil { - sysInfo.SysCpuPercent = 0 - } else { - sysInfo.SysCpuPercent = uint16(totalPercent[0] * 100) - } - - if pProc == nil { - checkPid := os.Getpid() - pProc, err = process.NewProcess(int32(checkPid)) - if err != nil { - log.Tracef("get process info error %v", err) - return err - } - } - - // self cpu percent - percent, err := pProc.Percent(0) //(2*time.Second) - if err != nil { - log.Tracef("get process cpu percent error %v", err) - sysInfo.MyCpuPercent = 0 - } else { - sysInfo.MyCpuPercent = uint16(percent * 100) - } - - // self RAM(KB) - myRam, err := pProc.MemoryInfo() - if err != nil { - log.Tracef("get self memory info error %v", err) - sysInfo.MyUsedRam = 0 - } else { - sysInfo.MyUsedRam = uint32(myRam.RSS / 1024) - } - - // system RAM(KB) - sysRam, err := mem.VirtualMemory() - if err != nil { - log.Tracef("gett sys memory info error %v", err) - sysInfo.SysTotalRam = 0 - sysInfo.SysRamUsedPercent = 0 - } else { - sysInfo.SysTotalRam = uint32(sysRam.Total / 1024) - sysInfo.SysRamUsedPercent = uint16(sysRam.UsedPercent * 100) - } - - // partition usage - GetPartitions(sysInfo) - return nil -} - -func getProcess() *process.Process { - checkPid := os.Getpid() - ret, _ := process.NewProcess(int32(checkPid)) - return ret -} - -func GetSystemCpuInfo() { - physicalCnt, _ := cpu.Counts(false) - logicalCnt, _ := cpu.Counts(true) - log.Tracef("physical count:%d logical count:%d", physicalCnt, logicalCnt) - - totalPercent, _ := cpu.Percent(3*time.Second, false) // per cpu is false - perPercents, _ := cpu.Percent(3*time.Second, true) // per cpu is true - log.Tracef("total percent:%v per percents:%v", totalPercent, perPercents) -} - -func GetProcessCpuPercent() { - p := getProcess() - percent, err := p.Percent(0) - if err != nil { - log.Tracef("error %v", err) - } - - numcpu := runtime.NumCPU() - // if percent < 0.0 || percent > 100.0*float64(numcpu) { // TODO - if percent < 0.0 { - log.Tracef("Err CPU Percent of Process: %f, CPU num: %d", percent, numcpu) - } else { - log.Tracef("get process CPU percent: %f, CPU num: %d", percent, numcpu) - } -} - -func GetProcessMemoryInfo() { - p := getProcess() - - v, err := p.MemoryInfo() - if err != nil { - log.Tracef("getting memory info error %v", err) - } - - log.Tracef("get process memory info %v", v) - - info, _ := mem.VirtualMemory() - fmt.Println(info) -} - -func GetPartitions(sysInfo *SysInfo) { - sysInfo.PartitionNum = 0 - //sysInfo.PartitionInfo = make([]PartitionInfo, MAX_PARTITION_NUM, MAX_PARTITION_NUM) - infos, _ := disk.Partitions(true) - for _, info := range infos { - GetOnePartitionUsage(info.Mountpoint, sysInfo) - if sysInfo.PartitionNum >= MAX_PARTITION_NUM { - break - } - } -} - -func GetOnePartitionUsage(path string, sysInfo *SysInfo) int { - info, err := disk.Usage(path) - if err != nil { - return -1 - } - - if info.Total <= 0 { // info.Used/(1024 * 1024)MB - return 0 - } - var partition PartitionInfo - partition.Total = uint32(info.Total / 1024 / 1024) - partition.Used = uint32(info.Used / 1024 / 1024) - sysInfo.PartitionInfo = append(sysInfo.PartitionInfo, partition) - sysInfo.PartitionNum++ - - /*data, err := json.MarshalIndent(info, "", " ") - if err != nil { - return -1 - } - - fmt.Println(string(data))*/ - return 1 -} - -func getOS() string { - var osname string - if runtime.GOOS == "linux" { - osname = "GNU/Linux" - } - return osname -} - -func utsnameToString(unameArray [65]int8) string { - var byteString [65]byte - var indexLength int - for ; unameArray[indexLength] != 0 && indexLength < 65; indexLength++ { - byteString[indexLength] = uint8(unameArray[indexLength]) - } - return string(byteString[:indexLength]) -} - -func getUnameStr() string { - var utsname = syscall.Utsname{} - err := syscall.Uname(&utsname) - if err == nil { - name := utsnameToString(utsname.Sysname) - node := utsnameToString(utsname.Nodename) - release := utsnameToString(utsname.Release) - version := utsnameToString(utsname.Version) - machine := utsnameToString(utsname.Machine) - //domain:= utsnameToString(utsname.Domainname) - osName := getOS() - return fmt.Sprintf("%s %s %s %s %s %s", name, node, - release, version, machine, osName) - } - return "" -} diff --git a/features/state/state_windows.go b/features/state/state_windows.go deleted file mode 100644 index cbb027ee..00000000 --- a/features/state/state_windows.go +++ /dev/null @@ -1,231 +0,0 @@ -//go:build windows -// +build windows - -package state - -import ( - "encoding/binary" - "fmt" - "os" - "runtime" - "syscall" - "time" - - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/disk" - "github.com/shirou/gopsutil/v4/mem" - "github.com/shirou/gopsutil/v4/process" -) - -type SysInfo struct { - SysCpuPercent uint16 // x% - MyCpuPercent uint16 // x%, CPU percent of current proccess - - SysTotalRam uint32 // KB - MyUsedRam uint32 // RAM usage of current proccess, KB - SysRamUsedPercent uint16 // x% - - PartitionNum byte - PartitionInfo []PartitionInfo // usage of each partition -} - -const MAX_PARTITION_NUM byte = 32 - -func GetSysStat() ([]byte, int) { - // Get sys info - var sysInfo SysInfo - err := GetSysInfo(&sysInfo) - if err != nil { - return nil, 0 - } - - //fmt.Printf("current sys info: %v", sysInfo) - - // build ems buffer - var data []byte = make([]byte, 1024) - var len int - var i byte - binary.BigEndian.PutUint16(data[0:], sysInfo.MyCpuPercent) //x% * 100 - binary.BigEndian.PutUint16(data[2:], sysInfo.SysCpuPercent) //x% * 100 - binary.BigEndian.PutUint32(data[4:], sysInfo.SysTotalRam) // KB - binary.BigEndian.PutUint32(data[8:], sysInfo.MyUsedRam) // KB - binary.BigEndian.PutUint16(data[12:], sysInfo.SysRamUsedPercent) //x% * 100 - data[14] = sysInfo.PartitionNum - for i = 0; i < sysInfo.PartitionNum; i++ { - binary.BigEndian.PutUint32(data[15+8*(i):], sysInfo.PartitionInfo[i].Total) // MB - binary.BigEndian.PutUint32(data[15+8*(i)+4:], sysInfo.PartitionInfo[i].Used) // MB - } - len = int(15 + 8*sysInfo.PartitionNum) - - //fmt.Printf("current sys stat buf: %v, len: %d", data, len) - - return data, len -} - -var pProc *process.Process = nil - -func GetSYsCpuPercent() float64 { - totalPercent, err := cpu.Percent(0, false) //(2*time.Second, false) - if err != nil { - return 0.0 - } else { - return totalPercent[0] - } -} - -func GetSysInfo(sysInfo *SysInfo) error { - // sys cpu percent - totalPercent, err := cpu.Percent(0, false) //(2*time.Second, false) - if err != nil { - sysInfo.SysCpuPercent = 0 - } else { - sysInfo.SysCpuPercent = uint16(totalPercent[0] * 100) - } - - if pProc == nil { - checkPid := os.Getpid() - pProc, err = process.NewProcess(int32(checkPid)) - if err != nil { - fmt.Printf("get process info error %v", err) - return err - } - } - - // self cpu percent - percent, err := pProc.Percent(0) //(2*time.Second) - if err != nil { - fmt.Printf("get process cpu percent error %v", err) - sysInfo.MyCpuPercent = 0 - } else { - sysInfo.MyCpuPercent = uint16(percent * 100) - } - - // self RAM(KB) - myRam, err := pProc.MemoryInfo() - if err != nil { - fmt.Printf("get self memory info error %v", err) - sysInfo.MyUsedRam = 0 - } else { - sysInfo.MyUsedRam = uint32(myRam.RSS / 1024) - } - - // system RAM(KB) - sysRam, err := mem.VirtualMemory() - if err != nil { - fmt.Printf("gett sys memory info error %v", err) - sysInfo.SysTotalRam = 0 - sysInfo.SysRamUsedPercent = 0 - } else { - sysInfo.SysTotalRam = uint32(sysRam.Total / 1024) - sysInfo.SysRamUsedPercent = uint16(sysRam.UsedPercent * 100) - } - - // partition usage - GetPartitions(sysInfo) - return nil -} - -func getProcess() *process.Process { - checkPid := os.Getpid() - ret, _ := process.NewProcess(int32(checkPid)) - return ret -} - -func GetSystemCpuInfo() { - physicalCnt, _ := cpu.Counts(false) - logicalCnt, _ := cpu.Counts(true) - fmt.Printf("physical count:%d logical count:%d\n", physicalCnt, logicalCnt) - - totalPercent, _ := cpu.Percent(3*time.Second, false) // per cpu is false - perPercents, _ := cpu.Percent(3*time.Second, true) // per cpu is true - fmt.Printf("total percent:%v per percents:%v\n", totalPercent, perPercents) -} - -func GetProcessCpuPercent() { - p := getProcess() - percent, err := p.Percent(0) - if err != nil { - fmt.Printf("error %v", err) - } - - numcpu := runtime.NumCPU() - // if percent < 0.0 || percent > 100.0*float64(numcpu) { // TODO - if percent < 0.0 { - fmt.Printf("Err CPU Percent of Process: %f, CPU num: %d", percent, numcpu) - } else { - fmt.Printf("get process CPU percent: %f, CPU num: %d", percent, numcpu) - } -} - -func GetProcessMemoryInfo() { - p := getProcess() - - v, err := p.MemoryInfo() - if err != nil { - fmt.Printf("getting memory info error %v", err) - } - - fmt.Printf("get process memory info %v\n", v) - - info, _ := mem.VirtualMemory() - fmt.Println(info) -} - -func GetPartitions(sysInfo *SysInfo) { - sysInfo.PartitionNum = 0 - //sysInfo.PartitionInfo = make([]PartitionInfo, MAX_PARTITION_NUM, MAX_PARTITION_NUM) - infos, _ := disk.Partitions(true) - for _, info := range infos { - GetOnePartitionUsage(info.Mountpoint, sysInfo) - if sysInfo.PartitionNum >= MAX_PARTITION_NUM { - break - } - } -} - -func GetOnePartitionUsage(path string, sysInfo *SysInfo) int { - info, err := disk.Usage(path) - if err != nil { - return -1 - } - - if info.Total <= 0 { // info.Used/(1024 * 1024)MB - return 0 - } - var partition PartitionInfo - partition.Total = uint32(info.Total / 1024 / 1024) - partition.Used = uint32(info.Used / 1024 / 1024) - sysInfo.PartitionInfo = append(sysInfo.PartitionInfo, partition) - sysInfo.PartitionNum++ - - /*data, err := json.MarshalIndent(info, "", " ") - if err != nil { - return -1 - } - - fmt.Println(string(data))*/ - return 1 -} - -func getOS() string { - var osname string - if runtime.GOOS == "linux" { - osname = "GNU/Linux" - } - return osname -} - -func utsnameToString(unameArray [65]int8) string { - var byteString [65]byte - var indexLength int - for ; unameArray[indexLength] != 0 && indexLength < 65; indexLength++ { - byteString[indexLength] = uint8(unameArray[indexLength]) - } - return string(byteString[:indexLength]) -} - -func getUnameStr() string { - osInfo, _ := syscall.GetVersion() - - return fmt.Sprintf("Widnows %d", osInfo) -} diff --git a/features/state/sysinfo.go b/features/state/sysinfo.go deleted file mode 100644 index f6f25b1c..00000000 --- a/features/state/sysinfo.go +++ /dev/null @@ -1,29 +0,0 @@ -package state - -import ( - "be.ems/lib/log" - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/mem" -) - -func getCpuNumber() int { - // 获取CPU信息 - cpuInfo, err := cpu.Info() - if err != nil { - log.Errorf("Failed to get CPU info: %v", err) - return 0 - } - log.Tracef("CPU info: %+v", cpuInfo) - return len(cpuInfo) -} - -func getTotalMemory() int { - // 获取内存信息 - memInfo, err := mem.VirtualMemory() - if err != nil { - log.Errorf("Failed to get memory info: %v", err) - return 0 - } - log.Tracef("Memory info: %+v", memInfo) - return int(memInfo.Total) -} diff --git a/features/ue/ue.go b/features/ue/ue.go deleted file mode 100644 index 4c4ebb9a..00000000 --- a/features/ue/ue.go +++ /dev/null @@ -1,833 +0,0 @@ -package ue - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/constants" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" - neService "be.ems/src/modules/network_element/service" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" -) - -// AmfNBInfo AMF的NodeB信息 -type AmfNBInfo struct { - ID string `json:"id"` //NodeB ID - Name string `json:"name"` // NodeB name - Address string `json:"address"` // 基站地址 - UENum int `jons:"ueNum"` // UE数量 -} - -// SmfUENum SMF在线用户数 -type SmfUENum struct { - UENum int `json:"ueNum"` // 当前在线用户数 -} - -// SmfUEInfo SMF在线用户信息 -type SmfUEInfo struct { - IMSI string `json:"imsi"` - MSISDN string `json:"msisdn"` - RatType string `json:"ratType"` - PduSessionInfo []struct { - PduSessionID int `json:"pduSessionID"` - IPv4 string `json:"ipv4"` - IPv6 string `json:"ipv6"` - Dnn string `json:"dnn"` - Tai string `json:"tai"` - SstSD string `json:"sstSD"` - UpfN3IP string `json:"upfN3IP"` - RanN3IP string `json:"ranN3IP"` - Activetime string `json:"activeTime"` - UpState string `json:"upState"` - } `json:"pduSessionInfo"` -} - -// ImsUEInfo IMS在线用户信息 -type ImsUEInfo struct { - IMSI string `json:"imsi"` - MSISDN string `json:"msisdn"` - IMPU string `json:"impu"` - Barring int `json:"barring"` - RegState int `json:"regState"` - Activetime string `json:"activeTime"` -} - -// N3iwfUEInfo N3IWF在线用户信息 -type N3iwfUEInfo struct { - IMSI string `json:"imsi"` - - NAI string `json:"nai"` - RegState int `json:"regState"` - Activetime string `json:"activeTime"` -} - -type N3iwfUEData struct { - Data []N3iwfUEInfo `json:"data"` -} - -var ( - UriNBState = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/nbState" - UriNBInfo = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/nbInfo" - UriUEInfo = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/ueInfo" - UriUENum = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/ueNum" - UriPCFUser = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo" - UriPCFUserM = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/batch/{number}" - UriPCFUserFileImport = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/file/import" - UriPCFUserFileExport = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/file/export" - UriNSSFAvailableAMFs = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/availableAMFs" - UriNSSFSubscriptions = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/subscriptions" - - CustomUriNBState = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/nbState" - CustomUriNBInfo = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/nbInfo" - CustomUriUEInfo = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/ueInfo" - CustomUriUENum = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/ueNum" - CustomUriPCFUser = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo" - CustomUriPCFUserM = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/batch/{number}" - CustomUriPCFUserFileImport = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/file/import" - CustomUriPCFUserFileExport = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/file/export" - CustomUriNSSFAvailableAMFs = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/availableAMFs" - CustomUriNSSFSubscriptions = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/subscriptions" -) - -var client = resty.New() - -func init() { - /* - client. - SetTimeout(10 * time.Second). - SetRetryCount(1). - SetRetryWaitTime(1 * time.Second). - SetRetryMaxWaitTime(2 * time.Second). - SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) { - return 0, errors.New("quota exceeded") - }) - */ - client.SetTimeout(500 * time.Millisecond) -} - -// Get AvailableAMFs from NSSF -func GetAvailableAMFsFromNSSF(w http.ResponseWriter, r *http.Request) { - log.Info("GetAvailableAMFsFromNSSF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if strings.ToLower(neType) != "nssf" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - //neTypeLower := strings.ToLower(neType) - var neId string - neIds := services.GetParamsArrByName("neId", r) - if len(neIds) == 1 { - neId = neIds[0] - } else { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get Subscriptions from NSSF -func GetSubscriptionsFromNSSF(w http.ResponseWriter, r *http.Request) { - log.Info("GetSubscriptionsFromNSSF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if strings.ToLower(neType) != "nssf" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - //neTypeLower := strings.ToLower(neType) - var neId string - neIds := services.GetParamsArrByName("neId", r) - if len(neIds) == 1 { - neId = neIds[0] - } else { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get UEInfo from NF/NFs -func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetUEInfoFromNF processing... ") - - neId := ctx.GetQuery(r, "neId") - neType := ctx.GetParam(r, "elementTypeValue") - if neType == "" || neId == "" { - log.Error("elementTypeValue/neId is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - var response services.MapResponse - if neInfo.NeId == neId && neInfo.NeId != "" { - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF:", requestURI2NF) - resp, err := client.R(). - EnableTrace(). - 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 from NF:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - _ = json.Unmarshal(resp.Body(), &response) - } - log.Debug("response:", response) - } - - services.ResponseWithJson(w, http.StatusOK, response) -} - -// POST User Info from NF/NFs -func PostPCFUserInfo(w http.ResponseWriter, r *http.Request) { - log.Info("PostPCFUserInfo processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - // if neType == "" { - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - //neTypeLower := strings.ToLower(neType) - neType := "PCF" - var neId string - neIds := services.GetParamsArrByName("neId", r) - if len(neIds) == 1 { - neId = neIds[0] - } else { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - client.SetTimeout(1 * time.Minute) - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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"}). - SetBody(body). - Post(requestURI2NF) - if err != nil { - log.Error("Failed to post:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// PUT PCF User Info from NF/NFs -func PutPCFUserInfo(w http.ResponseWriter, r *http.Request) { - log.Info("PutPCFUserInfo processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - // if neType == "" { - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - //neTypeLower := strings.ToLower(neType) - neType := "PCF" - var neId string - neIds := services.GetParamsArrByName("neId", r) - if len(neIds) == 1 { - neId = neIds[0] - } else { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - client.SetTimeout(1 * time.Minute) - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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"}). - SetBody(body). - Put(requestURI2NF) - if err != nil { - log.Error("Failed to put:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get UEInfo from NF/NFs -func DeletePCFUserInfo(w http.ResponseWriter, r *http.Request) { - log.Info("DeletePCFUserInfo processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - // if neType == "" { - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - //neTypeLower := strings.ToLower(neType) - neType := "PCF" - var neId string - neIds := services.GetParamsArrByName("neId", r) - if len(neIds) == 1 { - neId = neIds[0] - } else { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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"}). - Delete(requestURI2NF) - if err != nil { - log.Error("Failed to delete:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - w.WriteHeader(resp.StatusCode()) - w.Write(resp.Body()) - // var response services.MapResponse - // _ = json.Unmarshal(resp.Body(), &response) - // services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get UEInfo from SMF -func GetUENumFromNF(w http.ResponseWriter, r *http.Request) { - log.Info("GetUENumFromNF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - //neTypeLower := strings.ToLower(neType) - var neId string - neIds := services.GetParamsArrByName("neId", r) - if len(neIds) == 1 { - neId = neIds[0] - } else { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get Radio Info from NF/NFs -func GetNBInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Info("GetNBInfoFromNF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - //neTypeLower := strings.ToLower(neType) - var neId string - neIds := services.GetParamsArrByName("neId", r) - if len(neIds) == 1 { - neId = neIds[0] - } else { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// PostNBInfoFromNF 接收Radio数据请求 -func PostNBInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Info("PostNBInfoFromNF processing... ") - neType := ctx.GetParam(r, "elementTypeValue") - var body struct { - NeType string `json:"neType" ` - NeName string `json:"neName" ` - RmUID string `json:"rmUID"` - StateList []struct { - Address string `json:"address" ` - Name string `json:"name" ` - Position string `json:"position" ` - NbName string `json:"nbName" ` - State string `json:"state" ` // "OFF" or "ON" - OffTime string `json:"offTime" ` //if State=OFF, will set it - OnTime string `json:"onTime" ` //if State=ON , will set it - } - } - if err := ctx.ShouldBindJSON(r, &body); err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - neTypeLower := strings.ToLower(body.NeType) - if neType == "" || neType != neTypeLower { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("inconsistent network element types")) - return - } - - neInfo := neService.NewNeInfo.FindByRmuid(body.RmUID) - if neInfo.RmUID != body.RmUID { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("inconsistent network element rmUID")) - return - } - - if len(body.StateList) == 0 { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("no stateList")) - return - } - - nbStateService := neDataService.NewNBState - for _, v := range body.StateList { - if v.Address == "" || v.State == "" { - continue - } - timeStr := v.OffTime - if v.State == "ON" { - timeStr = v.OnTime - } - nbStateService.Insert(neDataModel.NBState{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - RmUid: neInfo.RmUID, - Address: v.Address, - Name: v.Name, - Position: v.Position, - NbName: v.NbName, - State: v.State, - Time: timeStr, - }) - } - - services.ResponseStatusOK204NoContent(w) -} - -// Get Radio Info from NF/NFs -func GetNBInfoAllFromNF(w http.ResponseWriter, r *http.Request) { - log.Info("GetNBInfoAllFromNF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - //neTypeLower := strings.ToLower(neType) - // var neID string - neIDs := services.GetParamsArrByName("neId", r) - // if len(neIDs) == 1 { - // neID = neIDs[0] - // } else { - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - //var ret error - var statusCode int = 500 - var dataResponse []services.MapResponse - var neInfos []dborm.NeInfo - dborm.XormGetNeInfo2(neType, neIDs, &neInfos) - for _, neInfo := range neInfos { - // neInfo, err := dborm.XormGetNeInfo(neType, neID) - // if err != nil { - // log.Error("Failed to XormGetNeInfo:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if neInfo == nil { - // err := global.ErrCMNotFoundTargetNE - // log.Error(global.ErrCMNotFoundTargetNE) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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:", err) - continue - // services.ResponseInternalServerError500ProcessError(w, err) - // return - } else { - switch resp.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - dataResponse = append(dataResponse, response) - statusCode = http.StatusOK - } - } - } - var response services.DataResponse - response.Data = dataResponse - services.ResponseWithJson(w, statusCode, response) -} - -// Get GetUEInfoFileExportNF from NF/NFs -func GetUEInfoFileExportNF(w http.ResponseWriter, r *http.Request) { - log.Info("GetUEInfoFromNF processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - // if neType == "" { - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - //neTypeLower := strings.ToLower(neType) - var neId string - neIds := services.GetParamsArrByName("neId", r) - if len(neIds) == 1 { - neId = neIds[0] - } else { - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("token:", token) - - neInfo, err := dborm.XormGetNeInfo("PCF", neId) - if err != nil { - log.Error("Failed to XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if neInfo == nil { - err := global.ErrCMNotFoundTargetNE - log.Error(global.ErrCMNotFoundTargetNE) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neInfo:", neInfo) - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI) - - log.Debug("requestURI2NF:", requestURI2NF) - - client.SetTimeout(3 * time.Minute) - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.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("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - w.WriteHeader(resp.StatusCode()) - w.Write(resp.Body()) - // var response services.MapResponse - // _ = json.Unmarshal(resp.Body(), &response) - // services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} diff --git a/go.mod b/go.mod index 36b10023..de6fd42b 100644 --- a/go.mod +++ b/go.mod @@ -1,21 +1,18 @@ module be.ems -go 1.24.0 +go 1.24 require ( github.com/creack/pty v1.1.24 github.com/dlclark/regexp2 v1.11.5 - github.com/gin-gonic/gin v1.10.0 + github.com/expr-lang/expr v1.17.5 + github.com/gin-gonic/gin v1.10.1 github.com/glebarez/sqlite v1.11.0 - github.com/go-resty/resty/v2 v2.16.5 - github.com/go-sql-driver/mysql v1.9.2 + github.com/go-ldap/ldap/v3 v3.4.11 github.com/godoes/ginprom v0.3.7 - github.com/golang-jwt/jwt/v5 v5.2.2 - github.com/gopacket/gopacket v1.3.1 - github.com/gorilla/mux v1.8.1 + github.com/golang-jwt/jwt/v5 v5.3.0 + github.com/gopacket/gopacket v1.4.0 github.com/gorilla/websocket v1.5.3 - github.com/gosnmp/gosnmp v1.40.0 - github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f github.com/linxGnu/gosmpp v0.3.1 github.com/matoous/go-nanoid/v2 v2.1.0 github.com/mojocn/base64Captcha v1.3.8 @@ -23,28 +20,28 @@ require ( github.com/penglongli/gin-metrics v0.1.13 github.com/pkg/sftp v1.13.9 github.com/prometheus-community/pro-bing v0.7.0 - github.com/redis/go-redis/v9 v9.8.0 + github.com/redis/go-redis/v9 v9.11.0 github.com/robfig/cron/v3 v3.0.1 - github.com/shirou/gopsutil/v4 v4.25.4 - github.com/slayercat/GoSNMPServer v0.5.2 - github.com/spf13/pflag v1.0.6 + github.com/shirou/gopsutil/v4 v4.25.7 + github.com/spf13/pflag v1.0.7 github.com/spf13/viper v1.20.1 github.com/swaggo/files v1.0.1 github.com/swaggo/gin-swagger v1.6.0 - github.com/swaggo/swag v1.16.4 + github.com/swaggo/swag v1.16.6 + github.com/tsmask/go-oam v1.0.7 + github.com/wneessen/go-mail v0.6.2 github.com/xuri/excelize/v2 v2.9.0 - golang.org/x/crypto v0.38.0 - golang.org/x/term v0.32.0 - golang.org/x/text v0.25.0 - gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df + golang.org/x/crypto v0.40.0 + golang.org/x/oauth2 v0.30.0 + golang.org/x/text v0.28.0 gopkg.in/yaml.v3 v3.0.1 - gorm.io/driver/mysql v1.5.7 - gorm.io/gorm v1.26.1 - xorm.io/xorm v1.3.9 + gorm.io/driver/mysql v1.6.0 + gorm.io/gorm v1.30.0 ) require ( filippo.io/edwards25519 v1.1.0 // indirect + github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.2.0 // indirect @@ -54,12 +51,12 @@ require ( github.com/cloudwego/base64x v0.1.5 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/ebitengine/purego v0.8.2 // indirect - github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect + github.com/ebitengine/purego v0.8.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gin-contrib/sse v1.1.0 // indirect github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect @@ -68,33 +65,26 @@ 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.26.0 - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/snappy v1.0.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/jonboulle/clockwork v0.5.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/fs v0.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect - github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 // indirect - github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 // indirect github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.27 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect - github.com/onsi/ginkgo v1.16.5 // indirect - github.com/onsi/gomega v1.37.0 // indirect github.com/orcaman/concurrent-map/v2 v2.0.1 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -107,15 +97,10 @@ require ( github.com/richardlehane/mscfb v1.0.4 // indirect github.com/richardlehane/msoleps v1.0.4 // indirect github.com/sagikazarmark/locafero v0.9.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.5 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/syndtr/goleveldb v1.0.0 // indirect - github.com/tebeka/strftime v0.1.5 // indirect github.com/tklauser/go-sysconf v0.3.15 // indirect github.com/tklauser/numcpus v0.10.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect @@ -127,15 +112,14 @@ require ( golang.org/x/arch v0.16.0 // indirect golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect golang.org/x/image v0.26.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/sync v0.14.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/tools v0.32.0 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/tools v0.35.0 // indirect google.golang.org/protobuf v1.36.6 // indirect - gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect modernc.org/libc v1.62.1 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.9.1 // indirect modernc.org/sqlite v1.37.0 // indirect - xorm.io/builder v0.3.13 // indirect ) diff --git a/go.sum b/go.sum index 67d7925c..1292a6bd 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,11 @@ 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= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI= +github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= 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/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= @@ -23,7 +24,6 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -35,14 +35,12 @@ github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= -github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -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/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/expr-lang/expr v1.17.5 h1:i1WrMvcdLF249nSNlpQZN1S6NXuW9WaOfF5tPi3aw3k= +github.com/expr-lang/expr v1.17.5/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= 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= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= @@ -51,12 +49,16 @@ github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= -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/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= +github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-ldap/ldap/v3 v3.4.11 h1:4k0Yxweg+a3OyBLjdYn5OKglv18JNvfDykSoI8bW0gU= +github.com/go-ldap/ldap/v3 v3.4.11/go.mod h1:bY7t0FLK8OAVpp/vV6sSlpz3EQDGcQwc8pF0ujLgKvM= 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= @@ -76,65 +78,48 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= -github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= -github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU= -github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godoes/ginprom v0.3.7 h1:HlKZhp2qS23YPpBWrP1K1+XZQFVruC6leUqkm/1ImFE= github.com/godoes/ginprom v0.3.7/go.mod h1:U6qRPc3I1sFtgbMDrnea4sDNYcc47b5e/ZHtCW3KFtY= -github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= -github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= 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/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= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -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/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 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/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= 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/gopacket/gopacket v1.3.1 h1:ZppWyLrOJNZPe5XkdjLbtuTkfQoxQ0xyMJzQCqtqaPU= -github.com/gopacket/gopacket v1.3.1/go.mod h1:3I13qcqSpB2R9fFQg866OOgzylYkZxLTmkvcXhvf6qg= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gopacket/gopacket v1.4.0 h1:cr1OlFpzksCkZHNO0eLjaSSOrMQnpPXg0j6qHIY3y2U= +github.com/gopacket/gopacket v1.4.0/go.mod h1:EpvsxINeehp5qj4YMKMLf2/dekdhKn2IIAO/ZOifS7o= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosnmp/gosnmp v1.36.2-0.20231009064202-d306ed5aa998/go.mod h1:O938QjIS4vpSag1UTcnnBq9MfNmimuOGtvQsT1NbErc= -github.com/gosnmp/gosnmp v1.40.0 h1:MvSqHZaNnhMKdn5IVhyYzCsVfXV1lgg6ZgLRku7FVcM= -github.com/gosnmp/gosnmp v1.40.0/go.mod h1:CxVS6bXqmWZlafUj9pZUnQX5e4fAltqPcijxWpCitDo= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= -github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= 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.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= -github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -145,7 +130,6 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -156,15 +140,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 h1:0iQektZGS248WXmGIYOwRXSQhD4qn3icjMpuxwO7qlo= -github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= -github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f h1:sgUSP4zdTUZYZgAGGtN5Lxk92rK+JUFOwf+FT99EEI4= -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/linxGnu/gosmpp v0.3.1 h1:8weIv03SG8+k/vI3bO7SnZ6URjqpXy2B8EJQkPzwmjI= github.com/linxGnu/gosmpp v0.3.1/go.mod h1:H5Ca2UBCIYast4KRjc3hwgOkjzpghr4CB77jueWGQmc= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= @@ -173,8 +150,6 @@ github.com/matoous/go-nanoid/v2 v2.1.0 h1:P64+dmq21hhWdtvZfEAofnvJULaRR1Yib0+PnU github.com/matoous/go-nanoid/v2 v2.1.0/go.mod h1:KlbGNQ+FhrUNIHUxZdL63t7tl4LaPkZNpUULS8H4uVM= 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.27 h1:drZCnuvf37yPfs95E5jd9s3XhdVWLal+6BOK6qrv6IU= -github.com/mattn/go-sqlite3 v1.14.27/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -190,19 +165,6 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -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= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -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/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= -github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c= github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= @@ -215,7 +177,6 @@ github.com/pkg/sftp v1.13.9 h1:4NGkvGudBL7GteO3m6qnaQ4pC0Kvf0onSVc9gR3EWBw= github.com/pkg/sftp v1.13.9/go.mod h1:OBN7bVXdstkFFN/gdnHPUb5TE8eb8G1Rp9wCItqjkkA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus-community/pro-bing v0.7.0 h1:KFYFbxC2f2Fp6c+TyxbCOEarf7rbnzr9Gw8eIb0RfZA= @@ -226,11 +187,10 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= -github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI= -github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= +github.com/redis/go-redis/v9 v9.11.0 h1:E3S08Gl/nJNn5vkxd2i78wZxWAPNZgUNTp8WIJUAiIs= +github.com/redis/go-redis/v9 v9.11.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= @@ -242,46 +202,28 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.9.0 h1:GbgQGNtTrEmddYDSAH9QLRyfAHY12md+8YFTqyMTC9k= github.com/sagikazarmark/locafero v0.9.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPrx49OMO0Bn0hJqk= -github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= -github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= -github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= -github.com/shirou/gopsutil/v4 v4.25.4 h1:cdtFO363VEOOFrUCjZRh4XVJkb548lyF0q0uTeMqYPw= -github.com/shirou/gopsutil/v4 v4.25.4/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -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/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/slayercat/GoSNMPServer v0.5.2 h1:IK2d3kz6JoiYHbAZT5H7hrQQRzAD7rxF0iJZxWrV7Ns= -github.com/slayercat/GoSNMPServer v0.5.2/go.mod h1:6taMSIwudR+7pKRO6dz2U+xoNccZds8eiMVlEN66fXY= +github.com/shirou/gopsutil/v4 v4.25.7 h1:bNb2JuqKuAu3tRlPv5piSmBZyMfecwQ+t/ILq+1JqVM= +github.com/shirou/gopsutil/v4 v4.25.7/go.mod h1:XV/egmwJtd3ZQjBpJVY5kndsiOO4IRqy9TQnmm6VP7U= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= +github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -290,37 +232,31 @@ github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= -github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A= -github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg= -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/tebeka/strftime v0.1.5 h1:1NQKN1NiQgkqd/2moD6ySP/5CoZQsKa1d3ZhJ44Jpmg= -github.com/tebeka/strftime v0.1.5/go.mod h1:29/OidkoWHdEKZqzyDLUyC+LmgDgdHo4WAFCDT7D/Ig= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI= +github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg= github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/tsmask/go-oam v1.0.7 h1:muMa7oL3QKljCYf4aXbaIM9Qydn59TFSeswi4LqT24o= +github.com/tsmask/go-oam v1.0.7/go.mod h1:HqFtN0LA9BiR1HWyHO++DY0fyYTl2sKVnRrZzuWy9n4= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= 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/wneessen/go-mail v0.6.2 h1:c6V7c8D2mz868z9WJ+8zDKtUyLfZ1++uAZmo2GRFji8= +github.com/wneessen/go-mail v0.6.2/go.mod h1:L/PYjPK3/2ZlNb2/FjEBIn9n1rUWjW+Toy531oVmeb4= github.com/xuri/efp v0.0.0-20250227110027-3491fafc2b79 h1:78nKszZqigiBRBVcoe/AuPzyLTWW5B+ltBaUX1rlIXA= github.com/xuri/efp v0.0.0-20250227110027-3491fafc2b79/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE= github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE= github.com/xuri/nfp v0.0.0-20250226145837-86d5fc24b2ba h1:DhIu6n3qU0joqG9f4IO6a/Gkerd+flXrmlJ+0yX2W8U= github.com/xuri/nfp v0.0.0-20250226145837-86d5fc24b2ba/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -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= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -328,38 +264,28 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 golang.org/x/arch v0.16.0 h1:foMtLTdyOmIniqWCHjY6+JxuC54XP1fDwx4N0ASyW+U= golang.org/x/arch v0.16.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY= golang.org/x/image v0.26.0 h1:4XjIFEZWQmCZi6Wv8BoxsDhRU3RVnLX04dToTDAEPlY= golang.org/x/image v0.26.0/go.mod h1:lcxbMFAovzpnJxzXS3nyL83K27tmqtKzIJpctK8YO5c= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -367,53 +293,38 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= 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= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -423,8 +334,9 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= +golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -434,55 +346,30 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= -golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -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= -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= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= -gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= -gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= -gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -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.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= -gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= -gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -gorm.io/gorm v1.26.1 h1:ghB2gUI9FkS46luZtn6DLZ0f6ooBJ5IbVej2ENFDjRw= -gorm.io/gorm v1.26.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg= +gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= modernc.org/cc/v4 v4.25.2 h1:T2oH7sZdGvTaie0BRNFbIYsabzCxUQg8nLqCdQ2i0ic= modernc.org/cc/v4 v4.25.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v4 v4.25.1 h1:TFSzPrAGmDsdnhT9X2UrcPMI3N/mJ9/X9ykKXwLhDsU= @@ -508,7 +395,3 @@ modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -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= -xorm.io/xorm v1.3.9/go.mod h1:LsCCffeeYp63ssk0pKumP6l96WZcHix7ChpurcLNuMw= diff --git a/lib/aes/aes.go b/lib/aes/aes.go deleted file mode 100644 index 5ce2fb40..00000000 --- a/lib/aes/aes.go +++ /dev/null @@ -1,64 +0,0 @@ -package aes - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "encoding/base64" -) - -func AesEncrypt(orig string, key string) string { - // 转成字节数组 - origData := []byte(orig) - k := []byte(key) - - // 分组秘钥 - block, _ := aes.NewCipher(k) - // 获取秘钥块的长度 - blockSize := block.BlockSize() - // 补全码 - origData = PKCS7Padding(origData, blockSize) - // 加密模式 - blockMode := cipher.NewCBCEncrypter(block, k[:blockSize]) - // 创建数组 - cryted := make([]byte, len(origData)) - // 加密 - blockMode.CryptBlocks(cryted, origData) - - return base64.StdEncoding.EncodeToString(cryted) - -} - -func AesDecrypt(cryted string, key string) string { - // 转成字节数组 - crytedByte, _ := base64.StdEncoding.DecodeString(cryted) - k := []byte(key) - - // 分组秘钥 - block, _ := aes.NewCipher(k) - // 获取秘钥块的长度 - blockSize := block.BlockSize() - // 加密模式 - blockMode := cipher.NewCBCDecrypter(block, k[:blockSize]) - // 创建数组 - orig := make([]byte, len(crytedByte)) - // 解密 - blockMode.CryptBlocks(orig, crytedByte) - // 去补全码 - orig = PKCS7UnPadding(orig) - return string(orig) -} - -// 补码 -func PKCS7Padding(ciphertext []byte, blocksize int) []byte { - padding := blocksize - len(ciphertext)%blocksize - padtext := bytes.Repeat([]byte{byte(padding)}, padding) - return append(ciphertext, padtext...) -} - -// 去码 -func PKCS7UnPadding(origData []byte) []byte { - length := len(origData) - unpadding := int(origData[length-1]) - return origData[:(length - unpadding)] -} diff --git a/lib/config/config.go b/lib/config/config.go deleted file mode 100644 index 2ba6afae..00000000 --- a/lib/config/config.go +++ /dev/null @@ -1,475 +0,0 @@ -package config - -import ( - "bufio" - "fmt" - "os" - "reflect" - "strings" - - "be.ems/lib/global" - "be.ems/lib/log" - - "gopkg.in/yaml.v3" -) - -// Yaml struct of config -type YamlConfig struct { - Logger struct { - File string `yaml:"file"` - Level string `yaml:"level"` - Duration int `yaml:"duration"` - Count int `yaml:"count"` - } `yaml:"logger"` - - OMC struct { - UriPrefix string `yaml:"uriPrefix"` - NeType string `yaml:"neType"` - NeId string `yaml:"neId"` - RmUID string `yaml:"rmUID"` - NeName string `yaml:"neName"` - Province string `yaml:"province"` - Vendor string `yaml:"vendor"` - Dn string `yaml:"dn"` - Chk2Ne bool `yaml:"chk2ne"` - Capability uint32 `yaml:"capability"` - Sn string `yaml:"sn"` - ExpiryDate string `yaml:"expiryDate"` - CheckSign bool `yaml:"checksign"` - RootDir string `yaml:"rootDir"` - BinDir string `yaml:"binDir"` - Backup string `yaml:"backup"` - Upload string `yaml:"upload"` - FrontUpload string `yaml:"frontUpload"` - FrontTraceDir string `yaml:"frontTraceDir"` - Software string `yaml:"software"` - License string `yaml:"license"` - GtpUri string `yaml:"gtpUri"` - CheckContentType bool `yaml:"checkContentType"` - TestMode bool `yaml:"testMode"` - RBACMode bool `yaml:"rbacMode"` - RunDir string `yaml:"runDir"` - CmdTimeout int `yaml:"cmdTimeout"` - } `yaml:"omc"` - - Alarm AlarmConfig `yaml:"alarm"` - - MML MMLParam `yaml:"mml"` - - NE struct { - Addr string `yaml:"addr"` - Port uint16 `yaml:"port"` - User string `yaml:"user"` - EtcDir string `yaml:"etcdir"` - BinDir string `yaml:"bindir"` - OmcDir string `yaml:"omcdir"` - ScpDir string `yaml:"scpdir"` - LicenseDir string `yaml:"licensedir"` - EtcListIMS string `yaml:"etcListIMS"` - EtcListDefault string `yaml:"etcListDefault"` - DpkgOverwrite bool `yaml:"dpkgOverwrite"` - DpkgTimeout int `yaml:"dpkgTimeout"` - } `yaml:"ne"` - - Auth struct { - Crypt string `yaml:"crypt"` - Token bool `yaml:"token"` - Expires uint32 `yaml:"expires"` - Session string `yaml:"session"` - PublicKey string `yaml:"publicKey"` - PrivateKey string `yaml:"privateKey"` - } `yaml:"auth"` - - Params struct { - RmUIDMaxNum int `yaml:"rmuidmaxnum"` - AlarmIDMaxNum int `yaml:"alarmidmaxnum"` - PmIDMaxNum int `yaml:"pmidmaxnum"` - SubIDMaxNum int `yaml:"subidmaxnum"` - UriMaxLen int `yaml:"urimaxlen"` - RmUIDRegexp string `yaml:"rmuidregexp"` - } `yaml:"params"` - - TestConfig struct { - Enabled bool `yaml:"enabled"` - File string `yaml:"file"` - } `yaml:"testConfig"` -} - -// type DbConfig 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"` -// ConnParam string `yaml:"connParam,omitempty"` -// Backup string `yaml:"backup"` -// } - -type AlarmConfig struct { - SplitEventAlarm bool `yaml:"splitEventAlarm"` - //ForwardAlarm bool `yaml:"forwardAlarm"` - - EmailForward struct { - Enable bool `yaml:"enable" json:"enable"` - EmailList string `yaml:"emailList" json:"emailList"` - Title string `yaml:"title" json:"title"` - SMTP string `yaml:"smtp" json:"smtp"` - Port uint16 `yaml:"port" json:"port"` - User string `yaml:"user" json:"user"` - Password string `yaml:"password" json:"password"` - TLSSkipVerify bool `yaml:"tlsSkipVerify" json:"tlsSkipVerify"` - } `yaml:"alarmEmailForward"` - SMSCForward struct { - Enable bool `yaml:"enable" json:"enable"` - MobileList string `yaml:"mobileList" json:"mobileList"` - SMSCAddr string `yaml:"smscAddr" json:"smscAddr"` - SystemID string `yaml:"systemID" json:"systemID"` - Password string `yaml:"password" json:"password"` - SystemType string `yaml:"systemType" json:"systemType"` - DataCoding byte `yaml:"dataCoding" json:"dataCoding"` - ServiceNumber string `yaml:"serviceNumber" json:"serviceNumber"` - } `yaml:"alarmSMSForward"` - SMS struct { - ApiURL string `yaml:"apiURL"` - AccessKeyID string `yaml:"AccessKeyID"` - AccessKeySecret string `yaml:"accessKeySecret"` - SignName string `yaml:"signName"` - TemplateCode string `yaml:"templateCode"` - } `yaml:"smsForward"` - SMProxy string `yaml:"smProxy"` -} - -type MMLParam struct { - Sleep int64 `yaml:"sleep"` - DeadLine int64 `yaml:"deadLine"` - SizeRow int16 `yaml:"sizeRow"` - SizeCol int16 `yaml:"sizeCol"` - BufferSize int `yaml:"bufferSize"` - MmlHome string `yaml:"mmlHome"` -} - -type TestDatas struct { - UDM struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"udm"` - AUSF struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"ausf"` - AMF struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"amf"` - SMF struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"smf"` - UPF struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"upf"` -} - -type NeTestData struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` -} -type TestDataMap struct { - NeTestDatas []map[string]NeTestData -} - -var yamlConfig YamlConfig = NewYamlConfig() - -type YamlConfigFile struct { - FilePath string `json:"filePath"` - ConfigLines YamlConfig `json:"configLines"` - OrignalLines []string `json:"orignalLines"` -} - -var YamlConfigInfo YamlConfigFile = YamlConfigFile{ - ConfigLines: NewYamlConfig(), -} - -// set default value for yaml config -func NewYamlConfig() YamlConfig { - return YamlConfig{ - // Database: DbConfig{ - // Type: "mysql", - // ConnParam: "charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True", - // }, - MML: MMLParam{ - SizeRow: 200, - SizeCol: 120, - BufferSize: 65535, - }, - Alarm: AlarmConfig{ - SplitEventAlarm: true, - }, - } -} - -func ReadConfig(configFile string) { - YamlConfigInfo.FilePath = configFile - - yamlFile, err := os.ReadFile(configFile) - if err != nil { - fmt.Println("Read yaml config file error:", err) - os.Exit(2) - } - // fmt.Println("yamlfile:", string(yamlFile)) - - err = yaml.Unmarshal(yamlFile, &YamlConfigInfo.ConfigLines) - if err != nil { - fmt.Println("Unmarshal error:", err) - os.Exit(3) - } - yamlConfig = YamlConfigInfo.ConfigLines - - ReadOriginalConfig(configFile) -} - -func ReadOriginalConfig(configFile string) { - // 读取原始YAML文件 - inputFile, err := os.Open(configFile) - if err != nil { - fmt.Println("failed to open:", err) - os.Exit(3) - } - defer inputFile.Close() - - scanner := bufio.NewScanner(inputFile) - for scanner.Scan() { - YamlConfigInfo.OrignalLines = append(YamlConfigInfo.OrignalLines, scanner.Text()) - } - - if err := scanner.Err(); err != nil { - fmt.Println("failed to scanner:", err) - os.Exit(3) - } -} - -func WriteOrignalConfig(configFile string, paramName string, paramData map[string]any) error { - lines := YamlConfigInfo.OrignalLines - for i, line := range lines { - if strings.Contains(line, paramName) { - for k, v := range paramData { - // find the first line nearby the paramName - for j := i + 1; j < len(lines); j++ { - if strings.Contains(lines[j], k+":") { - index := strings.Index(lines[j], k) - // Determine the type of v - switch v := v.(type) { - case string: - lines[j] = lines[j][:index] + fmt.Sprintf("%s: \"%s\"", k, v) - // case int: - // lines[j] = lines[j][:index] + fmt.Sprintf("%s: %d", k, v) - // case float64: - // lines[j] = lines[j][:index] + fmt.Sprintf("%s: %f", k, v) - case bool: - lines[j] = lines[j][:index] + fmt.Sprintf("%s: %t", k, v) - default: - lines[j] = lines[j][:index] + fmt.Sprintf("%s: %v", k, v) - } - break - } - } - } - break - } - } - - // write back to yaml file - outputFile, err := os.Create(configFile) - if err != nil { - fmt.Println(err) - return err - } - defer outputFile.Close() - - writer := bufio.NewWriter(outputFile) - for _, line := range YamlConfigInfo.OrignalLines { - writer.WriteString(line + "\n") - } - writer.Flush() - return nil -} - -func WriteYamlConfig(newConfigData YamlConfig, configFile string) error { - // 将配置转换回YAML数据 - newYamlData, err := yaml.Marshal(&newConfigData) - if err != nil { - log.Errorf("Failed to marshal YAML: %v", err) - return err - } - - // 将新的YAML数据写入文件 - err = os.WriteFile(configFile, newYamlData, 0644) - if err != nil { - log.Errorf("Failed to write YAML file: %v", err) - return err - } - return nil -} - -var mapYaml map[string]interface{} - -func ReadParamConfig(fileName string) *map[string]interface{} { - file, err := os.ReadFile(fileName) - if err != nil { - fmt.Println("Read yaml file error:", err) - } - - mapYaml = make(map[string]interface{}) - - err = yaml.Unmarshal(file, &mapYaml) - if err != nil { - fmt.Printf("yaml.Unmarshal: %v when to struct", err) - } - // fmt.Println("mapYaml:", mapYaml) - - return &mapYaml -} - -func UpdateStructFromMap(s any, updates map[string]any) { - v := reflect.ValueOf(s).Elem() - t := v.Type() - - for key, value := range updates { - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - if field.Tag.Get("json") == key { - structField := v.FieldByName(field.Name) - if structField.IsValid() && structField.CanSet() { - // Convert value to the appropriate type if necessary - convertedValue := reflect.ValueOf(value).Convert(structField.Type()) - if structField.Type() == convertedValue.Type() { - structField.Set(convertedValue) - } - } - break - } - } - } -} - -func GetYamlConfig() *YamlConfig { - return &YamlConfigInfo.ConfigLines -} - -func GetAuthFromConfig() interface{} { - return yamlConfig.Auth -} - -func GetExpiresFromConfig() uint32 { - return yamlConfig.Auth.Expires -} - -func GetRmUIDFromConfig() string { - return yamlConfig.OMC.RmUID -} - -func GetRmUIDRegexpFromConfig() string { - return yamlConfig.Params.RmUIDRegexp -} - -func GetRmUIDMaxNumFromConfig() int { - return yamlConfig.Params.RmUIDMaxNum -} - -func GetAlarmIDMaxNumFromConfig() int { - return yamlConfig.Params.AlarmIDMaxNum -} - -func GetPmIDMaxNumFromConfig() int { - return yamlConfig.Params.PmIDMaxNum -} - -func GetSubIDMaxNumFromConfig() int { - return yamlConfig.Params.SubIDMaxNum -} - -func GetUriMaxLenFromConfig() int { - return yamlConfig.Params.UriMaxLen -} - -func GetLogLevel() log.LogLevel { - var logLevel log.LogLevel - switch strings.ToLower(yamlConfig.Logger.Level) { - case "trace": - logLevel = log.LOG_TRACE - case "info": - logLevel = log.LOG_INFO - case "debug": - logLevel = log.LOG_DEBUG - case "warn": - logLevel = log.LOG_WARN - case "error": - logLevel = log.LOG_ERROR - case "fatal": - logLevel = log.LOG_FATAL - case "off": - logLevel = log.LOG_OFF - default: - logLevel = log.LOG_DEBUG - } - return logLevel -} - -var ( - DefaultUriPrefix string = "/api/rest" - UriPrefix string = "/omc/rest" - //TestDataUDM []map[string]interface{} - TDatas map[string]NeTestData -) - -func ReadTestConfigYaml(pfile string) (ret error) { - file, err := os.ReadFile(pfile) - if err != nil { - return err - } - - err = yaml.Unmarshal(file, &TDatas) - if err != nil { - fmt.Println("Failed to Unmarshal:", err) - return err - } - - return nil -} - -func GetDefaultUserAgent() string { - return "OMC/" + global.Version -} - -// const defaultConfigFile = "./etc/restconf.yaml" - -// func init() { -// cfile := flag.String("c", defaultConfigFile, "config file") -// pv := flag.Bool("version", false, "print version") -// ph := flag.Bool("help", false, "print help") - -// //global.BuildTime = "Wed May 31 18:24:04 CST 2023" -// //global.GoVer = "go version go1.15.7 linux/arm64" -// flag.Parse() -// if *pv { -// fmt.Printf("OMC restagent version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) -// os.Exit(0) -// } -// if *ph { -// flag.Usage() -// os.Exit(0) -// } - -// // 使用viper读取配置 -// conf.InitConfig(*cfile) - -// ReadConfig(*cfile) -// if GetYamlConfig().OMC.UriPrefix != "" { -// UriPrefix = GetYamlConfig().OMC.UriPrefix -// } -// if GetYamlConfig().TestConfig.Enabled { -// ReadTestConfigYaml(GetYamlConfig().TestConfig.File) -// } -// } diff --git a/lib/config/map.go b/lib/config/map.go deleted file mode 100644 index 4c012791..00000000 --- a/lib/config/map.go +++ /dev/null @@ -1,111 +0,0 @@ -package config - -import ( - "io/ioutil" - "log" - - "gopkg.in/yaml.v3" - - "be.ems/lib/global" -) - -type Uri2Object struct { - Uri string `yaml:"uri"` - Object []Object `yaml:"object"` -} - -type Object struct { - Name string `yaml:"name"` - Syntax string `yaml:"syntax"` - Oid string `yaml:"oid"` -} - -var uri2Object []Uri2Object - -func ReadMap(pfile string) (ret error) { - file, err := ioutil.ReadFile(pfile) - if err != nil { - log.Println(err) - return err - } - - err = yaml.Unmarshal(file, &uri2Object) - if err != nil { - log.Println(err) - return err - } - /* - for _, v := range uri2Object { - log.Println(v) - } - */ - return nil -} - -func GetOid(uri string, oids *[]string) *[]string { - for _, v := range uri2Object { - if uri == v.Uri { - for _, o := range v.Object { - *oids = append(*oids, o.Oid) - } - } - } - - return oids -} - -func GetOidByFileds(uri string, fields []string, oids *[]string) *[]string { - for _, v := range uri2Object { - if uri == v.Uri { - for _, o := range v.Object { - if global.IsContain(o.Name, fields) || len(fields) == 0 { - *oids = append(*oids, o.Oid) - } - } - } - } - - return oids -} - -type NameOid struct { - Name string - Oid string -} - -type NameValue struct { - Name string - Value string -} - -func GetDataOid(Uri string, nameOids *[]NameOid) *[]NameOid { - var nameOid NameOid - for _, v := range uri2Object { - if Uri == v.Uri { - for _, o := range v.Object { - nameOid.Name = o.Name - nameOid.Oid = o.Oid - *nameOids = append(*nameOids, nameOid) - } - } - } - - return nameOids -} - -func GetDataOidByFields(uri string, fields []string, nameOids *[]NameOid) *[]NameOid { - var nameOid NameOid - for _, v := range uri2Object { - if uri == v.Uri { - for _, o := range v.Object { - nameOid.Name = o.Name - nameOid.Oid = o.Oid - if len(fields) == 0 || global.IsContainP(nameOid.Name, &fields, len(fields)) { - *nameOids = append(*nameOids, nameOid) - } - } - } - } - - return nameOids -} diff --git a/lib/core/ctx/ctx.go b/lib/core/ctx/ctx.go deleted file mode 100644 index 57cda575..00000000 --- a/lib/core/ctx/ctx.go +++ /dev/null @@ -1,185 +0,0 @@ -package ctx - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "os" - "path/filepath" - "strings" - - "be.ems/src/framework/constants" - "be.ems/src/framework/token" - "github.com/gorilla/mux" -) - -// GetParam 地址栏参数{id} -func GetParam(r *http.Request, key string) string { - vars := mux.Vars(r) - v, ok := vars[key] - if ok { - return v - } - return "" -} - -// GetQuery 查询参数 -func GetQuery(r *http.Request, key string) string { - return r.URL.Query().Get(key) -} - -// GetHeader 请求头参数 -func GetHeader(r *http.Request, key string) string { - return r.Header.Get(key) -} - -// QueryMap 查询参数转换Map -func QueryMap(r *http.Request) map[string]any { - queryValues := r.URL.Query() - queryParams := make(map[string]any) - for key, values := range queryValues { - queryParams[key] = values[0] - } - return queryParams -} - -// ShouldBindQuery 查询参数读取json请求结构团体 &xxx -func ShouldBindQuery(r *http.Request, args any) error { - queryParams := QueryMap(r) - body, err := json.Marshal(queryParams) - if err != nil { - return err - } - return json.Unmarshal(body, args) -} - -// ShouldBindJSON 读取json请求结构团体 &xxx -func ShouldBindJSON(r *http.Request, args any) error { - body, err := io.ReadAll(io.LimitReader(r.Body, 1<<20)) // 设置较大的长度,例如 1<<20 (1MB) - if err != nil { - return err - } - err = json.Unmarshal(body, args) - return err -} - -// JSON 相应json数据 -func JSON(w http.ResponseWriter, code int, data any) { - w.Header().Set("Content-Type", "application/json;charset=UTF-8") - - response, err := json.Marshal(data) - if err != nil { - w.WriteHeader(500) - w.Write([]byte(err.Error())) - } else { - w.WriteHeader(code) - w.Write(response) - } -} - -// 将文件导出到外部下载 -func FileAttachment(w http.ResponseWriter, r *http.Request, filepath, filename string) { - w.Header().Set("Content-Disposition", `attachment; filename=`+url.QueryEscape(filename)) - w.Header().Set("Content-Type", "application/octet-stream") - http.ServeFile(w, r, filepath) -} - -// 将文件上传保存到指定目录 -// file, handler, err := r.FormFile("file") -// SaveUploadedFile uploads the form file to specific dst. -func SaveUploadedFile(r *http.Request, dst string) error { - // 解析请求中的文件 - _, handler, err := r.FormFile("file") - if err != nil { - return err - } - - src, err := handler.Open() - if err != nil { - return err - } - defer src.Close() - - if err = os.MkdirAll(filepath.Dir(dst), 0750); err != nil { - return err - } - - out, err := os.Create(dst) - if err != nil { - return err - } - defer out.Close() - - _, err = io.Copy(out, src) - return err -} - -/// ==== 登录用户信息, 通过中间件后预置入 - -// Authorization 解析请求头 -func Authorization(r *http.Request) string { - // Query请求查询 - if authQuery := r.URL.Query().Get(constants.ACCESS_TOKEN); authQuery != "" { - return authQuery - } - // Header请求头 - if authHeader := r.Header.Get(constants.ACCESS_TOKEN); authHeader != "" { - return authHeader - } - - // Query请求查询 - if authQuery := r.URL.Query().Get(constants.ACCESS_TOKEN_QUERY); authQuery != "" { - return authQuery - } - // Header请求头 - authHeader := r.Header.Get(constants.HEADER_KEY) - if authHeader == "" { - return "" - } - // 拆分 Authorization 请求头,提取 JWT 令牌部分 - tokenStr := strings.Replace(authHeader, constants.HEADER_PREFIX, "", 1) - if len(tokenStr) > 64 { - return strings.TrimSpace(tokenStr) // 去除可能存在的空格 - } - return "" -} - -// ContextKey 定义自定义类型作为键 -type ContextKey string - -// LoginUser 登录用户信息需要Authorize中间件 -func LoginUser(r *http.Request) (token.UserInfo, error) { - // 获取请求头标识信息 - tokenStr := Authorization(r) - if tokenStr == "" { - return token.UserInfo{}, fmt.Errorf("not token info") - } - if tokenStr == "" { - return token.UserInfo{}, fmt.Errorf("authorization token is empty") - } - - // 验证令牌 - claims, err := token.UserTokenVerify(tokenStr, "access") - if err != nil { - return token.UserInfo{}, err - } - - // 获取缓存的用户信息 - info := token.UserInfoGet(claims) - if info.UserId <= 0 { - return token.UserInfo{}, fmt.Errorf("invalid login user information") - } - - return info, nil -} - -// LoginUserToUserName 登录用户信息-用户名称 -func LoginUserToUserName(r *http.Request) string { - loginUser, err := LoginUser(r) - if err != nil { - return "" - } - return loginUser.User.UserName -} diff --git a/lib/dborm/dborm.go b/lib/dborm/dborm.go deleted file mode 100644 index cfe12f29..00000000 --- a/lib/dborm/dborm.go +++ /dev/null @@ -1,1561 +0,0 @@ -package dborm - -import ( - "database/sql" - "encoding/json" - "errors" - "fmt" - "strconv" - "time" - - "strings" - - "be.ems/lib/log" - neService "be.ems/src/modules/network_element/service" - - _ "github.com/go-sql-driver/mysql" - "xorm.io/xorm" - "xorm.io/xorm/core" -) - -const ( - TableNameMeasureTask = "measure_task" - TableNameNeInfo = "ne_info" -) - -type Menu struct { - Id int `json:"id"` - Title string `json:"title"` - Icon string `json:"icon"` - Href string `json:"href"` - ParentId int `json:"parent_id"` - Remark int `json:"remark"` -} - -type DatabaseClient struct { - dbType string - dbUrl string - dbConnMaxLifetime time.Duration - dbMaxIdleConns int - dbMaxOpenConns int - IsShowSQL bool - - XEngine *xorm.Engine -} - -var DbClient DatabaseClient - -func InitDbClient(dbType, dbUser, dbPassword, dbHost, dbPort, dbName, dbParam string) error { - DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s", - dbUser, dbPassword, dbHost, dbPort, dbName, dbParam) - DbClient.dbType = dbType - DbClient.dbConnMaxLifetime = 0 - DbClient.dbMaxIdleConns = 0 - DbClient.dbMaxOpenConns = 0 - if log.GetLevel() == log.LOG_TRACE { - DbClient.IsShowSQL = true - } - log.Debugf("dbType:%s dbUrl:%s:", dbType, DbClient.dbUrl) - - var err error - DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl) - if err != nil { - log.Error("Failed to connet database:", err) - return err - } - DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime) - DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns) - DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns) - DbClient.XEngine.DatabaseTZ = time.Local // 必须 - DbClient.XEngine.TZLocation = time.Local // 必须 - if DbClient.IsShowSQL { - DbClient.XEngine.ShowSQL(true) - } - - xEngine = DbClient.XEngine - - return nil -} - -// func InitDbClient() error { -// db := config.GetYamlConfig().Database -// DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", db.User, db.Password, db.Host, db.Port, db.Name) -// DbClient.dbType = db.Type -// DbClient.dbConnMaxLifetime = 0 -// DbClient.dbMaxIdleConns = 0 -// DbClient.dbMaxOpenConns = 0 -// if log.GetLevel() == log.LOG_TRACE { -// DbClient.IsShowSQL = true -// } -// log.Debugf("dbType:%s dbUrl:%s:******@tcp(%s:%s)/%s", DbClient.dbType, db.User, db.Host, db.Port, db.Name) -// var err error -// DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl) -// if err != nil { -// log.Error("Failed to connet database:", err) -// return err -// } -// DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime) -// DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns) -// DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns) -// if DbClient.IsShowSQL { -// DbClient.XEngine.ShowSQL(true) -// } -// xEngine = DbClient.XEngine - -// return nil -// } - -var xEngine *xorm.Engine - -func XormConnectDatabase(dbType, dbUser, dbPassword, dbHost, dbPort, dbName string) (*xorm.Engine, error) { - sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", - dbUser, dbPassword, dbHost, dbPort, dbName) - log.Debugf("dbType:%s Connect to:%s:******@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", - dbType, dbUser, dbHost, dbPort, dbName) - var err error - xEngine, err = xorm.NewEngine(dbType, sqlStr) //1、Create xorm engine - if err != nil { - log.Error("Failed to connect database:", err) - return nil, err - } - if log.GetLevel() == log.LOG_TRACE { - xEngine.ShowSQL(true) - } - return xEngine, nil -} - -func XCoreDB() *core.DB { - return xEngine.DB() -} - -func XEngDB() *xorm.Engine { - return xEngine -} - -func ConstructInsertSQL(tableName string, insertData interface{}) (string, []string) { - log.Debug("ConstructInsertSQL processing... ") - log.Debug("Request insertData:", insertData) - - var sql []string - var dataTag string - for t, d := range insertData.(map[string]interface{}) { - log.Tracef("t: %v d: %v", t, d) - dataTag = t - - for i, r := range d.([]interface{}) { - var cl, vl string - log.Tracef("i: %v r: %v", i, r) - for c, v := range r.(map[string]interface{}) { - log.Tracef("c: %v v: %v", c, v) - if cl == "" { - cl = fmt.Sprint(c) - } else { - cl = fmt.Sprintf("%s, %s", cl, c) - } - if vl == "" { - vl = fmt.Sprintf("'%v'", v) - } else { - vl = fmt.Sprintf("%s, '%v'", vl, v) - } - - log.Tracef("cl: %s vl: %s", cl, vl) - } - sql = append(sql, "insert into "+tableName+"("+cl+")"+" values("+vl+")") - } - - log.Debug("sql:", sql) - } - - return dataTag, sql -} - -func InsertDataWithJson(insertData interface{}) (int64, error) { - log.Debug("InsertDataWithJson processing... ") - - var data map[string]interface{} - var tableName string - for k, v := range insertData.(map[string]interface{}) { - log.Tracef("k: %v v: %v", k, v) - tableName = k - data = v.(map[string]interface{}) - } - - log.Tracef("data: %v", data) - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Insert(data, tableName) - xSession.Commit() - - return affected, err -} - -type NeInfo struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` // neUID/rmUID 网元唯一标识 - RmUID string `json:"rmUid" xorm:"rm_uid"` // neUID/rmUID网元UID - NeName string `json:"neName" xorm:"ne_name"` // NeName/UserLabel 网元名称/网元设备友好名称 - Ip string `json:"ip" xorm:"ip"` - Port string `json:"port" xorm:"port"` - PvFlag string `json:"pvFlag" xorm:"pv_flag"` // 网元虚实性标识 VNF/PNF: 虚拟/物理 - NeAddress string `json:"neAddress" xorm:"ne_address"` // 只对PNF - Province string `json:"province" xorm:"province"` // 网元所在省份 - VendorName string `json:"vendorName" xorm:"vendor_name"` // 厂商名称 - Dn string `json:"dn" xorm:"dn"` // 网络标识 - Status int `json:"status" xorm:"status"` - UpdateTime time.Time `json:"updateTime" xorm:"<-"` -} - -func XormGetNeInfo(neType string, neId string) (*NeInfo, error) { - log.Debug("XormGetNeInfo processing... ") - neInfox := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - neInfo := new(NeInfo) - neInfo.NeType = neType - neInfo.NeId = neId - neInfo.RmUID = neInfox.RmUID - neInfo.NeName = neInfox.NeName - neInfo.Ip = neInfox.IP - neInfo.Port = fmt.Sprint(neInfox.Port) - neInfo.PvFlag = neInfox.PvFlag - neInfo.NeAddress = neInfox.NeAddress - neInfo.Province = neInfox.Province - neInfo.VendorName = neInfox.VendorName - neInfo.Dn = neInfox.Dn - neInfo.Status = int(neInfox.Status) - neInfo.UpdateTime = time.UnixMilli(neInfox.UpdateTime) - - return neInfo, nil -} - -func XormGetNeInfoByRmUID(neType string, rmUID string) (*NeInfo, error) { - log.Debug("XormGetNeInfoByRmUID processing... ") - - neInfo := new(NeInfo) - has, err := xEngine.Where("ne_type=? and rm_uid=?", strings.ToUpper(neType), rmUID).Get(neInfo) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return nil, err - } else if !has { - log.Infof("Not found ne_info from database, neType=%s, neId=%s", neType, rmUID) - return nil, nil - } - - log.Debug("NE Info:", neInfo) - return neInfo, nil -} - -func XormGetAllNeInfo(nes *[]NeInfo) (*[]NeInfo, error) { - log.Debug("XormGetAllNeInfo processing... ") - - ne := new(NeInfo) - rows, err := xEngine.Table("ne_info").Rows(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return nil, err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return nil, err - } - *nes = append(*nes, *ne) - } - log.Trace("nes:", nes) - return nes, nil -} - -func XormGetNeInfoByNeType(neType string, nes *[]NeInfo) error { - log.Debug("XormGetNeInfoByNeType processing... ") - - ne := new(NeInfo) - rows, err := xEngine.Table("ne_info").Where("ne_type=?", neType).Rows(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return err - } - *nes = append(*nes, *ne) - } - - return nil -} - -func XormGetNeInfo2(neType string, neIDs []string, nes *[]NeInfo) error { - log.Info("XormGetNeInfo2 processing... ") - - ne := new(NeInfo) - var rows *xorm.Rows - var err error - if len(neIDs) == 0 { - rows, err = xEngine.Table("ne_info"). - Where("ne_type=?", neType). - Rows(ne) - } else { - rows, err = xEngine.Table("ne_info"). - In("ne_id", neIDs). - And("ne_type=?", neType). - Rows(ne) - } - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return err - } - *nes = append(*nes, *ne) - } - - return nil -} - -func XormInsertNeInfo(neInfo *NeInfo) (int64, error) { - log.Debug("XormInsertNeInfo processing... ") - - var affected int64 = 0 - var err error = nil - - xSession := xEngine.NewSession() - defer xSession.Close() - ex, _ := xEngine.Table("ne_info").Where("status = '1' and ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Exist() - if ex { - neInfo.Status = 0 - affected, err = xSession.Where("ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Update(neInfo) - } else { - affected, err = xSession.InsertOne(neInfo) - } - xSession.Commit() - return affected, err -} - -func XormUpdateNeInfo(neInfo *NeInfo) (int64, error) { - log.Debug("XormUpdateNeInfo processing... ") - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.ID(neInfo.Id).MustCols("status").Update(neInfo) - xSession.Commit() - return affected, err -} - -func XormDeleteNeInfo(neInfo *NeInfo) (int64, error) { - log.Debug("XormDeleteNeInfo processing... ") - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Where("ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Delete(neInfo) - xSession.Commit() - return affected, err -} - -func XormParseResult(body []byte) ([]NeInfo, error) { - log.Debug("XormParseResult processing... ") - - data := make(map[string]interface{}) - err := json.Unmarshal(body, &data) - if err != nil { - return nil, err - } - var neInfo []NeInfo - var re interface{} - if data["data"] == nil { - return nil, errors.New("the data is not found") - } - for _, d := range data["data"].([]interface{}) { - if d == nil { - return nil, errors.New("the data is Not found") - } - for _, re = range d.(map[string]interface{}) { - if re == nil { - return nil, errors.New("the data is Not found") - } - for _, rc := range re.([]interface{}) { - if rc == nil { - return nil, errors.New("the data is Not found") - } - var s NeInfo - record := rc.(map[string]interface{}) - s.NeName = fmt.Sprintf("%v", record["ne_name"]) - s.NeId = fmt.Sprintf("%v", record["ne_id"]) - s.NeType = fmt.Sprintf("%v", strings.ToLower(record["ne_type"].(string))) - s.Ip = fmt.Sprintf("%v", record["ip"]) - s.Port = fmt.Sprintf("%v", record["port"]) - s.PvFlag = fmt.Sprintf("%v", record["pv_flag"]) - - neInfo = append(neInfo, s) - } - } - } - - log.Debug("neInfo:", neInfo) - return neInfo, nil -} - -func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) { - log.Debug("ConstructUpdateSQL processing... ") - log.Debug("Request updateData:", updateData) - - var sql []string - var tblName string - for t, d := range updateData.(map[string]interface{}) { - log.Tracef("t: %v d: %v", t, d) - tblName = t - - for i, r := range d.([]interface{}) { - var cv string - log.Tracef("i: %v r: %v", i, r) - for c, v := range r.(map[string]interface{}) { - log.Tracef("c: %v v: %v", c, v) - if cv == "" { - cv = fmt.Sprintf("`%s`='%s'", c, v) - } else { - cv = fmt.Sprintf("%s,`%s`='%s'", cv, c, v) - } - - log.Tracef("cv: %s", cv) - } - sql = append(sql, "UPDATE "+tableName+" SET "+cv+" WHERE "+whereCondition) - } - - log.Debug("sql:", sql) - } - - return tblName, sql -} - -func ConstructUpdateSQL(tableName string, updateData interface{}, whereCondition string) (string, []string) { - log.Debug("ConstructUpdateSQL processing... ") - log.Debug("Request updateData:", updateData) - - var sql []string - var tblName string - for t, d := range updateData.(map[string]interface{}) { - log.Tracef("t: %v d: %v", t, d) - tblName = t - - var cv string - for c, v := range d.(map[string]interface{}) { - log.Tracef("c: %v v: %v", c, v) - if cv == "" { - //cv = fmt.Sprintf("`%s`=%s", c, v) - cv = fmt.Sprintf("`%s`='%s'", c, v) - } else { - //cv = fmt.Sprintf("%s,`%s`=%s", cv, c, v) - cv = fmt.Sprintf("%s,`%s`='%s'", cv, c, v) - } - - log.Tracef("cv: %s", cv) - } - sql = append(sql, "UPDATE "+tableName+" SET "+cv+" WHERE "+whereCondition) - - log.Debug("sql:", sql) - } - - return tblName, sql -} - -func ConstructDeleteSQL(tableName string, whereCondition string) string { - log.Debug("ConstructDeleteSQL processing... ") - - var sql string = "DELETE from " + tableName + " WHERE " + whereCondition - log.Debug("sql:", sql) - return sql -} - -type TaskStatus string - -const ( - MeasureTaskStatusInactive = "Inactive" - MeasureTaskStatusActive = "Active" - MeasureTaskStatusSuspend = "Suspend" - MeasureTaskStatusDeleted = "Deleted" -) - -type ScheduleJ struct { - Type string `json:"Type"` - Days []int `json:"Days"` -} - -type Period struct { - Start string `json:"Start"` - End string `json:"End"` -} - -func GetTableByWhere(whereCondition string, tableName string) (*[]interface{}, error) { - log.Debug("GetTableByWhere processing... ") - - rows := new([]interface{}) - has, err := xEngine.Table(tableName).Where(whereCondition).Get(rows) - if err != nil { - log.Errorf("Failed to get table %s from database:%v", tableName, err) - return nil, err - } else if !has { - log.Infof("Not found table %s from database:where=%d", tableName, whereCondition) - return nil, nil - } - - log.Debugf("%s:%v", tableName, rows) - return rows, nil -} - -func GetTableById(id int, tableName string) (*[]interface{}, error) { - log.Debug("GetTableById processing... ") - - rows := new([]interface{}) - has, err := xEngine.Table(tableName).ID(id).Get(rows) - if err != nil { - log.Errorf("Failed to get table %s from database:id=%d, %v", tableName, id, err) - return nil, err - } else if !has { - log.Infof("Not found table %s from database:id=%d", tableName, id) - return nil, nil - } - - log.Debugf("%s:%v", tableName, rows) - return rows, nil -} - -func XormUpdateTableById(id int, tableName string, tbInfo interface{}) (int64, error) { - log.Debug("XormUpdateTableById processing...id: ", id) - - affected, err := xEngine.Table(tableName).ID(id).Update(tbInfo) - if err != nil { - log.Errorf("Failed to update table %s from database:%v", tableName, err) - return 0, err - } - - return affected, nil -} - -func XormUpdateTableByWhere(whereCondition string, tableName string, tbInfo interface{}) (int64, error) { - log.Debug("UpdateTableByWhere processing... ") - - affected, err := xEngine.Table(tableName).Where(whereCondition).Update(tbInfo) - if err != nil { - log.Errorf("Failed to update table %s from database:%v", tableName, err) - return 0, err - } - - return affected, nil -} - -func XormIsExistUser(accid string) (bool, error) { - log.Info("xormIsExistUser processing... ") - - exist, err := xEngine.Table("user"). - Where("account_id=?", accid). - Exist() - if err != nil { - log.Error("Failed to exist user:", err) - - return false, err - } - - return exist, nil -} - -func XormGetConfig(moduleName, configTag string) (map[string]any, error) { - result, err := DbClient.XEngine.QueryInterface("select * from config where module_name=? and config_tag=?", moduleName, configTag) - if err != nil { - log.Error("Failed to get config:", err) - return nil, err - } - if len(result) > 0 { - return result[0], nil - } - return map[string]any{}, nil -} - -func XormGetConfigValue(moduleName, configTag string) (string, error) { - var value string - _, err := xEngine.Table("config"). - Where("module_name=? and config_tag=?", moduleName, configTag). - Cols("value"). - Get(&value) - if err != nil { - log.Error("Failed to get config:", err) - return "", err - } - return value, nil -} - -type Session struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - AccountId string `json:"accountId" xorm:"account_id"` - Name string `json:"name" xorm:"name"` - Host string `json:"host" xorm:"host"` - AccessToken string `json:"accessToken" xorm:"access_token"` - Expires uint32 `json:"expires" xorm:"expires"` - Status string `json:"status" xorm:"status"` - LoginTime string `json:"loginTime" xorm:"-"` - ShakeTime sql.NullTime `son:"shakeTime" xorm:"shake_time"` - LogoutTime sql.NullTime `json:"logoutTime" xorm:"logout_time"` -} - -// XormInsertSession create session -func XormInsertSession(name, host, token string, expires uint32, sessionFlag string) (int64, error) { - log.Info("XormInsertSession processing... ") - - var affected int64 = 0 - var err error = nil - currentTime := time.Now() - timeValue := currentTime.Local() - nullTime := sql.NullTime{Valid: true, Time: timeValue} - value, err := XormGetConfigValue("Security", "sessionExpires") - if err != nil { - return affected, err - } - if value != "" { - intValue, _ := strconv.Atoi(value) - expires = uint32(intValue) - log.Debugf("intValue=%d, expires=%d", intValue, expires) - } - - session := Session{AccountId: name, - Name: name, Host: host, AccessToken: token, - Status: "online", Expires: expires, - ShakeTime: nullTime, - } - - //session.ShakeTime.Time - xSession := xEngine.NewSession() - defer xSession.Close() - if strings.ToLower(sessionFlag) == "multiple" { - exist, err := xEngine.Table("session").Where("status = 'online' and account_id = ? and host = ?", name, host).Exist() - if err != nil { - return affected, err - } - if exist { - affected, _ = xSession.Table("session").Where("account_id = ? and host = ?", name, host).Update(session) - } else { - affected, _ = xSession.InsertOne(session) - } - } else { // single session for a user - exist, err := xEngine.Table("session").Where("status = 'online' and account_id = ?", name).Exist() - if err != nil { - return affected, err - } - if exist { - // todo... - err := errors.New("user is logged in") - return -1, err - } else { - affected, _ = xSession.InsertOne(session) - } - } - xSession.Commit() - return affected, err -} - -// XormUpdateSession update session -func XormLogoutUpdateSession(token string) (Session, error) { - log.Info("XormLogoutUpdateSession processing... ") - - session := Session{Status: "offline", AccessToken: token} - session.LogoutTime.Valid = true - session.LogoutTime.Time = time.Now() - - xSession := xEngine.NewSession() - defer xSession.Close() - _, err := xSession.Table("session").Where("access_token = ?", token).Update(session) - xSession.Commit() - // 查询记录返回 - if err == nil { - session := Session{} - _, err = xSession.Table("session").Where("access_token = ?", token).Get(&session) - return session, err - } - return session, err -} - -// XormUpdateSessionShakeTime create session -func XormUpdateSessionShakeTime(token string) (Session, error) { - log.Debug("XormUpdateSessionShakeTime processing... ") - - session := Session{AccessToken: token} - session.ShakeTime.Valid = true - session.ShakeTime.Time = time.Now() - xSession := xEngine.NewSession() - defer xSession.Close() - _, err := xSession.Table("session").Where("access_token = ?", token).Update(session) - xSession.Commit() - // 查询记录返回 - if err == nil { - session := Session{} - _, err = xSession.Table("session").Where("access_token = ?", token).Get(&session) - return session, err - } - return session, err -} - -func XormExistValidToken(token string, expires uint32) bool { - log.Info("XormExistValidToken processing... ") - - exist, err := xEngine.Table("session"). - Where("status = 'online' and access_token = ? and DATE_ADD(shake_time, INTERVAL expires SECOND) > NOW()", token). - Exist() - if err != nil { - return false - } - - return exist -} - -/* - type NorthboundPm struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - Date string `json:"date" xorm:"date"` - Index int `json:"index"` - StartTime string `json:"startTime" xorm:"start_time"` - TimeZone string `json:"timeZone" xorm:"time_zone"` - NEName string `json:"neName" xorm:"ne_name"` - PmVersion string `json:"pmVersion" xorm:"pm_version"` - Period string `json:"period" xorm:"pevalue" - RmUid string `json:"rmUid" xorm:"rm_uid"` - NEType string `json:"neType" xorm:"ne_type"` - Dn string `json:"neType" xorm:"ne_type"` - ObjectType string `json:"objectType" xorm:"object_type"` - PmName string `json:"pmName" xorm:"pm_name"` - PmExt string `json:"pmExt" xorm:"pm_ext"` - Value int `json:"value" xorm:"value"` - Timestamp string `json:"timestamp" xorm:"timestamp"` - } -*/ -type NorthboundPm struct { - Id int `json:"-" xorm:"pk 'id' autoincr"` - Date string `json:"Date" xorm:"date"` - Index int `json:"Index" xorm:"index"` // 1天中测量时间粒度(如15分钟)的切片索引: 0~95 - Timestamp string `json:"-" xorm:"-"` - NeName string `json:"NeName" xorm:"ne_name"` // UserLabel - RmUID string `json:"RmUID" xorm:"rm_uid"` - NeType string `json:"NeType" xorm:"ne_type"` // 网元类型 - PmVersion string `json:"PmVersion" xorm:"pm_version"` // 性能数据版本号 - Dn string `json:"Dn" xorm:"dn"` // (???)网元标识, 如:RJN-CMZJ-TZ,SubNetwork=5GC88,ManagedElement=SMF53456,SmfFunction=53456 - Period string `json:"Period" xorm:"period"` // 测量时间粒度选项:5/15/30/60 - TimeZone string `json:"TimeZone" xorm:"time_zone"` - StartTime string `json:"StartTime" xorm:"start_time"` - - Datas []struct { - ObjectType string `json:"ObjectType" xorm:"object_type"` // 网络资源类别名称, Pm指标项列表中为空间粒度 如:SmfFunction - PmDatas []struct { - PmName string `json:"KPIID" xorm:"pm_name"` // 指标项, 如: SMF.AttCreatePduSession._Dnn - SubDatas []struct { - SN string `json:"Name" xorm:"sn"` // 单个的写"Total", 或者指标项有多个测量项,如Dnn的名称写对应的Dnn"cmnet"/"ims" - SV int64 `json:"Value" xorm:"sv"` - } `json:"KPIValues" xorm:"sub_datas"` - } `json:"KPIs" xorm:"pm_datas"` - } `json:"Datas" xorm:"datas"` -} - -type Alarm struct { - AlarmSeq int `json:"alarmSeq"` - AlarmId string `json:"alarmId" xorm:"alarm_id"` - NeId string `json:"neId"` - AlarmCode int `json:"alarmCode"` - AlarmTitle string `json:"alarmTitle"` - EventTime string `json:"eventTime"` - AlarmType string `json:"alarmType"` - OrigSeverity string `json:"origSeverity"` - PVFlag string `json:"pvFlag" xorm:"pv_flag"` - NeName string `json:"neName"` - NeType string `json:"neType"` - ObjectUid string `json:"objectUid" xorm:"object_uid"` - ObjectName string `json:"objectName" xorm:"object_name"` - ObjectType string `json:"objectType" xorm:"object_type"` - LocationInfo string `json:"locationInfo"` - Province string `json:"province"` - AlarmStatus int `json:"alarmStatus"` - SpecificProblem string `json:"specificProblem"` - SpecificProblemID string `json:"specificProblemID" xorm:"specific_problem_id"` - AddInfo string `json:"addInfo"` - - // AckState int `json:"ackState" xorm:"-"` - // AckTime string `json:"ackTime" xorm:"-"` - ClearType int `json:"clearType" xorm:"-"` // 0: Unclear, 1: Auto clear, 2: Manual clear - ClearTime string `json:"clearTime" xorm:"-"` -} - -func XormGetAlarmByAlarmId(alarmId string, alarms *[]Alarm) (*[]Alarm, error) { - log.Debug("XormGetAlarmByAlarmId processing... ") - - alarm := new(Alarm) - rows, err := xEngine.Table("alarm").Where("alarm_id=?", alarmId).Rows(alarm) - if err != nil { - log.Error("Failed to get table alarm from database:", err) - return nil, err - } - - defer rows.Close() - for rows.Next() { - err := rows.Scan(alarm) - if err != nil { - log.Error("Failed to get table alarm from database:", err) - return nil, err - } - *alarms = append(*alarms, *alarm) - } - - log.Trace("alarms:", alarms) - return alarms, nil -} - -func XormSQLGetStringValue(querySQL string) (string, error) { - log.Debug("XormSQLGetStringValue processing... ") - - row := make(map[string]interface{}) - _, err := xEngine.SQL(querySQL).Get(&row) - if err != nil { - log.Errorf("Failed to get by SQL=%s:%v", querySQL, err) - return "", err - } - - for _, v := range row { - return fmt.Sprintf("%v", v), nil - } - - return "", nil -} - -func XormGetSingleCol(table, col, where string) (string, error) { - log.Debug("XormGetSingleCol processing... ") - - row := make(map[string]interface{}) - _, err := xEngine.Table(table).Where(where).Cols(col).Get(&row) - if err != nil { - log.Errorf("Failed to get %s from table %s:%v", col, table, err) - return "", err - } - - for _, v := range row { - return fmt.Sprintf("%v", v), nil - } - - return "", nil -} - -func XormGetSingleColStringArrayByIn(table, col, incol string, conditions []string, cols *[]string) error { - log.Debug("XormGetSingleColStringArrayByIn processing... ") - - err := xEngine.Table(table).In(incol, conditions).Cols(col).Distinct().Find(cols) - if err != nil { - log.Errorf("Failed to get %s from table %s:%v", col, table, err) - return err - } - return nil -} - -func XormGetColStringArrayByWhere(table, coln, where string, colv *[]string) error { - log.Debug("XormGetColStringArrayByWhere processing... ") - - _, err := xEngine.Table(table).Where(where).Cols(coln).Get(colv) - if err != nil { - log.Errorf("Failed to Get %s from table %s:%v", coln, table, err) - return err - } - return nil -} - -func XormFindColStringArrayByWhere(table, col, where string, cols *[]string) error { - log.Debug("XormFindColStringArrayByWhere processing... ") - - err := xEngine.Table(table).Where(where).Cols(col).Distinct().Find(cols) - if err != nil { - log.Errorf("Failed to Find %s from table %s:%v", col, table, err) - return err - } - return nil -} - -func XormGetSingleColStringByWhere(table, col, where string) (string, error) { - log.Info("XormFindSingleColStringByWhere processing... ") - - var colv string - _, err := xEngine.Table(table).Where(where).Cols(col).Get(&colv) - if err != nil { - log.Errorf("Failed to Find %s from table %s:%v", col, table, err) - return colv, err - } - return colv, nil -} - -func XormGetSingleColStringArrayByID(table, col string, id int, cols *[]string) error { - log.Debug("XormGetSingleColStringArrayByID processing... ") - - err := xEngine.Table(table).ID(id).Cols(col).Find(cols) - if err != nil { - log.Errorf("Failed to Find %s from table %s:%v", col, table, err) - return err - } - return nil -} - -func XormGetStringValue(table, col string, id int) (string, error) { - log.Debug("XormGetStringValue processing... ") - - row := make(map[string]interface{}) - _, err := xEngine.ID(id).Table(table).Cols(col).Get(&row) - if err != nil { - log.Errorf("Failed to get %s from table %s:%v", col, table, err) - return "", err - } - - for _, v := range row { - return fmt.Sprintf("%v", v), nil - } - - return "", nil -} - -type NeBackup struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` - FileName string `json:"neName" xorm:"file_name"` - Path string `json:"path"` - Md5Sum string `json:"md5Sum" xorm:"md5_sum"` - CreateTime string `json:"createTime" xorm:"-" ` -} - -// XormInsertSession create session -func XormInsertTableOne(tableName string, tbInfo interface{}) (int64, error) { - log.Debug("XormInsertTableOne processing... ") - - var affected int64 = 0 - var err error = nil - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err = xSession.Table(tableName).InsertOne(tbInfo) - xSession.Commit() - return affected, err -} - -// XormExistTableOne create session -func XormExistTableOne(tableName string, where string) (bool, error) { - log.Debug("XormExistTableOne processing... ") - - has, err := xEngine.Table(tableName).Where(where).Exist() - - return has, err -} - -func XormGetTableRows(tableName string, where string, tbInfo *[]interface{}) (*[]interface{}, error) { - log.Debug("XormGetTableRows processing... ") - - row := make(map[string]interface{}) - rows, err := xEngine.Table(tableName).Where(where).Rows(row) - if err != nil { - log.Errorf("Failed to Rows table %s from database: %v", tableName, err) - return nil, err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(row) - if err != nil { - log.Errorf("Failed to Scan table %s from database: %v", tableName, err) - return nil, err - } - *tbInfo = append(*tbInfo, row) - } - log.Trace("tbInfo:", tbInfo) - return tbInfo, nil -} - -type MeasureThreshold struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - KpiSet []string `json:"kpiSet" xorm:"kpi_set"` - Threshold int64 `json:"threshold"` - Status string `json:"md5Sum" xorm:"md5_sum"` - OrigSeverity string `json:"createTime" xorm:"orig_severity"` - AlarmId string `json:"alarmId" xorm:"alarm_id"` -} - -type NeSoftware struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - FileName string `json:"fileName" xorm:"name"` - Path string `json:"path" xorm:"path"` - Version string `json:"version" ` - Md5Sum string `json:"md5Sum" xorm:"-"` - Comment string `json:"comment" xorm:"description"` - // Status string `json:"status"` - UpdateTime string `json:"createTime" xorm:"-" ` -} - -type NeVersion struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` - Version string `json:"version" ` - FilePath string `json:"filePath" xorm:"path"` - NewVersion string `json:"newVersion" xorm:"new_version"` - NewFile string `json:"newFile" xorm:"new_path"` - PreVersion string `json:"preVersion" xorm:"pre_version"` - PreFile string `json:"preFile" xorm:"pre_path"` - Status string `json:"status" xorm:"status"` - UpdateTime string `json:"createTime" xorm:"-" ` -} - -func XormGetDataBySQL(sql string) (*[]map[string]string, error) { - log.Debug("XormGetDataBySQL processing... ") - - rows := make([]map[string]string, 0) - rows, err := DbClient.XEngine.QueryString(sql) - if err != nil { - log.Error("Failed to QueryString:", err) - return nil, err - } - - return &rows, nil -} - -func XormDeleteDataByWhere(where, table string) (int64, error) { - log.Debug("XormDeleteDataByWhere processing... ") - - xSession := DbClient.XEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Table(table).Where(where).Delete() - if err != nil { - log.Error("Failed to Delete:", err) - return 0, err - } - xSession.Commit() - - return affected, nil -} - -func XormDeleteDataByWhereNoSession(where, table string) (int64, error) { - affected, err := DbClient.XEngine.Table(table).Where(where).Delete() - if err != nil { - log.Error("Failed to Delete:", err) - return 0, err - } - return affected, nil -} - -func XormDeleteDataById(id int, table string) (int64, error) { - log.Debug("XormDeleteDataByWhere processing... ") - - xSession := DbClient.XEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Table(table).ID(id).Delete() - if err != nil { - log.Error("Failed to Delete:", err) - return 0, err - } - xSession.Commit() - - return affected, nil -} - -type ColOutput struct { - Name string `json:"name"` - Display string `json:"display"` - Length int `json:"length"` - Alias []string `json:"Alias"` -} - -type ColInput struct { - Name string `json:"name"` - Alias string `json:"Alias"` - Type string `json:"type"` - Length int `json:"length"` - Value any `json:"value"` -} - -type MmlInput struct { - BodyFmt string `json:"bodyFmt"` - BodyKey string `json:"bodyKey"` - CallFunc string `json:"callFunc"` - Cols []ColInput `json:"cols"` -} - -type MmlOutput struct { - RetFmt string `json:"retFmt"` - RetMsg string `json:"retMsg"` - ErrMsg string `json:"errMsg"` - Title string `json:"title"` - SingleList bool `json:"singleList"` - SepSpaceNum int `json:"sepSpaceNum"` - AlignmentM string `json:"alignmentM"` - AlignmentSN string `json:"alignmentSN"` - AlignmentSV string `json:"alignmentSV"` - Cols []ColOutput `json:"cols"` - End string `json:"end"` -} - -type MmlHttpMap struct { - ID int `json:"-" xorm:"id"` - NeType string `json:"neType" xorm:"ne_type"` - Operation string `json:"operation"` - Object string `json:"object"` - Method string `json:"method"` - URI string `json:"uri" xorm:"uri"` - ExtUri string `json:"extUri"` - ParamTag string `json:"paramTag"` - Params string `json:"params"` - Input string `json:"input"` - Output string `json:"output"` -} - -func XormGetMmlHttpMap(table, where string) (*MmlHttpMap, error) { - mmlMap := new(MmlHttpMap) - _, err := DbClient.XEngine.Table(table).Where(where).Get(mmlMap) - if err != nil { - log.Error("Failed to Get:", err) - return nil, err - } - return mmlMap, nil -} - -type MmlCommand struct { - ID int `json:"-" xorm:"id"` - NeType string `json:"neType" xorm:"ne_type"` - Category string `json:"category"` - CatDisplay string `json:"catDisplay"` - Operation string `json:"operation"` - Object string `json:"object" xorm:"object"` - MmlDisplay string `json:"mmlDisplay"` - ParamJson []struct { - Name string `json:"name"` - Alias string `json:"alias"` - Type string `json:"type"` - Optional string `json:"optional"` - Apostr string `json:"apostr"` - Loc string `json:"loc"` - Filter string `json:"filter"` - Display string `json:"display"` - Comment string `json:"comment"` - } `json:"paramJson"` -} - -func XormGetMmlCommand(table, where string) (*MmlCommand, error) { - mmlCmd := new(MmlCommand) - _, err := DbClient.XEngine.Table(table).Where(where).Get(mmlCmd) - if err != nil { - log.Error("Failed to Get:", err) - return nil, err - } - return mmlCmd, nil -} - -type AlarmOMCConfig struct { - ID int `json:"-" xorm:"id"` - ModuleName string `json:"moduleName"` - ConfigTag string `json:"configTag"` - Value string `json:"value"` - ValueJson string `json:"valueJson"` -} - -type ValueJson struct { - AlarmStatus string `json:"alarm_status"` - AlarmType string `json:"alarm_type"` - OrigSeverity string `json:"orig_severity"` - AckUser string `json:"ack_user"` -} - -type AlarmForwardToUsers struct { - Interface string `json:"interface"` - ToUser []string `json:"to_user"` -} - -func XormGetAAConfig() (*ValueJson, error) { - aaConfig := new(AlarmOMCConfig) - _, err := DbClient.XEngine.Table("config"). - Where("module_name=? and config_tag=?", "Alarm", "autoAlarmAck"). - Cols("value", "value_json"). - Get(aaConfig) - if err != nil { - log.Error("Failed to Get:", err) - return nil, err - } - log.Debug("aaConfig:", aaConfig) - valueJson := new(ValueJson) - err = json.Unmarshal([]byte(aaConfig.ValueJson), valueJson) - if err != nil { - log.Error("Failed to Unmarshal:", err) - return nil, err - } - log.Debug("valueJson:", valueJson) - return valueJson, nil -} - -func XormGetAlarmForward(interfaceName string) (*[]string, error) { - alarmForwardConfig := new(AlarmOMCConfig) - _, err := DbClient.XEngine.Table("config"). - Where("module_name=? and config_tag=?", "Alarm", "forwardAlarm"). - Cols("value", "value_json"). - Get(alarmForwardConfig) - if err != nil { - log.Error("Failed to Get:", err) - return nil, err - } - log.Debug("alarmForwardConfig:", alarmForwardConfig) - alarmForwardToUsers := new([]AlarmForwardToUsers) - err = json.Unmarshal([]byte(alarmForwardConfig.ValueJson), alarmForwardToUsers) - if err != nil { - log.Error("Failed to Unmarshal:", err) - return nil, err - } - log.Debug("alarmForwardToUsers:", alarmForwardToUsers) - for _, a := range *alarmForwardToUsers { - if a.Interface == interfaceName { - return &(a.ToUser), nil - } - } - return nil, nil -} - -type AlarmForwardLog struct { - ID int `json:"-" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeID string `json:"neID" xorm:"ne_id"` - AlarmID string `json:"alarmID" xorm:"alarm_id"` - AlarmTitle string `json:"alarmTitle" xorm:"alarm_title"` - AlarmSeq int `json:"alarmSeq" xorm:"alarm_seq"` - EventTime string `json:"eventTime" xorm:"event_time"` - Interface string `json:"interface" xorm:"interface"` - ToUser string `json:"toUser" xorm:"to_user"` - OperResult string `json:"operResult" xorm:"oper_result"` - LogTime string `json:"logTime" xorm:"<-"` -} - -func XormInsertAlarmForwardLog(logData *AlarmForwardLog) (int64, error) { - log.Debug("XormInsertAlarmForwardLog processing... ") - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Insert(logData) - xSession.Commit() - - return affected, err -} - -type SystemLog struct { - ID int `json:"-" xorm:"pk 'id' autoincr"` - UserName string `json:"user_name" xorm:"user_name"` - ProcessName string `json:"process_name" xorm:"process_name"` - ProcessID int32 `json:"process_id" xorm:"process_id"` - Operation string `json:"operation" xorm:"operation"` - StartTime string `json:"start_time" ` - LogTime string `json:"-" xorm:"-"` -} - -func XormInsertSystemLog(logData *SystemLog) (int64, error) { - log.Info("XormInsertSystemLog processing... ") - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Insert(logData) - xSession.Commit() - - return affected, err -} - -type Permission struct { - ID int `json:"-" xorm:"pk 'id' autoincr"` - PermissionName string `json:"permissionName"` - Method string `json:"method"` - Element string `json:"element"` - Object string `json:"object"` -} - -func IsPermissionAllowed(token, method, module, dbname, tbname, pack string) (bool, error) { - log.Info("IsPermissionAllowed processing... ") - - exist, err := xEngine.Table("permission"). - Join("INNER", "role_permission", "permission.permission_name = role_permission.p_name"). - Join("INNER", "user_role", "role_permission.r_name = user_role.r_name"). - Join("INNER", "session", "user_role.u_name = session.account_id and session.access_token=?", token). - Where("method in ('*',?) and module in ('*',?) and management in ('*',?) and element in ('*',?) and object in ('*',?)", method, pack, module, dbname, tbname). - Exist() - if err != nil { - return false, err - } - - return exist, nil -} - -type NeLicense struct { - NeType string `json:"neType" xorm:"ne_type"` - NeID string `json:"neID" xorm:"ne_id"` - SerialNo string `json:"serialNo" xorm:"serial_num"` - Capcity int `json:"capcity" xorm:"-"` - Used int `json:"used" xorm:"-"` - FeatureEnabled string `json:"featureEnabled" xorm:"-"` - ExpirationDate string `json:"expirationDate" xorm:"expiry_date"` - Status string `json:"status" xorm:"status"` - Path string `json:"path" xorm:"license_path"` - FileName string `json:"file_name" xorm:"-"` - Comment string `json:"comment" xorm:"remark"` - CreatedAt string `json:"createdAt" xorm:"-"` - UpdatedAt string `json:"updatedAt" xorm:"-"` - DeletedAt string `json:"deletedAt" xorm:"-"` -} - -func XormAdjustmentNeLicense(neType, neID string, value int) (int64, error) { - return 1, nil - //neLicense := NeLicense{NeType: neType, NeID: neID, Capability: value} - // session.LogoutTime.Valid = true - // session.LogoutTime.Time = time.Now() - // res, err := xEngine.Exec("update ne_license set capcity=capcity+? where IFNULL(ne_type, '')=? and IFNULL(ne_id, '')=?", value, neType, neID) - // defer xSession.Close() - - //affected, err := xSession.Table("ne_license").Where("ne_type=? and ne_id=?", neType, neID).Update(&neLicense) - - // //affected, err := xSession.Table("ne_license").SQL("ne_tye=? and ne_id=?", neType, neID).Update(session) - // err := xSession.SQL("update ne_license set capability=capability+? where ne_type=? and ne_id=?", value, neType, neID) - //xSession.Commit() - // affected, err := res.RowsAffected() - // return affected, err -} - -func XormUpdateNeLicense(neType, neID string, capcity int) (int64, error) { - return 1, nil - // var err error - // var res sql.Result - // if neType != "" && neID != "" { - // res, err = xEngine.Exec("update ne_license set capcity=? where ne_type=? and ne_id=?", capcity, neType, neID) - // } else if neType != "" && neID == "" { - // res, err = xEngine.Exec("update ne_license set capcity=? where ne_type=?", capcity, neType) - // } else if neType == "" && neID != "" { - // res, err = xEngine.Exec("update ne_license set capcity=? where ne_id=?", capcity, neID) - // } else { - // res, err = xEngine.Exec("update ne_license set capcity=?", capcity) - // } - - // affected, err := res.RowsAffected() - // return affected, err -} - -type NorthboundCm struct { - ID int `json:"-" xorm:"pk '-' autoincr"` - Timestamp string `json:"timestamp" xorm:"timestamp"` - TimeZone string `json:"timeZone" xorm:"time_zone"` - VendorName string `json:"vendorName" xorm:"vendor_name"` - NeType string `json:"neType" xorm:"ne_type"` - CmVersion string `json:"cmVersion" xorm:"cm_version"` - RmUID string `json:"rmUID" xorm:"rm_uid"` - NeID string `json:"neID" xorm:"ne_id"` - UserLabel string `json:"userLabel" xorm:"user_label"` - ObjectType string `json:"objectType" xorm:"object_type"` - PvFlag string `json:"pvFlag" xorm:"pv_flag"` - VMID string `json:"vmID" xorm:"vm_id"` - VnfInstanceID string `json:"vnf_instance_id"` - ValueJSON string `json:"valueJson" xorm:"value_json"` - Status string `json:"status" xorm:"status"` -} - -func XormGetNorthboundCm(neType string, cmResults *[]NorthboundCm) error { - log.Info("XormGetNorthboundCm processing... ") - - cmResult := new(NorthboundCm) - rows, err := xEngine.Table("nbi_cm"). - Distinct("object_type"). - Where("`ne_type` = ?", neType). - Desc("timestamp"). - Cols("*"). - Rows(cmResult) - if err != nil { - log.Error("Failed to get table nbi_cm:", err) - return err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(cmResult) - if err != nil { - log.Error("Failed to get table nbi_cm:", err) - return err - } - *cmResults = append(*cmResults, *cmResult) - } - return nil -} - -func XormGetNorthboundCmLatestObject(neType, neID, objectType string) (*NorthboundCm, error) { - log.Info("XormGetNorthboundCmLatestObject processing... ") - - cmResult := new(NorthboundCm) - _, err := xEngine.Table("nbi_cm"). - Where("`ne_type`=? and `ne_id`=? and `object_type`=?", neType, neID, objectType). - Desc("timestamp"). - Cols("*"). - Limit(1). - Get(cmResult) - if err != nil { - log.Error("Failed to get table nbi_cm:", err) - return nil, err - } - - return cmResult, nil -} - -type TraceData struct { - ID int `json:"-" xorm:"pk 'id' autoincr"` - TaskID int `json:"taskID" xorm:"task_id"` - Imsi string `json:"imsi" xorm:"imsi"` - Msisdn string `json:"msisdn" xorm:"msisdn"` - SrcAddr string `json:"srcAddr" xorm:"src_addr"` - DstAddr string `json:"dstAddr" xorm:"dst_addr"` - IfType int `json:"ifType" xorm:"if_type"` - MsgType int `json:"msgType" xorm:"msg_type"` - MsgDirect int `json:"msgDirect" xorm:"msg_direct"` - Length int `json:"length" xorm:"length"` - Timestamp int64 `json:"timestamp" xorm:"timestamp"` - RawMsg []byte `json:"rawMsg" xorm:"raw_msg"` - DecMsg string `json:"decMsg" xorm:"dec_msg"` -} - -func XormGetTraceData(id int) (*TraceData, error) { - result := new(TraceData) - _, err := xEngine.Table("trace_data"). - Where("id=?", id). - Get(result) - if err != nil { - log.Error("Failed to get table trace_data:", err) - return nil, err - } - - return result, nil -} - -func XormUpdateTraceData(id int, data *TraceData) (int64, error) { - affected, err := xEngine.Table("trace_data"). - Where("id=?", id). - Update(data) - if err != nil { - log.Error("Failed to update table trace_data:", err) - return 0, err - } - - return affected, nil -} - -func XormInsertTraceData(data *TraceData) (int64, error) { - affected, err := xEngine.Table("trace_data"). - InsertOne(data) - if err != nil { - log.Error("Failed to insert table trace_data:", err) - return 0, err - } - - return affected, nil -} - -func XormDeleteTraceData(id int) (int64, error) { - affected, err := xEngine.Table("trace_data"). - Where("id=?", id). - Delete() - if err != nil { - log.Error("Failed to delete table trace_data:", err) - return 0, err - } - - return affected, nil -} - -func XormGetTraceRawMsg(id int) (int64, []byte, error) { - var rawMsg []byte - var timestamp int64 - _, err := xEngine.Table("trace_data"). - Where("id=?", id). - Cols("timestamp", "raw_msg"). - Get(×tamp, &rawMsg) - if err != nil { - log.Error("Failed to get table trace_data:", err) - return timestamp, rawMsg, err - } - - return timestamp, rawMsg, nil -} - -func XormGetNEStateInfo(neType, neID string) (string, string, error) { - SN := "-" - Version := "-" - _, err := xEngine.Table("ne_state"). - Where("ne_type=? and ne_id=?", neType, neID). - Desc("timestamp"). - Cols("serial_num", "version"). - Limit(1). - Get(&SN, &Version) - return SN, Version, err -} - -type NeState struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` - Version string `json:"version" xorm:"column 'version' VARCHAR(16)"` - Capability uint32 `json:"capability" xorm:"capability"` - SerialNum string `json:"serialNum" xorm:"serial_num"` - ExpiryDate string `json:"expiryDate" xorm:"expiry_date"` - CpuUsage string `json:"cpuUsage" xorm:"cpu_usage"` - MemUsage string `json:"memUsage" xorm:"mem_usage"` - DiskSpace string `json:"diskSpace" xorm:"disk_space"` - Timestamp string `json:"timestamp" xorm:"-" ` -} - -func XormInsertNeState(neState *NeState) (int64, error) { - log.Debug("XormInsertNeState processing... ") - - var affected int64 = 0 - - session := xEngine.NewSession() - defer session.Close() - affected, err := session.InsertOne(neState) - if err != nil { - return 0, err - } - err = session.Commit() - if err != nil { - return 0, err - } - return affected, err -} - -type AlarmDefine struct { - AlarmId string `json:"alarmId" xorm:"alarm_id"` - AlarmCode int `json:"alarmCode" xorm:"alarm_code"` - AlarmTitle string `json:"alarmTitle" xorm:"alarm_title"` - NeType string `json:"neType" xorm:"ne_type"` - AlarmType string `json:"alarmType" xorm:"alarm_type"` - OrigSeverity string `json:"origSeverity" xorm:"orig_severity"` - ObjectUid string `json:"objectUid" xorm:"object_uid"` - ObjectName string `json:"objectName" xorm:"object_name"` - ObjectType string `json:"objectType" xorm:"object_type"` - LocationInfo string `json:"locationInfo"` - SpecificProblem string `json:"specificProblem"` - SpecificProblemId string `json:"specificProblemId" xorm:"specific_problem_id"` - AddInfo string `json:"addInfo" xorm:"add_info"` - Threshold int64 `json:"threshold" xorm:"threshold"` - Status string `json:"status" xorm:"status"` -} - -func XormGetAlarmDefine(alarmCode string) (*AlarmDefine, error) { - log.Debug("XormGetAlarmDefine processing... ") - - alarmDefine := new(AlarmDefine) - _, err := xEngine. - Where("alarm_code=? and status='Active'", alarmCode). - Get(alarmDefine) - if err != nil { - log.Error("Failed to get table alarm_define from database:", err) - return nil, err - } - - return alarmDefine, nil -} diff --git a/lib/eval/evaluate.go b/lib/eval/evaluate.go deleted file mode 100644 index 664d7176..00000000 --- a/lib/eval/evaluate.go +++ /dev/null @@ -1,119 +0,0 @@ -package evaluate - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "math" - "regexp" - "strconv" - "strings" -) - -// Parse and caculate expression -func CalcExpr(expr string, paramValues map[string]any) (float64, error) { - // match parameter with '' - re := regexp.MustCompile(`'([^']+)'`) - matches := re.FindAllStringSubmatch(expr, -1) - - // replace to value - for _, match := range matches { - paramName := match[1] - value, exists := paramValues[paramName] - if !exists { - return 0, fmt.Errorf("parameter '%s' not found", paramName) - } - - expr = strings.Replace(expr, match[0], fmt.Sprintf("%v", value), 1) - } - - // expression to evaluate - result, err := evalExpr(expr) - if math.IsNaN(result) { - return 0.0, err - } - return result, err -} - -// eval 解析和计算表达式 -func evalExpr(expr string) (float64, error) { - //fset := token.NewFileSet() - node, err := parser.ParseExpr(expr) - if err != nil { - return 0, err - } - return evalNode(node) -} - -// EvaluateExpr 解析并计算给定的表达式 -func EvalExpr(expr string, values map[string]any) (float64, error) { - // 解析表达式 - node, err := parser.ParseExpr(expr) - if err != nil { - return 0, err - } - - // 遍历 AST 并替换变量 - ast.Inspect(node, func(n ast.Node) bool { - if ident, ok := n.(*ast.Ident); ok { - if val, ok := values[ident.Name]; ok { - // 替换标识符为对应值 - ident.Name = fmt.Sprintf("%v", val) - } - } - return true - }) - - // 计算表达式 - return evalNode(node) -} - -// eval 递归计算 AST 节点 -func evalNode(node ast.Node) (float64, error) { - var result float64 - - switch n := node.(type) { - case *ast.BinaryExpr: - left, err := evalNode(n.X) - if err != nil { - return 0, err - } - right, err := evalNode(n.Y) - if err != nil { - return 0, err - } - switch n.Op { - case token.ADD: - result = left + right - case token.SUB: - result = left - right - case token.MUL: - result = left * right - case token.QUO: - if right == 0 { - return math.NaN(), fmt.Errorf("divisor cannot be zero") - } - - result = left / right - } - case *ast.BasicLit: - var err error - result, err = strconv.ParseFloat(n.Value, 64) - if err != nil { - return 0, err - } - case *ast.Ident: - val, err := strconv.ParseFloat(n.Name, 64) - if err != nil { - return 0, fmt.Errorf("unsupported expression: %s", n.Name) - } - result = val - case *ast.ParenExpr: - return evalNode(n.X) // 递归评估括号中的表达式 - default: - return 0, fmt.Errorf("unsupported expression: %T", n) - } - - return result, nil -} diff --git a/lib/file/file.go b/lib/file/file.go deleted file mode 100644 index 7bc2a57e..00000000 --- a/lib/file/file.go +++ /dev/null @@ -1,27 +0,0 @@ -package file - -import ( - "os" - "path/filepath" -) - -func GetFileAndDirCount(dir string) (int, int, error) { - var fileCount, dirCount int - - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if path == dir { - return nil // 跳过当前目录 - } - if info.IsDir() { - dirCount++ - } else { - fileCount++ - } - return nil - }) - - return fileCount, dirCount, err -} diff --git a/lib/file/file_linux.go b/lib/file/file_linux.go deleted file mode 100644 index e8936bb9..00000000 --- a/lib/file/file_linux.go +++ /dev/null @@ -1,78 +0,0 @@ -//go:build linux -// +build linux - -package file - -import ( - "fmt" - "os" - "os/user" - "path/filepath" - "syscall" -) - -type FileInfo struct { - 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) { - var files []FileInfo - - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if path == dir { - return nil // 跳过当前目录 - } - - fileType := "file" - if info.IsDir() { - fileType = "directory" - } else if info.Mode()&os.ModeSymlink != 0 { - fileType = "symlink" - } - - // check if match suffix - if (suffix != "" && filepath.Ext(path) == suffix) || suffix == "" { - stat, ok := info.Sys().(*syscall.Stat_t) - if !ok { - return fmt.Errorf("not a syscall.Stat_t") - } - userInfo, err := user.LookupId(fmt.Sprint(stat.Uid)) - if err != nil { - return err - } - groupInfo, err := user.LookupGroupId(fmt.Sprint(stat.Gid)) - if err != nil { - return err - } - fileInfo := FileInfo{ - FileType: fileType, - FileMode: info.Mode().String(), - LinkCount: int64(info.Sys().(*syscall.Stat_t).Nlink), - Owner: userInfo.Username, - Group: groupInfo.Name, - Size: info.Size(), - ModifiedTime: info.ModTime().Unix(), - FilePath: dir, - FileName: info.Name(), - } - files = append(files, fileInfo) - } - return nil - }) - if err != nil { - return nil, err - } - return files, nil -} diff --git a/lib/file/file_windows.go b/lib/file/file_windows.go deleted file mode 100644 index 7c97f111..00000000 --- a/lib/file/file_windows.go +++ /dev/null @@ -1,63 +0,0 @@ -//go:build windows -// +build windows - -package file - -import ( - "os" - "path/filepath" -) - -type FileInfo struct { - 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) { - var files []FileInfo - - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if path == dir { - return nil // 跳过当前目录 - } - - fileType := "file" - if info.IsDir() { - fileType = "directory" - } else if info.Mode()&os.ModeSymlink != 0 { - fileType = "symlink" - } - - // check if match suffix - if (suffix != "" && filepath.Ext(path) == suffix) || suffix == "" { - fileInfo := FileInfo{ - FileType: fileType, - FileMode: info.Mode().String(), - LinkCount: 0, - Owner: "-", - Group: "-", - Size: info.Size(), - ModifiedTime: info.ModTime().Unix(), - FilePath: dir, - FileName: info.Name(), - } - files = append(files, fileInfo) - } - return nil - }) - if err != nil { - return nil, err - } - return files, nil -} diff --git a/lib/global/exec_linux.go b/lib/global/exec_linux.go deleted file mode 100644 index e4aa8584..00000000 --- a/lib/global/exec_linux.go +++ /dev/null @@ -1,47 +0,0 @@ -//go:build linux -// +build linux - -package global - -import ( - "bytes" - "os/exec" -) - -func ExecCmd(command string) ([]byte, error) { - cmd := exec.Command("/bin/bash", "-c", command) - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - - return out, nil -} - -func ExecShell(command string) error { - in := bytes.NewBuffer(nil) - cmd := exec.Command("sh") - cmd.Stdin = in - in.WriteString(command) - in.WriteString("exit\n") - if err := cmd.Start(); err != nil { - return err - } - return nil -} - -func ExecOsCmd(command, os string) ([]byte, error) { - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - return out, nil -} diff --git a/lib/global/exec_windows.go b/lib/global/exec_windows.go deleted file mode 100644 index 285005c2..00000000 --- a/lib/global/exec_windows.go +++ /dev/null @@ -1,34 +0,0 @@ -//go:build windows -// +build windows - -package global - -import ( - "os/exec" -) - -func ExecCmd(command string) ([]byte, error) { - cmd := exec.Command("cmd", "/C", command) - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - - return out, nil -} - -func ExecOsCmd(command, os string) ([]byte, error) { - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - return out, nil -} diff --git a/lib/global/global.go b/lib/global/global.go deleted file mode 100644 index 228fdf20..00000000 --- a/lib/global/global.go +++ /dev/null @@ -1,65 +0,0 @@ -package global - -import "errors" - -// 跨package引用的首字母大写 -const ( - RequestBodyMaxLen = 2000000 - ApiVersionV1 = "v1" - ApiVersionV2 = "v2" - LineBreak = "\n" -) - -const ( - DateTime = "2006-01-02 15:04:05" - DateData = "20060102150405" - DateHour = "2006010215" - DateZone = "2006-01-02 15:04:05 +0000 UTC" -) - -const ( - MaxInt32Number = 2147483647 -) - -const ( - MaxLimitData = 1000 -) - -var ( - Version string = "-" - BuildTime string = "-" - GoVer string = "-" -) - -var ( - DefaultUriPrefix = "/api/rest" -) -var ( - ErrParamsNotAdapted = errors.New("the number of params is not adapted") - - // PM module error message - ErrPMNotFoundData = errors.New("not found PM data") - - // CM module error message - ErrCMNotFoundTargetNE = errors.New("not found target NE") - ErrCMCannotDeleteActiveNE = errors.New("can not delete an active NE") - ErrCMInvalidBackupFile = errors.New("invalid backup file") - ErrCMNotMatchMD5File = errors.New("md5 not match between file and url") - ErrCMNotMatchSignFile = errors.New("digests signatures not match in the file") - ErrCMExistSoftwareFile = errors.New("exist the same software package file") - ErrCMNotFoundTargetSoftware = errors.New("not found the target software package") - ErrCMNotFoundTargetNeVersion = errors.New("not found the target NE version") - ErrCMNotFoundRollbackNeVersion = errors.New("not found the rollback NE version") - ErrCMUnknownServiceAction = errors.New("unknown service action") - ErrCMUnknownInstanceAction = errors.New("unknown instance action") - - ErrCMNotFoundTargetBackupFile = errors.New("not found the target NE backup") - ErrCMUnknownSoftwareFormat = errors.New("unknown software package format") // 未知软件包格式 - - // TRACE module error message - ErrTraceFailedDistributeToNEs = errors.New("failed to distribute trace task to target NEs") - ErrTraceNotCarriedTaskID = errors.New("not carried task id in request url") - - // MML module error define - ErrMmlInvalidCommandFormat = errors.New("invalid mml command format") -) diff --git a/lib/global/kits.go b/lib/global/kits.go deleted file mode 100644 index 22091f08..00000000 --- a/lib/global/kits.go +++ /dev/null @@ -1,728 +0,0 @@ -package global - -import ( - "archive/zip" - "bytes" - "crypto/md5" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "net" - "net/http" - "os" - "path/filepath" - "reflect" - "regexp" - "sort" - "strings" - "time" -) - -const ( - IsIPv4 = "IPv4" - IsIPv6 = "IPv6" - NonIP = "NonIp" -) - -type em struct{} - -func GetPkgName() string { - return reflect.TypeOf(em{}).PkgPath() -} - -// interface{} change to map[string]interface{} -// interface{} data is []interface{} -func ListToMap(list interface{}, key string) map[string]interface{} { - res := make(map[string]interface{}) - arr := ToSlice(list) - for _, row := range arr { - immutable := reflect.ValueOf(row) - val := immutable.FieldByName(key).String() - res[val] = row - } - return res -} - -// interface{} change to []interface{} -func ToSlice(arr interface{}) []interface{} { - ret := make([]interface{}, 0) - v := reflect.ValueOf(arr) - if v.Kind() != reflect.Slice { - ret = append(ret, arr) - return ret - } - l := v.Len() - for i := 0; i < l; i++ { - ret = append(ret, v.Index(i).Interface()) - } - return ret -} - -var TodoList []Todo - -type Todo struct { - Id int64 - Item string -} - -// JSON序列化方式 -func jsonStructToMap(TodoList Todo) (map[string]interface{}, error) { - // 结构体转json - strRet, err := json.Marshal(TodoList) - if err != nil { - return nil, err - } - // json转map - var mRet map[string]interface{} - err1 := json.Unmarshal(strRet, &mRet) - if err1 != nil { - return nil, err1 - } - return mRet, nil -} - -func IsContain(item string, items []string) bool { - for _, e := range items { - if e == item { - return true - } - } - return false -} - -func IsContainP(item string, items *[]string, size int) bool { - for i := 0; i < size; i++ { - if (*items)[i] == item { - return true - } - } - return false -} - -// 将字符串 分割成 字符串数组 -// @s:分割符 -func SplitString(str string, s string) []string { - sa := strings.Split(str, s) - return sa -} - -//  合并字符串数组 -func MergeStringArr(a, b []string) []string { - var arr []string - for _, i := range a { - arr = append(arr, i) - } - for _, j := range b { - arr = append(arr, j) - } - return arr -} - -// 数组去重 -func UniqueStringArr(m []string) []string { - d := make([]string, 0) - tempMap := make(map[string]bool, len(m)) - for _, v := range m { // 以值作为键名 - if tempMap[v] == false { - tempMap[v] = true - d = append(d, v) - } - } - return d -} - -//  合并整型数组 -func MergeArr(a, b []int) []int { - var arr []int - for _, i := range a { - arr = append(arr, i) - } - for _, j := range b { - arr = append(arr, j) - } - return arr -} - -// 数组去重 -func UniqueArr(m []int) []int { - d := make([]int, 0) - tempMap := make(map[int]bool, len(m)) - for _, v := range m { // 以值作为键名 - if tempMap[v] == false { - tempMap[v] = true - d = append(d, v) - } - } - return d -} - -// 升序 -func AscArr(e []int) []int { - sort.Ints(e[:]) - return e -} - -// 降序 -func DescArr(e []int) []int { - sort.Sort(sort.Reverse(sort.IntSlice(e))) - return e -} - -func MatchRmUID(p string, s string) bool { - match, _ := regexp.MatchString(p, s) - return match -} - -type OrderedMap struct { - Order []string - Map map[string]interface{} -} - -func (om *OrderedMap) UnmarshalJson(b []byte) error { - json.Unmarshal(b, &om.Map) - - index := make(map[string]int) - for key := range om.Map { - om.Order = append(om.Order, key) - esc, _ := json.Marshal(key) //Escape the key - index[key] = bytes.Index(b, esc) - } - - sort.Slice(om.Order, func(i, j int) bool { return index[om.Order[i]] < index[om.Order[j]] }) - return nil -} - -func (om OrderedMap) MarshalJson() ([]byte, error) { - var b []byte - buf := bytes.NewBuffer(b) - buf.WriteRune('{') - l := len(om.Order) - for i, key := range om.Order { - km, err := json.Marshal(key) - if err != nil { - return nil, err - } - buf.Write(km) - buf.WriteRune(':') - vm, err := json.Marshal(om.Map[key]) - if err != nil { - return nil, err - } - buf.Write(vm) - if i != l-1 { - buf.WriteRune(',') - } - fmt.Println(buf.String()) - } - buf.WriteRune('}') - fmt.Println(buf.String()) - return buf.Bytes(), nil -} - -func GetBodyCopy(r *http.Request) (*bytes.Buffer, error) { - // If r.bodyBuf present, return the copy - // if r.bodyBuf != nil { - // return bytes.NewBuffer(r.bodyBuf.Bytes()), nil - // } - - // Maybe body is `io.Reader`. - // Note: Resty user have to watchout for large body size of `io.Reader` - if r.Body != nil { - b, err := io.ReadAll(r.Body) - if err != nil { - return nil, err - } - - // Restore the Body - // close(r.Body) - r.Body = io.NopCloser(bytes.NewReader(b)) - - // Return the Body bytes - return bytes.NewBuffer(b), nil - } - return nil, nil -} - -func UnmarshalBody(r *http.Request, v *interface{}, maxLen int64) error { - body, err := io.ReadAll(io.LimitReader(r.Body, maxLen)) - if err != nil { - return err - } - - return json.Unmarshal(body, v) -} - -func SetNotifyUrl(ip string, port uint16, uri string) string { - return fmt.Sprintf("http://%s:%d%s", ip, port, uri) -} - -func GetIps() (ips []string, err error) { - interfaceAddr, err := net.InterfaceAddrs() - if err != nil { - return ips, err - } - - for _, address := range interfaceAddr { - ipNet, isVailIpNet := address.(*net.IPNet) - // 检查ip地址判断是否回环地址 - if isVailIpNet && !ipNet.IP.IsLoopback() { - if ipNet.IP.To4() != nil { - ips = append(ips, ipNet.IP.String()) - } - } - } - return ips, nil -} - -func GetCurrentTimeSliceIndexByPeriod(t time.Time, period int) int { - index := int((t.Hour()*60+t.Minute())/period) - 1 - if index < 0 { - return int(24*60/period) - 1 - } - return index -} - -var ( - cst *time.Location -) - -// RFC3339ToDateTime convert rfc3339 value to china standard time layout -func RFC3339ToDateTime(value string) (string, error) { - ts, err := time.Parse(time.RFC3339, value) - if err != nil { - return "", err - } - - return ts.In(cst).Format("2006-01-02 15:04:05"), nil -} - -// CreateTimeDir 根据当前时间格式来创建文件夹 -func CreateTimeDir(fmt string, path string) string { - folderName := time.Now().Format(fmt) - folderPath := filepath.Join(path, folderName) - if _, err := os.Stat(folderPath); os.IsNotExist(err) { - // 必须分成两步:先创建文件夹、再修改权限 - os.Mkdir(folderPath, 0664) //0644也可以os.ModePerm - os.Chmod(folderPath, 0664) - } - return folderPath -} - -// CreateDir 根据传入的目录名和路径来创建文件夹 -func CreateDir(folderName string, path string) string { - folderPath := filepath.Join(path, folderName) - if _, err := os.Stat(folderPath); os.IsNotExist(err) { - // 必须分成两步:先创建文件夹、再修改权限 - os.MkdirAll(folderPath, 0664) //0644也可以os.ModePerm - os.Chmod(folderPath, 0664) - } - return folderPath -} - -func GetFmtTimeString(srcFmt string, timeString string, dstFmt string) string { - t, _ := time.ParseInLocation(srcFmt, timeString, time.Local) - return t.Format(dstFmt) -} - -func GetFileMD5Sum(filePath string) (string, error) { - file, err := os.Open(filePath) - if err != nil { - return "", err - } - defer file.Close() - md5 := md5.New() - _, err = io.Copy(md5, file) - if err != nil { - return "", err - } - - md5str := hex.EncodeToString(md5.Sum(nil)) - - return md5str, nil -} - -// PathExists check path is exist or no -func PathExists(path string) (bool, error) { - _, err := os.Stat(path) - if err == nil { //文件或者目录存在 - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} - -// PathExists check path is exist or no -func FilePathExists(filePath string) (bool, error) { - _, err := os.Stat(filePath) - if err == nil { //文件或者目录存在 - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} - -func GetDayDuration(d1, d2 string) int64 { - a, _ := time.Parse("2006-01-02", d1) - b, _ := time.Parse("2006-01-02", d2) - d := a.Sub(b) - - return (int64)(d.Hours() / 24) -} - -func GetSecondsSinceDatetime(datetimeStr string) (int64, error) { - loc1, _ := time.LoadLocation("Local") - // 解析日期时间字符串为时间对象 - datetime, err := time.ParseInLocation(time.DateTime, datetimeStr, loc1) - if err != nil { - return 0, err - } - - // 计算时间差 - duration := time.Since(datetime) - - // 获取时间差的秒数 - seconds := int64(duration.Seconds()) - - return seconds, nil -} - -func GetSecondDuration(time1, time2 string) (int64, error) { - loc1, _ := time.LoadLocation("Local") - // 解析日期时间字符串为时间对象 - t1, err := time.ParseInLocation(time.DateTime, time1, loc1) - if err != nil { - return 0, err - } - t2, err := time.ParseInLocation(time.DateTime, time2, loc1) - if err != nil { - return 0, err - } - - // 计算时间差 - duration := t2.Sub(t1) - - // 获取时间差的秒数 - seconds := int64(duration.Seconds()) - - return seconds, nil -} - -// 0: invalid ip -// 4: IPv4 -// 6: IPv6 -func ParseIP(s string) (net.IP, int) { - ip := net.ParseIP(s) - if ip == nil { - return nil, 0 - } - for i := 0; i < len(s); i++ { - switch s[i] { - case '.': - return ip, 4 - case ':': - return ip, 6 - } - } - return nil, 0 -} - -func BytesCombine1(pBytes ...[]byte) []byte { - return bytes.Join(pBytes, []byte("")) -} - -func BytesCombine(pBytes ...[]byte) []byte { - length := len(pBytes) - s := make([][]byte, length) - for index := 0; index < length; index++ { - s[index] = pBytes[index] - } - sep := []byte("") - return bytes.Join(s, sep) -} - -func ParseIPAddr(ip string) string { - ipAddr := net.ParseIP(ip) - - if ipAddr != nil { - if ipAddr.To4() != nil { - return IsIPv4 - } else { - return IsIPv6 - } - } - - return NonIP -} - -func CombineHostUri(ip string, port string) string { - var hostUri string = "" - ipType := ParseIPAddr(ip) - if ipType == IsIPv4 { - hostUri = fmt.Sprintf("http://%s:%v", ip, port) - } else { - hostUri = fmt.Sprintf("http://[%s]:%v", ip, port) - } - - return hostUri -} - -func StructToMap(obj interface{}) map[string]interface{} { - objValue := reflect.ValueOf(obj) - objType := objValue.Type() - - m := make(map[string]interface{}) - - for i := 0; i < objValue.NumField(); i++ { - field := objValue.Field(i) - fieldName := objType.Field(i).Name - - m[fieldName] = field.Interface() - } - - return m -} - -// ToMap 结构体转为Map[string]interface{} -func ToMap(in interface{}, tagName string) (map[string]interface{}, error) { - out := make(map[string]interface{}) - - v := reflect.ValueOf(in) - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - - if v.Kind() != reflect.Struct { // 非结构体返回错误提示 - return nil, fmt.Errorf("ToMap only accepts struct or struct pointer; got %T", v) - } - - t := v.Type() - // 遍历结构体字段 - // 指定tagName值为map中key;字段值为map中value - for i := 0; i < v.NumField(); i++ { - fi := t.Field(i) - if tagValue := fi.Tag.Get(tagName); tagValue != "" { - out[tagValue] = v.Field(i).Interface() - } - } - return out, nil -} - -func ZipOneFile(srcFile, dstZip string, pathFlag bool) error { - zipFile, err := os.Create(dstZip) - if err != nil { - return err - } - defer zipFile.Close() - - zipWriter := zip.NewWriter(zipFile) - defer zipWriter.Close() - - fileToCompress, err := os.Open(srcFile) - if err != nil { - return err - } - defer fileToCompress.Close() - - var fileInZip io.Writer - if pathFlag { - fileInZip, err = zipWriter.Create(srcFile) - if err != nil { - return err - } - } else { - // 获取文件的基本名称 - fileName := filepath.Base(fileToCompress.Name()) - fileInZip, err = zipWriter.Create(fileName) - if err != nil { - return err - } - } - - _, err = io.Copy(fileInZip, fileToCompress) - if err != nil { - return err - } - return nil -} - -func ZipDirectoryFile(srcDir, dstZip string) error { - // Create a new zip file - zipfileWriter, err := os.Create(dstZip) - if err != nil { - return err - } - defer zipfileWriter.Close() - - // Create a new zip archive - zipWriter := zip.NewWriter(zipfileWriter) - defer zipWriter.Close() - - // Walk through the directory and add files to the zip archive - err = filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Create a new file header for the current file - header, err := zip.FileInfoHeader(info) - if err != nil { - return err - } - - // Set the name of the file within the zip archive - header.Name = filepath.Join(filepath.Base(srcDir), path[len(srcDir):]) - - // If the current file is a directory, skip it - if info.IsDir() { - return nil - } - - // Create a new file in the zip archive - fileWriter, err := zipWriter.CreateHeader(header) - if err != nil { - return err - } - - // Open the current file - file, err := os.Open(path) - if err != nil { - return err - } - defer file.Close() - - // Copy the contents of the current file to the zip archive - _, err = io.Copy(fileWriter, file) - if err != nil { - return err - } - - return nil - }) - - return err -} - -// 判断软件包是rpm或者deb, 1:rpm, 2:deb, 0:unknown format -func JudgeRpmOrDebPackage(filePath string) (int, error) { - var fileType int = 0 - file, err := os.Open(filePath) - if err != nil { - return fileType, err - } - defer file.Close() - - // Read the first 6 bytes of the file - header := make([]byte, 6) - _, err = file.Read(header) - if err != nil { - return fileType, err - } - - // Check the magic numbers to determine the package format - if string(header) == "!" { - fileType = 1 - } else if string(header) == "!\n" - magic := []byte("!\n") - buffer := make([]byte, len(magic)) - - _, err := file.Read(buffer) - if err != nil && err != io.EOF { - return false - } - - return string(buffer) == string(magic) -} - -func CheckRpmOrDebPackage(filePath string) (int, error) { - var fileType int = 0 - file, err := os.Open(filePath) - if err != nil { - return fileType, err - } - defer file.Close() - - isRpm := isRpmPackage(file) - isDeb := isDebPackage(file) - - if isRpm { - fileType = 1 - } else if isDeb { - fileType = 2 - } else { - fileType = 0 - } - - return fileType, nil -} - -func IsRpmOrDebPackage(filePath string) int { - var fileType int = 0 - - if strings.Contains(filePath, ".rpm") { - fileType = 1 - } else if strings.Contains(filePath, ".deb") { - fileType = 2 - } else { - fileType = 0 - } - - return fileType -} - -func RecurseStructToMap(obj any) map[string]any { - out := make(map[string]any) - v := reflect.ValueOf(obj) - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - - // 递归函数,用于处理嵌套结构体 - var recurse func(reflect.Value) any - recurse = func(value reflect.Value) any { - if value.Kind() == reflect.Struct { - nestedOut := make(map[string]any) - for i := 0; i < value.NumField(); i++ { - nestedOut[value.Type().Field(i).Name] = recurse(value.Field(i)) - } - return nestedOut - } else if value.Kind() == reflect.Ptr { - return recurse(value.Elem()) - } - return value.Interface() - } - - t := v.Type() - for i := 0; i < v.NumField(); i++ { - f := v.Field(i) - out[t.Field(i).Name] = recurse(f) - } - return out -} diff --git a/lib/log/logger.go b/lib/log/logger.go deleted file mode 100644 index 3246b89e..00000000 --- a/lib/log/logger.go +++ /dev/null @@ -1,338 +0,0 @@ -// logger for omc/ems - -package log - -import ( - "fmt" - "io" - "log" -) - -// LogLevel defines a log level -type LogLevel int - -// enum all LogLevels -const ( - // following level also match syslog.Priority value - LOG_TRACE LogLevel = iota - LOG_DEBUG - LOG_INFO - LOG_WARN - LOG_ERROR - LOG_FATAL - LOG_OFF - LOG_NODEF -) - -// default log options -const ( - DEFAULT_LOG_PREFIX = "omc" - DEFAULT_LOG_FLAG = log.Lshortfile | log.Ldate | log.Lmicroseconds - DEFAULT_LOG_LEVEL = LOG_DEBUG - DEFAULT_CALL_DEPTH = 3 -) - -// Logger is a logger interface -type Logger interface { - Fatal(v ...interface{}) - Fatalf(format string, v ...interface{}) - Error(v ...interface{}) - Errorf(format string, v ...interface{}) - Warn(v ...interface{}) - Warnf(format string, v ...interface{}) - Info(v ...interface{}) - Infof(format string, v ...interface{}) - Debug(v ...interface{}) - Debugf(format string, v ...interface{}) - Trace(v ...interface{}) - Tracef(format string, v ...interface{}) - - Level() LogLevel - LevelString() string - SetLevel(l LogLevel) -} - -var _ Logger = DiscardLogger{} - -// DiscardLogger don't log implementation for ILogger -type DiscardLogger struct{} - -// Trace empty implementation -func (DiscardLogger) Trace(v ...interface{}) {} - -// Tracef empty implementation -func (DiscardLogger) Tracef(format string, v ...interface{}) {} - -// Debug empty implementation -func (DiscardLogger) Debug(v ...interface{}) {} - -// Debugf empty implementation -func (DiscardLogger) Debugf(format string, v ...interface{}) {} - -// Info empty implementation -func (DiscardLogger) Info(v ...interface{}) {} - -// Infof empty implementation -func (DiscardLogger) Infof(format string, v ...interface{}) {} - -// Warn empty implementation -func (DiscardLogger) Warn(v ...interface{}) {} - -// Warnf empty implementation -func (DiscardLogger) Warnf(format string, v ...interface{}) {} - -// Error empty implementation -func (DiscardLogger) Error(v ...interface{}) {} - -// Errorf empty implementation -func (DiscardLogger) Errorf(format string, v ...interface{}) {} - -// Fatal empty implementation -func (DiscardLogger) Fatal(v ...interface{}) {} - -// Fatalf empty implementation -func (DiscardLogger) Fatalf(format string, v ...interface{}) {} - -// Level empty implementation -func (DiscardLogger) Level() LogLevel { - return LOG_NODEF -} - -// Level empty implementation -func (DiscardLogger) LevelString() string { - return "" -} - -// SetLevel empty implementation -func (DiscardLogger) SetLevel(l LogLevel) {} - -// EmsLogger is the default implment of ILogger -type EmsLogger struct { - TRACE *log.Logger - DEBUG *log.Logger - INFO *log.Logger - WARN *log.Logger - ERROR *log.Logger - FATAL *log.Logger - level LogLevel - levelString []string - depth int -} - -var _ Logger = &EmsLogger{} - -// NewEmsLogger use a special io.Writer as logger output -func NewEmsLogger(out io.Writer) *EmsLogger { - return NewEmsLogger2(out, DEFAULT_LOG_PREFIX, DEFAULT_LOG_FLAG) -} - -// NewEmsLogger2 let you customrize your logger prefix and flag -func NewEmsLogger2(out io.Writer, prefix string, flag int) *EmsLogger { - return NewEmsLogger3(out, prefix, flag, DEFAULT_LOG_LEVEL) -} - -// NewEmsLogger3 let you customrize your logger prefix and flag and logLevel -func NewEmsLogger3(out io.Writer, prefix string, flag int, l LogLevel) *EmsLogger { - return &EmsLogger{ - TRACE: log.New(out, fmt.Sprintf("[%s] [trace] ", prefix), flag), - DEBUG: log.New(out, fmt.Sprintf("[%s] [debug] ", prefix), flag), - INFO: log.New(out, fmt.Sprintf("[%s] [info ] ", prefix), flag), - WARN: log.New(out, fmt.Sprintf("[%s] [warn ] ", prefix), flag), - ERROR: log.New(out, fmt.Sprintf("[%s] [error] ", prefix), flag), - FATAL: log.New(out, fmt.Sprintf("[%s] [fatal] ", prefix), flag), - level: l, - levelString: []string{"trace", "debug", "info", "warn", "error", "fatal"}, - depth: DEFAULT_CALL_DEPTH, - } -} - -// Trace implement ILogger -func (s *EmsLogger) Trace(v ...interface{}) { - if s.level <= LOG_TRACE { - _ = s.TRACE.Output(s.depth, fmt.Sprintln(v...)) - } -} - -// Tracef implement ILogger -func (s *EmsLogger) Tracef(format string, v ...interface{}) { - if s.level <= LOG_TRACE { - _ = s.TRACE.Output(s.depth, fmt.Sprintf(format, v...)) - } -} - -// Debug implement ILogger -func (s *EmsLogger) Debug(v ...interface{}) { - if s.level <= LOG_DEBUG { - _ = s.DEBUG.Output(s.depth, fmt.Sprintln(v...)) - } -} - -// Debugf implement ILogger -func (s *EmsLogger) Debugf(format string, v ...interface{}) { - if s.level <= LOG_DEBUG { - _ = s.DEBUG.Output(s.depth, fmt.Sprintf(format, v...)) - } -} - -// Info implement ILogger -func (s *EmsLogger) Info(v ...interface{}) { - if s.level <= LOG_INFO { - _ = s.INFO.Output(s.depth, fmt.Sprintln(v...)) - } -} - -// Infof implement ILogger -func (s *EmsLogger) Infof(format string, v ...interface{}) { - if s.level <= LOG_INFO { - _ = s.INFO.Output(s.depth, fmt.Sprintf(format, v...)) - } -} - -// Warn implement ILogger -func (s *EmsLogger) Warn(v ...interface{}) { - if s.level <= LOG_WARN { - _ = s.WARN.Output(s.depth, fmt.Sprintln(v...)) - } -} - -// Warnf implement ILogger -func (s *EmsLogger) Warnf(format string, v ...interface{}) { - if s.level <= LOG_WARN { - _ = s.WARN.Output(s.depth, fmt.Sprintf(format, v...)) - } -} - -// Error implement ILogger -func (s *EmsLogger) Error(v ...interface{}) { - if s.level <= LOG_ERROR { - _ = s.ERROR.Output(s.depth, fmt.Sprintln(v...)) - } -} - -// Errorf implement ILogger -func (s *EmsLogger) Errorf(format string, v ...interface{}) { - if s.level <= LOG_ERROR { - _ = s.ERROR.Output(s.depth, fmt.Sprintf(format, v...)) - } -} - -// Warn implement ILogger -func (s *EmsLogger) Fatal(v ...interface{}) { - if s.level <= LOG_FATAL { - _ = s.FATAL.Output(s.depth, fmt.Sprintln(v...)) - } -} - -// Warnf implement ILogger -func (s *EmsLogger) Fatalf(format string, v ...interface{}) { - if s.level <= LOG_FATAL { - _ = s.FATAL.Output(s.depth, fmt.Sprintf(format, v...)) - } -} - -// Level implement ILogger -func (s *EmsLogger) Level() LogLevel { - return s.level -} - -// Level implement ILogger -func (s *EmsLogger) LevelString() string { - return s.levelString[s.level] -} - -// SetLevel implement ILogger -func (s *EmsLogger) SetLevel(l LogLevel) { - s.level = l -} - -var Elogger Logger - -func InitLogger(logFile string, period int, count int, prefix string, logLevel LogLevel) io.Writer { - - /* - logFile, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766) - if err != nil { - panic(err) - } - */ - - logWriter := getLogWriter(logFile, period, count) - Elogger = NewEmsLogger3(logWriter, prefix, DEFAULT_LOG_FLAG, logLevel) - // fmt.Printf("logFile=%s, period=%d, count=%d, prefix=%s, logLevel=%s\n", logFile, period, count, prefix, GetLevelString()) - return logWriter -} - -// Trace implement ILogger -func Trace(v ...interface{}) { - Elogger.Trace(v...) -} - -// Tracef implement ILogger -func Tracef(format string, v ...interface{}) { - Elogger.Tracef(format, v...) -} - -// Debug implement ILogger -func Debug(v ...interface{}) { - Elogger.Debug(v...) -} - -// Debugf implement ILogger -func Debugf(format string, v ...interface{}) { - Elogger.Debugf(format, v...) -} - -// Info implement ILogger -func Info(v ...interface{}) { - Elogger.Info(v...) -} - -// Infof implement ILogger -func Infof(format string, v ...interface{}) { - Elogger.Infof(format, v...) -} - -// Warn implement ILogger -func Warn(v ...interface{}) { - Elogger.Warn(v...) -} - -// Warnf implement ILogger -func Warnf(format string, v ...interface{}) { - Elogger.Warnf(format, v...) -} - -// Error implement ILogger -func Error(v ...interface{}) { - Elogger.Error(v...) -} - -// Errorf implement ILogger -func Errorf(format string, v ...interface{}) { - Elogger.Errorf(format, v...) -} - -// Warn implement ILogger -func Fatal(v ...interface{}) { - Elogger.Fatal(v...) -} - -// Warnf implement ILogger -func Fatalf(format string, v ...interface{}) { - Elogger.Fatalf(format, v...) -} - -// Level implement ILogger -func GetLevel() LogLevel { - return Elogger.Level() -} - -// Level implement ILogger -func GetLevelString() string { - return Elogger.LevelString() -} - -// SetLevel implement ILogger -func SetLevel(l LogLevel) { - Elogger.SetLevel(l) -} diff --git a/lib/log/partition.go b/lib/log/partition.go deleted file mode 100644 index 5d32e583..00000000 --- a/lib/log/partition.go +++ /dev/null @@ -1,71 +0,0 @@ -package log - -import ( - "io" - "time" - - rotatelogs "github.com/lestrrat/go-file-rotatelogs" -) - -type WriteSyncer interface { - io.Writer - Sync() error -} - -// 得到LogWriter -func getLogWriter(filePath string, period, count int) WriteSyncer { - warnIoWriter := getWriter(filePath, period, count) - return addSync(warnIoWriter) -} - -// 日志文件切割 -func getWriter(filename string, period, count int) io.Writer { - // 保存日志count天,每period小时分割一次日志 - duration := time.Hour * time.Duration(period) - var logfile string - if period >= 24 { - logfile = filename + "-%Y%m%d" - } else { - logfile = filename + "-%Y%m%d%H" - } - hook, err := rotatelogs.New( - - logfile, - rotatelogs.WithLinkName(filename), - // rotatelogs.WithMaxAge(duration), - rotatelogs.WithRotationCount(count), - rotatelogs.WithRotationTime(duration), - rotatelogs.WithLocation(time.Local), - ) - - //保存日志30天,每1分钟分割一次日志 - /* - hook, err := rotatelogs.New( - filename+"_%Y%m%d%H%M.log", - rotatelogs.WithLinkName(filename), - rotatelogs.WithMaxAge(time.Hour*24*30), - rotatelogs.WithRotationTime(time.Minute*1), - ) - */ - if err != nil { - panic(err) - } - return hook -} - -func addSync(w io.Writer) WriteSyncer { - switch w := w.(type) { - case WriteSyncer: - return w - default: - return writerWrapper{w} - } -} - -type writerWrapper struct { - io.Writer -} - -func (w writerWrapper) Sync() error { - return nil -} diff --git a/lib/log/syslogger.go.bak b/lib/log/syslogger.go.bak deleted file mode 100644 index e5990202..00000000 --- a/lib/log/syslogger.go.bak +++ /dev/null @@ -1,89 +0,0 @@ -//go:build !windows && !nacl && !plan9 -// +build !windows,!nacl,!plan9 - -package log - -import ( - "fmt" - "log/syslog" -) - -var _ Logger = &SyslogLogger{} - -// SyslogLogger will be depricated -type SyslogLogger struct { - w *syslog.Writer -} - -// NewSyslogLogger implements Logger -func NewSyslogLogger(w *syslog.Writer) *SyslogLogger { - return &SyslogLogger{w: w} -} - -// Trace log content as Trace -func (s *SyslogLogger) Trace(v ...interface{}) { - _ = s.w.Trace(fmt.Sprint(v...)) -} - -// Tracef log content as Trace and format -func (s *SyslogLogger) Tracef(format string, v ...interface{}) { - _ = s.w.Trace(fmt.Sprintf(format, v...)) -} - -// Debug log content as Debug -func (s *SyslogLogger) Debug(v ...interface{}) { - _ = s.w.Debug(fmt.Sprint(v...)) -} - -// Debugf log content as Debug and format -func (s *SyslogLogger) Debugf(format string, v ...interface{}) { - _ = s.w.Debug(fmt.Sprintf(format, v...)) -} - -// Error log content as Error -func (s *SyslogLogger) Error(v ...interface{}) { - _ = s.w.Err(fmt.Sprint(v...)) -} - -// Errorf log content as Errorf and format -func (s *SyslogLogger) Errorf(format string, v ...interface{}) { - _ = s.w.Err(fmt.Sprintf(format, v...)) -} - -// Info log content as Info -func (s *SyslogLogger) Info(v ...interface{}) { - _ = s.w.Info(fmt.Sprint(v...)) -} - -// Infof log content as Infof and format -func (s *SyslogLogger) Infof(format string, v ...interface{}) { - _ = s.w.Info(fmt.Sprintf(format, v...)) -} - -// Warn log content as Warn -func (s *SyslogLogger) Warn(v ...interface{}) { - _ = s.w.Warn(fmt.Sprint(v...)) -} - -// Warnf log content as Warnf and format -func (s *SyslogLogger) Warnf(format string, v ...interface{}) { - _ = s.w.Warn(fmt.Sprintf(format, v...)) -} - -// Fatal log content as Fatal -func (s *SyslogLogger) Fatal(v ...interface{}) { - _ = s.w.Fatal(fmt.Sprint(v...)) -} - -// Fatalf log content as Fatalf and format -func (s *SyslogLogger) Fatalf(format string, v ...interface{}) { - _ = s.w.Fatal(fmt.Sprintf(format, v...)) -} - -// Level shows log level -func (s *SyslogLogger) Level() LogLevel { - return LOG_NODEF -} - -// SetLevel always return error, as current log/syslog package doesn't allow to set priority level after syslog.Writer created -func (s *SyslogLogger) SetLevel(l LogLevel) {} diff --git a/lib/midware/midhandle.go b/lib/midware/midhandle.go deleted file mode 100644 index 3e79cebf..00000000 --- a/lib/midware/midhandle.go +++ /dev/null @@ -1,80 +0,0 @@ -package midware - -import ( - "net/http" - "strings" - - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/constants" - - "github.com/gorilla/mux" -) - -func LoggerTrace(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Do stuff here - log.Trace("Http Trace Info:") - log.Trace(" From Host:", r.RemoteAddr) - log.Trace(" To Host:", r.Host) - log.Debug(" RequestUri:", r.RequestURI) - log.Trace(" Method:", r.Method) - log.Trace(" Proto:", r.Proto) - log.Trace(" ContentLength:", r.ContentLength) - log.Trace(" User-Agent:", r.Header.Get("User-Agent")) - log.Trace(" Content-Type:", r.Header.Get("Content-Type")) - log.Trace(" AccessToken:", r.Header.Get("AccessToken")) - log.Trace(" Authorization:", r.Header.Get(constants.HEADER_KEY)) - log.Trace("Trace End=====") - //body, _ := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - // nop-close to ready r.Body !!! - //r.Body = ioutil.NopCloser(bytes.NewReader(body)) - //log.Trace("Body:", string(body)) - // Call the next handler, which can be another middleware in the chain, or the final handler. - // if r.Method == "OPTIONS" { - // services.ResponseStatusOK201Accepted(w) - // return - // } - - next.ServeHTTP(w, r) - }) -} - -// 已禁用 -func OptionProcess(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "OPTIONS" { - services.ResponseStatusOK201Accepted(w) - return - } - - next.ServeHTTP(w, r) - }) -} - -// 已禁用 -func CheckPermission(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("AccessToken") - vars := mux.Vars(r) - management := vars["managedType"] - element := vars["elementTypeValue"] - object := vars["objectTypeValue"] - pack := "*" - if token != "" && element != "oauth" { - log.Debugf("token:%s, method:%s, management:%s, element:%s, object:%s, pack:%s", token, r.Method, management, element, object, pack) - exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), management, element, object, pack) - if err != nil { - log.Error("Failed to get permission:", err) - services.ResponseForbidden403NotPermission(w) - return - } - if !exist { - log.Error("Not permission!") - services.ResponseForbidden403NotPermission(w) - return - } - } - next.ServeHTTP(w, r) - }) -} diff --git a/lib/midware/mml_log.go b/lib/midware/mml_log.go deleted file mode 100644 index 190e9629..00000000 --- a/lib/midware/mml_log.go +++ /dev/null @@ -1,60 +0,0 @@ -package midware - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "time" - - "be.ems/lib/core/ctx" - "be.ems/lib/log" - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/date" -) - -// LogMML mml操作日志搜集 -func LogMML(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // 读取请求体内容 - body, err := io.ReadAll(r.Body) - if err != nil { - http.Error(w, "Internal Server Error", http.StatusInternalServerError) - return - } - // 解析json内参数 - var bodyArgs map[string]any - _ = json.Unmarshal(bytes.Clone(body), &bodyArgs) - // 将请求体内容存储在临时缓冲区中 - buffer := bytes.NewBuffer(body) - r.Body = io.NopCloser(buffer) - - next.ServeHTTP(w, r) - - // 收尾存入数据库的参数 - mmlCmd := bodyArgs["mml"].([]any)[0] - ipAddr := strings.Split(r.RemoteAddr, ":")[0] - neType := ctx.GetParam(r, "elementTypeValue") - neId := ctx.GetQuery(r, "ne_id") - timeStr := date.ParseDateToStr(time.Now(), date.YYYY_MM_DD_HH_MM_SS) - - // 响应内容长度和状态码作为结果 - str := strings.TrimSuffix(fmt.Sprintf("%v", w), "}") - strArr := strings.Split(str, " ") - size := strArr[1] - status := strArr[2] - contentType := w.Header().Get("Content-Type") - resultStr := fmt.Sprintf(`{"status":"%s","size":"%s","content-type":"%s"}`, status, size, contentType) - - // 用户名 - username := ctx.LoginUserToUserName(r) - // 执行插入 - sql := "insert into mml_log (user,ip,ne_type,ne_id,mml,result,log_time)values(?,?,?,?,?,?,?)" - _, sqlerr := db.ExecDB("", sql, []any{username, ipAddr, neType, neId, mmlCmd, resultStr, timeStr}) - if sqlerr != nil { - log.Errorf("insert row : %v", sqlerr.Error()) - } - }) -} diff --git a/lib/midware/operate_log.go b/lib/midware/operate_log.go deleted file mode 100644 index dd028b2b..00000000 --- a/lib/midware/operate_log.go +++ /dev/null @@ -1,135 +0,0 @@ -package midware - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "reflect" - "runtime" - "strings" - "time" - - "be.ems/lib/core/ctx" - "be.ems/src/framework/constants" - "be.ems/src/framework/ip2region" - "be.ems/src/framework/middleware/collectlogs" - "be.ems/src/framework/utils/parse" - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/service" -) - -// 敏感属性字段进行掩码 -var maskProperties []string = []string{ - "password", - "oldPassword", - "newPassword", - "confirmPassword", -} - -// LogOperate 操作日志搜集 -func LogOperate(options collectlogs.Options) func(http.Handler) http.Handler { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - startTime := time.Now() - - // 只对前端发送的数据进行记录 - appCodeStr := r.Header.Get("X-App-Code") - if appCodeStr == "" { - next.ServeHTTP(w, r) - return - } - - // 函数名 - funcName := runtime.FuncForPC(reflect.ValueOf(next).Pointer()).Name() - lastDotIndex := strings.LastIndex(funcName, "/") - funcName = funcName[lastDotIndex+1:] - - // 用户名 - username := ctx.LoginUserToUserName(r) - - // 解析ip地址 - ip := strings.Split(r.RemoteAddr, ":")[0] - ipaddr := ip2region.ClientIP(ip) - location := "-" //ip2region.RealAddressByIp(ipaddr) - // 操作日志记录 - operLog := model.SysLogOperate{ - Title: options.Title, - BusinessType: options.BusinessType, - OperaMethod: funcName, - OperaUrl: r.RequestURI, - OperaUrlMethod: r.Method, - OperaIp: ipaddr, - OperaLocation: location, - OperaBy: username, - } - - // 是否需要保存request,参数和值 - if options.IsSaveRequestData && (r.Method == "POST" || r.Method == "PUT") { - // 读取请求体内容 - body, err := io.ReadAll(r.Body) - if err != nil { - http.Error(w, "Internal Server Error", http.StatusInternalServerError) - return - } - // 解析json内参数 - var bodyArgs map[string]any - _ = json.Unmarshal(bytes.Clone(body), &bodyArgs) - // 将请求体内容存储在临时缓冲区中 - buffer := bytes.NewBuffer(body) - r.Body = io.NopCloser(buffer) - - params := bodyArgs - for k, v := range params { - // 敏感属性字段进行掩码 - for _, s := range maskProperties { - if s == k { - params[k] = parse.SafeContent(v.(string)) - break - } - } - } - jsonStr, _ := json.Marshal(params) - paramsStr := string(jsonStr) - if len(paramsStr) > 2000 { - paramsStr = paramsStr[:2000] - } - operLog.OperaParam = paramsStr - } - - next.ServeHTTP(w, r) - - // 响应内容长度和状态码作为结果 - str := strings.TrimSuffix(fmt.Sprintf("%v", w), "}") - strArr := strings.Split(str, " ") - size := strArr[1] - status := strArr[2] - - // 响应状态 - if status == "200" || status == "204" { - operLog.StatusFlag = constants.STATUS_YES - } else { - operLog.StatusFlag = constants.STATUS_NO - } - - // 是否需要保存response,参数和值 - if options.IsSaveResponseData { - contentDisposition := w.Header().Get("Content-Disposition") - contentType := w.Header().Get("Content-Type") - content := contentType + contentDisposition - msg := fmt.Sprintf(`{"status":"%s","size":"%s","content-type":"%s"}`, status, size, content) - operLog.OperaMsg = msg - } - - // 日志记录时间 - duration := time.Since(startTime) - operLog.CostTime = duration.Milliseconds() - operLog.OperaTime = time.Now().UnixMilli() - - // 保存操作记录到数据库 - service.NewSysLogOperate.Insert(operLog) - - }) - } -} diff --git a/lib/mmlp/parse.go b/lib/mmlp/parse.go deleted file mode 100644 index 02408cec..00000000 --- a/lib/mmlp/parse.go +++ /dev/null @@ -1,1059 +0,0 @@ -package mmlp - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "math" - "net/http" - "regexp" - "strconv" - "strings" - - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/run" - "be.ems/src/framework/constants" - - "github.com/go-resty/resty/v2" -) - -type Param struct { - Name string `json:"name"` - Value string `json:"value"` -} - -type MmlCommand struct { - Operation string `json:"operation"` - Object string `json:"object"` - Params []Param `json:"params"` - PaList []string `json:"paList"` - AaList []string `json:"aaList"` - AaMap map[string]interface{} `json:"aaMap"` - NaMap map[string]interface{} `json:"naMap"` - AaUri []string `json:"aaUri"` - AaLoc []string `json:"aaLoc"` // for loc parameter -} - -type MmlVar struct { - Version string `json:"version"` - Output string `json:"output"` - MmlHome string `json:"mmlHome"` - Limit int `json:"limit"` - User string `json:"user"` - SessionToken string `josn:"sessionToken"` - Authorization string `josn:"authorization"` - HttpUri string `json:"httpUri"` - UserAgent string `json:"userAgent"` - TagNE string `json:"tagNE"` -} - -// func init() { -// OmcMmlVar = &MmlVar{ -// Version: "16.1.1", -// Output: DefaultFormatType, -// Limit: 50, -// } -// } - -// func SetOmcMmlVarOutput(output string) { -// OmcMmlVar.Output = output -// } - -// func SetOmcMmlVarLimit(limit int) { -// OmcMmlVar.Limit = limit -// } - -func splitByColon(str string) []string { - return splitBy(str, ':') -} - -func splitByComma(str string) []string { - return splitBy(str, ',') -} - -func splitBy(str string, sep rune) []string { - var result []string - var stack []string - var current []rune - var quotes, apoFlag bool = false, false - - for _, c := range str { - if c == '{' || c == '[' || (c == '\'' && apoFlag == false) || (c == '"' && quotes == false) { // "'" - apoFlag = true - quotes = true - stack = append(stack, string(c)) - } else if c == '}' || c == ']' || (c == '\'' && apoFlag == true) || (c == '"' && quotes == true) { - apoFlag = false - quotes = false - if len(stack) > 0 { - stack = stack[:len(stack)-1] - } - } - - if c == sep && len(stack) == 0 { - result = append(result, string(current)) - current = []rune{} - } else { - current = append(current, c) - } - } - - result = append(result, string(current)) - return result -} - -func ParseMMLCommand(mmlStr string, mmlComms *[]MmlCommand) error { - log.Info("ParseMMLCommand processing ...") - log.Debug("mmlStr: ", mmlStr) - - mc := new(MmlCommand) - reg := regexp.MustCompile(`\s*;\s*`) - mmls := reg.Split(mmlStr, -1) - for _, mml := range mmls { - log.Trace("mml:", mml) - if len(mml) == 0 { - continue - } - //reg := regexp.MustCompile(`\s*:\s*`) - //ms := reg.Split(mml, -1) - ms := splitByColon(mml) - if len(ms) < 1 || len(ms) > 2 { - err := global.ErrMmlInvalidCommandFormat - log.Error(err) - return err - } - if len(ms) == 2 { - cmd := strings.Trim(ms[0], " ") - reg = regexp.MustCompile(`\s+`) - cs := reg.Split(cmd, -1) - //cs := strings.Split(cmd, " ") - if len(cs) == 2 { - mc.Operation = cs[0] - mc.Object = cs[1] - } else { - err := global.ErrMmlInvalidCommandFormat - log.Error(err) - return err - } - //reg = regexp.MustCompile(`\s*,\s*`) - //reg = regexp.MustCompile(`(?U)(? 0 { - extUri := strings.Join(mml.AaUri, "/") - requestURI = requestURI + fmt.Sprintf(mmlMap.ExtUri, extUri) - } - if mmlMap.Params != "" { - params := strings.Join(mml.AaLoc, "+and+") - params = strings.ReplaceAll(params, " ", "+") // replace " " to "+" - log.Trace("params:", params) - if mmlMap.ParamTag == "SQL" && strings.TrimSpace(params) != "" { - params = "+where+" + params - } - requestURI = fmt.Sprintf("%s%s%s", requestURI, mmlMap.Params, params) - } - return requestURI -} - -func DeploymentLicense(mml *MmlCommand, omcMmlVar *MmlVar, outputJson *dborm.MmlOutput) *[]byte { - var output []byte - log.Debug("mml:", mml) - var srcNeType, srcNeid, dstNeType, dstNeId, value string - for _, Param := range mml.Params { - switch Param.Name { - case "srcnetype": - srcNeType = Param.Value - case "srcneid": - srcNeid = Param.Value - case "dstnetype": - dstNeType = Param.Value - case "dstneid": - dstNeId = Param.Value - case "number": - value = Param.Value - } - } - intValue, _ := strconv.Atoi(value) - log.Debugf("srcNeType:%s, srcNeid:%s dstNeType:%s dstNeId:%s intValue:%d", srcNeType, srcNeid, dstNeType, dstNeId, intValue) - a1, err := dborm.XormAdjustmentNeLicense(srcNeType, srcNeid, intValue) - if err != nil { - log.Error("Failed to Put:", err) - } - - a2, err := dborm.XormAdjustmentNeLicense(dstNeType, dstNeId, -intValue) - if err != nil { - log.Error("Failed to Put:", err) - output = *ParseErrorOutput(err) - } else { - //response := &resty.Response{StatusCode: http.StatusOK} - //output = ParseOutputResponse(omcMmlVar, outputJson, response.) - str := fmt.Sprintf("RetCode = 0 operation succeeded\n\nAffected rows = %d \n\n", a1+a2) - output = []byte(str) - } - - return &output -} - -func AdjustmentLicense(mml *MmlCommand, omcMmlVar *MmlVar, outputJson *dborm.MmlOutput) *[]byte { - var output []byte - log.Debug("mml:", mml) - var neType, neid, number string - for _, Param := range mml.Params { - switch Param.Name { - case "netype": - neType = Param.Value - case "neid": - neid = Param.Value - case "number": - number = Param.Value - } - } - intValue, _ := strconv.Atoi(number) - log.Debugf("neType:%s, neid:%s intValue:%d", neType, neid, intValue) - affected, err := dborm.XormAdjustmentNeLicense(neType, neid, intValue) - if err != nil { - log.Error("Failed to XormAdjustmentNeLicense:", err) - output = *ParseErrorOutput(err) - } else { - str := fmt.Sprintf("RetCode = 0 operation succeeded\n\nAffected rows = %d \n\n", affected) - output = []byte(str) - } - - return &output -} - -func InstallLicense(mml *MmlCommand, omcMmlVar *MmlVar, outputJson *dborm.MmlOutput) *[]byte { - var output []byte - log.Debug("mml:", mml) - var neType, neid, number string - for _, Param := range mml.Params { - switch Param.Name { - case "netype": - neType = Param.Value - case "neid": - neid = Param.Value - case "number": - number = Param.Value - } - } - intValue, _ := strconv.Atoi(number) - log.Debugf("neType:%s, neid:%s intValue:%d", neType, neid, intValue) - affected, err := dborm.XormUpdateNeLicense(neType, neid, intValue) - if err != nil { - log.Error("Failed to XormUpdateNeLicense:", err) - output = *ParseErrorOutput(err) - } else { - str := fmt.Sprintf("RetCode = 0 operation succeeded\n\nAffected rows = %d \n\n", affected) - output = []byte(str) - } - - return &output -} - -func RunShellCommand(mml *MmlCommand, omcMmlVar *MmlVar, outputJson *dborm.MmlOutput) *[]byte { - var output []byte - log.Debug("mml:", mml) - var command string - for _, Param := range mml.Params { - switch Param.Name { - case "cmd": - command = Param.Value - default: - } - } - out, err := run.ExecCmd(command, omcMmlVar.MmlHome) - //cmd := exec.Command("/bin/bash", "-c", command) - - //out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - str := fmt.Sprintf("Command: %s output:\n\n%v\n", command, string(out)) - //output = *ParseErrorOutput(err) - output = []byte(str) - //return &output - } else { - str := fmt.Sprintf("Command: %s output:\n\n%v\n", command, string(out)) - output = []byte(str) - } - - return &output -} - -func TransMml2HttpReq(omcMmlVar *MmlVar, mml *MmlCommand) (*[]byte, error) { - log.Info("TransMml2HttpReq processing ...") - log.Debug("mml: ", mml) - - where := fmt.Sprintf("operation='%s' AND object='%s'", mml.Operation, mml.Object) - mmlMap, err := dborm.XormGetMmlHttpMap("mml_http_map", where) - if err != nil { - log.Error("Failed to XormGetMmlHttpMap: ", err) - return ParseErrorOutput(err), err - } - if mmlMap == nil { - err := errors.New("Not found mml map") - log.Error(err) - return ParseErrorOutput(err), err - } - log.Trace("mmlMap: ", mmlMap) - if mmlMap.Output == "" { - mmlMap.Output = "{}" - } - outputJson := new(dborm.MmlOutput) - err = json.Unmarshal([]byte(mmlMap.Output), outputJson) - if err != nil { - log.Error("Failed to Unmarshal:", err) - return ParseErrorOutput(err), err - } - log.Trace("outputJson: ", outputJson) - inputJson := new(dborm.MmlInput) - log.Trace("mmlMap.Input: ", mmlMap.Input) - if mmlMap.Input == "" { - mmlMap.Input = "{}" - } - err = json.Unmarshal([]byte(mmlMap.Input), inputJson) - if err != nil { - log.Error("Failed to Unmarshal:", err) - return ParseErrorOutput(err), err - } - log.Trace("inputJson: ", inputJson) - - var requestURI string - var output *[]byte - client := resty.New() - switch strings.ToLower(mmlMap.Method) { - case "get": - requestURI = parseRequestUri(omcMmlVar.HttpUri, mmlMap, mml) - log.Debugf("method: Get requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: omcMmlVar.Authorization}). - // SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}). - SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Get(requestURI) - if err != nil { - log.Error("Failed to Get:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(omcMmlVar, outputJson, response) - } - case "post": - requestURI = parseRequestUri(omcMmlVar.HttpUri, mmlMap, mml) - body := ParseInputBody(inputJson, mml) - log.Debugf("method: Post requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: omcMmlVar.Authorization}). - // SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}). - SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(*body). - Post(requestURI) - if err != nil { - log.Error("Failed to Post:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(omcMmlVar, outputJson, response) - } - case "put": - switch inputJson.CallFunc { - case "DeploymentLicense": - output = DeploymentLicense(mml, omcMmlVar, outputJson) - return output, nil - case "AdjustmentLicense": - output = AdjustmentLicense(mml, omcMmlVar, outputJson) - return output, nil - case "InstallLicense": - output = InstallLicense(mml, omcMmlVar, outputJson) - return output, nil - case "RunShellCommand": - output = RunShellCommand(mml, omcMmlVar, outputJson) - return output, nil - default: - } - - requestURI = parseRequestUri(omcMmlVar.HttpUri, mmlMap, mml) - log.Debugf("method: Put requestURI: %s", requestURI) - body := ParseInputBody(inputJson, mml) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: omcMmlVar.Authorization}). - // SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}). - SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(*body). - Put(requestURI) - if err != nil { - log.Error("Failed to Put:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(omcMmlVar, outputJson, response) - } - case "delete": - requestURI = parseRequestUri(omcMmlVar.HttpUri, mmlMap, mml) - log.Debugf("method: Delete requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: omcMmlVar.Authorization}). - // SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}). - SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Delete(requestURI) - if err != nil { - log.Error("Failed to Delete:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(omcMmlVar, outputJson, response) - } - case "patch": - requestURI = parseRequestUri(omcMmlVar.HttpUri, mmlMap, mml) - log.Debugf("method: patch requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: omcMmlVar.Authorization}). - // SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}). - SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Patch(requestURI) - if err != nil { - log.Error("Failed to Patch:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(omcMmlVar, outputJson, response) - } - default: - err := errors.New("not found mml command") - log.Error(err) - output = ParseErrorOutput(err) - } - return output, nil -} - -const ( - MaxMmlOutputBufferSize = 1000000 - FormatTypeJson = "json" - FormatTypeTable = "table" - DefaultFormatType = FormatTypeTable -) - -const ( - RetCodeSucceeded = 0 - RetCodeFailed = 0 -) - -func ParseInputBody(inputJson *dborm.MmlInput, mml *MmlCommand) *[]byte { - inputBody := make(map[string]interface{}) - log.Trace("mml.NaMap:", mml.NaMap) - log.Trace("mml.AaMap:", mml.AaMap) - if strings.ToLower(inputJson.BodyFmt) == "putdb" { - for _, icol := range inputJson.Cols { - log.Trace("icol:", icol) - mml.NaMap[icol.Name] = icol.Value - } - inputBody[inputJson.BodyKey] = mml.NaMap - } else { - inputParams := make([]map[string]interface{}, 0) - inputParams = append(inputParams, mml.NaMap) - inputBody[inputJson.BodyKey] = inputParams - } - - body, err := json.Marshal(inputBody) - if err != nil { - log.Error("Failed to marshal:", err) - } - - log.Trace("inputBody:", inputBody) - log.Trace("body:", string(body)) - return &body -} - -func ParseOutputResponse(omcMmlVar *MmlVar, outputJson *dborm.MmlOutput, response *resty.Response) *[]byte { - var output []byte - var str bytes.Buffer - - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - if omcMmlVar.Output == FormatTypeJson { - code := fmt.Sprintf("StatusCode = %d status %s\n\n", response.StatusCode(), response.Status()) - title := formatTitle(outputJson.Title) - - json.Indent(&str, response.Body(), "", " ") - log.Trace(str.String()) - - output = global.BytesCombine1([]byte(code), []byte(title), str.Bytes(), []byte("\n")) - } else { - log.Trace("Body:", string(response.Body())) - mapDatas := make(map[string]interface{}, 0) - - err := json.Unmarshal(response.Body(), &mapDatas) - if err != nil { - log.Error("Failed to json.Unmarshal:", err) - //output = *ParseErrorOutput(err) - output = *ParseErrorOutput(string(response.Body())) - return &output - } - log.Trace("mapDatas:", mapDatas) - switch strings.ToLower(outputJson.RetFmt) { - case "getdb": - if len(mapDatas) > 0 { - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - if len(data.([]interface{})) > 0 { - table := (data.([]interface{}))[0] - log.Trace("table:", table) - - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - title := formatTitle(outputJson.Title) - fmtResults := ParseTableOutput(outputJson, table) - output = global.BytesCombine1([]byte(code), []byte(title), []byte(fmtResults)) - } - } - case "deletedb": - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - - if len(data.(map[string]interface{})) > 0 { - table := data.(map[string]interface{}) - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - fmtResults := ParseDBOperOutput(outputJson, table) - output = global.BytesCombine1([]byte(code), []byte(fmtResults)) - } - case "postdb": - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - - if len(data.(map[string]interface{})) > 0 { - table := data.(map[string]interface{}) - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - fmtResults := ParseDBOperOutput(outputJson, table) - output = global.BytesCombine1([]byte(code), []byte(fmtResults)) - } - case "putdb": - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - if len(data.(map[string]interface{})) > 0 { - table := data.(map[string]interface{}) - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - fmtResults := ParseDBOperOutput(outputJson, table) - output = global.BytesCombine1([]byte(code), []byte(fmtResults)) - } - case "getnf": - if len(mapDatas) > 0 { - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - if len(data.([]interface{})) > 0 { - //table := (data.([]interface{}))[0] - //log.Trace("table:", table) - - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - title := formatTitle(outputJson.Title) - fmtResults := ParseNFTableOutput(outputJson, data) - output = global.BytesCombine1([]byte(code), []byte(title), []byte(fmtResults)) - } - } - default: - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - output = global.BytesCombine1([]byte(code)) - } - - } - default: - if omcMmlVar.Output == FormatTypeJson { - code := fmt.Sprintf("StatusCode = %d status %s\n\n", response.StatusCode(), response.Status()) - //title := formatTitle("Network Element Information") - - json.Indent(&str, response.Body(), "", " ") - log.Trace(str.String()) - - output = global.BytesCombine1([]byte(code), str.Bytes(), []byte("\n")) - } else { - log.Trace("Body:", string(response.Body())) - mapResults := make(map[string]interface{}, 0) - - err := json.Unmarshal(response.Body(), &mapResults) - if err != nil { - log.Error("Failed to json.Unmarshal:", err) - output = *ParseErrorOutput(string(response.Body())) - } else { - log.Trace("mapResults:", mapResults) - if v, ok := mapResults["error"]; ok { - vMap := v.(map[string]interface{}) - if len(vMap) > 0 { - errCode, _ := strconv.Atoi(fmt.Sprintf("%v", vMap["errorCode"])) - errorInfo := vMap["errorInfo"] - output = []byte(fmt.Sprintf(outputJson.ErrMsg, errCode, errorInfo)) - } - } else if v, ok := mapResults["code"]; ok { - errCode, _ := strconv.Atoi(fmt.Sprintf("%v", v)) - errorInfo := mapResults["msg"] - output = []byte(fmt.Sprintf(outputJson.ErrMsg, errCode, errorInfo)) - } else { - output = []byte(fmt.Sprintf("%v", mapResults)) - } - } - } - } - return &output -} - -func ParseDBOperOutput(outputJson *dborm.MmlOutput, cols any) string { - var colOutput []dborm.ColOutput = outputJson.Cols - var value, retFmtCols string - if len(cols.(map[string]interface{})) > 0 { - if len(colOutput) > 0 { - coln := colOutput[0].Name - value = fmt.Sprintf("%v", cols.(map[string]interface{})[coln]) - log.Tracef("coln:%s value:%s", coln, value) - retFmtCols = colOutput[0].Display + " = " + value + "\n\n" - } - } - - return retFmtCols -} - -func ParseNFTableOutput(outputJson *dborm.MmlOutput, cols any) string { - var colOutput []dborm.ColOutput - var fmtColName string - var colName []string - var spaceNum int = 1 - var alignmentM, alignmentSN, alignmentSV string = "Left", "Right", "Left" - - if outputJson.SepSpaceNum != 0 { - spaceNum = outputJson.SepSpaceNum - } - if outputJson.AlignmentM != "" { - alignmentM = outputJson.AlignmentM - } - if outputJson.AlignmentSN != "" { - alignmentSN = outputJson.AlignmentSN - } - if outputJson.AlignmentSV != "" { - alignmentSV = outputJson.AlignmentSV - } - - maxLength := math.MinInt64 - for _, coln := range outputJson.Cols { - log.Trace("coln:", coln) - - if len(coln.Display) > maxLength { - maxLength = len(coln.Display) - } - if coln.Length < len(coln.Display) { - coln.Length = len(coln.Display) - } - - colName = append(colName, ParseAlignmentOutput(coln.Length, alignmentM, coln.Display)) - colOutput = append(colOutput, coln) - } - fmtColName = formatLineBySpace(&colName, spaceNum) - log.Trace("fmtColName:", fmtColName) - - var retFmtCols string - var fmtColValues []string - var numberResult int - // for _, colnvs := range cols.([]interface{}) { - // log.Trace("colnvs:", colnvs) - // if colnvs == nil { - // break - // } - numberResult = len(cols.([]interface{})) - - if numberResult == 1 && outputJson.SingleList == true { - colnv := cols.([]interface{})[0] - log.Trace("colnv:", colnv) - - var fmtNV []string - for _, coln := range colOutput { - fmtName := ParseAlignmentOutput(maxLength, alignmentSN, coln.Display) - log.Tracef("alignmentSN:%s fmtName:%s", alignmentSN, fmtName) - value := fmt.Sprintf("%v", colnv.(map[string]interface{})[coln.Name]) - fmtValue := ParseAlignmentOutput(coln.Length, alignmentSV, value) - fmtNV = append(fmtNV, fmtName+": "+fmtValue) - } - - fmtResults := strings.Join(fmtNV, "\n") - log.Tracef("fmtResults:\n%s", fmtResults) - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtResults + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols - } else { - for i := 0; i < numberResult; i++ { - colnv := cols.([]interface{})[i] - log.Trace("colnv:", colnv) - var colValues []string - var newVal []string - for _, coln := range colOutput { - value := fmt.Sprintf("%v", colnv.(map[string]interface{})[coln.Name]) - if len(coln.Alias) != 0 { - enumVal, _ := strconv.Atoi(value) - value = parseEnumAlias(&(coln.Alias), enumVal) - } - newVal = append(newVal, ParseAlignmentOutput(coln.Length, alignmentM, value)) - } - colValues = append(colValues, formatLineBySpace(&newVal, spaceNum)) - log.Trace("colValues:", colValues) - fmtColValues = append(fmtColValues, strings.Join(colValues, "\n")) - log.Trace("fmtColValues:", fmtColValues) - } - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtColName + "\n\n" + strings.Join(fmtColValues, "\n") + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols - } -} - -func ParseTableOutput(outputJson *dborm.MmlOutput, cols any) string { - var colOutput []dborm.ColOutput - var fmtColName string - var colName []string - var spaceNum int = 1 - var alignmentM, alignmentSN, alignmentSV string = "Left", "Right", "Left" - - if outputJson.SepSpaceNum != 0 { - spaceNum = outputJson.SepSpaceNum - } - if outputJson.AlignmentM != "" { - alignmentM = outputJson.AlignmentM - } - if outputJson.AlignmentSN != "" { - alignmentSN = outputJson.AlignmentSN - } - if outputJson.AlignmentSV != "" { - alignmentSV = outputJson.AlignmentSV - } - - maxLength := math.MinInt64 - for _, coln := range outputJson.Cols { - log.Trace("coln:", coln) - - if len(coln.Display) > maxLength { - maxLength = len(coln.Display) - } - if coln.Length < len(coln.Display) { - coln.Length = len(coln.Display) - } - - colName = append(colName, ParseAlignmentOutput(coln.Length, alignmentM, coln.Display)) - colOutput = append(colOutput, coln) - } - fmtColName = formatLineBySpace(&colName, spaceNum) - log.Trace("fmtColName:", fmtColName) - - var retFmtCols string - var fmtColValues []string - var numberResult int - for _, colnvs := range cols.(map[string]interface{}) { - log.Trace("colnvs:", colnvs) - if colnvs == nil { - break - } - numberResult = len(colnvs.([]interface{})) - - if numberResult == 1 && outputJson.SingleList == true { - colnv := colnvs.([]interface{})[0] - log.Trace("colnv:", colnv) - - var fmtNV []string - for _, coln := range colOutput { - fmtName := ParseAlignmentOutput(maxLength, alignmentSN, coln.Display) - log.Tracef("alignmentSN:%s fmtName:%s", alignmentSN, fmtName) - value := fmt.Sprintf("%v", colnv.(map[string]interface{})[coln.Name]) - fmtValue := ParseAlignmentOutput(coln.Length, alignmentSV, value) - fmtNV = append(fmtNV, fmtName+": "+fmtValue) - } - - fmtResults := strings.Join(fmtNV, "\n") - log.Tracef("fmtResults:\n%s", fmtResults) - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtResults + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols - } else { - for i := 0; i < numberResult; i++ { - colnv := colnvs.([]interface{})[i] - log.Trace("colnv:", colnv) - var colValues []string - var newVal []string - for _, coln := range colOutput { - value := fmt.Sprintf("%v", colnv.(map[string]interface{})[coln.Name]) - if len(coln.Alias) != 0 { - enumVal, _ := strconv.Atoi(value) - value = parseEnumAlias(&(coln.Alias), enumVal) - } - newVal = append(newVal, ParseAlignmentOutput(coln.Length, alignmentM, value)) - } - colValues = append(colValues, formatLineBySpace(&newVal, spaceNum)) - log.Trace("colValues:", colValues) - fmtColValues = append(fmtColValues, strings.Join(colValues, "\n")) - log.Trace("fmtColValues:", fmtColValues) - } - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtColName + "\n\n" + strings.Join(fmtColValues, "\n") + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols - } - } - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtColName + "\n" + strings.Join(fmtColValues, "\n") + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols -} - -func parseEnumAlias(alias *[]string, enumVal int) string { - return (*alias)[enumVal] -} - -func formatLineBySpace(strArray *[]string, spaceNum int) string { - space := strings.Repeat(" ", spaceNum) - return strings.Join(*strArray, space) -} - -func ParseAlignmentOutput(length int, alignment string, str string) string { - spaceLen := length - len(str) - if spaceLen < 0 { - log.Warnf("len(str=%s)=%d more length=%d", str, len(str), length) - spaceLen = 0 - } - var retStr string - switch alignment { - case "Left": - suffix := strings.Repeat(" ", spaceLen) - retStr = str + suffix - case "Right": - prefix := strings.Repeat(" ", spaceLen) - retStr = prefix + str - log.Tracef("retStr:%s", retStr) - case "Middle": - prefix := strings.Repeat(" ", int(math.Ceil(float64(spaceLen)/2))) - suffix := strings.Repeat(" ", int(math.Floor(float64(spaceLen)/2))) - retStr = prefix + str + suffix - } - log.Tracef("length=%d, spaceLne=%d, alignment=%s, str=%s, retStr=%s", length, spaceLen, alignment, str, retStr) - return retStr -} - -func ParseErrorOutput(err any) *[]byte { - var output []byte - - var formatType string = DefaultFormatType - if formatType == FormatTypeJson { - output = []byte(fmt.Sprintf("ErrorCode = 1 Error message: %v\n\n", err)) - } else { - output = []byte(fmt.Sprintf("RetCode = -1 operation failed: %v\n\n", err)) - } - - return &output -} - -func formatTitle(title string) string { - var builder strings.Builder - builder.WriteString(title) - builder.WriteString("\n") - for i := 0; i < len(title); i++ { - builder.WriteString("-") - } - builder.WriteString("\n") - return builder.String() -} - -func formatTableOutput() { - -} diff --git a/lib/oauth/oauth.go b/lib/oauth/oauth.go deleted file mode 100644 index b261f35f..00000000 --- a/lib/oauth/oauth.go +++ /dev/null @@ -1,157 +0,0 @@ -package oauth - -import ( - "crypto/sha256" - "crypto/sha512" - "encoding/hex" - "math/rand" - "net/http" - "strings" - "time" - - "be.ems/lib/log" - - "golang.org/x/crypto/bcrypt" -) - -func RandAccessToken(n int) (ret string) { - allString := "52661fbd-6b84-4fc2-aa1e-17879a5c6c9b" - ret = "" - for i := 0; i < n; i++ { - r := rand.Intn(len(allString)) - ret = ret + allString[r:r+1] - } - return ret -} - -const letterBytes = "abcdef0123456789" -const ( - letterIdxBits = 6 // 6 bits to represent a letter index - letterIdxMask = 1<= 0; { - if remain == 0 { - cache, remain = src.Int63(), letterIdxMax - } - if idx := int(cache & letterIdxMask); idx < len(letterBytes) { - b[i] = letterBytes[idx] - i-- - } - cache >>= letterIdxBits - remain-- - } - - return string(b) -} - -func GenRandToken(prefix string) string { - if prefix == "" { - return RandStringBytes(8) + "-" + RandStringBytes(4) + "-" + - RandStringBytes(4) + "-" + RandStringBytes(4) + "-" + RandStringBytes(12) - } else { - return prefix + "-" + RandStringBytes(8) + "-" + RandStringBytes(4) + "-" + - RandStringBytes(4) + "-" + RandStringBytes(4) + "-" + RandStringBytes(12) - } -} - -type OAuthBody struct { - GrantType string - UserName string - Value string -} - -/* -func IsValidOAuthInfo(oAuthBody OAuthBody) bool { - log.Debug("IsValidOAuthInfo processing... ") - - conf := config.GetYamlConfig() - for _, o := range conf.Auth { - if oAuthBody.GrantType == o.Type && oAuthBody.UserName == o.User && oAuthBody.Value == o.Password { - return true - } - } - - return false -} -*/ - -func IsWrongOAuthInfo(oAuthBody OAuthBody) bool { - log.Debug("IsWrongOAuthInfo processing... ") - - if oAuthBody.GrantType == "" || strings.ToLower(oAuthBody.GrantType) != "password" || - oAuthBody.UserName == "" || oAuthBody.Value == "" { - return true - } - - return false -} - -func GetTokenFromHttpRequest(r *http.Request) string { - for k, v := range r.Header { - log.Tracef("k:%s, v:%s", k, v) - if strings.ToLower(k) == "accesstoken" && len(v) != 0 { - log.Trace("AccessToken:", v[0]) - return v[0] - } - } - - return "" -} - -// IsCarriedToken check token is carried -func IsCarriedToken(r *http.Request) (string, bool) { - - token := GetTokenFromHttpRequest(r) - if token == "" { - return "", false - } - return token, true -} - -// Bcrypt Encrypt 加密明文密码 -func BcryptEncrypt(password string) (string, error) { - hashedBytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) - return string(hashedBytes), err -} - -// Bcrypt Compare 密文校验 -func BcryptCompare(hashedPassword, password string) error { - return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password)) -} - -// sha256 crypt -func GetSHA256HashCode(stringMessage string) string { - message := []byte(stringMessage) //字符串转化字节数组 - //创建一个基于SHA256算法的hash.Hash接口的对象 - hash := sha256.New() //sha-256加密 - //输入数据 - hash.Write(message) - //计算哈希值 - bytes := hash.Sum(nil) - //将字符串编码为16进制格式,返回字符串 - hashCode := hex.EncodeToString(bytes) - //返回哈希值 - return hashCode -} - -// sha512 crypt -func GetSHA512HashCode(stringMessage string) string { - message := []byte(stringMessage) //字符串转化字节数组 - //创建一个基于SHA256算法的hash.Hash接口的对象 - hash := sha512.New() //SHA-512加密 - //输入数据 - hash.Write(message) - //计算哈希值 - bytes := hash.Sum(nil) - //将字符串编码为16进制格式,返回字符串 - hashCode := hex.EncodeToString(bytes) - //返回哈希值 - return hashCode -} diff --git a/lib/pair/pair.go b/lib/pair/pair.go deleted file mode 100644 index f779424f..00000000 --- a/lib/pair/pair.go +++ /dev/null @@ -1,37 +0,0 @@ -package pair - -type Pair struct { - Key int - Value int -} - -type PairList []Pair - -type Interface interface { - // Len is the number of elements in the collection. - Len() int - - // Less reports whether the element with index i - // must sort before the element with index j. - // - // If both Less(i, j) and Less(j, i) are false, - // then the elements at index i and j are considered equal. - // Sort may place equal elements in any order in the final result, - // while Stable preserves the original input order of equal elements. - // - // Less must describe a transitive ordering: - // - if both Less(i, j) and Less(j, k) are true, then Less(i, k) must be true as well. - // - if both Less(i, j) and Less(j, k) are false, then Less(i, k) must be false as well. - // - // Note that floating-point comparison (the < operator on float32 or float64 values) - // is not a transitive ordering when not-a-number (NaN) values are involved. - // See Float64Slice.Less for a correct implementation for floating-point values. - Less(i, j int) bool - - // Swap swaps the elements with indexes i and j. - Swap(i, j int) -} - -func (p PairList) Len() int { return len(p) } -func (p PairList) Less(i, j int) bool { return p[i].Value < p[j].Value } -func (p PairList) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/lib/routes/routes.go b/lib/routes/routes.go deleted file mode 100644 index e276ef18..00000000 --- a/lib/routes/routes.go +++ /dev/null @@ -1,318 +0,0 @@ -package routes - -import ( - "net/http" - - // "log" - - "be.ems/features/aaaa" - "be.ems/features/cdr" - "be.ems/features/cm" - "be.ems/features/dbrest" - "be.ems/features/event" - "be.ems/features/file" - "be.ems/features/fm" - "be.ems/features/lm" - "be.ems/features/mml" - "be.ems/features/pm" - "be.ems/features/security" - "be.ems/features/sm" - "be.ems/features/state" - "be.ems/features/ue" - "be.ems/lib/midware" - "be.ems/lib/services" - "be.ems/src/framework/middleware/collectlogs" - - "github.com/gorilla/mux" -) - -type Router struct { - Method string - Pattern string - Handler http.HandlerFunc - Middleware mux.MiddlewareFunc -} - -var routers []Router - -func init() { - Register("POST", security.UriOauthToken, security.LoginFromOMC, nil) - Register("POST", security.UriOauthHandshake, security.HandshakeFromOMC, nil) - Register("DELETE", security.UriOauthToken, security.LogoutFromOMC, nil) - - Register("POST", security.CustomUriOauthToken, security.LoginFromOMC, nil) - Register("DELETE", security.CustomUriOauthToken, security.LogoutFromOMC, nil) - Register("POST", security.CustomUriOauthHandshake, security.HandshakeFromOMC, nil) - - // System state - Register("GET", state.UriSysState, state.GetStateFromNF, nil) - Register("GET", state.UriSysState2, state.GetStateFromNF, nil) - Register("GET", state.UriSysInfoAll, state.GetAllSysinfoFromNF, nil) - Register("GET", state.UriSysInfoOne, state.GetOneSysinfoFromNF, nil) - Register("GET", state.UriLicenseInfoAll, state.GetAllLicenseInfoFromNF, nil) - Register("GET", state.UriLicenseInfoOne, state.GetOneLicenseInfoFromNF, nil) - - Register("GET", state.CustomUriSysState, state.GetStateFromNF, nil) - Register("GET", state.CustomUriSysState2, state.GetStateFromNF, nil) - Register("GET", state.CustomUriSysInfoAll, state.GetAllSysinfoFromNF, nil) - Register("GET", state.CustomUriSysInfoOne, state.GetOneSysinfoFromNF, nil) - Register("GET", state.CustomUriLicenseInfoAll, state.GetAllLicenseInfoFromNF, nil) - Register("GET", state.CustomUriLicenseInfoOne, state.GetOneLicenseInfoFromNF, nil) - - Register("GET", sm.UriOMCLocalTime, sm.GetOMCLocalTime, nil) - Register("GET", sm.CustomUriOMCLocalTime, sm.GetOMCLocalTime, nil) - - // database management - Register("GET", dbrest.XormGetDataUri, dbrest.DatabaseGetData, nil) - Register("GET", dbrest.XormSelectDataUri, dbrest.DatabaseGetData, nil) - Register("POST", dbrest.XormInsertDataUri, dbrest.DatabaseInsertData, nil) - Register("PUT", dbrest.XormUpdateDataUri, dbrest.DatabaseUpdateData, nil) - Register("DELETE", dbrest.XormDeleteDataUri, dbrest.DatabaseDeleteData, nil) - - Register("GET", dbrest.CustomXormGetDataUri, dbrest.DatabaseGetData, nil) - Register("GET", dbrest.CustomXormSelectDataUri, dbrest.DatabaseGetData, nil) - Register("POST", dbrest.CustomXormInsertDataUri, dbrest.DatabaseInsertData, nil) - Register("PUT", dbrest.CustomXormUpdateDataUri, dbrest.DatabaseUpdateData, nil) - Register("DELETE", dbrest.CustomXormDeleteDataUri, dbrest.DatabaseDeleteData, nil) - - Register("GET", dbrest.XormCommonUri, dbrest.DatabaseGetData, nil) - Register("POST", dbrest.XormCommonUri, dbrest.DatabaseInsertData, nil) - Register("PUT", dbrest.XormCommonUri, dbrest.DatabaseUpdateData, nil) - Register("DELETE", dbrest.XormCommonUri, dbrest.DatabaseDeleteData, nil) - - Register("GET", dbrest.XormDatabaseUri, dbrest.TaskDatabaseGetData, nil) - Register("POST", dbrest.XormDatabaseUri, dbrest.TaskDatabaseInsertData, nil) - Register("PUT", dbrest.XormDatabaseUri, dbrest.TaskDatabaseUpdateData, nil) - Register("DELETE", dbrest.XormDatabaseUri, dbrest.TaskDatabaseDeleteData, nil) - - Register("GET", dbrest.CustomXormCommonUri, dbrest.DatabaseGetData, nil) - Register("POST", dbrest.CustomXormCommonUri, dbrest.DatabaseInsertData, nil) - Register("PUT", dbrest.CustomXormCommonUri, dbrest.DatabaseUpdateData, nil) - Register("DELETE", dbrest.CustomXormCommonUri, dbrest.DatabaseDeleteData, nil) - - Register("GET", dbrest.XormDataRestUri, dbrest.ExtDatabaseGetData, nil) - Register("POST", dbrest.XormDataRestUri, dbrest.ExtDatabaseInsertData, nil) - Register("PUT", dbrest.XormDataRestUri, dbrest.ExtDatabaseUpdateData, nil) - Register("DELETE", dbrest.XormDataRestUri, dbrest.ExtDatabaseDeleteData, nil) - - Register("GET", dbrest.XormExtDataUri, dbrest.ExtDatabaseGetData, nil) - Register("POST", dbrest.XormExtDataUri, dbrest.ExtDatabaseInsertData, nil) - Register("PUT", dbrest.XormExtDataUri, dbrest.ExtDatabaseUpdateData, nil) - Register("DELETE", dbrest.XormExtDataUri, dbrest.ExtDatabaseDeleteData, nil) - - Register("GET", dbrest.CustomXormExtDataUri, dbrest.ExtDatabaseGetData, nil) - Register("POST", dbrest.CustomXormExtDataUri, dbrest.ExtDatabaseInsertData, nil) - Register("PUT", dbrest.CustomXormExtDataUri, dbrest.ExtDatabaseUpdateData, nil) - Register("DELETE", dbrest.CustomXormExtDataUri, dbrest.ExtDatabaseDeleteData, nil) - - // alarm restful Register - Register("POST", fm.UriAlarms, fm.PostAlarmFromNF, nil) - Register("Get", fm.UriAlarms, fm.GetAlarmFromNF, nil) - - Register("POST", fm.CustomUriAlarms, fm.PostAlarmFromNF, nil) - Register("Get", fm.CustomUriAlarms, fm.GetAlarmFromNF, nil) - - // performance restful Register - Register("POST", pm.PerformanceUri, pm.PostKPIReportFromNF, nil) - Register("POST", pm.MeasureTaskUri, pm.PostMeasureTaskToNF, midware.LogOperate(collectlogs.OptionNew("MeasureTask", collectlogs.BUSINESS_TYPE_INSERT))) - Register("PUT", pm.MeasureTaskUri, pm.PutMeasureTaskToNF, midware.LogOperate(collectlogs.OptionNew("MeasureTask", collectlogs.BUSINESS_TYPE_UPDATE))) - Register("DELETE", pm.MeasureTaskUri, pm.DeleteMeasureTaskToNF, midware.LogOperate(collectlogs.OptionNew("MeasureTask", collectlogs.BUSINESS_TYPE_DELETE))) - Register("PATCH", pm.MeasureTaskUri, pm.PatchMeasureTaskToNF, midware.LogOperate(collectlogs.OptionNew("MeasureTask", collectlogs.BUSINESS_TYPE_UPDATE))) - Register("POST", pm.MeasureReportUri, pm.PostMeasureReportFromNF, midware.LogOperate(collectlogs.OptionNew("MeasureTask", collectlogs.BUSINESS_TYPE_UPDATE))) - - Register("POST", pm.MeasurementUri, pm.PostMeasurementFromNF, nil) - Register("GET", pm.MeasurementUri, pm.GetMeasurementFromNF, nil) - - Register("POST", pm.CustomPerformanceUri, pm.PostKPIReportFromNF, nil) - Register("POST", pm.CustomMeasureTaskUri, pm.PostMeasureTaskToNF, nil) - Register("PUT", pm.CustomMeasureTaskUri, pm.PutMeasureTaskToNF, nil) - Register("DELETE", pm.CustomMeasureTaskUri, pm.DeleteMeasureTaskToNF, nil) - Register("PATCH", pm.CustomMeasureTaskUri, pm.PatchMeasureTaskToNF, nil) - Register("POST", pm.CustomMeasureReportUri, pm.PostMeasureReportFromNF, nil) - - Register("POST", pm.CustomMeasurementUri, pm.PostMeasurementFromNF, nil) - Register("GET", pm.CustomMeasurementUri, pm.GetMeasurementFromNF, nil) - - // parameter config management - Register("GET", cm.ParamConfigUri, cm.GetParamConfigFromNF, nil) - Register("POST", cm.ParamConfigUri, cm.PostParamConfigToNF, midware.LogOperate(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_INSERT))) - Register("PUT", cm.ParamConfigUri, cm.PutParamConfigToNF, midware.LogOperate(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_UPDATE))) - Register("DELETE", cm.ParamConfigUri, cm.DeleteParamConfigToNF, midware.LogOperate(collectlogs.OptionNew("log.operate.title.neConfig", collectlogs.BUSINESS_TYPE_INSERT))) - - Register("GET", cm.CustomParamConfigUri, cm.GetParamConfigFromNF, nil) - Register("POST", cm.CustomParamConfigUri, cm.PostParamConfigToNF, nil) - Register("PUT", cm.CustomParamConfigUri, cm.PutParamConfigToNF, nil) - Register("DELETE", cm.CustomParamConfigUri, cm.DeleteParamConfigToNF, nil) - - // Get/Create/Modify/Delete NE info - Register("GET", cm.UriNeInfo, cm.GetNeInfo, nil) - Register("POST", cm.UriNeInfo, cm.PostNeInfo, midware.LogOperate(collectlogs.OptionNew("NE Info", collectlogs.BUSINESS_TYPE_INSERT))) - Register("PUT", cm.UriNeInfo, cm.PutNeInfo, midware.LogOperate(collectlogs.OptionNew("NE Info", collectlogs.BUSINESS_TYPE_UPDATE))) - Register("DELETE", cm.UriNeInfo, cm.DeleteNeInfo, midware.LogOperate(collectlogs.OptionNew("NE Info", collectlogs.BUSINESS_TYPE_DELETE))) - - // Get/Create/Modify/Delete NE info - Register("GET", cm.CustomUriNeInfo, cm.GetNeInfo, nil) - Register("POST", cm.CustomUriNeInfo, cm.PostNeInfo, nil) - Register("PUT", cm.CustomUriNeInfo, cm.PutNeInfo, nil) - Register("DELETE", cm.CustomUriNeInfo, cm.DeleteNeInfo, nil) - - //ne service action handle - Register("POST", cm.UriNeService, cm.PostNeServiceAction, nil) - //ne service action handle - Register("POST", cm.UriNeInstance, cm.PostNeInstanceAction, nil) - // Post MML command to NF - Register("POST", mml.UriMML, mml.PostMMLToNF, midware.LogMML) - Register("POST", mml.UriMMLDiscard, mml.PostMMLToNF, nil) - Register("POST", mml.UriOmMmlExt, mml.PostMMLToOMC, midware.LogMML) - Register("POST", mml.CustomUriMML, mml.PostMMLToNF, nil) - Register("POST", mml.CustomUriOmMmlExt, mml.PostMMLToOMC, nil) - // post mml2 (standard upf port=5002) - Register("POST", mml.UriMML2, mml.PostMML2ToNF, midware.LogMML) - Register("POST", mml.CustomUriMML2, mml.PostMML2ToNF, nil) - - // Northbound Get NRM - // Register("GET", nbi.GetNRMUri, nbi.NBIGetNRMFromNF, nil) - - // Register("GET", nbi.CustomGetNRMUri, nbi.NBIGetNRMFromNF, nil) - - // Import/Export NF CM - Register("GET", cm.NeCmUri, cm.ExportCmFromNF, nil) - Register("POST", cm.NeCmUri, cm.ImportCmToNF, midware.LogOperate(collectlogs.OptionNew("Import NF", collectlogs.BUSINESS_TYPE_INSERT))) - - Register("GET", cm.UriNeCmFile, cm.DownloadNeBackupFile, nil) - Register("DELETE", cm.UriNeCmFile, cm.DeleteNeBackupFile, midware.LogOperate(collectlogs.OptionNew("Delete NF Backup", collectlogs.BUSINESS_TYPE_DELETE))) - - Register("GET", cm.CustomNeCmUri, cm.ExportCmFromNF, nil) - Register("POST", cm.CustomNeCmUri, cm.ImportCmToNF, nil) - - Register("GET", cm.CustomUriNeCmFile, cm.DownloadNeBackupFile, nil) - Register("DELETE", cm.CustomUriNeCmFile, cm.DeleteNeBackupFile, nil) - - // Software management - Register("GET", cm.UriSoftware, cm.DownloadSoftwareFile, nil) - //Register("POST", cm.UriSoftware, cm.UploadSoftwareFile, nil) - Register("POST", cm.UriSoftware, cm.UploadSoftwareMultiFile, midware.LogOperate(collectlogs.OptionNew("Software", collectlogs.BUSINESS_TYPE_UPDATE))) - Register("DELETE", cm.UriSoftware, cm.DeleteSoftwareFile, midware.LogOperate(collectlogs.OptionNew("Software", collectlogs.BUSINESS_TYPE_DELETE))) - - Register("POST", cm.UriSoftwareNE, cm.DistributeSoftwareToNF, midware.LogOperate(collectlogs.OptionNew("Software", collectlogs.BUSINESS_TYPE_OTHER))) - Register("PUT", cm.UriSoftwareNE, cm.ActiveSoftwareToNF, midware.LogOperate(collectlogs.OptionNew("Software", collectlogs.BUSINESS_TYPE_OTHER))) - Register("PATCH", cm.UriSoftwareNE, cm.RollBackSoftwareToNF, midware.LogOperate(collectlogs.OptionNew("Software", collectlogs.BUSINESS_TYPE_OTHER))) - - Register("GET", cm.CustomUriSoftware, cm.DownloadSoftwareFile, nil) - Register("POST", cm.CustomUriSoftware, cm.UploadSoftwareFile, nil) - Register("DELETE", cm.CustomUriSoftware, cm.DeleteSoftwareFile, nil) - - Register("POST", cm.CustomUriSoftwareNE, cm.DistributeSoftwareToNF, nil) - Register("PUT", cm.CustomUriSoftwareNE, cm.ActiveSoftwareToNF, nil) - Register("PATCH", cm.CustomUriSoftwareNE, cm.RollBackSoftwareToNF, nil) - - // file management - Register("POST", file.UriFile, file.UploadFile, midware.LogOperate(collectlogs.OptionNew("File", collectlogs.BUSINESS_TYPE_INSERT))) - Register("GET", file.UriFile, file.DownloadFile, midware.LogOperate(collectlogs.OptionNew("File", collectlogs.BUSINESS_TYPE_OTHER))) - Register("DELETE", file.UriFile, file.DeleteFile, midware.LogOperate(collectlogs.OptionNew("File", collectlogs.BUSINESS_TYPE_DELETE))) - - Register("POST", file.CustomUriFile, file.UploadFile, nil) - Register("GET", file.CustomUriFile, file.DownloadFile, nil) - Register("DELETE", file.CustomUriFile, file.DeleteFile, nil) - - // AAAA - Register("GET", aaaa.UriAAAASSO, aaaa.GetSSOFromAAAA, nil) - // AAAA - Register("GET", aaaa.CustomUriAAAASSO, aaaa.GetSSOFromAAAA, nil) - - // UEInfo: SMF - Register("GET", ue.UriUEInfo, ue.GetUEInfoFromNF, nil) - Register("GET", ue.CustomUriUEInfo, ue.GetUEInfoFromNF, nil) - - // UEInfo: PCF - Register("GET", ue.UriPCFUser, ue.GetUEInfoFromNF, nil) - Register("GET", ue.CustomUriPCFUser, ue.GetUEInfoFromNF, nil) - Register("POST", ue.UriPCFUser, ue.PostPCFUserInfo, nil) - Register("POST", ue.CustomUriPCFUser, ue.PostPCFUserInfo, nil) - Register("PUT", ue.UriPCFUser, ue.PutPCFUserInfo, nil) - Register("PUT", ue.CustomUriPCFUser, ue.PutPCFUserInfo, nil) - Register("DELETE", ue.UriPCFUser, ue.DeletePCFUserInfo, nil) - Register("DELETE", ue.CustomUriPCFUser, ue.DeletePCFUserInfo, nil) - - // PCFUEInfo: batch add/modify/delete - Register("POST", ue.UriPCFUserM, ue.PostPCFUserInfo, nil) - Register("POST", ue.CustomUriPCFUserM, ue.PostPCFUserInfo, nil) - Register("PUT", ue.UriPCFUserM, ue.PutPCFUserInfo, nil) - Register("PUT", ue.CustomUriPCFUserM, ue.PutPCFUserInfo, nil) - Register("DELETE", ue.UriPCFUserM, ue.DeletePCFUserInfo, nil) - Register("DELETE", ue.CustomUriPCFUserM, ue.DeletePCFUserInfo, nil) - //PCF User file - Register("GET", ue.UriPCFUserFileExport, ue.GetUEInfoFileExportNF, nil) - Register("PUT", ue.UriPCFUserFileImport, ue.PutPCFUserInfo, nil) - - // UE Number - Register("GET", ue.UriUENum, ue.GetUENumFromNF, nil) - Register("GET", ue.CustomUriUENum, ue.GetUENumFromNF, nil) - - // NBInfo - Register("GET", ue.UriNBInfo, ue.GetNBInfoFromNF, nil) - Register("GET", ue.CustomUriNBInfo, ue.GetNBInfoFromNF, nil) - Register("POST", ue.UriNBState, ue.PostNBInfoFromNF, nil) - Register("POST", ue.CustomUriNBState, ue.PostNBInfoFromNF, nil) - - // NSSF AvailableAMFs - Register("GET", ue.UriNSSFAvailableAMFs, ue.GetAvailableAMFsFromNSSF, nil) - Register("GET", ue.CustomUriNSSFAvailableAMFs, ue.GetAvailableAMFsFromNSSF, nil) - - // NSSF Subscriptions - Register("GET", ue.UriNSSFSubscriptions, ue.GetSubscriptionsFromNSSF, nil) - Register("GET", ue.CustomUriNSSFSubscriptions, ue.GetSubscriptionsFromNSSF, nil) - - // cdr event - Register("POST", cdr.UriCDREvent, cdr.PostCDREventFrom, nil) - Register("POST", cdr.CustomUriCDREvent, cdr.PostCDREventFrom, nil) - - // UE event 上报的UE事件 - Register("POST", event.UriUEEvent, event.PostUEEvent, nil) - // UE event AMF上报的UE事件, 无前缀给到Gin处理 - //Register("POST", event.UriUEEvent, event.PostUEEventFromAMF, nil) - - // 数据库连接情况 - Register("GET", dbrest.UriDbConnection, dbrest.DbConnection, nil) - Register("GET", dbrest.CustomUriDbConnection, dbrest.DbConnection, nil) - Register("POST", dbrest.UriDbStop, dbrest.DbStop, nil) - Register("POST", dbrest.CustomUriDbStop, dbrest.DbStop, nil) - - // 日志表备份 - Register("POST", lm.ExtBackupDataUri, lm.ExtDatabaseBackupData, nil) - Register("POST", lm.CustomExtBackupDataUri, lm.ExtDatabaseBackupData, nil) - -} - -// To resolv rest POST/PUT/DELETE/PATCH cross domain -func OptionsProc(w http.ResponseWriter, r *http.Request) { - services.ResponseStatusOK204NoContent(w) -} - -func NewRouter() *mux.Router { - r := mux.NewRouter() - - // set custom handle for status 404/405 - // r.NotFoundHandler = services.CustomResponseNotFound404Handler() - // r.MethodNotAllowedHandler = services.CustomResponseMethodNotAllowed405Handler() - - r.Use(midware.LoggerTrace) - // r.Use(midware.Cors) - // r.Use(midware.OptionProcess) - // r.Use(midware.ArrowIPAddr) - - for _, router := range routers { - rt := r.Methods(router.Method).Subrouter() - rt.HandleFunc(router.Pattern, router.Handler) - if router.Middleware != nil { - rt.Use(router.Middleware) - } - - } - - return r -} - -func Register(method, pattern string, handler http.HandlerFunc, middleware mux.MiddlewareFunc) { - routers = append(routers, Router{method, pattern, handler, middleware}) -} diff --git a/lib/run/exec_linux.go b/lib/run/exec_linux.go deleted file mode 100644 index e36f89ee..00000000 --- a/lib/run/exec_linux.go +++ /dev/null @@ -1,56 +0,0 @@ -//go:build linux -// +build linux - -package run - -import ( - "bytes" - "os/exec" - - "be.ems/lib/log" -) - -func ExecCmd(command, path string) ([]byte, error) { - log.Debug("Exec command:", command) - - cmd := exec.Command("/bin/bash", "-c", command) - cmd.Dir = path - out, err := cmd.CombinedOutput() - if err != nil { - return out, err - } - - return out, nil -} - -func ExecShell(command string) error { - in := bytes.NewBuffer(nil) - cmd := exec.Command("sh") - cmd.Stdin = in - in.WriteString(command) - in.WriteString("exit\n") - if err := cmd.Start(); err != nil { - return err - } - return nil -} - -func ExecOsCmd(command, os string) error { - log.Debugf("Exec %s command:%s", os, command) - - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - return nil -} diff --git a/lib/run/exec_wasm.go b/lib/run/exec_wasm.go deleted file mode 100644 index 9633073d..00000000 --- a/lib/run/exec_wasm.go +++ /dev/null @@ -1,45 +0,0 @@ -//go:build wasm -// +build wasm - -package run - -import ( - "os/exec" - - "be.ems/lib/log" -) - -func ExecCmd(command, path string) ([]byte, error) { - log.Debug("Exec command:", command) - - cmd := exec.Command("cmd", "/C", command) - cmd.Dir = path - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return out, err - } - - return out, nil -} - -func ExecOsCmd(command, os string) error { - log.Debugf("Exec %s command:%s", os, command) - - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - return nil -} diff --git a/lib/run/exec_windows.go b/lib/run/exec_windows.go deleted file mode 100644 index 1af2b979..00000000 --- a/lib/run/exec_windows.go +++ /dev/null @@ -1,45 +0,0 @@ -//go:build windows -// +build windows - -package run - -import ( - "os/exec" - - "be.ems/lib/log" -) - -func ExecCmd(command, path string) ([]byte, error) { - log.Debug("Exec command:", command) - - cmd := exec.Command("cmd", "/C", command) - cmd.Dir = path - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return out, err - } - - return out, nil -} - -func ExecOsCmd(command, os string) error { - log.Debugf("Exec %s command:%s", os, command) - - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - return nil -} diff --git a/lib/services/file.go b/lib/services/file.go deleted file mode 100644 index 4243cda6..00000000 --- a/lib/services/file.go +++ /dev/null @@ -1,426 +0,0 @@ -package services - -import ( - "bufio" - "bytes" - "fmt" - "io" - "mime/multipart" - "net/http" - "os" - "strconv" - "strings" - - "be.ems/lib/log" -) - -const ( - RootPath = "uploads/" - ChunkRootPath = "uploads_tmp/" -) - -var ( - // FilesMax 限制上传文件的大小为7 MB - FilesMax int64 = 32 << 20 - // ValuesMax 限制POST字段内容的大小 - ValuesMax int64 = 512 -) - -func GetPostFile(w http.ResponseWriter, r *http.Request) { - //获取文件流,第三个返回值是错误对象 - file, header, _ := r.FormFile("file") - //读取文件流为[]byte - b, err := io.ReadAll(file) - if err != nil { - log.Error("Failed to ReadAll:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - //把文件保存到指定位置 - err = os.WriteFile("./upload/test.zip", b, 0644) - if err != nil { - log.Error("Failed to WriteFile:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - //输出上传时文件名 - log.Debug("filename:", header.Filename) -} - -func GetUploadFile(w http.ResponseWriter, r *http.Request) { - log.Debug("GetUploadFile processing...") - - file, err := os.Create("./test.zip") - if err != nil { - log.Error("Failed to Create:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - _, err = io.Copy(file, r.Body) - if err != nil { - log.Error("Failed to Copy:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } -} - -func GetUploadFormFile(w http.ResponseWriter, r *http.Request) { - // 设置最大的内存限制为32MB - r.ParseMultipartForm(32 << 20) - file, handler, err := r.FormFile("file") - if err != nil { - log.Error("Failed to FormFile:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - defer file.Close() - log.Debug("Header:%v", handler.Header) - f, err := os.OpenFile("./"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) - if err != nil { - log.Error("Failed to OpenFile:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - defer f.Close() - _, err = io.Copy(f, file) - if err != nil { - log.Error("Failed to Copy:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("File uploaded successfully:", handler.Filename) -} - -func HandleUploadFile(r *http.Request, path, newFileName string) (string, error) { - var filePath, fileName string - reader, err := r.MultipartReader() - if err != nil { - log.Error("Failed to MultipartReader:", err) - return "", err - } - - for { - part, err := reader.NextPart() - if err == io.EOF { - break - } else if err != nil { - log.Error("Failed to NextPart:", err) - return "", err - } - - log.Debugf("FileName=[%s], FormName=[%s]", part.FileName(), part.FormName()) - if part.FileName() == "" { // this is FormData - data, _ := io.ReadAll(part) - log.Debugf("FormData=[%s]", string(data)) - } else { // This is FileData - - if newFileName != "" { - fileName = newFileName - } else { - fileName = part.FileName() - } - - err := os.MkdirAll(path, os.ModePerm) - if err != nil { - log.Error("Failed to Mkdir:", err) - return "", err - } - - filePath = path + "/" + fileName - - file, err := os.Create(filePath) - if err != nil { - log.Error("Failed to Create:", err) - return "", err - } - defer file.Close() - _, err = io.Copy(file, part) - if err != nil { - log.Error("Failed to Copy:", err) - return "", err - } - } - } - return fileName, nil -} - -type UploadMultiFileData struct { - SoftwareFileName string `json:"softwareFileName"` - CmsFileName string `json:"cmsFileName"` - Datas map[string][]string `json:"datas"` -} - -func HandleUploadMultiFile(r *http.Request, path, newFileName string) (*UploadMultiFileData, error) { - fileData := new(UploadMultiFileData) - // 解析multipart/form-data请求 - err := r.ParseMultipartForm(100 << 20) // 100MB - if err != nil { - return fileData, err - } - - // 获取文件和数据 - softwareFile := r.MultipartForm.File["file"] - cmsFile := r.MultipartForm.File["cms"] - fileData.Datas = r.MultipartForm.Value - - // 处理文件 - if len(softwareFile) > 0 { - file := softwareFile[0] - // 打开文件 - f, err := file.Open() - if err != nil { - return fileData, err - } - defer f.Close() - - // 创建本地文件 - dst, err := os.Create(path + "/" + file.Filename) - if err != nil { - return fileData, err - } - defer dst.Close() - - fileData.SoftwareFileName = file.Filename - // 将文件内容拷贝到本地文件 - _, err = io.Copy(dst, f) - if err != nil { - return fileData, err - } - } - // 处理文件 - if len(cmsFile) > 0 { - file := cmsFile[0] - // 打开文件 - f, err := file.Open() - if err != nil { - return fileData, err - } - defer f.Close() - - // 创建本地文件 - dst, err := os.Create(path + "/" + file.Filename) - if err != nil { - return fileData, err - } - defer dst.Close() - - fileData.CmsFileName = file.Filename - // 将文件内容拷贝到本地文件 - _, err = io.Copy(dst, f) - if err != nil { - return fileData, err - } - } - - return fileData, nil -} - -func HandleUploadFormFile(w http.ResponseWriter, r *http.Request) { - r.ParseMultipartForm(32 << 20) - //mForm := r.MultipartForm - - for k := range r.MultipartForm.File { - // k is the key of file part - file, fileHeader, err := r.FormFile(k) - if err != nil { - fmt.Println("inovke FormFile error:", err) - return - } - defer file.Close() - fmt.Printf("the uploaded file: name[%s], size[%d], header[%#v]\n", - fileHeader.Filename, fileHeader.Size, fileHeader.Header) - - // store uploaded file into local path - localFileName := "./upload/" + fileHeader.Filename - out, err := os.Create(localFileName) - if err != nil { - fmt.Printf("failed to open the file %s for writing", localFileName) - return - } - defer out.Close() - _, err = io.Copy(out, file) - if err != nil { - fmt.Printf("copy file err:%s\n", err) - return - } - fmt.Printf("file %s uploaded ok\n", fileHeader.Filename) - } -} - -func PostFileHandler(w http.ResponseWriter, r *http.Request) { - fmt.Println("PostFileHandler processing... ") - if !strings.Contains(r.Header.Get("Content-Type"), "multipart/form-data") { - // 不支持的 Content-Type 类型 - fmt.Println("Invalid Content-Type: ", r.Header.Get("Content-Type")) - http.Error(w, " Unsupported Content-Type Types", http.StatusBadRequest) - return - } - - // 整个请求的主体大小设置为7.5Mb - r.Body = http.MaxBytesReader(w, r.Body, FilesMax+ValuesMax) - reader, err := r.MultipartReader() - if err != nil { - fmt.Println(err) - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - for { - // A Part represents a single part in a multipart body. - part, err := reader.NextPart() - if err != nil { - if err == io.EOF { - - break - } - - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - fileName := part.FileName() - formName := part.FormName() - var buf = &bytes.Buffer{} - // 非文件字段部分大小限制验证(非文件字段,go中filename会是空) - if fileName == "" { - // "请求主体中非文件字段" + formName + "超出大小限制" - var limitError = fmt.Sprintf("Non-file field %s in request body exceeds size limit", formName) - err = uploadSizeLimit(buf, part, ValuesMax, limitError) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - continue - } - - // 文件字段部分大小限制验证 - // "请求主体中文件字段" + fileName + "超出大小限制" - var limitError = fmt.Sprintf("File field %s in request body exceeds size limit", fileName) - err = uploadSizeLimit(buf, part, FilesMax, limitError) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // 文件创建部分 - if err := uploadFileHandle(r.Header, fileName, buf); err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // 非逻辑内容,仅为测试使用 - var chunkNumber = r.Header.Get("chunk-number") - if chunkNumber == "" { - // "文件"+fileName+"上传成功" - http.Error(w, fmt.Sprintf("File %s uploaded successfully", fileName), http.StatusOK) - } else { - // "分片文件 %s %s 上传成功" - http.Error(w, fmt.Sprintf("Sliced file %s %s uploaded successfully.", fileName, chunkNumber), http.StatusOK) - } - } -} - -// 上传内容大小限制 -func uploadSizeLimit(buf *bytes.Buffer, part *multipart.Part, maxLimit int64, limitError string) error { - n, err := io.CopyN(buf, part, maxLimit+1) - if err != nil && err != io.EOF { - fmt.Println("PostFileHandler:", err) - return err - } - maxLimit -= n - if maxLimit < 0 { - return fmt.Errorf("%s", limitError) - } - return nil -} - -// uploadFileHandle handle upload file -func uploadFileHandle(header http.Header, fileName string, buf *bytes.Buffer) error { - var chunkNumberStr = header.Get("chunk-number") - // 1.普通文件上传处理 - if chunkNumberStr == "" { - //创建文件并写入文件内容 - return createFile(RootPath+fileName, buf.Bytes()) - } - // 2.分片文件上传处理 - //2.1读取分片编号 - chunkNumber, err := strconv.Atoi(chunkNumberStr) - if err != nil { - return err - } - //2.2创建分片文件并写入分片内容 - if err := createFile(fmt.Sprintf(ChunkRootPath+fileName+"%d.chunk", chunkNumber), buf.Bytes()); err != nil { - return err - } - //2.3确认是否上传完毕 - if header.Get("chunk-final") == "true" { - //2.4合并文件 - if err := mergeChunkFiles(fileName); err != nil { - return err - } - //2.5删除分片 - for i := 0; ; i++ { - chunFileName := fmt.Sprintf(ChunkRootPath+fileName+"%d.chunk", i) - err := os.Remove(chunFileName) - if err != nil { - if os.IsNotExist(err) { - break - } - return err - } - } - } - return nil -} - -// 创建文件并写入内容 -func createFile(fileName string, res []byte) error { - newFile, err := os.Create(fileName) - if err != nil { - return err - } - defer func() { - _ = newFile.Close() - }() - bufferedWriter := bufio.NewWriter(newFile) - _, err = bufferedWriter.Write(res) - if err != nil && err != io.EOF { - return err - } - return bufferedWriter.Flush() -} - -// 合并分片文件 -func mergeChunkFiles(fileName string) error { - var ( - n int64 - err error - ) - finalFile, err := os.Create(RootPath + fileName) - if err != nil { - return err - } - defer finalFile.Close() - // 将分片内容写入最终文件 - for i := 0; ; i++ { - chunFile, err := os.Open(fmt.Sprintf(ChunkRootPath+fileName+"%d.chunk", i)) - if err != nil { - if os.IsNotExist(err) { - break - } - return err - } - n, err = io.Copy(finalFile, chunFile) - if err != nil { - return err - } - err = chunFile.Close() - if err != nil { - return err - } - if n < 1 { - break - } - } - return nil -} diff --git a/lib/services/response.go b/lib/services/response.go deleted file mode 100644 index 2bdacf1a..00000000 --- a/lib/services/response.go +++ /dev/null @@ -1,39 +0,0 @@ -package services - -import "be.ems/src/framework/resp" - -const ( - CODE_FAIL = resp.CODE_ERROR - CODE_SUCC = resp.CODE_SUCCESS -) - -func ErrResp(msg string) map[string]any { - return map[string]any{"code": CODE_FAIL, "msg": msg} -} - -func DataResp(data any) map[string]any { - return map[string]any{"code": CODE_SUCC, "data": data} -} - -func SuccMessageResp() map[string]any { - return map[string]any{"code": CODE_SUCC, "msg": "success"} -} - -func TotalResp(total int64) map[string]any { - return map[string]any{"code": CODE_SUCC, "total": total} -} - -func TotalDataResp(data any, total any) map[string]any { - return map[string]any{"code": CODE_SUCC, "data": map[string]any{ - "rows": data, "total": total, - }, "msg": "success"} -} - -func SuccResp(va map[string]any) map[string]any { - resp := make(map[string]any) - resp["code"] = CODE_SUCC - for k, v := range va { - resp[k] = v - } - return resp -} diff --git a/lib/services/services.go b/lib/services/services.go deleted file mode 100644 index 22b128ce..00000000 --- a/lib/services/services.go +++ /dev/null @@ -1,983 +0,0 @@ -package services - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "mime/multipart" - "os" - "path/filepath" - - // "log" - "net/http" - "net/url" - "strconv" - "strings" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/oauth" - "github.com/gorilla/mux" -) - -type NameValue struct { - Name string - Value string -} - -type NameOid struct { - Name string - Oid string -} - -type DataResponse struct { - Data interface{} `json:"data"` -} - -type MapResponse map[string]any - -type NullResponse struct { - nil interface{} -} - -type ErrorResponse struct { - Error interface{} `json:"error"` -} - -type ErrorMessage struct { - ErrorCode string `json:"errorCode"` - ErrorInfo string `json:"errorInfo"` -} - -type SucceedOAuthResponse struct { - AccessToken string `json:"accessToken"` - Expires string `json:"expires"` - // Enum: "0": 不需要修改密码, "1": "FirstLogin",首次登录, "2": PasswordAboutToExpire, 密码即将过期 - ChangePasswordFlag int `json:"changePasswordFlag"` - GroupName string `json:"groupName"` - Roles []string `json:"roles"` - Perms []string `json:"perms"` -} - -type ServiceResponse struct { -} - -func GetUriParamString(r *http.Request, paramName string, sep string, brackets bool, apostr bool) string { - vars := r.URL.Query() - s, ok := vars[paramName] - if !ok { - log.Infof("Parameter Name is not exist, %s", paramName) - return "" - } - if apostr { - for i := 0; i < len(s); i++ { - s[i] = "'" + s[i] + "'" - } - } - pn := strings.Join(s, sep) - if brackets { - pn = fmt.Sprintf("(%s)", pn) - } - - return pn -} - -func GetUriWhereString(r *http.Request) string { - return GetUriParamString(r, "WHERE", " and ", false, false) -} - -func GetUriLocString(r *http.Request) string { - return GetUriParamString(r, "loc", " and ", false, false) -} - -func GetUriPageLimitString(r *http.Request) string { - vars := r.URL.Query() - p, ok := vars["PAGE"] - if !ok { - log.Info("page param is not exist") - return "" - } - - l, ok := vars["LIMIT"] - if !ok { - log.Info("limit param is not exist") - return "" - } - li, _ := strconv.Atoi(l[0]) - pi, _ := strconv.Atoi(p[0]) - ls := fmt.Sprintf("limit %d, %d", li*(pi-1), li) - - log.Debug("Limit array:", ls) - return ls -} - -func ExtGetUriPageLimitString(r *http.Request) string { - vars := r.URL.Query() - p, ok := vars["page"] - if !ok { - log.Info("page param is not exist") - p = append(p, "1") - } - - l, ok := vars["limit"] - if !ok { - log.Info("limit param is not exist") - l = append(l, strconv.Itoa(global.MaxLimitData)) - } - limit, _ := strconv.Atoi(l[0]) - if limit > global.MaxLimitData { - limit = global.MaxLimitData - } - page, _ := strconv.Atoi(p[0]) - limitStr := fmt.Sprintf("limit %d, %d", limit*(page-1), limit) - - log.Debug("limitStr:", limitStr) - return limitStr -} - -func IsJsonContentType(r *http.Request) bool { - hType := r.Header.Get("Content-Type") - return strings.Contains(hType, "application/json") -} - -func IsValidOAuthUri(r *http.Request) bool { - vars := mux.Vars(r) - apiVer := vars["apiVersion"] // 获取Uri - return apiVer == "v1" -} - -func IsVallidContentType(r *http.Request, checkFlag bool) bool { - log.Debug("IsVallidContentType processing ...") - /* - ctype := r.Header["Content-Type"] - log.Debug("ctype:", ctype) - if len(ctype) != 0 && !strings.Contains(ctype[0], "application/json") { - return false - } - */ - if strings.Contains(r.Header.Get("Content-Type"), "application/json") || !checkFlag { - return true - } - return false -} - -func CheckParameterName(r *http.Request) []string { - var errorParams []string - vars := r.URL.Query() - for k, v := range vars { - log.Debug("vars:", k, v) - if k != "rmUIDs" && k != "fields" { - errorParams = append(errorParams, k) - } - } - - return errorParams -} - -func GetRmUIDArr(r *http.Request) []string { - vars := r.URL.Query() - rmUIDs, ok := vars["rmUIDs"] - if !ok { - log.Info("rmUIDs is not exist") - return nil - } - - var rmUIDValues []string - for _, r := range rmUIDs { - if r != "" { - rmUIDValues = global.MergeStringArr(rmUIDValues, strings.Split(r, `,`)) - } - } - - return rmUIDValues -} - -func GetAttrNameArr(r *http.Request) []string { - vars := r.URL.Query() - fields, ok := vars["fields"] - if !ok { - log.Info("attributeNames does not exist") - return nil - } - var attrNames []string - for _, a := range fields { - if a != "" { - attrNames = global.MergeStringArr(attrNames, strings.Split(a, `,`)) - } - } - - return attrNames -} - -func CheckValidRmUID(rmUIDs []string) []string { - log.Debug("CheckValidRmUID processing... ") - - var invalidRmUIDs []string - for _, r := range rmUIDs { - if !global.MatchRmUID(config.GetRmUIDRegexpFromConfig(), r) { - invalidRmUIDs = append(invalidRmUIDs, r) - } - } - - return invalidRmUIDs -} - -func CheckLocalRmUID(rmUIDs []string) string { - log.Debug("GetLocalRmUID processing... ") - - rmUID := config.GetRmUIDFromConfig() - for _, r := range rmUIDs { - if r == rmUID { - return rmUID - } - } - - return "" -} - -func GetParamsArrByName(paramName string, r *http.Request) []string { - vars := r.URL.Query() - pns, ok := vars[paramName] - if !ok { - log.Infof("%s is not exist", paramName) - return nil - } - - var pnArr []string - for _, pn := range pns { - if pn != "" { - pnArr = global.MergeStringArr(pnArr, strings.Split(pn, `,`)) - } - } - - return pnArr -} - -func GetOperationTypeFromHttpRequest(r *http.Request) string { - for k, v := range r.Header { - log.Tracef("k:%s, v:%s", k, v) - if strings.ToLower(k) == "operationtype" && len(v) != 0 { - log.Trace("OperationType:", v[0]) - return v[0] - } - } - - return "" -} - -func CheckNorthboundValidRequest(w http.ResponseWriter, r *http.Request) (string, error) { - log.Debug("CheckNorthboundValidRequest processing... ") - - var token string = "" - var err error - var ret bool - // response 414-4 uri too long ? (optional) - // todo ... ? - if bytes.Count([]byte(r.RequestURI), nil) > config.GetUriMaxLenFromConfig() { - log.Error("Request Uri too long:", bytes.Count([]byte(r.RequestURI), nil), config.GetUriMaxLenFromConfig()) - ResponseRequestURITooLong414UriTooLong(w) - return token, err - } - - // check media type(content type) only support "application/json" - // response 415-1 - if !IsJsonContentType(r) { - log.Error("invalid Content-Type") - ResponseUnsupportedMediaType415(w) - return token, err - } - - // error processing ... - // 401-1 response - token, ret = oauth.IsCarriedToken(r) - if !ret { - log.Error("accessToken is not carried") - ResponseUnauthorized401AccessTokenNotCarried(w) - return token, err - } - - // 401-2 response - if !dborm.XormExistValidToken(token, config.GetExpiresFromConfig()) { - log.Error("accessToken fails or does not exist") - ResponseUnauthorized401AccessTokenNotExist(w) - return token, err - } - - if operType := GetOperationTypeFromHttpRequest(r); operType != "auto" { - _, err = dborm.XormUpdateSessionShakeTime(token) - if err != nil { - log.Error("Failed to update session table:", err) - ResponseUnauthorized401AccessTokenNotExist(w) - return token, err - } - } - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri is invalid") - ResponseNotFound404UriNotExist(w, r) - return token, err - } - - // response 406-1 - rmUIDValues := GetRmUIDArr(r) - if rmUIDValues == nil { - log.Error("missing parameter: rmUIDs") - ResponseNotAcceptable406MissingParam(w) - return token, err - } - - // response 406-2 - errorParams := CheckParameterName(r) - if errorParams != nil { - log.Error("parameter name error: ", errorParams) - ResponseNotAcceptable406ParamError(w, errorParams) - return token, err - } - - // response 400-5 - if len(rmUIDValues) == 0 { - log.Error("rmUIDs is wrong or NULL") - ResponseBadRequest400WrongParamValue(w) - return token, err - } - - // response 414-1 - if len(rmUIDValues) > config.GetYamlConfig().Params.RmUIDMaxNum { - log.Error("rmUID greater than", config.GetYamlConfig().Params.RmUIDMaxNum) - ResponseRequestURITooLong414NRMNumExceed(w, config.GetYamlConfig().Params.RmUIDMaxNum) - return token, err - } - - return token, nil -} - -func CheckCommonValidRequest(w http.ResponseWriter, r *http.Request) (string, error) { - log.Debug("CheckCommonValidRequest processing... ") - - var token string = "" - var err error - var ret bool - // response 414-4 uri too long ? (optional) - // todo ... ? - if bytes.Count([]byte(r.RequestURI), nil) > config.GetUriMaxLenFromConfig() { - log.Error("Request Uri too long:", bytes.Count([]byte(r.RequestURI), nil), config.GetUriMaxLenFromConfig()) - ResponseRequestURITooLong414UriTooLong(w) - return token, err - } - - // check media type(content type) only support "application/json" - // response 415-1 - if !IsJsonContentType(r) { - log.Error("Invalid Content-Type") - ResponseUnsupportedMediaType415(w) - return token, err - } - - // error processing ... - // 401-1 response - token, ret = oauth.IsCarriedToken(r) - if !ret { - log.Error("accessToken is not carried") - ResponseUnauthorized401AccessTokenNotCarried(w) - return token, err - } - - // 401-2 response - if !dborm.XormExistValidToken(token, config.GetExpiresFromConfig()) { - log.Error("accessToken fails or does not exist") - ResponseUnauthorized401AccessTokenNotExist(w) - return token, err - } - - if operType := GetOperationTypeFromHttpRequest(r); operType != "auto" { - _, err = dborm.XormUpdateSessionShakeTime(token) - if err != nil { - log.Error("Failed to update session table:", err) - ResponseUnauthorized401AccessTokenNotExist(w) - return token, err - } - } - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri is invalid") - ResponseNotFound404UriNotExist(w, r) - return token, err - } - - return token, nil -} - -func CheckUserPermission(token, method, module, dbname, tbname, pack string) (bool, error) { - if config.GetYamlConfig().OMC.RBACMode { - if module == "" { - module = "*" - } - if dbname == "" { - dbname = "*" - } - if tbname == "" { - tbname = "*" - } - exist, err := dborm.IsPermissionAllowed(token, method, module, dbname, tbname, pack) - if err != nil { - return false, err - } - if !exist { - return false, nil - } - } - - return true, nil -} - -func IsLocalhost(host string) bool { - if strings.Contains(host, "127.0.0.1") || strings.Contains(host, "::1") { - return true - } - return false -} - -func CheckFrontValidRequest(w http.ResponseWriter, r *http.Request) (string, error) { - log.Debug("CheckFrontValidRequest processing... ") - - var token string = "" - // var err error - // var ret bool - // // response 414-4 uri too long ? (optional) - // // todo ... ? - // if bytes.Count([]byte(r.RequestURI), nil) > config.GetUriMaxLenFromConfig() { - // err = errors.New("request Uri too long") - // log.Errorf("Request Uri too long: bytes=%d, MaxLen=%d", bytes.Count([]byte(r.RequestURI), nil), config.GetUriMaxLenFromConfig()) - // ResponseRequestURITooLong414UriTooLong(w) - // return token, err - // } - - // /* - // // check media type(content type) only support "application/json" - // // response 415-1 - // if !IsVallidContentType(r) { - // err := errors.New("Invalid Content-Type") - // log.Error(err) - // ResponseUnsupportedMediaType415(w) - // return err - // } - // */ - - // // error processing ... - // // 401-1 response - // if config.GetYamlConfig().Auth.Token && !IsLocalhost(r.RemoteAddr) { - // token, ret = oauth.IsCarriedToken(r) - // if !ret { - // err = errors.New("accessToken is not carried") - // log.Error(err) - // ResponseUnauthorized401AccessTokenNotCarried(w) - // return token, err - // } - - // // 401-2 response - // if !dborm.XormExistValidToken(token, config.GetExpiresFromConfig()) { - // err = errors.New("accessToken fails or does not exist") - // log.Error(err) - // ResponseUnauthorized401AccessTokenNotExist(w) - // return token, err - // } - - // if operType := GetOperationTypeFromHttpRequest(r); operType != "auto" { - // _, err = dborm.XormUpdateSessionShakeTime(token) - // if err != nil { - // log.Error("Failed to update session table:", err) - // ResponseUnauthorized401AccessTokenNotExist(w) - // return token, err - // } - // } - - // } - - // vars := mux.Vars(r) - // apiVer := vars["apiVersion"] - // if apiVer != global.ApiVersionV1 { - // err = errors.New("uri is invalid") - // log.Error(err) - // ResponseNotFound404UriNotExist(w, r) - // return token, err - // } - - return token, nil -} - -func CheckExtValidRequest(w http.ResponseWriter, r *http.Request) (string, error) { - log.Debug("CheckExtValidRequest processing... ") - - var token string = "" - var err error - var ret bool - // error processing ... - // 401-1 response - if config.GetYamlConfig().Auth.Token { - token, ret = oauth.IsCarriedToken(r) - if !ret { - err = errors.New("accessToken is not carried") - log.Error(err) - ResponseUnauthorized401AccessTokenNotCarried(w) - return token, err - } - - // 401-2 response - if !dborm.XormExistValidToken(token, config.GetExpiresFromConfig()) { - err = errors.New("accessToken fails or does not exist") - log.Error(err) - ResponseUnauthorized401AccessTokenNotExist(w) - return token, err - } - - if operType := GetOperationTypeFromHttpRequest(r); operType != "auto" { - _, err = dborm.XormUpdateSessionShakeTime(token) - if err != nil { - log.Error("Failed to update session table:", err) - ResponseUnauthorized401AccessTokenNotExist(w) - return token, err - } - } - } - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - err = errors.New("uri is invalid") - log.Error(err) - ResponseNotFound404UriNotExist(w, r) - return token, err - } - - return token, nil -} - -func ResponseStatusOK200Login(w http.ResponseWriter, token string) { - var oAuthResponse SucceedOAuthResponse - oAuthResponse.AccessToken = token - oAuthResponse.Expires = strconv.Itoa((int)(config.GetExpiresFromConfig())) - ResponseWithJson(w, http.StatusOK, oAuthResponse) -} - -func ResponseStatusOK200Null(w http.ResponseWriter) { - response := NullResponse{""} - ResponseWithJson(w, http.StatusOK, response) -} - -func ResponseStatusOK204NoContent(w http.ResponseWriter) { - ResponseWithJson(w, http.StatusNoContent, "") -} - -func ResponseStatusOK201Accepted(w http.ResponseWriter) { - ResponseWithJson(w, http.StatusAccepted, "") -} - -type SSORedirect struct { - User string `json:"user"` - Token string `json:"token"` -} - -func ResponseRedirect(w http.ResponseWriter, redirectUrl, user, token string) { - w.Header().Set("Cache-Control", "must-revalidate, no-store") - w.Header().Set("Content-Type", " text/html;charset=UTF-8") - w.Header().Set("Location", redirectUrl) //跳转地址设置 - //w.WriteHeader(http.StatusTemporaryRedirect) //重定向! - ssoRedirect := &SSORedirect{user, token} - ResponseWithJson(w, http.StatusTemporaryRedirect, *ssoRedirect) -} - -func ResponseBadRequest400RmUIDsIsInvalid(w http.ResponseWriter, rmUIDs []string) { - errorMessage := ErrorMessage{"1", "rmUIDs is invalid:" + strings.Join(rmUIDs, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusBadRequest, errorResponse) -} - -func ResponseBadRequest400DuplicateSubId(w http.ResponseWriter, SubIds string) { - errorMessage := ErrorMessage{"2", "Duplicate with resource subscription id:" + SubIds} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusBadRequest, errorResponse) -} - -func ResponseBadRequest400DuplicateAlarmId(w http.ResponseWriter, AlarmIds string) { - errorMessage := ErrorMessage{"3", "Duplicate with alarm subscription id: " + AlarmIds} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusBadRequest, errorResponse) -} - -func ResponseBadRequest400IncorrectLogin(w http.ResponseWriter) { - errorMessage := ErrorMessage{"4", "incorrect username and password"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusBadRequest, errorResponse) -} - -func ResponseBadRequest400WrongParamValue(w http.ResponseWriter) { - errorMessage := ErrorMessage{"5", "wrong parameter value"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusBadRequest, errorResponse) -} - -func ResponseBadRequest400CMCALoginError(w http.ResponseWriter) { - errorMessage := ErrorMessage{"6", "CMCA centralized authentication login error"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusBadRequest, errorResponse) -} - -func ResponseBadRequest400InvalidJson(w http.ResponseWriter) { - errorMessage := ErrorMessage{"7", "invalid json format"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusUnauthorized, errorResponse) -} - -func ResponseUnauthorized401AccessTokenNotCarried(w http.ResponseWriter) { - errorMessage := ErrorMessage{"1", "accessToken is not carried"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusUnauthorized, errorResponse) -} - -func ResponseUnauthorized401AccessTokenNotExist(w http.ResponseWriter) { - errorMessage := ErrorMessage{"2", "accessToken fails or does not exist"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusUnauthorized, errorResponse) -} - -func ResponseForbidden403NotPermission(w http.ResponseWriter) { - errorMessage := ErrorMessage{"1", "do not have the operation permissions"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusForbidden, errorResponse) -} - -func ResponseForbidden403MultiLoginNotAllowed(w http.ResponseWriter) { - errorMessage := ErrorMessage{"2", "multiple logins are not allowed"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusForbidden, errorResponse) -} - -func ResponseNotFound404UriNotExist(w http.ResponseWriter, r *http.Request) { - if r.Method == "OPTIONS" { - ResponseStatusOK204NoContent(w) - return - } - errorMessage := ErrorMessage{"1", "the requested URI does not exist"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func ResponseNotFound404UriNotExistExt(w http.ResponseWriter) { - errorMessage := ErrorMessage{"1", "the requested URI does not exist"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func CustomResponseNotFound404Handler() http.Handler { - return http.HandlerFunc(ResponseNotFound404UriNotExist) -} - -func ResponseNotFound404NRMNotExist(w http.ResponseWriter, rmUIDs []string) { - errorMessage := ErrorMessage{"2", "rmUIDs does not exist: " + strings.Join(rmUIDs, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func ResponseNotFound404PMNotExist(w http.ResponseWriter, rmUIDs []string) { - errorMessage := ErrorMessage{"3", "rmUIDs does not exist: " + strings.Join(rmUIDs, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func ResponseNotFound404AlarmNotExist(w http.ResponseWriter, AlarmIds []string) { - errorMessage := ErrorMessage{"4", "alarmIds does not exist: " + strings.Join(AlarmIds, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func ResponseNotFound404GetSubscriptionNotExist(w http.ResponseWriter, SubIds []string) { - errorMessage := ErrorMessage{"5", "subscription id does not exist: " + strings.Join(SubIds, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func ResponseNotFound404DeleteSubscriptionNotExist(w http.ResponseWriter, SubIds []string) { - errorMessage := ErrorMessage{"6", "subscription id does not exist: " + strings.Join(SubIds, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func ResponseNotFound404GetAlarmSubscriptionNotExist(w http.ResponseWriter, SubIds []string) { - errorMessage := ErrorMessage{"7", "subscription id does not exist: " + strings.Join(SubIds, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func ResponseNotFound404DeleteAlarmSubscriptionNotExist(w http.ResponseWriter, SubIds []string) { - errorMessage := ErrorMessage{"8", "subscription id does not exist: " + strings.Join(SubIds, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotFound, errorResponse) -} - -func ResponseMethodNotAllowed405(w http.ResponseWriter, r *http.Request) { - if r.Method == "OPTIONS" { - ResponseStatusOK204NoContent(w) - return - } - errorMessage := ErrorMessage{"1", "method not allowed"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusMethodNotAllowed, errorResponse) -} - -func CustomResponseMethodNotAllowed405Handler() http.Handler { - return http.HandlerFunc(ResponseMethodNotAllowed405) -} - -func ResponseNotAcceptable406MissingParam(w http.ResponseWriter) { - errorMessage := ErrorMessage{"1", "missing parameter: rmUIDs"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotAcceptable, errorResponse) -} - -func ResponseNotAcceptable406ParamError(w http.ResponseWriter, errorParamsName []string) { - errorMessage := ErrorMessage{"2", "parameter name error: " + strings.Join(errorParamsName, ",")} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotAcceptable, errorResponse) -} - -func ResponseNotAcceptable406QuerySQLError(w http.ResponseWriter) { - errorMessage := ErrorMessage{"3", "wrong or non-query SQL statement"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusNotAcceptable, errorResponse) -} - -func ResponseRequestEntityTooLarge413SubscriptionExceed(w http.ResponseWriter, num int) { - errorMessage := ErrorMessage{"1", "the number of subscriptions greater than " + strconv.Itoa(num)} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusRequestEntityTooLarge, errorResponse) -} - -func ResponseRequestEntityTooLarge413BodyToLarge(w http.ResponseWriter) { - errorMessage := ErrorMessage{"2", "the request entity too large"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusRequestEntityTooLarge, errorResponse) -} - -func ResponseRequestURITooLong414NRMNumExceed(w http.ResponseWriter, num int) { - errorMessage := ErrorMessage{"1", "the number of NRM rmUIDs greater than " + strconv.Itoa(num)} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusRequestURITooLong, errorResponse) -} - -func ResponseRequestURITooLong414AlarmNumExceed(w http.ResponseWriter, num int) { - errorMessage := ErrorMessage{"2", "the number of alarmIds greater than " + strconv.Itoa(num)} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusRequestURITooLong, errorResponse) -} - -func ResponseRequestURITooLong414PMNumExceed(w http.ResponseWriter, num int) { - errorMessage := ErrorMessage{"3", "the number of PM rmUIDs greater than " + strconv.Itoa(num)} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusRequestURITooLong, errorResponse) -} - -func ResponseRequestURITooLong414UriTooLong(w http.ResponseWriter) { - errorMessage := ErrorMessage{"3", "request URI too long"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusRequestURITooLong, errorResponse) -} - -func ResponseUnsupportedMediaType415(w http.ResponseWriter) { - errorMessage := ErrorMessage{"1", "unsupported media type"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusUnsupportedMediaType, errorResponse) -} - -func ResponseInternalServerError500NFConnectRefused(w http.ResponseWriter) { - errorMessage := ErrorMessage{"1", "internal server error, NF connnect refused"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusInternalServerError, errorResponse) -} - -func ResponseInternalServerError500DatabaseOperationFailed(w http.ResponseWriter) { - errorMessage := ErrorMessage{"2", "internal server error, database opration failed"} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusInternalServerError, errorResponse) -} - -func ResponseInternalServerError500ProcessError(w http.ResponseWriter, err error) { - em := fmt.Sprintf("internal server error: %v", err) - errorMessage := ErrorMessage{"3", em} - errorResponse := ErrorResponse{errorMessage} - ResponseWithJson(w, http.StatusInternalServerError, errorResponse) -} - -func ResponseWithJson(w http.ResponseWriter, code int, payload interface{}) { - log.Trace("payload: ", payload) - - response, _ := json.Marshal(payload) - SetResponseHeader(w) - w.WriteHeader(code) - w.Write(response) - log.Trace("Response Code:", code) - log.Trace("Response Body:", string(response)) -} - -func ResponseWithZip(w http.ResponseWriter, payload interface{}) { - response, _ := json.Marshal(payload) - SetResponseHeader(w) - w.WriteHeader(http.StatusOK) - w.Write(response) - log.Trace("Response Body:", string(response)) -} - -func TransportResponse(w http.ResponseWriter, code int, payload []byte) { - var tempBody, transBody interface{} - switch code { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - json.Unmarshal(payload, &tempBody) - transBody = DataResponse{tempBody} - default: - json.Unmarshal(payload, &tempBody) - transBody = ErrorResponse{tempBody} - } - response, _ := json.Marshal(transBody) - log.Trace("transBody: ", transBody) - SetResponseHeader(w) - w.WriteHeader(code) - w.Write(response) - log.Trace("response: ", string(response)) -} - -func ResponseWithUnsortJson(w http.ResponseWriter, code int, payload map[string]interface{}) { - var om global.OrderedMap - om.Map = payload - response, _ := om.MarshalJson() - log.Trace("payload: ", payload) - SetResponseHeader(w) - w.WriteHeader(code) - w.Write(response) - log.Trace("response: ", string(response)) -} - -func ResponseErrorWithJson(w http.ResponseWriter, code int, nameValue interface{}) { - response := make(map[string]interface{}) - response["error"] = nameValue - ResponseWithJson(w, code, response) -} - -func SetCommonResponseHeader(w http.ResponseWriter) { - // 设置Vary头部 - w.Header().Set("Vary", "Origin") - w.Header().Set("Keep-Alive", "timeout=5") - // To solve cross domain issue - w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Access-Control-Allow-Methods", "*") - w.Header().Set("Access-Control-Allow-Headers", "*") - w.Header().Set("Access-Control-Allow-Credentials", "true") - // 响应最大时间值 - w.Header().Set("Access-Control-Max-Age", "31536000") -} - -func SetResponseHeader(w http.ResponseWriter) { - w.Header().Set("Content-Type", "application/json;charset=UTF-8") - SetCommonResponseHeader(w) -} - -// Creates a new file upload http request with optional extra params -func ResponseUploadFile(w http.ResponseWriter, code int, params map[string]string, paramName, path string) { - file, err := os.Open(path) - if err != nil { - log.Errorf("Failed to open: %v", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - defer file.Close() - - body := &bytes.Buffer{} - writer := multipart.NewWriter(body) - part, err := writer.CreateFormFile(paramName, filepath.Base(path)) - if err != nil { - log.Error("Failed to CreateFormFile:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - _, err = io.Copy(part, file) - if err != nil { - log.Error("Failed to Copy:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - - for key, val := range params { - _ = writer.WriteField(key, val) - } - - err = writer.Close() - if err != nil { - log.Error("Failed to Close:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - - SetCommonResponseHeader(w) - w.Header().Set("Content-Type", writer.FormDataContentType()) - w.WriteHeader(code) - w.Write(body.Bytes()) -} - -func ResponseFile(w http.ResponseWriter, code int, filePath string) { - fileBytes, err := os.ReadFile(filePath) - if err != nil { - log.Error("Failed to ReadFile:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - SetCommonResponseHeader(w) - w.Header().Set("Content-Type", "application/octet-stream") - w.WriteHeader(code) - w.Write(fileBytes) -} - -func ResponseFileWithNameAndMD5(w http.ResponseWriter, code int, fileName, path, md5Sum string) { - filePath := path + "/" + fileName - fileBytes, err := os.ReadFile(filePath) - if err != nil { - log.Error("Failed to ReadFile:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - SetCommonResponseHeader(w) - encodedFileName := url.PathEscape(fileName) - w.Header().Set("Content-Disposition", `attachment; filename="`+encodedFileName+`"`) - w.Header().Set("Content-Type", "application/octet-stream") - w.Header().Set("User-File", fileName) - w.Header().Set("MD5-Sum", md5Sum) - w.WriteHeader(code) - w.Write(fileBytes) -} - -func ResponseHtmlContent(w http.ResponseWriter, code int, filePath string) { - htmlContent, err := os.ReadFile(filePath) - if err != nil { - log.Error("Failed to ReadFile:", err) - ResponseInternalServerError500ProcessError(w, err) - return - } - - SetCommonResponseHeader(w) - w.Header().Set("Content-Type", "text/html") - w.WriteHeader(code) - w.Write(htmlContent) -} - -// RouterItem 路由项 -type RouterItem struct { - Method string - Pattern string - Handler http.HandlerFunc - Middleware mux.MiddlewareFunc -} diff --git a/lib/session/session.go b/lib/session/session.go deleted file mode 100644 index 0e3156e0..00000000 --- a/lib/session/session.go +++ /dev/null @@ -1,168 +0,0 @@ -package session - -import ( - "crypto/rand" - "encoding/base64" - "fmt" - "io" - "net/http" - "strconv" - "strings" - "sync" - "time" - - "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/oauth" -) - -// SessionMgr session manager -type SessManager struct { - name string - expires int64 - lock sync.RWMutex - sessions map[string]*Session -} - -// Session -type Session struct { - token string - time time.Time - permission []bool - values map[interface{}]interface{} -} - -// NewSessionMgr create session manager -func NewSessManager(name string) *SessManager { - smgr := &SessManager{name: name, expires: (int64)(config.GetExpiresFromConfig()), sessions: make(map[string]*Session)} - go smgr.SessionGC() - return smgr -} - -// NewSession create session -func (smgr *SessManager) NewSession(w http.ResponseWriter, r *http.Request, plist []bool) string { - smgr.lock.Lock() - defer smgr.lock.Unlock() - token := oauth.GenRandToken("omc") // Generate new token to session ID - session := &Session{token: token, time: time.Now(), permission: plist, values: make(map[interface{}]interface{})} - smgr.sessions[token] = session - - return token -} - -// EndSession -func (smgr *SessManager) EndSession(w http.ResponseWriter, r *http.Request) { - token := smgr.GetTokenFromHttpRequest(r) - - smgr.lock.Lock() - defer smgr.lock.Unlock() - delete(smgr.sessions, token) -} - -// Handshake session, restart session -func (smgr *SessManager) ShakeSession(token string) bool { - - smgr.lock.Lock() - defer smgr.lock.Unlock() - for _, s := range smgr.sessions { - if token == s.token { - log.Debug("session time:", s.time) - s.time = time.Now() - return true - } - } - return false -} - -// EndSessionByID end the session by session ID -func (smgr *SessManager) DeleteSession(token string) { - smgr.lock.Lock() - defer smgr.lock.Unlock() - delete(smgr.sessions, token) -} - -// SetSessionValue set value fo session -func (smgr *SessManager) SetSessionValue(token string, key interface{}, value interface{}) error { - smgr.lock.Lock() - defer smgr.lock.Unlock() - if session, ok := smgr.sessions[token]; ok { - session.values[key] = value - return nil - } - return fmt.Errorf("invalid session ID") -} - -// GetSessionValue get value fo session -func (smgr *SessManager) GetSessionValue(token string, key interface{}) (interface{}, error) { - smgr.lock.RLock() - defer smgr.lock.RUnlock() - if session, ok := smgr.sessions[token]; ok { - if val, ok := session.values[key]; ok { - return val, nil - } - } - return nil, fmt.Errorf("invalid session ID") -} - -func (smgr *SessManager) GetTokenFromHttpRequest(r *http.Request) string { - for k, v := range r.Header { - if strings.ToLower(k) == "accesstoken" && len(v) != 0 { - log.Debug("AccessToken:", v[0]) - return v[0] - } - } - return "" -} - -// IsValidToken check token is valid or not -func (smgr *SessManager) IsValidToken(token string) bool { - - smgr.lock.Lock() - defer smgr.lock.Unlock() - if _, ok := smgr.sessions[token]; ok { - return true - } - return false -} - -// IsCarriedToken check token is carried -func (smgr *SessManager) IsCarriedToken(r *http.Request) (string, bool) { - - token := smgr.GetTokenFromHttpRequest(r) - if token == "" { - return "", false - } - return token, true -} - -// GetPermissionFromSession get permission from session by token -func (smgr *SessManager) GetPermissionFromSession(token string) []bool { - - if s, ok := smgr.sessions[token]; ok { - return s.permission - } - return nil -} - -// SessionGC maintain session -func (smgr *SessManager) SessionGC() { - smgr.lock.Lock() - defer smgr.lock.Unlock() - for token, session := range smgr.sessions { - if session.time.Unix()+smgr.expires < time.Now().Unix() { - delete(smgr.sessions, token) - } - } - - time.AfterFunc(time.Duration(smgr.expires)*time.Second, func() { smgr.SessionGC() }) -} - -// NewSessionID generate unique ID -func (smgr *SessManager) NewSessionID() string { - b := make([]byte, 32) - if _, err := io.ReadFull(rand.Reader, b); err != nil { - nano := time.Now().UnixNano() - return strconv.FormatInt(nano, 10) - } - return base64.URLEncoding.EncodeToString(b) -} diff --git a/local/omc.yaml b/local/omc.yaml index 48d091ad..41140574 100644 --- a/local/omc.yaml +++ b/local/omc.yaml @@ -7,32 +7,28 @@ serverVersion: "std" # interface encryption, default false # serverCryptoApi: false +# route service configuration # service listen ipv4/v6 and port, support multiple routines -# ip: 0.0.0.0 or ::0, support IPv4/v6 -server: - - ipv4: "0.0.0.0" - ipv6: "" - port: 33040 # http listen port - schema: http - - ipv4: "0.0.0.0" - ipv6: "" - port: 33443 # https listen port - schema: https - certFile: ./local/certs/www.omc.net.crt - keyFile: ./local/certs/www.omc.net.key +routeServer: + - addr: "0.0.0.0:33040" # route http port + schema: "http" + - addr: "0.0.0.0:33443" # route https port + schema: "https" + certFile: "./local/certs/www.omc.net.crt" + keyFile: "./local/certs/www.omc.net.key" # web service configuration # if you are using nginx to take over, you can disable the webServer: enabled: false # web server enabled, default false - rootDir: ./local/web + rootDir: /usr/local/etc/omc/web listen: - - addr: "0.0.0.0:80" - schema: http - - addr: "0.0.0.0:443" - schema: https - certFile: ./local/certs/www.omc.net.crt - keyFile: ./local/certs/www.omc.net.key + - addr: "0.0.0.0:80" # web http port + schema: "http" + - addr: "0.0.0.0:443" # web https port + schema: "https" + certFile: "./local/certs/www.omc.net.crt" + keyFile: "./local/certs/www.omc.net.key" # track configuration for NE signaling trace # host fill in the specific IP address @@ -41,46 +37,44 @@ trace: host: "192.168.5.58" # trace host, default 127.0.0.1 port: 33033 # trace port, default 33033 -# data sources +# data source database: dataSource: - # Default database instance + # std: standard std: type: "mysql" - host: "192.168.9.58" - port: 13306 - username: "root" - password: "1000omc@kp!" - database: "omc_db_lite" + host: "192.168.9.58" # mysql host + port: 13306 # mysql port + username: "root" # mysql username + password: "1000omc@kp!" # mysql password + database: "omc_db_lite" # mysql database logging: true - # SQLite database instance + # lite: lite lite: type: "sqlite" - database: "./local/omc_db.sqlite" + database: "./local/omc_db.sqlite" # sqlite database logging: true - # used to specify the default data source for multiple data resourece + # default data source name defaultDataSourceName: "std" # redis cached data redis: dataSource: default: - port: 16379 # port - host: "192.168.9.58" # host - password: "helloearth" - db: 10 # db_num + port: 16379 # redis port + host: "192.168.9.58" # redis host + password: "helloearth" # redis password + db: 10 # Redis db_num # default data source name defaultDataSourceName: "default" -# file: log file name -# level: /trace/debug/info/warn/error/fatal, default: debug -# duration: rotation time with xx hours, example: 1/12/24 hours -# count: rotation count of log, default is 30 rotation +# log logger: - file: "C:/var/log/omc_restagent.log" - level: warn - duration: 24 - count: 90 + fileDir: "/var/log" # Log File Dir + fileName: "omc.log" # Log File Name + level: 0 # Log Level of 0:silent<1:info<2:warn<3:error + maxDay: 7 # Log retention Days + maxSize: 10 # Log File cutting by size # prometheus metrics metrics: true @@ -98,125 +92,22 @@ staticFile: prefix: "/upload" dir: "C:/usr/local/omc/upload" -# sleep: time delay for after write buffer (millisecond) -# deadLine: timeout for io read and write (second) -mml: - sleep: 200 - deadLine: 10 - sizeRow: 600 - sizeCol: 128 - bufferSize: 65535 - mmlHome: ./mmlhome - -# NE config -ne: - user: omcuser - etcdir: /usr/local/etc - bindir: /usr/local/bin - omcdir: /usr/local/omc - scpdir: /tmp - licensedir: /usr/local/etc/{neType}/license - # backup etc list of IMS, does not contain spaces - etcListIMS: "{*.yaml,mmtel,vars.cfg}" - etcListDefault: "{*.yaml,*.conf,*.cfg}" - # true/false to overwrite config file when dpkg ne software - dpkgOverwrite: false - # dpkg timeout (second) - dpkgTimeout: 180 - -# chk2ne: true/false, if put OmcNeConfig parameters to NE -omc: - uriPrefix: "/omc/rest" - neType: OMC - neId: 001 - rmUID: 4400HX101 - neName: OMC - province: "" - vendor: "" - dn: "" - chk2ne: false - capability: 50 - sn: "12345678" - expiryDate: "2099-12-31" - checksign: false - rootDir: /usr/local/omc - binDir: /usr/local/omc/bin - backup: /usr/local/omc/backup - upload: /usr/local/omc/upload - frontUpload: /usr/local/omc/htdocs/front/upload - frontTraceDir: /usr/local/omc/htdocs/front/trace - software: /usr/local/omc/software - license: /usr/local/omc/license - gtpUri: gtp:192.168.2.119:32152 - checkContentType: false - testMode: false - rbacMode: true - runDir: /usr/local/omc/run - cmdTimeout: 120 - -# Alarm module setting -# Forward interface: -# TLS Skip verify: true/false -# email/sms -# smProxy: sms(Short Message Service)/smsc(SMS Centre) -# dataCoding: 0:GSM7BIT, 1:ASCII, 2:BINARY8BIT1, 3:LATIN1, -# 4:BINARY8BIT2, 6:CYRILLIC, 7:HEBREW, 8:UCS2 -alarm: - alarmEmailForward: - enable: false - emailList: "" - title: "Alarm from OMC" - smtp: mail.smtp.com - port: 25 - user: smtpext@smtp.com - password: "1000smtp@omc!" - tlsSkipVerify: true - alarmSMSForward: - enable: false - mobileList: "" - smscAddr: "192.168.13.114:2775" - systemID: "omc" - password: "omc123" - systemType: "UTRAN" - dataCoding: 0 - serviceNumber: "OMC" - sms: - apiURL: http://smsc.xxx.com/ - accessKeyID: xxxx - accessKeySecret: xxxx - signName: xxx SMSC - templateCode: 1000 - smProxy: smsc - -# User authorized information -# crypt: mysql/md5/bcrypt -# token: true/false to check accessToken -# expires for session, unit: second -# Support single/multiple session of user -# -auth: - crypt: bcrypt - token: true - expires: 1800 - session: multiple - publicKey: /usr/local/omc/etc/certs/omc - privateKey: /usr/local/omc/etc/certs/omc - -# Parameter for limit number -# rmuid_maxnum: the max number of rmUID, default: 50 -# alarmid_maxnum: the max number of AlarmID, default: 50 -# pmid_maxnum: the max number of pmID, default: 50 -# subid_maxnum: the max number of subscription ID, default: 20 -# uri_maxlen: the max length of uri, default: 8192 -# rmuid_regexp: regexp pattern of rmUID -params: - rmuidmaxnum: 50 - alarmidmaxnum: 50 - pmidmaxnum: 50 - subidmaxnum: 20 - urimaxlen: 2100000 - rmuidregexp: "[0-9]{4}[A-Z]{2}[A-Z]{2}[0-9A-Z]{1}[0-9A-Z]{3}[0-9A-Z]{1,16}" - -testConfig: - enabled: false - file: /usr/local/omc/etc/testconfig.yaml +# notification only alarm use +notification: + email: + enable: false # email enable + list: "" # toEmail,email,email + title: "Alarm from OMC" # email title + smtp: "mail.smtp.com" # email smtp + port: 25 # email port + user: "smtpext@smtp.com" # email user + password: "1000smtp@omc!" # email password + smsc: + enable: false # smsc enable + list: "" # toMobile,mobile,mobile + addr: "192.168.13.114:2775" # smsc addr + systemid: "omc" # smsc system id + systemtype: "UTRAN" # smsc system type + password: "omc123" # smsc password + coding: 0 # smsc codingMap 0:GSM7BIT, 1:ASCII, 2:BINARY8BIT1, 3:LATIN1, 4:BINARY8BIT2, 6:CYRILLIC, 7:HEBREW, 8:UCS2 + servicenumber: "OMC" # smsc service number diff --git a/local/param/cbc_param_config.yaml b/local/param/cbc_param_config.yaml index 4da1094c..3f201230 100644 --- a/local/param/cbc_param_config.yaml +++ b/local/param/cbc_param_config.yaml @@ -10,13 +10,6 @@ cbc: filter: "0~64" display: "CBC Name" comment: "" - - name: "instance" - type: "string" - value: "CBC-001" - access: "read-write" - filter: "0~64" - display: "NF Instance" - comment: "" - name: "sbiIp" type: "string" value: "127.0.0.1" @@ -37,7 +30,14 @@ cbc: access: "read-write" filter: '{"0":"http","1":"https"}' display: "SBI Scheme" - comment: "http or https" + comment: "" + - name: "sbiTimeout" + type: "int" + value: "3" + access: "read-write" + filter: "0~65535" + display: "SBI Timeout" + comment: "0~65535" amfProfile: display: "AMF Profile" @@ -50,6 +50,13 @@ cbc: filter: "0~15" display: "Index" comment: "0~15" + - name: "enabled" + type: "bool" + value: "1" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "Enable AMF" + comment: "apply the current AMF NF Profile" - name: "name" type: "string" value: "AMF" @@ -63,21 +70,43 @@ cbc: access: "read-write" filter: "0~64" display: "AMF URI" - comment: "" - - name: "plmnId" + comment: "format: http://: e.g: http://192.168.1.1:9090" + - name: "taiList" type: "regex" - value: "00101" + value: "" access: "read-write" - filter: "^[0-9]{5,6}$" - display: "PLMN ID" - comment: "" - - name: "tac" - type: "string" - value: "1" - access: "read-write" - filter: "0~8" - display: "TAC" - comment: "0~16777215" + filter: "" + display: "Tai List" + comment: "allow TaiList null or add more tai value" + array: + - name: "index" + type: "int" + value: "1" + access: "read-only" + filter: "1~32" + display: "Index" + comment: "1~32" + - name: "mcc" + type: "regex" + value: "460" + access: "read-write" + filter: '^\d{3,3}$' + display: "MCC" + comment: "" + - name: "mnc" + type: "regex" + value: "00" + access: "read-write" + filter: '^\d{2,3}$' + display: "MNC" + comment: "" + - name: "tac" + type: "regex" + value: "4388" + access: "read-write" + filter: '^(\d+(;\d+)*)?$' + display: "TAC" + comment: "(A).format is decimal string,e.g:43888 (B).Allow set multiple tac value by ; split, e:4388;4360 " mmeProfile: display: "MME Profile" @@ -90,6 +119,13 @@ cbc: filter: "0~15" display: "Index" comment: "0~15" + - name: "enabled" + type: "bool" + value: "1" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "Enable MME" + comment: "apply the current MME NF Profile" - name: "name" type: "string" value: "MME" @@ -103,18 +139,40 @@ cbc: access: "read-write" filter: "0~64" display: "MME URI" - comment: "" - - name: "plmnId" + comment: "format: sctp://: e.g: sctp://192.168.1.1:9090" + - name: "taiList" type: "regex" - value: "00101" + value: "" access: "read-write" - filter: "^[0-9]{5,6}$" - display: "PLMN ID" - comment: "" - - name: "tac" - type: "string" - value: "1" - access: "read-write" - filter: "0~8" - display: "TAC" - comment: "0~16777215" + filter: "" + display: "Tai List" + comment: "allow TaiList null or add more tai value" + array: + - name: "index" + type: "int" + value: "1" + access: "read-only" + filter: "1~32" + display: "Index" + comment: "1~32" + - name: "mcc" + type: "regex" + value: "460" + access: "read-write" + filter: '^\d{3,3}$' + display: "MCC" + comment: "" + - name: "mnc" + type: "regex" + value: "00" + access: "read-write" + filter: '^\d{2,3}$' + display: "MNC" + comment: "" + - name: "tac" + type: "regex" + value: "4388" + access: "read-write" + filter: '^(\d+(;\d+)*)?$' + display: "TAC" + comment: "(A).format is decimal string,e.g:43888 (B).Allow set multiple tac value by ; split, e:4388;4360 " diff --git a/local/param/omc_param_config.yaml b/local/param/omc_param_config.yaml index cce7a7ae..90fd952f 100644 --- a/local/param/omc_param_config.yaml +++ b/local/param/omc_param_config.yaml @@ -14,17 +14,17 @@ omc: type: "ipv4" value: "172.16.5.100" access: "read-write" - filter: '0~128' + filter: "0~128" display: "Host" comment: "NE signaling trace host address" - name: "port" type: "int" value: "33033" access: "read-write" - filter: '3000~65530' + filter: "3000~65530" display: "Port" comment: "NE signaling trace port" - alarmEmailForward: + notificationEmail: display: "Alarm Email Forward Interface" sort: 3 list: @@ -32,9 +32,16 @@ omc: type: "bool" value: "true" access: "rw" - filter: "true;false" + filter: '{"0":"false","1":"true"}' display: "Enable" comment: "Is it enabled forward alarm with Email interface" + - name: "list" + type: "string" + value: "" + access: "rw" + filter: "" + display: "Email List" + comment: "" - name: "title" type: "string" value: "" @@ -42,13 +49,6 @@ omc: filter: "" display: "Email Title" comment: "string, no variable support" - - name: "emailList" - type: "string" - value: "" - access: "rw" - filter: "" - display: "Email List" - comment: "" - name: "smtp" type: "string" value: "" @@ -77,14 +77,7 @@ omc: filter: "" display: "Password" comment: "" - - name: "tlsSkipVerify" - type: "bool" - value: "true" - access: "rw" - filter: "true;false" - display: "TLS Skip Verify" - comment: "If skip TLS verify (true/false)" - alarmSMSForward: + notificationSMSC: display: "Alarm SMS Forward Interface" sort: 4 list: @@ -95,27 +88,34 @@ omc: filter: "true;false" display: "Enable" comment: "Is it enabled forward alarm with SMS interface" - - name: "mobileList" + - name: "list" type: "string" value: "" access: "rw" filter: "" display: "Mobile List" comment: "Multiple mobile separated by commas" - - name: "smscAddr" + - name: "addr" type: "string" value: "" access: "rw" filter: "" display: "SMSC Address" comment: "The SMSC SMPP Address" - - name: "systemID" + - name: "systemid" type: "string" value: "" access: "rw" filter: "" display: "System ID" comment: "" + - name: "systemtype" + type: "string" + value: "" + access: "rw" + filter: "" + display: "System Type" + comment: "" - name: "password" type: "string" value: "" @@ -123,21 +123,14 @@ omc: filter: "" display: "Password" comment: "" - - name: "systemType" - type: "string" - value: "" - access: "rw" - filter: "" - display: "System Type" - comment: "" - - name: "dataCoding" + - name: "coding" type: "enum" value: "GSM7BIT" access: "rw" filter: '{"0":"GSM7BIT","1":"ASCII","2":"BINARY8BIT1","3":"LATIN1","4":"BINARY8BIT2","6":"CYRILLIC","7":"HEBREW","8":"UCS2"}' display: "Data Coding" comment: "Short message coding type" - - name: "serviceNumber" + - name: "servicenumber" type: "string" value: "OMC" access: "rw" diff --git a/local/param/udm_param_config.yaml b/local/param/udm_param_config.yaml index fba3cf9c..838f0677 100644 --- a/local/param/udm_param_config.yaml +++ b/local/param/udm_param_config.yaml @@ -256,7 +256,7 @@ udm: comment: "" - name: "name" type: "string" - value: "def_ambr" + value: "lab_sar" access: "read-write" filter: "^.{1,32}$" display: "Name" diff --git a/main.go b/main.go index f1c03e66..9f070bf7 100644 --- a/main.go +++ b/main.go @@ -15,16 +15,9 @@ import ( swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "be.ems/features" - "be.ems/features/event" - "be.ems/features/mml" - featuresCfg "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/routes" "be.ems/src" "be.ems/src/framework/config" "be.ems/src/framework/logger" - "be.ems/src/framework/middleware" "be.ems/src/framework/utils/machine" "be.ems/src/framework/utils/parse" _ "be.ems/swagger_docs" @@ -159,9 +152,7 @@ func main() { src.ModulesRoute(app) - loadFeatures(app) - - loadServer(app) + loadServerRoute(app) loadServerWeb() @@ -170,33 +161,6 @@ func main() { wg.Wait() } -// loadFeatures mux路由模块 -func loadFeatures(app *gin.Engine) { - conf := featuresCfg.GetYamlConfig() - - log.InitLogger(conf.Logger.File, conf.Logger.Duration, conf.Logger.Count, "omc:restagent", featuresCfg.GetLogLevel()) - // fmt.Printf("OMC Version: %s\n", config.Version) - // log.Infof("========================= OMC Startup =========================") - // log.Infof("OMC Version: %s %s %s", config.Version, config.BuildTime, config.GoVer) - - mml.InitMML() - - // 将 mux.Router 注册到 gin.Engine - - // 默认路由组 - defaultUriGroup := app.Group(featuresCfg.DefaultUriPrefix) - defaultUriGroup.Use(middleware.AuthorizeUser(nil)) - defaultUriGroup.Any("/*any", gin.WrapH(routes.NewRouter())) - // 可配置前缀路由组 - uriGroup := app.Group(featuresCfg.UriPrefix) - uriGroup.Any("/*any", gin.WrapH(routes.NewRouter())) - // AMF上报的UE事件, 无前缀,暂时特殊处理 - app.POST(event.UriUEEventAMF, event.PostUEEventFromAMF) - - // register feature service gin.Engine - features.InitServiceEngine(app) -} - // loadGlobalPre 全局预加载 func loadGlobalPre(app *gin.Engine) { // Swagger 接口文档 @@ -231,30 +195,24 @@ func loadGlobalPre(app *gin.Engine) { } } -// loadServer 多个HTTP服务启动 -func loadServer(app *gin.Engine) { - httpArr := config.Get("server") - if httpArr == nil { - logger.Errorf("server config not found") +// loadServerRoute 多个HTTP服务启动-API服务 +func loadServerRoute(app *gin.Engine) { + routeArr := config.Get("routeServer") + if routeArr == nil { + logger.Errorf("routeServer config not found") return } - for _, v := range httpArr.([]any) { + for _, v := range routeArr.([]any) { item := v.(map[string]any) - port := parse.Number(item["port"]) - ipv4 := fmt.Sprint(item["ipv4"]) - ipv6 := fmt.Sprint(item["ipv6"]) + addr := fmt.Sprint(item["addr"]) + if addr == "" || addr == "" { + continue + } schema := fmt.Sprint(item["schema"]) if schema == "https" && schema != "" { certFile := fmt.Sprint(item["certfile"]) keyFile := fmt.Sprint(item["keyfile"]) - addr := "" - if ipv4 != "" && ipv4 != "" { - addr = fmt.Sprintf("%s:%d", ipv4, port) - } - if ipv6 != "" && ipv6 != "" { - addr = fmt.Sprintf("[%s]:%d", ipv6, port) - } - if addr == "" { + if certFile == "" || certFile == "" || keyFile == "" || keyFile == "" { continue } // 启动HTTPS服务 @@ -270,16 +228,6 @@ func loadServer(app *gin.Engine) { } }(addr, certFile, keyFile) } else { - addr := "" - if ipv4 != "" && ipv4 != "" { - addr = fmt.Sprintf("%s:%d", ipv4, port) - } - if ipv6 != "" && ipv6 != "" { - addr = fmt.Sprintf("[%s]:%d", ipv6, port) - } - if addr == "" { - continue - } // 启动HTTP服务 wg.Add(1) go func(addr string) { @@ -298,62 +246,69 @@ func loadServer(app *gin.Engine) { // loadServerWeb 多个HTTP服务启动-前端静态资源 func loadServerWeb() { - webEnabled := config.Get("webServer.enabled") - if webEnabled == nil { - logger.Errorf("webServer config not found") + webEnabled := parse.Boolean(config.Get("webServer.enabled")) + if !webEnabled { + logger.Warnf("webServer config not found") return } - if webEnabled.(bool) { - rootDir := config.Get("webServer.rootDir").(string) - if rootDir != "" { - var web *gin.Engine - gin.SetMode(gin.ReleaseMode) - web = gin.New() - web.Use(gin.Recovery()) - gin.DisableConsoleColor() - web.StaticFS("/", http.Dir(rootDir)) - // 多个HTTP服务启动 - listenArr := config.Get("webServer.listen") - for _, v := range listenArr.([]any) { - listen := v.(map[string]any) - addr := fmt.Sprint(listen["addr"]) - schema := fmt.Sprint(listen["schema"]) - if schema == "https" && schema != "" { - certFile := fmt.Sprint(listen["certfile"]) - keyFile := fmt.Sprint(listen["keyfile"]) - if addr == "" || addr == "" { - continue - } - // 启动HTTPS服务 - wg.Add(1) - go func(addr string, certFile string, keyFile string) { - defer wg.Done() - for i := range maxRetries { - if err := web.RunTLS(addr, certFile, keyFile); err != nil { - logger.Errorf("webServer run tls err:%v", err) - time.Sleep(retryInterval) // 重试间隔时间 - logger.Warnf("trying to restart HTTPS server on %s (Attempt %d)", addr, i) - } - } - }(addr, certFile, keyFile) - } else { - if addr == "" || addr == "" { - continue - } - // 启动HTTP服务 - wg.Add(1) - go func(addr string) { - defer wg.Done() - for i := range maxRetries { - if err := web.Run(addr); err != nil { - logger.Errorf("webServer run err:%v", err) - time.Sleep(retryInterval) // 重试间隔时间 - logger.Warnf("trying to restart HTTP server on %s (Attempt %d)", addr, i) - } - } - }(addr) - } + rootDir := fmt.Sprint(config.Get("webServer.rootDir")) + if rootDir == "" || rootDir == "" { + logger.Warnf("webServer rootDir config not found") + return + } + + var web *gin.Engine = gin.New() + gin.SetMode(gin.ReleaseMode) + gin.DisableConsoleColor() + web.Use(gin.Recovery()) + web.StaticFS("/", http.Dir(rootDir)) + // 多个HTTP服务启动 + listenArr := config.Get("webServer.listen") + if listenArr == nil { + logger.Errorf("webServer listen config not found") + return + } + for _, v := range listenArr.([]any) { + listen := v.(map[string]any) + addr := fmt.Sprint(listen["addr"]) + if addr == "" || addr == "" { + continue + } + schema := fmt.Sprint(listen["schema"]) + if schema == "https" && schema != "" { + certFile := fmt.Sprint(listen["certfile"]) + keyFile := fmt.Sprint(listen["keyfile"]) + if certFile == "" || certFile == "" || keyFile == "" || keyFile == "" { + continue } + // 启动HTTPS服务 + wg.Add(1) + go func(addr string, certFile string, keyFile string) { + defer wg.Done() + for i := range maxRetries { + if err := web.RunTLS(addr, certFile, keyFile); err != nil { + logger.Errorf("webServer run tls err:%v", err) + time.Sleep(retryInterval) // 重试间隔时间 + logger.Warnf("trying to restart HTTPS server on %s (Attempt %d)", addr, i) + } + } + }(addr, certFile, keyFile) + } else { + if addr == "" || addr == "" { + continue + } + // 启动HTTP服务 + wg.Add(1) + go func(addr string) { + defer wg.Done() + for i := range maxRetries { + if err := web.Run(addr); err != nil { + logger.Errorf("webServer run err:%v", err) + time.Sleep(retryInterval) // 重试间隔时间 + logger.Warnf("trying to restart HTTP server on %s (Attempt %d)", addr, i) + } + } + }(addr) } } } diff --git a/src/app.go b/src/app.go index 2f47f4ed..407f533a 100644 --- a/src/app.go +++ b/src/app.go @@ -15,7 +15,8 @@ import ( "be.ems/src/modules/monitor" networkdata "be.ems/src/modules/network_data" networkelement "be.ems/src/modules/network_element" - "be.ems/src/modules/oauth2" + "be.ems/src/modules/notification" + "be.ems/src/modules/oam" "be.ems/src/modules/system" "be.ems/src/modules/tool" "be.ems/src/modules/trace" @@ -27,10 +28,6 @@ import ( // 初始应用引擎 func AppEngine() *gin.Engine { var app *gin.Engine - - // 禁止控制台日志输出的颜色 - gin.DisableConsoleColor() - // 根据运行环境注册引擎 if config.Env() == "prod" { gin.SetMode(gin.ReleaseMode) @@ -39,6 +36,8 @@ func AppEngine() *gin.Engine { } else { app = gin.Default() } + // 禁止控制台日志输出的颜色 + gin.DisableConsoleColor() app.ForwardedByClientIP = true return app } @@ -84,8 +83,9 @@ func ModulesRoute(app *gin.Engine) { system.Setup(app) // 认证模块 auth.Setup(app) - // 开放客户端模块 - oauth2.Setup(app) + // 网元OAM对接 + oam.Setup(app) + oam.SetupOauth2(app) // 通用模块 common.Setup(app) @@ -94,6 +94,8 @@ func ModulesRoute(app *gin.Engine) { // 网元数据模块 networkdata.Setup(app) + // 通知模块 + notification.Setup(app) // 跟踪模块 trace.Setup(app) // 图表模块 diff --git a/src/assets/dependency/iperf/deb/iperf_2.0.13+dfsg1-1build1_amd64.deb b/src/assets/dependency/iperf/deb/iperf_2.0.13+dfsg1-1build1_amd64.deb deleted file mode 100644 index 323ae584..00000000 Binary files a/src/assets/dependency/iperf/deb/iperf_2.0.13+dfsg1-1build1_amd64.deb and /dev/null differ diff --git a/src/assets/dependency/iperf/rpm/iperf-2.1.6-2.el8.aarch64.rpm b/src/assets/dependency/iperf/rpm/iperf-2.1.6-2.el8.aarch64.rpm deleted file mode 100644 index ec6b9314..00000000 Binary files a/src/assets/dependency/iperf/rpm/iperf-2.1.6-2.el8.aarch64.rpm and /dev/null differ diff --git a/src/assets/dependency/iperf/rpm/iperf3-3.6-6.ky10.aarch64.rpm b/src/assets/dependency/iperf/rpm/iperf3-3.6-6.ky10.aarch64.rpm deleted file mode 100644 index b5d5a4a5..00000000 Binary files a/src/assets/dependency/iperf/rpm/iperf3-3.6-6.ky10.aarch64.rpm and /dev/null differ 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 deleted file mode 100644 index 0c687e31..00000000 Binary files a/src/assets/dependency/iperf3/deb/iperf3_3.1.3-1_amd64.deb and /dev/null differ 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 deleted file mode 100644 index c81f6622..00000000 Binary files a/src/assets/dependency/iperf3/deb/libiperf0_3.1.3-1_amd64.deb and /dev/null differ diff --git a/src/assets/dependency/iperf3/deb/libsctp1_1.0.19+dfsg-1build1_amd64.deb b/src/assets/dependency/iperf3/deb/libsctp1_1.0.19+dfsg-1build1_amd64.deb deleted file mode 100644 index 03c3947e..00000000 Binary files a/src/assets/dependency/iperf3/deb/libsctp1_1.0.19+dfsg-1build1_amd64.deb and /dev/null differ 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 deleted file mode 100644 index b5d5a4a5..00000000 Binary files a/src/assets/dependency/iperf3/rpm/iperf3-3.6-6.ky10.aarch64.rpm and /dev/null differ diff --git a/src/assets/dependency/iperf3/rpm/iperf3-help-3.6-6.ky10.noarch.rpm b/src/assets/dependency/iperf3/rpm/iperf3-help-3.6-6.ky10.noarch.rpm deleted file mode 100644 index 78a425f8..00000000 Binary files a/src/assets/dependency/iperf3/rpm/iperf3-help-3.6-6.ky10.noarch.rpm and /dev/null differ diff --git a/src/config/config.default.yaml b/src/config/config.default.yaml index c98c4678..41ef001b 100644 --- a/src/config/config.default.yaml +++ b/src/config/config.default.yaml @@ -7,6 +7,29 @@ serverLoginAuth: true # 接口加密,默认关闭 serverCryptoApi: false +# 路由服务配置 +# 服务监听 ipv4/v6 端口,支持多路由 +routeServer: + - addr: "0.0.0.0:33030" # 路由 http 端口 + schema: "http" + - addr: "0.0.0.0:33443" # 路由 https 端口 + schema: "https" + certFile: "/usr/local/etc/omc/certs/www.omc.net.crt" + keyFile: "/usr/local/etc/omc/certs/www.omc.net.key" + +# Web 服务配置 +# 如果使用 nginx 接管,可以禁用 +webServer: + enabled: true # Web 服务启用,默认 false + rootDir: /usr/local/etc/omc/web + listen: + - addr: "0.0.0.0:80" # Web http 端口 + schema: "http" + - addr: "0.0.0.0:443" # Web https 端口 + schema: "https" + certFile: "/usr/local/etc/omc/certs/www.omc.net.crt" + keyFile: "/usr/local/etc/omc/certs/www.omc.net.key" + # 日志 logger: fileDir: "/var/log" @@ -158,7 +181,7 @@ database: # 内置轻量级数据库 lite: type: "sqlite" - database: "" + database: "" logging: false # 多个数据源时可以用这个指定默认的数据源 defaultDataSourceName: "std" diff --git a/src/config/config.local.yaml b/src/config/config.local.yaml index 250cdc6f..12f212cb 100644 --- a/src/config/config.local.yaml +++ b/src/config/config.local.yaml @@ -1,49 +1,47 @@ -# 日志 +# log logger: - fileDir: "/var/log" - fileName: "omc.log" - level: 0 # 日志记录的等级 0:silent<1:info<2:warn<3:error - maxDay: 7 # 日志会保留 180 天 - maxSize: 10 # 调整按 10MB 大小的切割 + fileDir: "/var/log" # Log File Dir + fileName: "omc.log" # Log File Name + level: 0 # Log Level of 0:silent<1:info<2:warn<3:error + maxDay: 7 # Log retention Days + maxSize: 10 # Log File cutting by size -# 静态文件配置, 相对项目根路径或填绝对路径 +# static file resource access staticFile: - # 默认资源,dir目录需要预先创建 default: - prefix: "/static" - dir: "/usr/local/omc/static" - # 文件上传资源目录映射,与项目目录同级 + prefix: "/static" # Static File Prefix + dir: "/usr/local/omc/static" # Static File Dir upload: - prefix: "/upload" - dir: "/usr/local/omc/upload" + prefix: "/upload" # Upload File Prefix + dir: "/usr/local/omc/upload" # Upload File Dir -# DB 数据源 +# data source database: dataSource: - # 默认数据库实例 + # std: standard std: type: "mysql" - host: "127.0.0.1" - port: 33066 - username: "root" - password: "1000omc@kp!" - database: "omc_db" + host: "127.0.0.1" # mysql host + port: 33066 # mysql port + username: "root" # mysql username + password: "1000omc@kp!" # mysql password + database: "omc_db" # mysql database logging: true - # 内置轻量级数据库 + # lite: lite lite: type: "sqlite" - database: "/usr/local/etc/omc/database/omc_db.sqlite" + database: "/usr/local/etc/omc/database/omc_db.sqlite" # sqlite database logging: true - # 多个数据源时可以用这个指定默认的数据源 + # default data source name defaultDataSourceName: "std" -# Redis 缓存数据 +# redis cached data redis: dataSource: default: - port: 6379 # Redis port - host: "127.0.0.1" # Redis host - password: "helloearth" + port: 6379 # redis port + host: "127.0.0.1" # redis host + password: "helloearth" # redis password db: 10 # Redis db_num - # 多个数据源时可以用这个指定默认的数据源 + # default data source name defaultDataSourceName: "default" diff --git a/src/config/config.prod.yaml b/src/config/config.prod.yaml index bdf5cfd6..6e380cbf 100644 --- a/src/config/config.prod.yaml +++ b/src/config/config.prod.yaml @@ -1,30 +1,28 @@ -# DB 数据源 +# data source database: dataSource: - # 默认数据库实例 + # std: standard std: type: "mysql" - host: "127.0.0.1" - port: 33066 - username: "root" - password: "1000omc@kp!" - database: "omc_db" - logging: false - # 内置轻量级数据库 + host: "127.0.0.1" # mysql host + port: 33066 # mysql port + username: "root" # mysql username + password: "1000omc@kp!" # mysql password + database: "omc_db" # mysql database + # lite: lite lite: type: "sqlite" - database: "/usr/local/etc/omc/database/omc_db.sqlite" - logging: false - # 多个数据源时可以用这个指定默认的数据源 + database: "/usr/local/etc/omc/database/omc_db.sqlite" # sqlite database + # default data source name defaultDataSourceName: "std" -# Redis 缓存数据 +# redis cached data redis: dataSource: default: - port: 6379 # Redis port - host: "127.0.0.1" # Redis host - password: "helloearth" + port: 6379 # redis port + host: "127.0.0.1" # redis host + password: "helloearth" # redis password db: 10 # Redis db_num - # 多个数据源时可以用这个指定默认的数据源 + # default data source name defaultDataSourceName: "default" diff --git a/src/framework/config/config.go b/src/framework/config/config.go index 764333d4..c4e8fc0f 100644 --- a/src/framework/config/config.go +++ b/src/framework/config/config.go @@ -10,8 +10,6 @@ import ( "github.com/spf13/pflag" "github.com/spf13/viper" - - libConfig "be.ems/lib/config" ) var ( @@ -21,11 +19,10 @@ var ( ) // 程序配置 -var conf *viper.Viper +var conf *viper.Viper = viper.New() // 初始化程序配置 func InitConfig(configDir *embed.FS) { - conf = viper.New() initFlag() initViper(configDir) } @@ -97,16 +94,14 @@ func initViper(configDir *embed.FS) { // 外部文件配置 externalConfig := conf.GetString("config") if externalConfig != "" { - // readExternalConfig(externalConfig) - // 处理旧配置,存在相同的配置项处理 - configInMerge(externalConfig) + readExternalConfig(externalConfig) } // 记录程序开始运行的时间点 conf.Set("runTime", time.Now()) } -// readExternalConfig 读取外部文件配置(放弃旧的配置序列化时候才用) +// readExternalConfig 读取外部文件配置 func readExternalConfig(configPaht string) { f, err := os.Open(configPaht) if err != nil { @@ -121,38 +116,6 @@ func readExternalConfig(configPaht string) { } } -// 配置文件读取进行内部参数合并 -func configInMerge(configFile string) { - // 指定配置文件读取序列化 - libConfig.ReadConfig(configFile) - uriPrefix := libConfig.GetYamlConfig().OMC.UriPrefix - if uriPrefix != "" { - libConfig.UriPrefix = uriPrefix - } - if libConfig.GetYamlConfig().TestConfig.Enabled { - libConfig.ReadTestConfigYaml(libConfig.GetYamlConfig().TestConfig.File) - } - - // 配置文件读取 - var v = viper.New() - // 设置配置文件路径 - v.SetConfigFile(configFile) - v.SetConfigType("yaml") - // 读取配置文件 - if err := v.ReadInConfig(); err != nil { - fmt.Printf("failure to read configuration file: %v \n", err) - return - } - // 合并外层lib和features使用配置 - for key, value := range v.AllSettings() { - // 跳过配置 - if key == "testconfig" || key == "logger" { - continue - } - conf.Set(key, value) - } -} - // Env 获取运行服务环境 // local prod func Env() string { diff --git a/src/framework/config/expand.go b/src/framework/config/expand.go new file mode 100644 index 00000000..2941e7bf --- /dev/null +++ b/src/framework/config/expand.go @@ -0,0 +1,30 @@ +package config + +import ( + "fmt" + "os" + "regexp" +) + +// SedReplace 替换文件内容,文件来自外部文件配置config传入 +// +// sed 's/port: [0-9]\+ # trace port/port: 6964 # trace port/' /usr/local/etc/omc/omc.yaml +func SedReplace(pattern, replacement string) error { + // 外部文件配置 + externalConfig := conf.GetString("config") + if externalConfig == "" { + return fmt.Errorf("config file path not found") + } + // 读取文件内容 + data, err := os.ReadFile(externalConfig) + if err != nil { + return err + } + + // 定义正则表达式 + re := regexp.MustCompile(pattern) + // 使用正则替换,将匹配到的部分替换为新的内容 + replacedData := re.ReplaceAll(data, []byte(replacement)) + // 写回文件 + return os.WriteFile(externalConfig, replacedData, 0644) +} diff --git a/src/framework/constants/alarm.go b/src/framework/constants/alarm.go index f22c8e2d..e64a4d8d 100644 --- a/src/framework/constants/alarm.go +++ b/src/framework/constants/alarm.go @@ -1,13 +1,19 @@ package constants -// 告警 alarmCode 常量 const ( - // ALARM_EVENT_REBOOT 事件-网元重启 - ALARM_EVENT_REBOOT = 9000 - // ALARM_STATE_CHECK 告警-状态检查 - ALARM_STATE_CHECK = 10000 - // ALARM_RAM_CPU_CHECK 告警-内存/CPU/磁盘检查 - ALARM_CMD_CHECK = 10001 - // ALARM_LICENSE_CHECK 告警-网元License到期检查 - ALARM_LICENSE_CHECK = 10002 + ALARM_EVENT_REBOOT = 9000 // 告警Code-事件-网元重启 + ALARM_STATE_CHECK = 10000 // 告警Code-状态检查 + ALARM_CMD_CHECK = 10001 // 告警Code-内存/CPU/磁盘检查 + ALARM_LICENSE_CHECK = 10002 // 告警Code-网元License到期检查 +) + +const ( + ALARM_ACK_STATE_NOT_ACK = "NotAck" // 告警确认状态-未确认 + ALARM_ACK_STATE_ACK = "Ack" // 告警确认状态-已确认 +) + +const ( + ALARM_CLEAR_TYPE_NOT_CLEAR = "NotClear" // 告警清除状态-未清除 + ALARM_CLEAR_TYPE_AUTO_CLEAR = "AutoClear" // 告警清除状态-自动清除 + ALARM_CLEAR_TYPE_MANUAL_CLEAR = "ManualClear" // 告警清除状态-手动清除 ) diff --git a/src/framework/database/db/expand.go b/src/framework/database/db/expand.go index 209c4eea..ec4af539 100644 --- a/src/framework/database/db/expand.go +++ b/src/framework/database/db/expand.go @@ -103,6 +103,10 @@ func processSQLFile(db *gorm.DB, filePath string) { } else if strings.Contains(errorStr, "duplicate key") { // 忽略重复索引错误 // Error 1061 (42000): Duplicate key name 'key_name' + } else if strings.Contains(errorStr, "duplicate entry") { + // 忽略重复记录错误 + // Error 1062 (23000): Duplicate entry 'value' for key 'key_name' + log.Println(err.Error()) } else if strings.Contains(errorStr, "unknown column") { // 忽略未知字段错误 // Error 1054 (42S22): Unknown column 'field_name' in 'table' @@ -110,6 +114,10 @@ func processSQLFile(db *gorm.DB, filePath string) { // 忽略删除字段或索引错误 // Error 1091 (42000): Can't DROP COLUMN `field_name`; check that it exists // Error 1091 (42000): Can't DROP 'idx_ne_type_id'; check that column/key exists + } else if strings.Contains(errorStr, "doesn't match") { + // 忽略列数不匹配错误 + // Error 1136 (21S01): Column count doesn't match value count at row 1 + log.Println(err.Error()) } else { // 其他错误终止程序 log.Fatalln(errorStr) diff --git a/src/framework/middleware/operate_log.go b/src/framework/middleware/operate_log.go index 61346792..32b378f7 100644 --- a/src/framework/middleware/operate_log.go +++ b/src/framework/middleware/operate_log.go @@ -2,7 +2,6 @@ package middleware import ( "encoding/json" - "fmt" "reflect" "strings" "time" @@ -134,8 +133,15 @@ func OperateLog(options Options) gin.HandlerFunc { contentDisposition := c.Writer.Header().Get("Content-Disposition") contentType := c.Writer.Header().Get("Content-Type") content := contentType + contentDisposition - msg := fmt.Sprintf(`{"status":"%d","size":%d,"content-type":"%s"}`, status, c.Writer.Size(), content) - operaLog.OperaMsg = msg + msgByte, err := json.Marshal(map[string]any{ + "status": status, + "size": c.Writer.Size(), + "content-type": content, + }) + if err != nil { + operaLog.OperaMsg = "" + } + operaLog.OperaMsg = string(msgByte) } // 日志记录时间 diff --git a/src/framework/socket/tcp_client.go b/src/framework/socket/tcp_client.go deleted file mode 100644 index 05935f29..00000000 --- a/src/framework/socket/tcp_client.go +++ /dev/null @@ -1,96 +0,0 @@ -package socket - -import ( - "bytes" - "fmt" - "net" - "strings" - "time" -) - -// ConnTCP 连接TCP客户端 -type ConnTCP struct { - Addr string `json:"addr"` // 主机地址 - Port int64 `json:"port"` // 端口 - - DialTimeOut time.Duration `json:"dialTimeOut"` // 连接超时断开 - - Client *net.Conn `json:"client"` - LastResult string `json:"lastResult"` // 记最后一次发送消息的结果 -} - -// New 创建TCP客户端 -func (c *ConnTCP) New() (*ConnTCP, error) { - // IPV6地址协议 - proto := "tcp" - if strings.Contains(c.Addr, ":") { - proto = "tcp6" - c.Addr = fmt.Sprintf("[%s]", c.Addr) - } - address := net.JoinHostPort(c.Addr, fmt.Sprint(c.Port)) - - // 默认等待5s - if c.DialTimeOut == 0 { - c.DialTimeOut = 5 * time.Second - } - - // 连接到服务端 - client, err := net.DialTimeout(proto, address, c.DialTimeOut) - if err != nil { - return nil, err - } - - c.Client = &client - return c, nil -} - -// Close 关闭当前TCP客户端 -func (c *ConnTCP) Close() { - if c.Client != nil { - (*c.Client).Close() - } -} - -// Send 发送消息 -func (c *ConnTCP) Send(msg []byte, timer time.Duration) (string, error) { - if c.Client == nil { - return "", fmt.Errorf("tcp client not connected") - } - conn := *c.Client - - // 写入信息 - if len(msg) > 0 { - if _, err := conn.Write(msg); err != nil { - return "", err - } - } - - var buf bytes.Buffer - defer buf.Reset() - - tmp := make([]byte, 1024) - for { - select { - case <-time.After(timer): - c.LastResult = buf.String() - return c.LastResult, fmt.Errorf("timeout") - default: - // 读取命令消息 - n, err := conn.Read(tmp) - if n == 0 || err != nil { - tmp = nil - break - } - - tmpStr := string(tmp[:n]) - buf.WriteString(tmpStr) - - // 是否有终止符 - if strings.HasSuffix(tmpStr, ">") || strings.HasSuffix(tmpStr, "> ") || strings.HasSuffix(tmpStr, "# ") { - tmp = nil - c.LastResult = buf.String() - return c.LastResult, nil - } - } - } -} diff --git a/src/framework/socket/tcp_server.go b/src/framework/socket/tcp_server.go deleted file mode 100644 index 755b41c3..00000000 --- a/src/framework/socket/tcp_server.go +++ /dev/null @@ -1,83 +0,0 @@ -package socket - -import ( - "fmt" - "net" - "strings" - - "be.ems/src/framework/logger" -) - -// SocketTCP TCP服务端 -type SocketTCP struct { - Addr string `json:"addr"` // 主机地址 - Port int64 `json:"port"` // 端口 - Listener *net.TCPListener `json:"listener"` - StopChan chan struct{} `json:"stop"` // 停止信号 -} - -// New 创建TCP服务端 -func (s *SocketTCP) New() (*SocketTCP, error) { - // IPV6地址协议 - proto := "tcp" - if strings.Contains(s.Addr, ":") { - proto = "tcp6" - s.Addr = fmt.Sprintf("[%s]", s.Addr) - } - address := fmt.Sprintf("%s:%d", s.Addr, s.Port) - - // 解析 TCP 地址 - tcpAddr, err := net.ResolveTCPAddr(proto, address) - if err != nil { - return nil, err - } - - // 监听 TCP 地址 - listener, err := net.ListenTCP(proto, tcpAddr) - if err != nil { - return nil, err - } - - s.Listener = listener - s.StopChan = make(chan struct{}, 1) - return s, nil -} - -// Close 关闭当前TCP服务端 -func (s *SocketTCP) Close() { - if s.Listener != nil { - s.StopChan <- struct{}{} - (*s.Listener).Close() - } -} - -// Resolve 处理消息 -func (s *SocketTCP) Resolve(callback func(conn *net.Conn, err error)) { - if s.Listener == nil { - callback(nil, fmt.Errorf("tcp service not created")) - return - } - - defer func() { - if err := recover(); err != nil { - callback(nil, fmt.Errorf("tcp service panic err")) - } - }() - - listener := *s.Listener - for { - select { - case <-s.StopChan: - callback(nil, fmt.Errorf("udp service stop")) - return - default: - conn, err := listener.Accept() - if err != nil { - logger.Errorf("Error accepting connection: %v ", err) - continue - } - defer conn.Close() - callback(&conn, nil) - } - } -} diff --git a/src/framework/socket/udp_client.go b/src/framework/socket/udp_client.go deleted file mode 100644 index 9c77aade..00000000 --- a/src/framework/socket/udp_client.go +++ /dev/null @@ -1,96 +0,0 @@ -package socket - -import ( - "bytes" - "fmt" - "net" - "strings" - "time" -) - -// ConnUDP 连接UDP客户端 -type ConnUDP struct { - Addr string `json:"addr"` // 主机地址 - Port int64 `json:"port"` // 端口 - - DialTimeOut time.Duration `json:"dialTimeOut"` // 连接超时断开 - - Client *net.Conn `json:"client"` - LastResult string `json:"lastResult"` // 记最后一次发送消息的结果 -} - -// New 创建UDP客户端 -func (c *ConnUDP) New() (*ConnUDP, error) { - // IPV6地址协议 - proto := "udp" - if strings.Contains(c.Addr, ":") { - proto = "udp6" - c.Addr = fmt.Sprintf("[%s]", c.Addr) - } - address := net.JoinHostPort(c.Addr, fmt.Sprint(c.Port)) - - // 默认等待5s - if c.DialTimeOut == 0 { - c.DialTimeOut = 5 * time.Second - } - - // 连接到服务端 - client, err := net.DialTimeout(proto, address, c.DialTimeOut) - if err != nil { - return nil, err - } - - c.Client = &client - return c, nil -} - -// Close 关闭当前UDP客户端 -func (c *ConnUDP) Close() { - if c.Client != nil { - (*c.Client).Close() - } -} - -// Send 发送消息 -func (c *ConnUDP) Send(msg []byte, ms int) (string, error) { - if c.Client == nil { - return "", fmt.Errorf("udp client not connected") - } - conn := *c.Client - - // 写入信息 - if len(msg) > 0 { - if _, err := conn.Write(msg); err != nil { - return "", err - } - } - - var buf bytes.Buffer - defer buf.Reset() - - tmp := make([]byte, 1024) - for { - select { - case <-time.After(time.Duration(time.Duration(ms).Milliseconds())): - c.LastResult = buf.String() - return c.LastResult, fmt.Errorf("timeout") - default: - // 读取命令消息 - n, err := conn.Read(tmp) - if n == 0 || err != nil { - tmp = nil - break - } - - tmpStr := string(tmp[:n]) - buf.WriteString(tmpStr) - - // 是否有终止符 - if strings.HasSuffix(tmpStr, ">") || strings.HasSuffix(tmpStr, "> ") || strings.HasSuffix(tmpStr, "# ") { - tmp = nil - c.LastResult = buf.String() - return c.LastResult, nil - } - } - } -} diff --git a/src/framework/socket/udp_server.go b/src/framework/socket/udp_server.go deleted file mode 100644 index 1c9f8eaa..00000000 --- a/src/framework/socket/udp_server.go +++ /dev/null @@ -1,74 +0,0 @@ -package socket - -import ( - "fmt" - "net" - "strings" -) - -// SocketUDP UDP服务端 -type SocketUDP struct { - Addr string `json:"addr"` // 主机地址 - Port int64 `json:"port"` // 端口 - Conn *net.UDPConn `json:"conn"` - StopChan chan struct{} `json:"stop"` // 停止信号 -} - -// New 创建UDP服务端 -func (s *SocketUDP) New() (*SocketUDP, error) { - // IPV6地址协议 - proto := "udp" - if strings.Contains(s.Addr, ":") { - proto = "udp6" - s.Addr = fmt.Sprintf("[%s]", s.Addr) - } - address := fmt.Sprintf("%s:%d", s.Addr, s.Port) - - // 解析 UDP 地址 - udpAddr, err := net.ResolveUDPAddr(proto, address) - if err != nil { - return nil, err - } - - // 监听 UDP 地址 - conn, err := net.ListenUDP("udp", udpAddr) - if err != nil { - return nil, err - } - - s.Conn = conn - s.StopChan = make(chan struct{}, 1) - return s, nil -} - -// CloseService 关闭当前UDP服务端 -func (s *SocketUDP) Close() { - if s.Conn != nil { - s.StopChan <- struct{}{} - (*s.Conn).Close() - } -} - -// Resolve 处理消息 -func (s *SocketUDP) Resolve(callback func(*net.UDPConn, error)) { - if s.Conn == nil { - callback(nil, fmt.Errorf("udp service not created")) - return - } - - defer func() { - if err := recover(); err != nil { - callback(nil, fmt.Errorf("udp service panic err")) - } - }() - - for { - select { - case <-s.StopChan: - callback(nil, fmt.Errorf("udp service not created")) - return - default: - callback(s.Conn, nil) - } - } -} diff --git a/src/framework/telnet/telnet.go b/src/framework/telnet/telnet.go index c72a46bd..478c301a 100644 --- a/src/framework/telnet/telnet.go +++ b/src/framework/telnet/telnet.go @@ -42,10 +42,14 @@ func (c *ConnTelnet) NewClient() (*ConnTelnet, error) { } // 进行登录 - time.Sleep(100 * time.Millisecond) - client.Write([]byte(c.User + "\r\n")) - time.Sleep(100 * time.Millisecond) - client.Write([]byte(c.Password + "\r\n")) + if c.User != "" { + time.Sleep(100 * time.Millisecond) + client.Write([]byte(c.User + "\r\n")) + } + if c.Password != "" { + time.Sleep(100 * time.Millisecond) + client.Write([]byte(c.Password + "\r\n")) + } // fmt.Fprintln(client, c.User) // fmt.Fprintln(client, c.Password) @@ -103,6 +107,19 @@ func (c *ConnTelnet) RunCMD(cmd string) (string, error) { return c.LastResult, nil } +// WindowChange informs the remote host about a terminal window dimension change to h rows and w columns. +func (s *ConnTelnet) WindowChange(h, w int) error { + if s.Client == nil { + return fmt.Errorf("client is nil to content write failed") + } + conn := *s.Client + + // 需要确保接收方理解并正确处理发送窗口大小设置命令 + conn.Write([]byte{255, 251, 31}) + conn.Write([]byte{255, 250, 31, byte(w >> 8), byte(w & 0xFF), byte(h >> 8), byte(h & 0xFF), 255, 240}) + return nil +} + // NewClient 创建Telnet客户端会话对象 func (c *ConnTelnet) NewClientSession(cols, rows int) (*TelnetClientSession, error) { if c.Client == nil { diff --git a/src/framework/utils/date/date.go b/src/framework/utils/date/date.go index a1006bbe..7e9d3abd 100644 --- a/src/framework/utils/date/date.go +++ b/src/framework/utils/date/date.go @@ -54,9 +54,9 @@ func ParseDateToStr(date any, formatStr string) string { if v == 0 { return "" } - if v > 9999999999 { + if v > 1e12 { t = time.UnixMilli(v) - } else if v > 999999999 { + } else if v > 1e9 { t = time.Unix(v, 0) } else { logger.Infof("utils ParseDateToStr err %v", "Invalid timestamp") diff --git a/src/framework/utils/expr/expr.go b/src/framework/utils/expr/expr.go new file mode 100644 index 00000000..cd7ba420 --- /dev/null +++ b/src/framework/utils/expr/expr.go @@ -0,0 +1,44 @@ +package expr + +import ( + "fmt" + "regexp" + "strings" + + "github.com/expr-lang/expr" +) + +// Eval 计算表达式返回结果 +func Eval(exprStr string, env map[string]any) (any, error) { + return expr.Eval(exprStr, env) +} + +// ParseExprEnv 解析表达式环境变量 +// 比如 "('SMF.03'/'SMF.04')*100" +// 变量传入"SMF.03": 3 +func ParseExprEnv(exprStr string, env map[string]any) (string, map[string]any) { + // 使用正则表达式匹配带单引号的变量名 + re := regexp.MustCompile(`'([^']+)'`) + tempEnv := make(map[string]any) + tempExpr := exprStr + varCount := 0 + matches := re.FindAllStringSubmatch(exprStr, -1) + for _, match := range matches { + paramName := match[1] + tempVarName := fmt.Sprintf("var%d", varCount) + tempEnv[tempVarName] = env[paramName] + tempExpr = strings.Replace(tempExpr, match[0], tempVarName, 1) + varCount++ + } + + // 合并临时环境变量和原环境变量 + combinedEnv := make(map[string]any) + for k, v := range env { + combinedEnv[k] = v + } + for k, v := range tempEnv { + combinedEnv[k] = v + } + + return tempExpr, combinedEnv +} diff --git a/src/framework/utils/regular/regular.go b/src/framework/utils/regular/regular.go index c27cb08e..59c8f10e 100644 --- a/src/framework/utils/regular/regular.go +++ b/src/framework/utils/regular/regular.go @@ -19,7 +19,7 @@ func ValidUsername(username string) bool { if username == "" { return false } - pattern := `^[a-zA-Z][a-z0-9A-Z]{5,}` + pattern := `^.{4,}$` //`^[a-zA-Z][a-z0-9A-Z]{5,}` match, err := regexp.MatchString(pattern, username) if err != nil { return false diff --git a/src/modules/auth/auth.go b/src/modules/auth/auth.go index 11e64407..d177b4b4 100644 --- a/src/modules/auth/auth.go +++ b/src/modules/auth/auth.go @@ -23,38 +23,84 @@ func Setup(router *gin.Engine) { ) // 账号身份操作 + account := controller.NewAccount + accountGroup := router.Group("/auth") { - router.POST("/auth/login", + accountGroup.POST("/login", middleware.RateLimit(middleware.LimitOption{ Time: 180, Count: 15, Type: middleware.LIMIT_IP, }), - controller.NewAccount.Login, + account.Login, ) - router.POST("/auth/logout", + accountGroup.POST("/logout", middleware.RateLimit(middleware.LimitOption{ Time: 120, Count: 15, Type: middleware.LIMIT_IP, }), - controller.NewAccount.Logout, + account.Logout, ) - router.POST("/auth/refresh-token", + accountGroup.POST("/refresh-token", middleware.RateLimit(middleware.LimitOption{ Time: 60, Count: 5, Type: middleware.LIMIT_IP, }), - controller.NewAccount.RefreshToken, + account.RefreshToken, ) router.GET("/me", middleware.AuthorizeUser(nil), - controller.NewAccount.Me, + account.Me, ) router.GET("/router", middleware.AuthorizeUser(nil), - controller.NewAccount.Router, + account.Router, + ) + } + + // 登录认证源 + { + accountGroup.GET("/login/source", + middleware.RateLimit(middleware.LimitOption{ + Time: 300, + Count: 60, + Type: middleware.LIMIT_IP, + }), + account.LoginSource, + ) + accountGroup.POST("/login/ldap", + middleware.RateLimit(middleware.LimitOption{ + Time: 180, + Count: 15, + Type: middleware.LIMIT_IP, + }), + account.LDAP, + ) + accountGroup.POST("/login/smtp", + middleware.RateLimit(middleware.LimitOption{ + Time: 180, + Count: 15, + Type: middleware.LIMIT_IP, + }), + account.SMTP, + ) + accountGroup.GET("/login/oauth2/authorize", + middleware.RateLimit(middleware.LimitOption{ + Time: 180, + Count: 15, + Type: middleware.LIMIT_IP, + }), + account.OAuth2CodeURL, + ) + accountGroup.POST("/login/oauth2/token", + middleware.RateLimit(middleware.LimitOption{ + Time: 180, + Count: 15, + Type: middleware.LIMIT_IP, + }), + account.OAuth2Token, ) } @@ -70,4 +116,62 @@ func Setup(router *gin.Engine) { ) } + // 客户端授权管理 + oauth2Client := controller.NewOauth2Client + oauth2ClientGroup := router.Group("/oauth2/client") + { + oauth2ClientGroup.GET("/list", + middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), + oauth2Client.List, + ) + oauth2ClientGroup.GET("/:clientId", + middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), + oauth2Client.Info, + ) + oauth2ClientGroup.POST("", + middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.oauth2client", middleware.BUSINESS_TYPE_INSERT)), + oauth2Client.Add, + ) + oauth2ClientGroup.PUT("", + middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.oauth2client", middleware.BUSINESS_TYPE_UPDATE)), + oauth2Client.Edit, + ) + oauth2ClientGroup.DELETE("/:id", + middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.oauth2client", middleware.BUSINESS_TYPE_DELETE)), + oauth2Client.Remove, + ) + } + + // 授权认证 + oauth2 := controller.NewOauth2 + oauth2Group := router.Group("/oauth2") + { + oauth2Group.GET("/authorize", + middleware.RateLimit(middleware.LimitOption{ + Time: 60, + Count: 30, + Type: middleware.LIMIT_IP, + }), + oauth2.Authorize, + ) + oauth2Group.POST("/token", + middleware.RateLimit(middleware.LimitOption{ + Time: 180, + Count: 15, + Type: middleware.LIMIT_IP, + }), + oauth2.Token, + ) + oauth2Group.POST("/refresh-token", + middleware.RateLimit(middleware.LimitOption{ + Time: 60, + Count: 5, + Type: middleware.LIMIT_IP, + }), + oauth2.RefreshToken, + ) + } } diff --git a/src/modules/auth/controller/account.go b/src/modules/auth/controller/account.go index e3584682..b95cf140 100644 --- a/src/modules/auth/controller/account.go +++ b/src/modules/auth/controller/account.go @@ -4,16 +4,13 @@ import ( "fmt" "time" - "be.ems/src/framework/config" "be.ems/src/framework/constants" "be.ems/src/framework/i18n" "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/token" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/auth/model" "be.ems/src/modules/auth/service" - systemModelVO "be.ems/src/modules/system/model/vo" systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" @@ -33,95 +30,6 @@ type AccountController struct { sysLogLoginService *systemService.SysLogLogin // 系统登录访问 } -// Login 系统登录 -// -// POST /auth/login -// -// @Tags common/authorization -// @Accept json -// @Produce json -// @Param data body object true "Request Param" -// @Success 200 {object} object "Response Results" -// @Summary System Login -// @Description System Login -// @Router /auth/login [post] -func (s AccountController) Login(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - var body model.LoginBody - if err := c.ShouldBindJSON(&body); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } - - // 当前请求信息 - ipaddr, location := reqctx.IPAddrLocation(c) - os, browser := reqctx.UaOsBrowser(c) - - // 校验验证码 根据错误信息,创建系统访问记录 - if err := s.accountService.ValidateCaptcha(body.Code, body.UUID); err != nil { - msg := fmt.Sprintf("%s code %s", err.Error(), body.Code) - s.sysLogLoginService.Insert( - body.Username, constants.STATUS_NO, msg, - [4]string{ipaddr, location, os, browser}, - ) - c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - - // 登录用户信息 - info, err := s.accountService.ByUsername(body.Username, body.Password) - if err != nil { - s.sysLogLoginService.Insert( - body.Username, constants.STATUS_NO, err.Error(), - [4]string{ipaddr, location, os, browser}, - ) - c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - - data := map[string]any{} - - if !config.IsSystemUser(info.UserId) { - // 强制改密码 - forcePasswdChange, err := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime) - if err != nil { - c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - if forcePasswdChange { - data["forcePasswdChange"] = true - } - } - - deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) - - // 生成访问令牌 - accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") - if accessToken == "" || expiresIn == 0 { - c.JSON(200, resp.ErrMsg("token generation failed")) - return - } - // 生成刷新令牌 - refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") - - // 记录令牌,创建系统访问记录 - token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) - s.accountService.UpdateLoginDateAndIP(info) - s.sysLogLoginService.Insert( - body.Username, constants.STATUS_YES, "app.common.loginSuccess", - [4]string{ipaddr, location, os, browser}, - ) - - data["tokenType"] = constants.HEADER_PREFIX - data["accessToken"] = accessToken - data["expiresIn"] = expiresIn - data["refreshToken"] = refreshToken - data["refreshExpiresIn"] = refreshExpiresIn - data["userId"] = info.UserId - c.JSON(200, resp.OkData(data)) -} - // Logout 系统登出 // // POST /auth/logout @@ -222,82 +130,10 @@ func (s AccountController) RefreshToken(c *gin.Context) { })) } -// Me 登录用户信息 +// LoginSource 登录认证源 // -// GET /me -// -// @Tags common/authorization -// @Accept json -// @Produce json -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Login User Information -// @Description Login User Information -// @Router /me [get] -func (s AccountController) Me(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - info, err := reqctx.LoginUser(c) - if err != nil { - c.JSON(401, resp.CodeMsg(resp.CODE_AUTH_INVALID, err.Error())) - return - } - - // 角色权限集合,系统管理员拥有所有权限 - isSystemUser := config.IsSystemUser(info.UserId) - roles, perms := s.accountService.RoleAndMenuPerms(info.UserId, isSystemUser) - - info.User.NickName = i18n.TKey(language, info.User.NickName) - info.User.Remark = i18n.TKey(language, info.User.Remark) - info.User.Dept.DeptName = i18n.TKey(language, info.User.Dept.DeptName) - for ri := range info.User.Roles { - info.User.Roles[ri].RoleName = i18n.TKey(language, info.User.Roles[ri].RoleName) - } - - data := map[string]any{ - "user": info.User, - "roles": roles, - "permissions": perms, - } - if !isSystemUser { - // 强制改密码 - forcePasswdChange, _ := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime) - if forcePasswdChange { - data["forcePasswdChange"] = true - } - } +// GET /auth/login/source +func (s AccountController) LoginSource(c *gin.Context) { + data := s.accountService.LoginSource() c.JSON(200, resp.OkData(data)) } - -// Router 登录用户路由信息 -// -// GET /router -// -// @Tags common/authorization -// @Accept json -// @Produce json -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Login User Routing Information -// @Description Login User Routing Information -// @Router /router [get] -func (s AccountController) Router(c *gin.Context) { - loginUserId := reqctx.LoginUserToUserID(c) - - // 前端路由,系统管理员拥有所有 - isSystemUser := config.IsSystemUser(loginUserId) - buildMenus := s.accountService.RouteMenus(loginUserId, isSystemUser) - // 闭包函数处理多语言 - language := reqctx.AcceptLanguage(c) - var converI18n func(language string, arr *[]systemModelVO.Router) - converI18n = func(language string, arr *[]systemModelVO.Router) { - for i := range *arr { - (*arr)[i].Meta.Title = i18n.TKey(language, (*arr)[i].Meta.Title) - if len((*arr)[i].Children) > 0 { - converI18n(language, &(*arr)[i].Children) - } - } - } - converI18n(language, &buildMenus) - - c.JSON(200, resp.OkData(buildMenus)) -} diff --git a/src/modules/auth/controller/account_info.go b/src/modules/auth/controller/account_info.go new file mode 100644 index 00000000..49c5ec41 --- /dev/null +++ b/src/modules/auth/controller/account_info.go @@ -0,0 +1,93 @@ +package controller + +import ( + "be.ems/src/framework/config" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + systemModelVO "be.ems/src/modules/system/model/vo" + + "github.com/gin-gonic/gin" +) + +// Me 登录用户信息 +// +// GET /me +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Login User Information +// @Description Login User Information +// @Router /me [get] +func (s AccountController) Me(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + info, err := reqctx.LoginUser(c) + if err != nil { + c.JSON(401, resp.CodeMsg(resp.CODE_AUTH_INVALID, err.Error())) + return + } + + // 角色权限集合,系统管理员拥有所有权限 + isSystemUser := config.IsSystemUser(info.UserId) + roles, perms := s.accountService.RoleAndMenuPerms(info.UserId, isSystemUser) + + info.User.NickName = i18n.TKey(language, info.User.NickName) + info.User.Remark = i18n.TKey(language, info.User.Remark) + if info.User.Dept != nil { + info.User.Dept.DeptName = i18n.TKey(language, info.User.Dept.DeptName) + } + for ri := range info.User.Roles { + info.User.Roles[ri].RoleName = i18n.TKey(language, info.User.Roles[ri].RoleName) + } + + data := map[string]any{ + "user": info.User, + "roles": roles, + "permissions": perms, + } + if !isSystemUser { + // 强制改密码 + forcePasswdChange, _ := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime) + if forcePasswdChange { + data["forcePasswdChange"] = true + } + } + c.JSON(200, resp.OkData(data)) +} + +// Router 登录用户路由信息 +// +// GET /router +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Login User Routing Information +// @Description Login User Routing Information +// @Router /router [get] +func (s AccountController) Router(c *gin.Context) { + loginUserId := reqctx.LoginUserToUserID(c) + + // 前端路由,系统管理员拥有所有 + isSystemUser := config.IsSystemUser(loginUserId) + buildMenus := s.accountService.RouteMenus(loginUserId, isSystemUser) + // 闭包函数处理多语言 + language := reqctx.AcceptLanguage(c) + var converI18n func(language string, arr *[]systemModelVO.Router) + converI18n = func(language string, arr *[]systemModelVO.Router) { + for i := range *arr { + (*arr)[i].Meta.Title = i18n.TKey(language, (*arr)[i].Meta.Title) + if len((*arr)[i].Children) > 0 { + converI18n(language, &(*arr)[i].Children) + } + } + } + converI18n(language, &buildMenus) + + c.JSON(200, resp.OkData(buildMenus)) +} diff --git a/src/modules/auth/controller/account_ldap.go b/src/modules/auth/controller/account_ldap.go new file mode 100644 index 00000000..d2510d96 --- /dev/null +++ b/src/modules/auth/controller/account_ldap.go @@ -0,0 +1,80 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/auth/model" + + "github.com/gin-gonic/gin" +) + +// LDAP LDAP认证登录 +// +// POST /auth/ldap +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Summary System Login +// @Description System Login +// @Router /auth/ldap [post] +func (s AccountController) LDAP(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body model.LoginSourceBody + if err := c.ShouldBindJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 当前请求信息 + ipaddr, location := reqctx.IPAddrLocation(c) + os, browser := reqctx.UaOsBrowser(c) + + // 登录用户信息 + info, err := s.accountService.ByLDAP(body) + if err != nil { + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, err.Error(), + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + data := map[string]any{} + + deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) + + // 生成访问令牌 + accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") + if accessToken == "" || expiresIn == 0 { + c.JSON(200, resp.ErrMsg("token generation failed")) + return + } + // 生成刷新令牌 + refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") + + // 记录令牌,创建系统访问记录 + token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) + s.accountService.UpdateLoginDateAndIP(info) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, + ) + + data["tokenType"] = constants.HEADER_PREFIX + data["accessToken"] = accessToken + data["expiresIn"] = expiresIn + data["refreshToken"] = refreshToken + data["refreshExpiresIn"] = refreshExpiresIn + data["userId"] = info.UserId + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/auth/controller/account_oauth2.go b/src/modules/auth/controller/account_oauth2.go new file mode 100644 index 00000000..1a90bccd --- /dev/null +++ b/src/modules/auth/controller/account_oauth2.go @@ -0,0 +1,107 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/auth/model" + + "github.com/gin-gonic/gin" +) + +// OAuth2CodeURL OAuth2认证跳转登录URL +// +// GET /auth/login/oauth2/authorize +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Summary System Login +// @Description System Login +// @Router /auth/login/oauth2/authorize [get] +func (s AccountController) OAuth2CodeURL(c *gin.Context) { + state := c.Query("state") + if state == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: state is empty")) + return + } + + redirectURL, err := s.accountService.ByOAuth2CodeURL(state) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + c.Redirect(302, redirectURL) +} + +// OAuth2 OAuth2认证登录 +// +// POST /auth/login/oauth2/token +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Summary System Login +// @Description System Login +// @Router /auth/login/oauth2/token [post] +func (s AccountController) OAuth2Token(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body model.LoginSourceOauth2Body + if err := c.ShouldBindJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 当前请求信息 + ipaddr, location := reqctx.IPAddrLocation(c) + os, browser := reqctx.UaOsBrowser(c) + + // 登录用户信息 + info, err := s.accountService.ByOAuth2(body) + if err != nil { + s.sysLogLoginService.Insert( + body.State, constants.STATUS_NO, err.Error(), + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + data := map[string]any{} + + deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) + + // 生成访问令牌 + accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") + if accessToken == "" || expiresIn == 0 { + c.JSON(200, resp.ErrMsg("token generation failed")) + return + } + // 生成刷新令牌 + refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") + + // 记录令牌,创建系统访问记录 + token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) + s.accountService.UpdateLoginDateAndIP(info) + s.sysLogLoginService.Insert( + body.State, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, + ) + + data["tokenType"] = constants.HEADER_PREFIX + data["accessToken"] = accessToken + data["expiresIn"] = expiresIn + data["refreshToken"] = refreshToken + data["refreshExpiresIn"] = refreshExpiresIn + data["userId"] = info.UserId + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/auth/controller/account_smtp.go b/src/modules/auth/controller/account_smtp.go new file mode 100644 index 00000000..ab94e0bd --- /dev/null +++ b/src/modules/auth/controller/account_smtp.go @@ -0,0 +1,80 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/auth/model" + + "github.com/gin-gonic/gin" +) + +// SMTP SMTP认证登录 +// +// POST /auth/smtp +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Summary System Login +// @Description System Login +// @Router /auth/smtp [post] +func (s AccountController) SMTP(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body model.LoginSourceBody + if err := c.ShouldBindJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 当前请求信息 + ipaddr, location := reqctx.IPAddrLocation(c) + os, browser := reqctx.UaOsBrowser(c) + + // 登录用户信息 + info, err := s.accountService.BySMTP(body) + if err != nil { + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, err.Error(), + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + data := map[string]any{} + + deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) + + // 生成访问令牌 + accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") + if accessToken == "" || expiresIn == 0 { + c.JSON(200, resp.ErrMsg("token generation failed")) + return + } + // 生成刷新令牌 + refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") + + // 记录令牌,创建系统访问记录 + token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) + s.accountService.UpdateLoginDateAndIP(info) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, + ) + + data["tokenType"] = constants.HEADER_PREFIX + data["accessToken"] = accessToken + data["expiresIn"] = expiresIn + data["refreshToken"] = refreshToken + data["refreshExpiresIn"] = refreshExpiresIn + data["userId"] = info.UserId + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/auth/controller/account_system.go b/src/modules/auth/controller/account_system.go new file mode 100644 index 00000000..d9721a1e --- /dev/null +++ b/src/modules/auth/controller/account_system.go @@ -0,0 +1,104 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/auth/model" + + "github.com/gin-gonic/gin" +) + +// Login 系统登录 +// +// POST /auth/login +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Summary System Login +// @Description System Login +// @Router /auth/login [post] +func (s AccountController) Login(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body model.LoginBody + if err := c.ShouldBindJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 当前请求信息 + ipaddr, location := reqctx.IPAddrLocation(c) + os, browser := reqctx.UaOsBrowser(c) + + // 校验验证码 根据错误信息,创建系统访问记录 + if err := s.accountService.ValidateCaptcha(body.Code, body.UUID); err != nil { + msg := fmt.Sprintf("%s code %s", err.Error(), body.Code) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, msg, + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + // 登录用户信息 + info, err := s.accountService.ByUsername(body.Username, body.Password) + if err != nil { + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, err.Error(), + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + data := map[string]any{} + + if !config.IsSystemUser(info.UserId) { + // 强制改密码 + forcePasswdChange, err := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime) + if err != nil { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + if forcePasswdChange { + data["forcePasswdChange"] = true + } + } + + deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) + + // 生成访问令牌 + accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") + if accessToken == "" || expiresIn == 0 { + c.JSON(200, resp.ErrMsg("token generation failed")) + return + } + // 生成刷新令牌 + refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") + + // 记录令牌,创建系统访问记录 + token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) + s.accountService.UpdateLoginDateAndIP(info) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, + ) + + data["tokenType"] = constants.HEADER_PREFIX + data["accessToken"] = accessToken + data["expiresIn"] = expiresIn + data["refreshToken"] = refreshToken + data["refreshExpiresIn"] = refreshExpiresIn + data["userId"] = info.UserId + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/oauth2/controller/oauth2.go b/src/modules/auth/controller/oauth2.go similarity index 98% rename from src/modules/oauth2/controller/oauth2.go rename to src/modules/auth/controller/oauth2.go index bb8fceb3..6da8add9 100644 --- a/src/modules/oauth2/controller/oauth2.go +++ b/src/modules/auth/controller/oauth2.go @@ -11,8 +11,8 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/token" - "be.ems/src/modules/oauth2/model" - "be.ems/src/modules/oauth2/service" + "be.ems/src/modules/auth/model" + "be.ems/src/modules/auth/service" ) // NewOauth2 实例化控制层 diff --git a/src/modules/oauth2/controller/oauth2_client.go b/src/modules/auth/controller/oauth2_client.go similarity index 98% rename from src/modules/oauth2/controller/oauth2_client.go rename to src/modules/auth/controller/oauth2_client.go index 30d0bbf5..830c9b71 100644 --- a/src/modules/oauth2/controller/oauth2_client.go +++ b/src/modules/auth/controller/oauth2_client.go @@ -10,8 +10,8 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/oauth2/model" - "be.ems/src/modules/oauth2/service" + "be.ems/src/modules/auth/model" + "be.ems/src/modules/auth/service" ) // NewOauth2Client 实例化控制层 diff --git a/src/modules/auth/model/login_body.go b/src/modules/auth/model/login_body.go index ec37763e..78546991 100644 --- a/src/modules/auth/model/login_body.go +++ b/src/modules/auth/model/login_body.go @@ -2,15 +2,8 @@ package model // LoginBody 用户登录对象 type LoginBody struct { - // Username 用户名 - Username string `json:"username" binding:"required"` - - // Password 用户密码 - Password string `json:"password" binding:"required"` - - // Code 验证码 - Code string `json:"code"` - - // UUID 验证码唯一标识 - UUID string `json:"uuid"` + Username string `json:"username" binding:"required"` // Username 用户名 + Password string `json:"password" binding:"required"` // Password 用户密码 + Code string `json:"code"` // Code 验证码 + UUID string `json:"uuid"` // UUID 验证码唯一标识 } diff --git a/src/modules/auth/model/login_source_body.go b/src/modules/auth/model/login_source_body.go new file mode 100644 index 00000000..7b63ad57 --- /dev/null +++ b/src/modules/auth/model/login_source_body.go @@ -0,0 +1,22 @@ +package model + +// LoginSourceVo 认证源登录对象 +type LoginSourceVo struct { + UID string `json:"uid"` // UID 认证源UID + Name string `json:"name"` // Name 认证源名称 + Type string `json:"type"` // Type 认证源类型 + Icon string `json:"icon"` // Icon 认证源图标 +} + +// LoginSourceBody 认证源用户登录对象 +type LoginSourceBody struct { + Username string `json:"username" binding:"required"` // Username 用户名 + Password string `json:"password" binding:"required"` // Password 用户密码 + UID string `json:"uid" binding:"required"` // UID 认证源唯一标识 +} + +// LoginSourceOauth2Body 认证源OAuth2用户登录对象 +type LoginSourceOauth2Body struct { + Code string `json:"code" binding:"required"` // Code 授权码 + State string `json:"state" binding:"required"` // State 状态-认证源唯一标识 +} diff --git a/src/modules/oauth2/model/token_body.go b/src/modules/auth/model/oauth2_body.go similarity index 67% rename from src/modules/oauth2/model/token_body.go rename to src/modules/auth/model/oauth2_body.go index 2f82ab8f..17a8e165 100644 --- a/src/modules/oauth2/model/token_body.go +++ b/src/modules/auth/model/oauth2_body.go @@ -8,3 +8,10 @@ type TokenBody struct { Code string `json:"code"` // 授权拿到的code值 RefreshToken string `json:"refreshToken"` // 刷新令牌 } + +// CodeQuery 重定向授权码参数 +type CodeQuery struct { + RedirectUrl string `form:"redirectUrl" binding:"required"` // 授权回调地址 + ClientId string `form:"clientId" binding:"required"` // 申请得到的客户端ID + State string `form:"state" binding:"required"` // 随机字符串,认证服务器会原封不动地返回这个值 +} diff --git a/src/modules/oauth2/model/oauth2_client.go b/src/modules/auth/model/oauth2_client.go similarity index 100% rename from src/modules/oauth2/model/oauth2_client.go rename to src/modules/auth/model/oauth2_client.go diff --git a/src/modules/oauth2/model/oauth2_log_login.go b/src/modules/auth/model/oauth2_log_login.go similarity index 100% rename from src/modules/oauth2/model/oauth2_log_login.go rename to src/modules/auth/model/oauth2_log_login.go diff --git a/src/modules/auth/model/register_body.go b/src/modules/auth/model/register_body.go index 4bf11142..9354306a 100644 --- a/src/modules/auth/model/register_body.go +++ b/src/modules/auth/model/register_body.go @@ -2,21 +2,10 @@ package model // RegisterBody 用户注册对象 type RegisterBody struct { - // Username 用户名 - Username string `json:"username" binding:"required"` - - // Password 用户密码 - Password string `json:"password" binding:"required"` - - // ConfirmPassword 用户确认密码 - ConfirmPassword string `json:"confirmPassword" binding:"required"` - - // Code 验证码 - Code string `json:"code"` - - // UUID 验证码唯一标识 - UUID string `json:"uuid"` - - // UserType 标记用户类型 - UserType string `json:"userType"` + Username string `json:"username" binding:"required"` // Username 用户名 + Password string `json:"password" binding:"required"` // Password 用户密码 + ConfirmPassword string `json:"confirmPassword" binding:"required"` // ConfirmPassword 用户确认密码 + Code string `json:"code"` // Code 验证码 + UUID string `json:"uuid"` // UUID 验证码唯一标识 + UserType string `json:"userType"` // UserType 标记用户类型 } diff --git a/src/modules/oauth2/repository/oauth2_client.go b/src/modules/auth/repository/oauth2_client.go similarity index 99% rename from src/modules/oauth2/repository/oauth2_client.go rename to src/modules/auth/repository/oauth2_client.go index 1c7253c4..503ea2c4 100644 --- a/src/modules/oauth2/repository/oauth2_client.go +++ b/src/modules/auth/repository/oauth2_client.go @@ -6,7 +6,7 @@ import ( "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/modules/oauth2/model" + "be.ems/src/modules/auth/model" ) // NewOauth2Client 实例化数据层 diff --git a/src/modules/oauth2/repository/oauth2_log_login.go b/src/modules/auth/repository/oauth2_log_login.go similarity index 96% rename from src/modules/oauth2/repository/oauth2_log_login.go rename to src/modules/auth/repository/oauth2_log_login.go index f712b9d4..71dc09b7 100644 --- a/src/modules/oauth2/repository/oauth2_log_login.go +++ b/src/modules/auth/repository/oauth2_log_login.go @@ -7,7 +7,7 @@ import ( "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/modules/oauth2/model" + "be.ems/src/modules/auth/model" ) // NewOauth2LogLogin 实例化数据层 @@ -69,9 +69,10 @@ func (r Oauth2LogLoginRepository) SelectByPage(query map[string]string) ([]model sortOrder := sortOrderArr[i] // 排序字段 sort := "id" - if sortBy == "loginIp" { + switch sortBy { + case "loginIp": sort = "login_ip" - } else if sortBy == "createTime" { + case "createTime": sort = "create_time" } // 排序方式 diff --git a/src/modules/auth/service/account.go b/src/modules/auth/service/account.go index bc8d605a..d4939326 100644 --- a/src/modules/auth/service/account.go +++ b/src/modules/auth/service/account.go @@ -2,102 +2,32 @@ package service import ( "fmt" - "time" "be.ems/src/framework/config" "be.ems/src/framework/constants" - "be.ems/src/framework/database/redis" "be.ems/src/framework/token" - "be.ems/src/framework/utils/crypto" "be.ems/src/framework/utils/parse" - systemModelVO "be.ems/src/modules/system/model/vo" + "be.ems/src/modules/auth/model" + systemModel "be.ems/src/modules/system/model" systemService "be.ems/src/modules/system/service" ) // 实例化服务层 Account 结构体 var NewAccount = &Account{ - sysUserService: systemService.NewSysUser, - sysConfigService: systemService.NewSysConfig, - sysRoleService: systemService.NewSysRole, - sysMenuService: systemService.NewSysMenu, + sysUserService: systemService.NewSysUser, + sysConfigService: systemService.NewSysConfig, + sysRoleService: systemService.NewSysRole, + sysMenuService: systemService.NewSysMenu, + sysLogSourceService: systemService.NewSysLoginSource, } // 账号身份操作服务 服务层处理 type Account struct { - sysUserService *systemService.SysUser // 用户信息服务 - sysConfigService *systemService.SysConfig // 参数配置服务 - sysRoleService *systemService.SysRole // 角色服务 - sysMenuService *systemService.SysMenu // 菜单服务 -} - -// ValidateCaptcha 校验验证码 -func (s *Account) ValidateCaptcha(code, uuid string) error { - // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 - captchaEnabledStr := s.sysConfigService.FindValueByKey("sys.account.captchaEnabled") - if !parse.Boolean(captchaEnabledStr) { - return nil - } - if code == "" || uuid == "" { - // 验证码信息错误 - return fmt.Errorf("captcha.err") - } - verifyKey := constants.CACHE_CAPTCHA_CODE + ":" + 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 -} - -// ByUsername 登录创建用户信息 -func (s Account) ByUsername(username, password string) (token.UserInfo, error) { - info := token.UserInfo{} - - // 检查密码重试次数 - retryKey, retryCount, lockTime, err := s.passwordRetryCount(username) - if err != nil { - return info, err - } - - // 查询用户登录账号 - sysUser := s.sysUserService.FindByUserName(username) - if sysUser.UserName != username { - return info, fmt.Errorf("login.errNameOrPasswd") - } - if sysUser.DelFlag == constants.STATUS_YES { - return info, fmt.Errorf("login.errDelFlag") - } - if sysUser.StatusFlag == constants.STATUS_NO { - return info, fmt.Errorf("login.errStatus") - } - - // 检验用户密码 - compareBool := crypto.BcryptCompare(password, sysUser.Password) - if compareBool { - s.CleanLoginRecordCache(sysUser.UserName) // 清除错误记录次数 - } else { - _ = redis.Set("", retryKey, retryCount+1, lockTime) - return info, fmt.Errorf("login.errNameOrPasswd") - } - - // 登录用户信息 - info.UserId = sysUser.UserId - info.DeptId = sysUser.DeptId - info.User = sysUser - // 用户权限组标识 - if config.IsSystemUser(sysUser.UserId) { - info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} - } else { - perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) - info.Permissions = parse.RemoveDuplicates(perms) - } - return info, nil + sysUserService *systemService.SysUser // 用户信息服务 + sysConfigService *systemService.SysConfig // 参数配置服务 + sysRoleService *systemService.SysRole // 角色服务 + sysMenuService *systemService.SysMenu // 菜单服务 + sysLogSourceService *systemService.SysLoginSource // 认证源 } // ByUserId 用户ID刷新令牌创建用户信息 @@ -140,86 +70,43 @@ func (s Account) UpdateLoginDateAndIP(info token.UserInfo) bool { return s.sysUserService.Update(user) > 0 } -// CleanLoginRecordCache 清除错误记录次数 -func (s Account) CleanLoginRecordCache(userName string) bool { - cacheKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) - hasKey, err := redis.Has("", cacheKey) - if hasKey > 0 && err == nil { - return redis.Del("", cacheKey) == nil +// LoginSource 登录认证源 +func (s Account) LoginSource() []model.LoginSourceVo { + rows := s.sysLogSourceService.FindByActive("") + data := make([]model.LoginSourceVo, 0) + for _, v := range rows { + data = append(data, model.LoginSourceVo{ + UID: v.UID, + Name: v.Name, + Type: v.Type, + Icon: v.Icon, + }) } - return false + return data } -// passwordRetryCount 密码重试次数 -func (s Account) passwordRetryCount(userName string) (string, int64, time.Duration, error) { - // 从数据库配置获取登录次数和错误锁定时间 - maxRetryCountStr := s.sysConfigService.FindValueByKey("sys.user.maxRetryCount") - lockTimeStr := s.sysConfigService.FindValueByKey("sys.user.lockTime") - // 验证登录次数和错误锁定时间 - maxRetryCount := parse.Number(maxRetryCountStr) - lockTime := parse.Number(lockTimeStr) +// initLoginSourceUser 初始化登录源用户 +func (s *Account) initLoginSourceUser(uid, sType, username, password string) systemModel.SysUser { + sysUser := systemModel.SysUser{ + UserName: username, + NickName: username, // 昵称使用名称账号 + Password: password, // 原始密码 + UserType: sType, + UserSource: uid, + Sex: "0", // 性别未选择 + StatusFlag: constants.STATUS_YES, // 账号状态激活 + DeptId: 101, // 归属部门为根节点 + CreateBy: sType, // 创建来源 + } - // 验证缓存记录次数 - retryKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) - retryCount, err := redis.Get("", retryKey) - if retryCount == "" || err != nil { - retryCount = "0" + // 新增用户的角色管理 + sysUser.RoleIds = []int64{5} + // 新增用户的岗位管理 + sysUser.PostIds = []int64{} + + insertId := s.sysUserService.Insert(sysUser) + if insertId > 0 { + sysUser.UserId = insertId } - // 是否超过错误值 - retryCountInt64 := parse.Number(retryCount) - if retryCountInt64 >= int64(maxRetryCount) { - // msg := fmt.Sprintf("密码输入错误 %d 次,帐户锁定 %d 分钟", maxRetryCount, lockTime) - msg := fmt.Errorf("login.errRetryPasswd") // 密码输入错误多次,帐户已被锁定 - return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, fmt.Errorf("%s", msg) - } - return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil -} - -// PasswordCountOrExpireTime 首次登录或密码过期时间 -func (s Account) PasswordCountOrExpireTime(loginCount, passwordUpdateTime int64) (bool, error) { - forcePasswdChange := false - // 从数据库配置获取-首次登录密码修改 - fristPasswdChangeStr := s.sysConfigService.FindValueByKey("sys.user.fristPasswdChange") - if parse.Boolean(fristPasswdChangeStr) { - forcePasswdChange = loginCount < 1 || passwordUpdateTime == 0 - } - - // 非首次登录,判断密码是否过期 - if !forcePasswdChange { - alert, err := s.sysUserService.ValidatePasswordExpireTime(passwordUpdateTime) - if err != nil { - return alert, err - } - forcePasswdChange = alert - } - return forcePasswdChange, nil -} - -// RoleAndMenuPerms 角色和菜单数据权限 -func (s Account) RoleAndMenuPerms(userId int64, isSystemUser bool) ([]string, []string) { - if isSystemUser { - return []string{constants.SYS_ROLE_SYSTEM_KEY}, []string{constants.SYS_PERMISSION_SYSTEM} - } - // 角色key - var roleGroup []string - roles := s.sysRoleService.FindByUserId(userId) - for _, role := range roles { - roleGroup = append(roleGroup, role.RoleKey) - } - // 菜单权限key - perms := s.sysMenuService.FindPermsByUserId(userId) - return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) -} - -// RouteMenus 前端路由所需要的菜单 -func (s Account) RouteMenus(userId int64, isSystemUser bool) []systemModelVO.Router { - var buildMenus []systemModelVO.Router - if isSystemUser { - menus := s.sysMenuService.BuildTreeMenusByUserId(0) - buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") - } else { - menus := s.sysMenuService.BuildTreeMenusByUserId(userId) - buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") - } - return buildMenus + return s.sysUserService.FindByUserName(username, sType, uid) } diff --git a/src/modules/auth/service/account_info.go b/src/modules/auth/service/account_info.go new file mode 100644 index 00000000..5c22a16b --- /dev/null +++ b/src/modules/auth/service/account_info.go @@ -0,0 +1,36 @@ +package service + +import ( + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/parse" + systemModelVO "be.ems/src/modules/system/model/vo" +) + +// RoleAndMenuPerms 角色和菜单数据权限 +func (s Account) RoleAndMenuPerms(userId int64, isSystemUser bool) ([]string, []string) { + if isSystemUser { + return []string{constants.SYS_ROLE_SYSTEM_KEY}, []string{constants.SYS_PERMISSION_SYSTEM} + } + // 角色key + var roleGroup []string + roles := s.sysRoleService.FindByUserId(userId) + for _, role := range roles { + roleGroup = append(roleGroup, role.RoleKey) + } + // 菜单权限key + perms := s.sysMenuService.FindPermsByUserId(userId) + return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) +} + +// RouteMenus 前端路由所需要的菜单 +func (s Account) RouteMenus(userId int64, isSystemUser bool) []systemModelVO.Router { + var buildMenus []systemModelVO.Router + if isSystemUser { + menus := s.sysMenuService.BuildTreeMenusByUserId(0) + buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") + } else { + menus := s.sysMenuService.BuildTreeMenusByUserId(userId) + buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") + } + return buildMenus +} diff --git a/src/modules/auth/service/account_ldap.go b/src/modules/auth/service/account_ldap.go new file mode 100644 index 00000000..999fba21 --- /dev/null +++ b/src/modules/auth/service/account_ldap.go @@ -0,0 +1,108 @@ +package service + +import ( + "encoding/json" + "fmt" + + "github.com/go-ldap/ldap/v3" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/auth/model" + systemModelVo "be.ems/src/modules/system/model/vo" +) + +// ByLDAP 登录创建用户信息 +func (s *Account) ByLDAP(body model.LoginSourceBody) (token.UserInfo, error) { + info := token.UserInfo{} + rows := s.sysLogSourceService.FindByActive(body.UID) + if len(rows) != 1 { + return info, fmt.Errorf("ldap auth source not exist") + } + item := rows[0] + if item.Config == "" { + return info, fmt.Errorf("ldap auth source config is empty") + } + var source systemModelVo.SysLoginSourceLDAP + if err := json.Unmarshal([]byte(item.Config), &source); err != nil { + return info, err + } + + // 校验LDAP用户 + err := ldapAuth(source, body.Username, body.Password) + if err != nil { + return info, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.FindByUserName(body.Username, item.Type, item.UID) + if sysUser.UserId == 0 || sysUser.UserName == "" { + sysUser = s.initLoginSourceUser(item.UID, item.Type, body.Username, body.Password) + } + if sysUser.UserId == 0 || sysUser.UserName != body.Username { + return info, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == constants.STATUS_YES { + return info, fmt.Errorf("login.errDelFlag") + } + if sysUser.StatusFlag == constants.STATUS_NO { + return info, fmt.Errorf("login.errStatus") + } + + // 登录用户信息 + info.UserId = sysUser.UserId + info.DeptId = sysUser.DeptId + info.User = sysUser + // 用户权限组标识 + if config.IsSystemUser(sysUser.UserId) { + info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} + } else { + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + info.Permissions = parse.RemoveDuplicates(perms) + } + return info, nil +} + +// ldapAuth 校验LDAP用户 +func ldapAuth(source systemModelVo.SysLoginSourceLDAP, username, password string) error { + // 连接LDAP + l, err := ldap.DialURL(source.URL) + if err != nil { + return err + } + defer l.Close() + + // 绑定DN校验 + if source.BindDN != "" && source.BindPassword != "" { + if err := l.Bind(source.BindDN, source.BindPassword); err != nil { + return fmt.Errorf("ldap user bind %s", err) + } + } + + // 搜索用户 + searchRequest := ldap.NewSearchRequest( + source.BaseDN, + ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, + fmt.Sprintf(source.UserFilter, ldap.EscapeFilter(username)), + []string{"dn", "uid"}, + nil, + ) + sr, err := l.Search(searchRequest) + if err != nil { + return fmt.Errorf("ldap user search %s", err) + } + // for _, entry := range sr.Entries { + // fmt.Printf("%s ==== %v\n", entry.DN, entry.GetAttributeValue("uid")) + // } + if len(sr.Entries) != 1 { + return fmt.Errorf("ldap user does not exist or too many entries returned") + } + + // 校验密码 + if err = l.Bind(sr.Entries[0].DN, password); err != nil { + return fmt.Errorf("ldap user bind %s", err) + } + return nil +} diff --git a/src/modules/auth/service/account_oauth2.go b/src/modules/auth/service/account_oauth2.go new file mode 100644 index 00000000..c9c51d9e --- /dev/null +++ b/src/modules/auth/service/account_oauth2.go @@ -0,0 +1,168 @@ +package service + +import ( + "context" + "encoding/json" + "fmt" + "reflect" + "strings" + "time" + + "golang.org/x/oauth2" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/auth/model" + systemModelVo "be.ems/src/modules/system/model/vo" +) + +// ByOAuth2CodeURL 获取OAuth2登录URL +func (s *Account) ByOAuth2CodeURL(state string) (string, error) { + rows := s.sysLogSourceService.FindByActive(state) + if len(rows) != 1 { + return "", fmt.Errorf("oauth2 auth source not exist") + } + item := rows[0] + if item.Config == "" { + return "", fmt.Errorf("oauth2 auth source config is empty") + } + var source systemModelVo.SysLoginSourceOAuth2 + json.Unmarshal([]byte(item.Config), &source) + + conf := oauth2.Config{ + ClientID: source.ClientID, + ClientSecret: source.ClientSecret, + RedirectURL: source.RedirectURL, + Scopes: source.Scopes, + Endpoint: oauth2.Endpoint{ + AuthURL: source.AuthURL, + TokenURL: source.TokenURL, + }, + } + return conf.AuthCodeURL(state, oauth2.AccessTypeOffline), nil +} + +// ByOAuth2 登录创建用户信息 +func (s *Account) ByOAuth2(body model.LoginSourceOauth2Body) (token.UserInfo, error) { + info := token.UserInfo{} + rows := s.sysLogSourceService.FindByActive(body.State) + if len(rows) != 1 { + return info, fmt.Errorf("oauth2 auth source not exist") + } + item := rows[0] + if item.Config == "" { + return info, fmt.Errorf("oauth2 auth source config is empty") + } + var source systemModelVo.SysLoginSourceOAuth2 + if err := json.Unmarshal([]byte(item.Config), &source); err != nil { + return info, err + } + + // 校验OAuth2用户 + account, err := oauth2Auth(source, body.Code) + if err != nil { + return info, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.FindByUserName(account, item.Type, item.UID) + if sysUser.UserId == 0 || sysUser.UserName == "" { + sysUser = s.initLoginSourceUser(item.UID, item.Type, account, account) + } + if sysUser.UserId == 0 || sysUser.UserName != account { + return info, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == constants.STATUS_YES { + return info, fmt.Errorf("login.errDelFlag") + } + if sysUser.StatusFlag == constants.STATUS_NO { + return info, fmt.Errorf("login.errStatus") + } + + // 登录用户信息 + info.UserId = sysUser.UserId + info.DeptId = sysUser.DeptId + info.User = sysUser + // 用户权限组标识 + if config.IsSystemUser(sysUser.UserId) { + info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} + } else { + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + info.Permissions = parse.RemoveDuplicates(perms) + } + return info, nil +} + +// oauth2Auth 校验OAuth2用户 +func oauth2Auth(source systemModelVo.SysLoginSourceOAuth2, code string) (string, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + conf := oauth2.Config{ + ClientID: source.ClientID, + ClientSecret: source.ClientSecret, + RedirectURL: source.RedirectURL, + Scopes: source.Scopes, + Endpoint: oauth2.Endpoint{ + AuthURL: source.AuthURL, + TokenURL: source.TokenURL, + }, + } + token, err := conf.Exchange(ctx, code) + if err != nil { + return "", err + } + // 使用token创建HTTP客户端 请求用户信息 + resp, err := conf.Client(ctx, token).Get(source.UserURL) + if err != nil { + return "", err + } + defer resp.Body.Close() + // 解析用户信息 + var userInfo map[string]any + if err := json.NewDecoder(resp.Body).Decode(&userInfo); err != nil { + return "", err + } + + // 读取嵌套数据 + value, found := getValueByPath(userInfo, source.AccountField) + if !found { + return "", fmt.Errorf("oauth2 auth source account field not exist") + } + return fmt.Sprintf("%v", value), nil +} + +// getValueByPath 从嵌套的 map[string]any 获取嵌套键对应的值 +func getValueByPath(data map[string]any, path string) (any, bool) { + keys := strings.Split(path, ".") // 按照 "." 拆分路径 + return getValue(data, keys) +} + +// getValue 是递归查找嵌套 map 的函数 +func getValue(data map[string]any, keys []string) (any, bool) { + if len(keys) == 0 { + return data, false + } + + // 获取当前键 + key := keys[0] + + // 获取当前键的值 + val, ok := data[key] + if !ok { + return nil, false // 找不到键,返回 false + } + + // 如果还有嵌套键,继续查找 + if len(keys) > 1 { + // 递归查找嵌套 map + if reflect.TypeOf(val).Kind() == reflect.Map { + // 将 `any` 转换为 `map[string]any` 类型 + if nestedMap, ok := val.(map[string]any); ok { + return getValue(nestedMap, keys[1:]) + } + } + } + return val, true +} diff --git a/src/modules/auth/service/account_smtp.go b/src/modules/auth/service/account_smtp.go new file mode 100644 index 00000000..020cd4e4 --- /dev/null +++ b/src/modules/auth/service/account_smtp.go @@ -0,0 +1,88 @@ +package service + +import ( + "context" + "crypto/tls" + "encoding/json" + "fmt" + + "github.com/wneessen/go-mail" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/auth/model" + systemModelVo "be.ems/src/modules/system/model/vo" +) + +// BySMTP 登录创建用户信息 +func (s *Account) BySMTP(body model.LoginSourceBody) (token.UserInfo, error) { + info := token.UserInfo{} + rows := s.sysLogSourceService.FindByActive(body.UID) + if len(rows) != 1 { + return info, fmt.Errorf("smtp auth source not exist") + } + item := rows[0] + if item.Config == "" { + return info, fmt.Errorf("smtp auth source config is empty") + } + var source systemModelVo.SysLoginSourceSMTP + if err := json.Unmarshal([]byte(item.Config), &source); err != nil { + return info, err + } + + // 校验SMTP用户 + err := smtpAuth(source, body.Username, body.Password) + if err != nil { + return info, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.FindByUserName(body.Username, item.Type, item.UID) + if sysUser.UserId == 0 || sysUser.UserName == "" { + sysUser = s.initLoginSourceUser(item.UID, item.Type, body.Username, body.Password) + } + if sysUser.UserId == 0 || sysUser.UserName != body.Username { + return info, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == constants.STATUS_YES { + return info, fmt.Errorf("login.errDelFlag") + } + if sysUser.StatusFlag == constants.STATUS_NO { + return info, fmt.Errorf("login.errStatus") + } + + // 登录用户信息 + info.UserId = sysUser.UserId + info.DeptId = sysUser.DeptId + info.User = sysUser + // 用户权限组标识 + if config.IsSystemUser(sysUser.UserId) { + info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} + } else { + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + info.Permissions = parse.RemoveDuplicates(perms) + } + return info, nil +} + +// smtpAuth 校验SMTP用户 +func smtpAuth(source systemModelVo.SysLoginSourceSMTP, username, password string) error { + client, err := mail.NewClient(source.Host, + mail.WithSMTPAuth(mail.SMTPAuthAutoDiscover), + mail.WithUsername(username), + mail.WithPort(source.Port), + mail.WithPassword(password), + mail.WithTLSConfig(&tls.Config{InsecureSkipVerify: true}), + ) + if err != nil { + return fmt.Errorf("failed to create mail client %s", err) + } + // 连接到邮件SMTP服务器 + if err = client.DialWithContext(context.Background()); err != nil { + return err + } + defer client.Close() + return nil +} diff --git a/src/modules/auth/service/account_sysstem.go b/src/modules/auth/service/account_sysstem.go new file mode 100644 index 00000000..21b45238 --- /dev/null +++ b/src/modules/auth/service/account_sysstem.go @@ -0,0 +1,138 @@ +package service + +import ( + "fmt" + "time" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" +) + +// ValidateCaptcha 校验验证码 +func (s Account) ValidateCaptcha(code, uuid string) error { + // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 + captchaEnabledStr := s.sysConfigService.FindValueByKey("sys.account.captchaEnabled") + if !parse.Boolean(captchaEnabledStr) { + return nil + } + if code == "" || uuid == "" { + // 验证码信息错误 + return fmt.Errorf("captcha.err") + } + verifyKey := constants.CACHE_CAPTCHA_CODE + ":" + 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 +} + +// ByUsername 登录创建用户信息 +func (s Account) ByUsername(username, password string) (token.UserInfo, error) { + info := token.UserInfo{} + + // 检查密码重试次数 + retryKey, retryCount, lockTime, err := s.passwordRetryCount(username) + if err != nil { + return info, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.FindByUserName(username, "System", "#") + if sysUser.UserName != username { + return info, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == constants.STATUS_YES { + return info, fmt.Errorf("login.errDelFlag") + } + if sysUser.StatusFlag == constants.STATUS_NO { + return info, fmt.Errorf("login.errStatus") + } + + // 检验用户密码 + compareBool := crypto.BcryptCompare(password, sysUser.Password) + if compareBool { + s.CleanLoginRecordCache(sysUser.UserName) // 清除错误记录次数 + } else { + _ = redis.Set("", retryKey, retryCount+1, lockTime) + return info, fmt.Errorf("login.errNameOrPasswd") + } + + // 登录用户信息 + info.UserId = sysUser.UserId + info.DeptId = sysUser.DeptId + info.User = sysUser + // 用户权限组标识 + if config.IsSystemUser(sysUser.UserId) { + info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} + } else { + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + info.Permissions = parse.RemoveDuplicates(perms) + } + return info, nil +} + +// CleanLoginRecordCache 清除错误记录次数 +func (s Account) CleanLoginRecordCache(userName string) bool { + cacheKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) + hasKey, err := redis.Has("", cacheKey) + if hasKey > 0 && err == nil { + return redis.Del("", cacheKey) == nil + } + return false +} + +// passwordRetryCount 密码重试次数 +func (s Account) passwordRetryCount(userName string) (string, int64, time.Duration, error) { + // 从数据库配置获取登录次数和错误锁定时间 + maxRetryCountStr := s.sysConfigService.FindValueByKey("sys.user.maxRetryCount") + lockTimeStr := s.sysConfigService.FindValueByKey("sys.user.lockTime") + // 验证登录次数和错误锁定时间 + maxRetryCount := parse.Number(maxRetryCountStr) + lockTime := parse.Number(lockTimeStr) + + // 验证缓存记录次数 + retryKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) + retryCount, err := redis.Get("", retryKey) + if retryCount == "" || err != nil { + retryCount = "0" + } + // 是否超过错误值 + retryCountInt64 := parse.Number(retryCount) + if retryCountInt64 >= int64(maxRetryCount) { + // msg := fmt.Sprintf("密码输入错误 %d 次,帐户锁定 %d 分钟", maxRetryCount, lockTime) + msg := fmt.Errorf("login.errRetryPasswd") // 密码输入错误多次,帐户已被锁定 + return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, fmt.Errorf("%s", msg) + } + return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil +} + +// PasswordCountOrExpireTime 首次登录或密码过期时间 +func (s Account) PasswordCountOrExpireTime(loginCount, passwordUpdateTime int64) (bool, error) { + forcePasswdChange := false + // 从数据库配置获取-首次登录密码修改 + fristPasswdChangeStr := s.sysConfigService.FindValueByKey("sys.user.fristPasswdChange") + if parse.Boolean(fristPasswdChangeStr) { + forcePasswdChange = loginCount < 1 || passwordUpdateTime == 0 + } + + // 非首次登录,判断密码是否过期 + if !forcePasswdChange { + alert, err := s.sysUserService.ValidatePasswordExpireTime(passwordUpdateTime) + if err != nil { + return alert, err + } + forcePasswdChange = alert + } + return forcePasswdChange, nil +} diff --git a/src/modules/oauth2/service/oauth2.go b/src/modules/auth/service/oauth2.go similarity index 96% rename from src/modules/oauth2/service/oauth2.go rename to src/modules/auth/service/oauth2.go index 3ca444c4..81b29c77 100644 --- a/src/modules/oauth2/service/oauth2.go +++ b/src/modules/auth/service/oauth2.go @@ -10,8 +10,8 @@ import ( "be.ems/src/framework/token" "be.ems/src/framework/utils/crypto" "be.ems/src/framework/utils/generate" - "be.ems/src/modules/oauth2/model" - "be.ems/src/modules/oauth2/repository" + "be.ems/src/modules/auth/model" + "be.ems/src/modules/auth/repository" ) // NewOauth2Service 实例化服务层 diff --git a/src/modules/oauth2/service/oauth2_client.go b/src/modules/auth/service/oauth2_client.go similarity index 87% rename from src/modules/oauth2/service/oauth2_client.go rename to src/modules/auth/service/oauth2_client.go index 6edc055f..de44d6c0 100644 --- a/src/modules/oauth2/service/oauth2_client.go +++ b/src/modules/auth/service/oauth2_client.go @@ -4,8 +4,8 @@ import ( "fmt" "be.ems/src/framework/utils/generate" - "be.ems/src/modules/oauth2/model" - "be.ems/src/modules/oauth2/repository" + "be.ems/src/modules/auth/model" + "be.ems/src/modules/auth/repository" ) // NewOauth2ClientService 实例化服务层 @@ -55,11 +55,11 @@ func (s Oauth2ClientService) DeleteByIds(ids []int64) (int64, error) { arr := s.oauth2ClientRepository.SelectByIds(ids) if len(arr) <= 0 { // return 0, fmt.Errorf("没有权限访问用户授权第三方应用数据!") - return 0, fmt.Errorf("No permission to access user-authorized third-party application data!") + return 0, fmt.Errorf("no permission to access user-authorized third-party application data") } if len(arr) == len(ids) { return s.oauth2ClientRepository.DeleteByIds(ids), nil } // return 0, fmt.Errorf("删除用户授权第三方应用信息失败!") - return 0, fmt.Errorf("Failed to delete user-authorized third-party application information!") + return 0, fmt.Errorf("failed to delete user-authorized third-party application information") } diff --git a/src/modules/oauth2/service/oauth2_log_login.go b/src/modules/auth/service/oauth2_log_login.go similarity index 96% rename from src/modules/oauth2/service/oauth2_log_login.go rename to src/modules/auth/service/oauth2_log_login.go index e400fa9c..cd30dc01 100644 --- a/src/modules/oauth2/service/oauth2_log_login.go +++ b/src/modules/auth/service/oauth2_log_login.go @@ -6,8 +6,8 @@ import ( "be.ems/src/framework/constants" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" - "be.ems/src/modules/oauth2/model" - "be.ems/src/modules/oauth2/repository" + "be.ems/src/modules/auth/model" + "be.ems/src/modules/auth/repository" ) // NewOauth2LogLogin 实例化服务层 diff --git a/src/modules/auth/service/register.go b/src/modules/auth/service/register.go index 39903be2..9dca45c4 100644 --- a/src/modules/auth/service/register.go +++ b/src/modules/auth/service/register.go @@ -61,12 +61,14 @@ func (s Register) ByUserName(username, password string) (int64, error) { sysUser := systemModel.SysUser{ UserName: username, - NickName: username, // 昵称使用名称账号 - Password: password, // 原始密码 + NickName: username, // 昵称使用名称账号 + Password: password, // 原始密码 + UserType: "System", + UserSource: "#", Sex: "0", // 性别未选择 StatusFlag: constants.STATUS_YES, // 账号状态激活 - DeptId: 100, // 归属部门为根节点 - CreateBy: "register", // 创建来源 + DeptId: 101, // 归属部门为根节点 + CreateBy: "System", // 创建来源 } // 新增用户的角色管理 diff --git a/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go b/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go index c04b6781..755e1d6f 100644 --- a/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go +++ b/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go @@ -15,7 +15,6 @@ import ( "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" - neDataModel "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neModel "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" @@ -23,26 +22,20 @@ import ( ) var NewProcessor = &BackupExportCDRProcessor{ - count: 0, - backupService: neDataService.NewBackup, - sysDictService: systemService.NewSysDictData, - neInfoService: neService.NewNeInfo, - imsCDREventService: neDataService.NewCDREventIMS, - smscCDREventService: neDataService.NewCDREventSMSC, - smfCDREventService: neDataService.NewCDREventSMF, - sgwcCDREventService: neDataService.NewCDREventSGWC, + count: 0, + backupService: neDataService.NewBackup, + sysDictService: systemService.NewSysDictData, + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREvent, } // BackupExportCDR 队列任务处理 type BackupExportCDRProcessor struct { - count int // 执行次数 - backupService *neDataService.Backup // 备份相关服务 - sysDictService *systemService.SysDictData // 字典类型数据服务 - neInfoService *neService.NeInfo // 网元信息服务 - imsCDREventService *neDataService.CDREventIMS // IMS-CDR会话事件服务 - smscCDREventService *neDataService.CDREventSMSC // SMSC-CDR会话事件服务 - smfCDREventService *neDataService.CDREventSMF // SMF-CDR会话事件服务 - sgwcCDREventService *neDataService.CDREventSGWC // SGWC-CDR会话事件服务 + count int // 执行次数 + backupService *neDataService.Backup // 备份相关服务 + sysDictService *systemService.SysDictData // 字典类型数据服务 + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREvent // CDR会话事件服务 } func (s *BackupExportCDRProcessor) Execute(data any) (any, error) { @@ -104,16 +97,16 @@ func (s BackupExportCDRProcessor) exportIMS(hour int, rmUID, fileType string) st start := end.Add(-time.Duration(hour) * time.Hour) language := "en" - query := neDataModel.CDREventIMSQuery{ - SortField: "timestamp", - SortOrder: "asc", - RmUID: rmUID, - BeginTime: start.UnixMilli(), - EndTime: end.UnixMilli(), - PageNum: 1, - PageSize: 30000, + query := map[string]string{ + "sortField": "timestamp", + "sortOrder": "asc", + "rmUID": rmUID, + "beginTime": fmt.Sprint(start.UnixMilli()), + "endTime": fmt.Sprint(end.UnixMilli()), + "pageNum": fmt.Sprint(1), + "pageSize": fmt.Sprint(30000), } - rows, total := s.imsCDREventService.FindByPage(query) + rows, total := s.cdrEventService.FindByPage("IMS", query) if total == 0 { return "no data" } @@ -393,16 +386,16 @@ func (s BackupExportCDRProcessor) exportSMSC(hour int, rmUID, fileType string) s start := end.Add(-time.Duration(hour) * time.Hour) language := "en" - query := neDataModel.CDREventSMSCQuery{ - SortField: "timestamp", - SortOrder: "asc", - RmUID: rmUID, - BeginTime: start.UnixMilli(), - EndTime: end.UnixMilli(), - PageNum: 1, - PageSize: 30000, + query := map[string]string{ + "sortField": "timestamp", + "sortOrder": "asc", + "rmUID": rmUID, + "beginTime": fmt.Sprint(start.UnixMilli()), + "endTime": fmt.Sprint(end.UnixMilli()), + "pageNum": fmt.Sprint(1), + "pageSize": fmt.Sprint(30000), } - rows, total := s.smscCDREventService.FindByPage(query) + rows, total := s.cdrEventService.FindByPage("SMSC", query) if total == 0 { return "no data" } @@ -609,16 +602,16 @@ func (s BackupExportCDRProcessor) exportSMF(hour int, rmUID, fileType string) st end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) start := end.Add(-time.Duration(hour) * time.Hour) - query := neDataModel.CDREventSMFQuery{ - SortField: "timestamp", - SortOrder: "asc", - RmUID: rmUID, - BeginTime: start.UnixMilli(), - EndTime: end.UnixMilli(), - PageNum: 1, - PageSize: 30000, + query := map[string]string{ + "sortField": "timestamp", + "sortOrder": "asc", + "rmUID": rmUID, + "beginTime": fmt.Sprint(start.UnixMilli()), + "endTime": fmt.Sprint(end.UnixMilli()), + "pageNum": fmt.Sprint(1), + "pageSize": fmt.Sprint(30000), } - rows, total := s.smfCDREventService.FindByPage(query) + rows, total := s.cdrEventService.FindByPage("SMF", query) if total == 0 { return "no data" } @@ -1017,16 +1010,16 @@ func (s BackupExportCDRProcessor) exportSGWC(hour int, rmUID, fileType string) s end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) start := end.Add(-time.Duration(hour) * time.Hour) - query := neDataModel.CDREventSGWCQuery{ - SortField: "timestamp", - SortOrder: "asc", - RmUID: rmUID, - BeginTime: start.UnixMilli(), - EndTime: end.UnixMilli(), - PageNum: 1, - PageSize: 30000, + query := map[string]string{ + "sortField": "timestamp", + "sortOrder": "asc", + "rmUID": rmUID, + "beginTime": fmt.Sprint(start.UnixMilli()), + "endTime": fmt.Sprint(end.UnixMilli()), + "pageNum": fmt.Sprint(1), + "pageSize": fmt.Sprint(30000), } - rows, total := s.sgwcCDREventService.FindByPage(query) + rows, total := s.cdrEventService.FindByPage("SGWC", query) if total == 0 { return "no data" } diff --git a/src/modules/crontask/processor/backup_export_table/backup_export_table.go b/src/modules/crontask/processor/backup_export_table/backup_export_table.go index 554eb4dd..d540038f 100644 --- a/src/modules/crontask/processor/backup_export_table/backup_export_table.go +++ b/src/modules/crontask/processor/backup_export_table/backup_export_table.go @@ -15,21 +15,22 @@ import ( "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" - neDataModel "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" systemModel "be.ems/src/modules/system/model" systemService "be.ems/src/modules/system/service" ) var NewProcessor = &BackupExportTableProcessor{ - backupService: neDataService.NewBackup, - count: 0, + backupService: neDataService.NewBackup, + cdrEventService: neDataService.NewCDREvent, + count: 0, } // BackupExportTable 备份导出数据表 type BackupExportTableProcessor struct { - backupService *neDataService.Backup // 备份相关服务 - count int // 执行次数 + backupService *neDataService.Backup // 备份相关服务 + cdrEventService *neDataService.CDREvent // CDR会话事件服务 + count int // 执行次数 } func (s *BackupExportTableProcessor) Execute(data any) (any, error) { @@ -197,13 +198,13 @@ func (s BackupExportTableProcessor) exportSMF(hour int, columns []string, filePa start := end.Add(-time.Duration(hour) * time.Hour) // 查询数据 - rows := []neDataModel.CDREventSMF{} - tx := db.DB("").Model(&neDataModel.CDREventSMF{}) - tx = tx.Where("created_at >= ? and created_at <= ?", start.UnixMilli(), end.UnixMilli()) - if err := tx.Find(&rows).Error; err != nil { - return 0, err - } - if len(rows) <= 0 { + rows, total := s.cdrEventService.FindByPage("SMF", map[string]string{ + "sortField": "created_at", + "sortOrder": "asc", + "beginTime": fmt.Sprint(start.UnixMilli()), + "endTime": fmt.Sprint(end.UnixMilli()), + }) + if total <= 0 { return 0, nil } @@ -417,7 +418,7 @@ func (s BackupExportTableProcessor) exportSMF(hour int, columns []string, filePa err := file.WriterFileCSV(data, filePath) - return tx.RowsAffected, err + return total, err } // exportIMS 导出csv @@ -428,13 +429,13 @@ func (s BackupExportTableProcessor) exportIMS(hour int, columns []string, filePa start := end.Add(-time.Duration(hour) * time.Hour) // 查询数据 - rows := []neDataModel.CDREventIMS{} - tx := db.DB("").Model(&neDataModel.CDREventIMS{}) - tx = tx.Where("created_at >= ? and created_at <= ?", start.UnixMilli(), end.UnixMilli()) - if err := tx.Find(&rows).Error; err != nil { - return 0, err - } - if len(rows) <= 0 { + rows, total := s.cdrEventService.FindByPage("IMS", map[string]string{ + "sortField": "created_at", + "sortOrder": "asc", + "beginTime": fmt.Sprint(start.UnixMilli()), + "endTime": fmt.Sprint(end.UnixMilli()), + }) + if total <= 0 { return 0, nil } @@ -561,7 +562,7 @@ func (s BackupExportTableProcessor) exportIMS(hour int, columns []string, filePa err := file.WriterFileCSV(data, filePath) - return tx.RowsAffected, err + return total, err } // exportSMSC 导出csv @@ -572,13 +573,13 @@ func (s BackupExportTableProcessor) exportSMSC(hour int, columns []string, fileP start := end.Add(-time.Duration(hour) * time.Hour) // 查询数据 - rows := []neDataModel.CDREventSMSC{} - tx := db.DB("").Model(&neDataModel.CDREventSMSC{}) - tx = tx.Where("created_at >= ? and created_at <= ?", start.UnixMilli(), end.UnixMilli()) - if err := tx.Find(&rows).Error; err != nil { - return 0, err - } - if len(rows) <= 0 { + rows, total := s.cdrEventService.FindByPage("SMS", map[string]string{ + "sortField": "created_at", + "sortOrder": "asc", + "beginTime": fmt.Sprint(start.UnixMilli()), + "endTime": fmt.Sprint(end.UnixMilli()), + }) + if total <= 0 { return 0, nil } @@ -686,7 +687,7 @@ func (s BackupExportTableProcessor) exportSMSC(hour int, columns []string, fileP err := file.WriterFileCSV(data, filePath) - return tx.RowsAffected, err + return total, err } // exportSGWC 导出csv @@ -697,13 +698,13 @@ func (s BackupExportTableProcessor) exportSGWC(hour int, columns []string, fileP start := end.Add(-time.Duration(hour) * time.Hour) // 查询数据 - rows := []neDataModel.CDREventSMSC{} - tx := db.DB("").Model(&neDataModel.CDREventSMSC{}) - tx = tx.Where("created_at >= ? and created_at <= ?", start.UnixMilli(), end.UnixMilli()) - if err := tx.Find(&rows).Error; err != nil { - return 0, err - } - if len(rows) <= 0 { + rows, total := s.cdrEventService.FindByPage("SGWC", map[string]string{ + "sortField": "created_at", + "sortOrder": "asc", + "beginTime": fmt.Sprint(start.UnixMilli()), + "endTime": fmt.Sprint(end.UnixMilli()), + }) + if total <= 0 { return 0, nil } @@ -923,5 +924,5 @@ func (s BackupExportTableProcessor) exportSGWC(hour int, columns []string, fileP err := file.WriterFileCSV(data, filePath) - return tx.RowsAffected, err + return total, err } diff --git a/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go b/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go index f2d6e9a7..e79e6f1d 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go +++ b/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go @@ -5,33 +5,26 @@ import ( "fmt" "time" + "github.com/tsmask/go-oam" + "be.ems/src/framework/constants" "be.ems/src/framework/cron" "be.ems/src/framework/logger" "be.ems/src/framework/utils/parse" - - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" neModel "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" - wsService "be.ems/src/modules/ws/service" + oamService "be.ems/src/modules/oam/service" ) var NewProcessor = &NeAlarmStateCheckProcessor{ - neConfigBackupService: neService.NewNeConfigBackup, - neInfoService: neService.NewNeInfo, - alarmService: neDataService.NewAlarm, - wsSendService: wsService.NewWSSend, - count: 0, + neInfoService: neService.NewNeInfo, + count: 0, } // NeAlarmStateCheckProcessor 网元告警状态检查 type NeAlarmStateCheckProcessor struct { - neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 - neInfoService *neService.NeInfo // 网元信息服务 - alarmService *neDataService.Alarm // 告警信息服务 - wsSendService *wsService.WSSend // ws发送服务 - count int // 执行次数 + neInfoService *neService.NeInfo // 网元信息服务 + count int // 执行次数 } // alarmParams 告警参数 @@ -69,104 +62,37 @@ func (s *NeAlarmStateCheckProcessor) Execute(data any) (any, error) { if neInfo.CreateTime == 0 { continue } - neTypeAndId := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId) + // 网元在线状态 isOnline := parse.Boolean(neInfo.ServerState["online"]) // 告警ID params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_STATE_CHECK, neInfo.CreateTime) - // 检查网元告警ID是否唯一 - alarmIdArr := s.alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: params.AlarmId, - }) - // 告警状态 - alarmStatus := "" - if len(alarmIdArr) > 0 { - alarmStatus = fmt.Sprint(alarmIdArr[0].AlarmStatus) - } - // 在线且状态为活动告警 - if isOnline && alarmStatus == "1" { - // 进行清除 - clearAlarm, err := s.alarmClear(neInfo, alarmIdArr[0]) - if err != nil { - result[neTypeAndId] = err.Error() - continue - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - s.wsSendService.ByGroupID(groupID, clearAlarm) - result[neTypeAndId] = "alarm clear" - } - // 不在线 - if !isOnline && alarmStatus == "" { - // 进行新增 - newAlarm, err := s.alarmNew(neInfo, params) - if err != nil { - result[neTypeAndId] = err.Error() - continue - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - s.wsSendService.ByGroupID(groupID, newAlarm) - result[neTypeAndId] = "alarm new" + // 告警状态 + alarmStatus := oam.ALARM_STATUS_ACTIVE + if isOnline { + alarmStatus = oam.ALARM_STATUS_CLEAR + } + // 创建告警 + alarm := oam.Alarm{ + NeUid: neInfo.RmUID, // 网元唯一标识 + AlarmTime: time.Now().UnixMilli(), // 事件产生时间 + AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应 + AlarmCode: constants.ALARM_STATE_CHECK, // 告警状态码 + AlarmType: params.AlarmType, // 告警类型 + AlarmTitle: params.AlarmTitle, // 告警标题 + PerceivedSeverity: params.OrigSeverity, // 告警级别 + AlarmStatus: alarmStatus, // 告警状态 + SpecificProblem: params.SpecificProblem, // 告警问题原因 + SpecificProblemID: params.SpecificProblemID, // 告警问题原因ID + AddInfo: params.AddInfo, // 告警辅助信息 + LocationInfo: "NE State: Heartbeat", // 告警定位信息 + } + if err = oamService.NewAlarm.Resolve(alarm); err == nil { + result[neInfo.RmUID] = "state alarm" } } // 返回结果,用于记录执行结果 return result, nil } - -// alarmClear 清除告警 -func (s NeAlarmStateCheckProcessor) alarmClear(neInfo neModel.NeInfo, v neDataModel.Alarm) (neDataModel.Alarm, error) { - // 变更告警ID为告警清除ID - v.AlarmId = fmt.Sprintf("%d%d", v.AlarmCode, v.EventTime) - v.AlarmStatus = "0" - // 告警清除 - v.ClearType = 1 - v.ClearTime = neInfo.UpdateTime - v.ClearUser = "system" - rows := s.alarmService.Update(v) - if rows > 0 { - return v, nil - } - return neDataModel.Alarm{}, fmt.Errorf("clear alarm fail") -} - -// alarmNew 新增告警 -func (s NeAlarmStateCheckProcessor) alarmNew(neInfo neModel.NeInfo, v alarmParams) (neDataModel.Alarm, error) { - // seq 告警序号 - lastSeq := s.alarmService.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId) - lastTime := neInfo.UpdateTime // 网元最后更新时间 - if lastTime < neInfo.CreateTime { - lastTime = time.Now().UnixMilli() - } - alarm := neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - NeName: neInfo.NeName, - Province: neInfo.Province, - PvFlag: neInfo.PvFlag, - AlarmSeq: lastSeq + 1, - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: constants.ALARM_STATE_CHECK, - EventTime: lastTime, - AlarmType: v.AlarmType, - OrigSeverity: v.OrigSeverity, - PerceivedSeverity: v.OrigSeverity, - ObjectUid: neInfo.RmUID, - ObjectName: "NE State", - ObjectType: "state", - LocationInfo: "NE State: Heartbeat", - AlarmStatus: "1", // 活动告警 - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - insertId := s.alarmService.InsertAndForword(alarm) - if insertId > 0 { - alarm.ID = insertId - return alarm, nil - } - return neDataModel.Alarm{}, fmt.Errorf("new alarm fail") -} diff --git a/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go b/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go index 6a622081..12dc40ae 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go +++ b/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go @@ -10,6 +10,8 @@ import ( "sync" "time" + "github.com/tsmask/go-oam" + "be.ems/src/framework/constants" "be.ems/src/framework/cron" "be.ems/src/framework/logger" @@ -18,6 +20,7 @@ import ( neDataService "be.ems/src/modules/network_data/service" neModel "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" + oamService "be.ems/src/modules/oam/service" wsService "be.ems/src/modules/ws/service" ) @@ -28,22 +31,18 @@ var ( ) var NewProcessor = &NeAlarmStateCheckCMDProcessor{ - neConfigBackupService: neService.NewNeConfigBackup, - neInfoService: neService.NewNeInfo, - neStateService: neDataService.NewNEState, - alarmService: neDataService.NewAlarm, - wsSendService: wsService.NewWSSend, - count: 0, + neInfoService: neService.NewNeInfo, + neStateService: neDataService.NewNEState, + wsSendService: wsService.NewWSSend, + count: 0, } // NeAlarmStateCheckCMDProcessor 网元告警内存/CPU/磁盘检查 type NeAlarmStateCheckCMDProcessor struct { - neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 - neInfoService *neService.NeInfo // 网元信息服务 - neStateService *neDataService.NEState // 网元状态信息服务 - alarmService *neDataService.Alarm // 告警信息服务 - wsSendService *wsService.WSSend // ws发送服务 - count int // 执行次数 + neInfoService *neService.NeInfo // 网元信息服务 + neStateService *neDataService.NEState // 网元状态信息服务 + wsSendService *wsService.WSSend // ws发送服务 + count int // 执行次数 } // alarmParams 告警参数 @@ -103,65 +102,84 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) { } // 检查状态 - err := s.serverState(neInfo.ServerState, params.CPUUseGt, params.MemUseGt, params.DiskUseGt) + sysCpuUsage, sysMemUsage, sysDiskUsage := s.serverState(neInfo.ServerState) + // 检查CPU/Menory/Disk使用率 + warnMsg := []string{} + if int64(sysCpuUsage) >= params.CPUUseGt { + warnMsg = append(warnMsg, fmt.Sprintf("cpu usage %.2f%%", sysCpuUsage)) + } + if int64(sysMemUsage) >= params.MemUseGt { + warnMsg = append(warnMsg, fmt.Sprintf("memory usage %.2f%%", sysMemUsage)) + } + if int64(sysDiskUsage) >= params.DiskUseGt { + warnMsg = append(warnMsg, fmt.Sprintf("disk usage %.2f%%", sysDiskUsage)) + } + var err error + if len(warnMsg) > 0 { + currentTime := time.Now() + validTimes := []time.Time{} + if v, ok := triggerCount.Load(neInfo.RmUID); ok { + times := v.([]time.Time) + // 清理过期的记录:10秒前的触发记录不再计入 + for _, t := range times { + if currentTime.Sub(t) <= triggerWindow { + validTimes = append(validTimes, t) + } + } + validTimes = append(validTimes, currentTime) + triggerCount.Store(neInfo.RmUID, validTimes) + } else { + // 事件第一次触发,初始化记录 + validTimes = append(validTimes, currentTime) + triggerCount.Store(neInfo.RmUID, validTimes) + } + if int64(len(validTimes)) >= triggerMax { + err = fmt.Errorf("greater than %s", strings.Join(warnMsg, ", ")) + } + } + + // 检查状态连续触发 if err == nil { continue } + addInfo := params.AddInfo + if addInfo != "" { + addInfo = addInfo + ", " + err.Error() + } else { + addInfo = err.Error() + } - neTypeAndId := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId) + // 事件产生时间 + alarmTime := time.Now().UnixMilli() // 告警ID - params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_CMD_CHECK, neInfo.CreateTime) - // 检查网元告警ID是否唯一 - alarmIdArr := s.alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: params.AlarmId, - }) - // 告警状态, 存在的需要手动清除 - alarmStatus := "" - if len(alarmIdArr) > 0 { - alarmStatus = fmt.Sprint(alarmIdArr[0].AlarmStatus) + params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_CMD_CHECK, alarmTime) + // 创建告警 + alarm := oam.Alarm{ + NeUid: neInfo.RmUID, // 网元唯一标识 + AlarmTime: alarmTime, // 事件产生时间 + AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应 + AlarmCode: constants.ALARM_CMD_CHECK, // 告警状态码 + AlarmType: params.AlarmType, // 告警类型 + AlarmTitle: params.AlarmTitle, // 告警标题 + PerceivedSeverity: params.OrigSeverity, // 告警级别 + AlarmStatus: oam.ALARM_STATUS_ACTIVE, // 告警状态 + SpecificProblem: params.SpecificProblem, // 告警问题原因 + SpecificProblemID: params.SpecificProblemID, // 告警问题原因ID + AddInfo: addInfo, // 告警辅助信息 + LocationInfo: "NE CPU/Menory/Disk: Heartbeat", // 告警定位信息 } - // 活动告警进行清除 - if alarmStatus == "1" { - clearAlarm, err := s.alarmClear(neInfo, alarmIdArr[0]) - if err != nil { - result[neTypeAndId] = err.Error() - continue - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - s.wsSendService.ByGroupID(groupID, clearAlarm) - result[neTypeAndId] = "alarm clear" - alarmStatus = "" // 标记为未记录再次发起新告警 - } - // 未记录 - if alarmStatus == "" { - addInfo := params.AddInfo - if params.AddInfo != "" { - params.AddInfo = params.AddInfo + ", " + err.Error() - } else { - params.AddInfo = err.Error() - } - // 进行新增 - newAlarm, err := s.alarmNew(neInfo, params) - params.AddInfo = addInfo // 恢复附加信息 - triggerCount.Clear() // 重置连续触发次数 - if err != nil { - result[neTypeAndId] = err.Error() - continue - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - s.wsSendService.ByGroupID(groupID, newAlarm) - result[neTypeAndId] = "alarm new" + if err = oamService.NewAlarm.Resolve(alarm); err == nil { + result[neInfo.RmUID] = "cmd alarm" } + triggerCount.Delete(neInfo.RmUID) } // 返回结果,用于记录执行结果 return result, nil } -// serverState 网元状态 -func (s NeAlarmStateCheckCMDProcessor) serverState(state map[string]any, cpuUseGt, memUseGt, diskUseGt int64) error { +// serverState 网元状态记录 +func (s NeAlarmStateCheckCMDProcessor) serverState(state map[string]any) (float64, float64, float64) { // 网元CPU使用率 var nfCpuUsage float64 = 0 // CPU使用率 @@ -224,94 +242,5 @@ func (s NeAlarmStateCheckCMDProcessor) serverState(state map[string]any, cpuUseG groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_NE_STATE, neState.NeType, neState.NeId) s.wsSendService.ByGroupID(groupID, neState) - // 检查CPU/Menory/Disk使用率 - warnMsg := []string{} - if int64(sysCpuUsage) >= cpuUseGt { - warnMsg = append(warnMsg, fmt.Sprintf("cpu usage %.2f%%", sysCpuUsage)) - } - if int64(sysMemUsage) >= memUseGt { - warnMsg = append(warnMsg, fmt.Sprintf("memory usage %.2f%%", sysMemUsage)) - } - if int64(sysDiskUsage) >= diskUseGt { - warnMsg = append(warnMsg, fmt.Sprintf("disk usage %.2f%%", sysDiskUsage)) - } - if len(warnMsg) > 0 { - currentTime := time.Now() - neTypeAndId := fmt.Sprintf("%s_%s", neState.NeType, neState.NeId) - validTimes := []time.Time{} - if v, ok := triggerCount.Load(neTypeAndId); ok { - times := v.([]time.Time) - // 清理过期的记录:10秒前的触发记录不再计入 - for _, t := range times { - if currentTime.Sub(t) <= triggerWindow { - validTimes = append(validTimes, t) - } - } - validTimes = append(validTimes, currentTime) - triggerCount.Store(neTypeAndId, validTimes) - } else { - // 事件第一次触发,初始化记录 - validTimes = append(validTimes, currentTime) - triggerCount.Store(neTypeAndId, validTimes) - } - if int64(len(validTimes)) >= triggerMax { - return fmt.Errorf("greater than %s", strings.Join(warnMsg, ", ")) - } - } - return nil -} - -// alarmClear 清除告警 -func (s NeAlarmStateCheckCMDProcessor) alarmClear(neInfo neModel.NeInfo, v neDataModel.Alarm) (neDataModel.Alarm, error) { - // 变更告警ID为告警清除ID - v.AlarmId = fmt.Sprintf("%d%d", v.AlarmCode, v.EventTime) - v.AlarmStatus = "0" - // 告警清除 - v.ClearType = 1 - v.ClearTime = neInfo.UpdateTime - v.ClearUser = "system" - rows := s.alarmService.Update(v) - if rows > 0 { - return v, nil - } - return neDataModel.Alarm{}, fmt.Errorf("clear alarm fail") -} - -// alarmNew 新增告警 -func (s NeAlarmStateCheckCMDProcessor) alarmNew(neInfo neModel.NeInfo, v alarmParams) (neDataModel.Alarm, error) { - // seq 告警序号 - lastSeq := s.alarmService.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId) - lastTime := neInfo.UpdateTime // 网元最后更新时间 - if lastTime < neInfo.CreateTime { - lastTime = time.Now().UnixMilli() - } - alarm := neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - NeName: neInfo.NeName, - Province: neInfo.Province, - PvFlag: neInfo.PvFlag, - AlarmSeq: lastSeq + 1, - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: constants.ALARM_CMD_CHECK, - EventTime: lastTime, - AlarmType: v.AlarmType, - OrigSeverity: v.OrigSeverity, - PerceivedSeverity: v.OrigSeverity, - ObjectUid: neInfo.RmUID, - ObjectName: "NE CPU/Menory/Disk", - ObjectType: "cmd", - LocationInfo: "NE CPU/Menory/Disk: Heartbeat", - AlarmStatus: "1", // 活动告警 - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - insertId := s.alarmService.InsertAndForword(alarm) - if insertId > 0 { - alarm.ID = insertId - return alarm, nil - } - return neDataModel.Alarm{}, fmt.Errorf("new alarm fail") + return sysCpuUsage, sysMemUsage, sysDiskUsage } diff --git a/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go b/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go index 761fad13..8e866a05 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go +++ b/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go @@ -10,29 +10,22 @@ import ( "be.ems/src/framework/cron" "be.ems/src/framework/logger" "be.ems/src/framework/utils/parse" + "github.com/tsmask/go-oam" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" neModel "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" - wsService "be.ems/src/modules/ws/service" + oamService "be.ems/src/modules/oam/service" ) var NewProcessor = &NeAlarmStateCheckLicenseProcessor{ - neConfigBackupService: neService.NewNeConfigBackup, - neInfoService: neService.NewNeInfo, - alarmService: neDataService.NewAlarm, - wsSendService: wsService.NewWSSend, - count: 0, + neInfoService: neService.NewNeInfo, + count: 0, } // NeAlarmStateCheckLicenseProcessor 网元告警License到期检查 type NeAlarmStateCheckLicenseProcessor struct { - neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 - neInfoService *neService.NeInfo // 网元信息服务 - alarmService *neDataService.Alarm // 告警信息服务 - wsSendService *wsService.WSSend // ws发送服务 - count int // 执行次数 + neInfoService *neService.NeInfo // 网元信息服务 + count int // 执行次数 } // alarmParams 告警参数 @@ -83,60 +76,36 @@ func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) { } // 检查状态 - err := s.serverState(neInfo.ServerState, params.DayLt) + err := s.cheackState(neInfo.ServerState, params.DayLt) if err == nil { continue } - if params.AddInfo != "" { - params.AddInfo = params.AddInfo + ", " + err.Error() + addInfo := params.AddInfo + if addInfo != "" { + addInfo = addInfo + ", " + err.Error() } else { - params.AddInfo = err.Error() + addInfo = err.Error() } - neTypeAndId := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId) // 告警ID params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_LICENSE_CHECK, neInfo.CreateTime) - // 检查网元告警ID是否唯一 - alarmIdArr := s.alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: params.AlarmId, - }) - // 告警状态, 存在的需要手动清除 - alarmStatus := "" - if len(alarmIdArr) > 0 { - alarmStatus = fmt.Sprint(alarmIdArr[0].AlarmStatus) + // 创建告警 + alarm := oam.Alarm{ + NeUid: neInfo.RmUID, // 网元唯一标识 + AlarmTime: time.Now().UnixMilli(), // 事件产生时间 + AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应 + AlarmCode: constants.ALARM_LICENSE_CHECK, // 告警状态码 + AlarmType: params.AlarmType, // 告警类型 + AlarmTitle: params.AlarmTitle, // 告警标题 + PerceivedSeverity: params.OrigSeverity, // 告警级别 + AlarmStatus: oam.ALARM_STATUS_ACTIVE, // 告警状态 + SpecificProblem: params.SpecificProblem, // 告警问题原因 + SpecificProblemID: params.SpecificProblemID, // 告警问题原因ID + AddInfo: addInfo, // 告警辅助信息 + LocationInfo: "NE License: Heartbeat", // 告警定位信息 } - // 活动告警进行清除 - if alarmStatus == "1" { - clearAlarm, err := s.alarmClear(neInfo, alarmIdArr[0]) - if err != nil { - result[neTypeAndId] = err.Error() - continue - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - s.wsSendService.ByGroupID(groupID, clearAlarm) - result[neTypeAndId] = "alarm clear" - alarmStatus = "" // 标记为未记录再次发起新告警 - } - // 未记录 - if alarmStatus == "" { - addInfo := params.AddInfo - if params.AddInfo != "" { - params.AddInfo = params.AddInfo + ", " + err.Error() - } else { - params.AddInfo = err.Error() - } - // 进行新增 - newAlarm, err := s.alarmNew(neInfo, params) - params.AddInfo = addInfo // 恢复附加信息 - if err != nil { - result[neTypeAndId] = err.Error() - continue - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - s.wsSendService.ByGroupID(groupID, newAlarm) - result[neTypeAndId] = "alarm new" + if err = oamService.NewAlarm.Resolve(alarm); err == nil { + result[neInfo.RmUID] = "license alarm" } } @@ -144,8 +113,8 @@ func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) { return result, nil } -// serverState 网元状态 -func (s NeAlarmStateCheckLicenseProcessor) serverState(state map[string]any, dayLt int64) error { +// cheackState 检查网元状态 +func (s NeAlarmStateCheckLicenseProcessor) cheackState(state map[string]any, dayLt int64) error { expire := fmt.Sprint(state["expire"]) if expire == "" || expire == "" || expire == "-" || expire == "2099-12-31" { return nil @@ -168,58 +137,3 @@ func (s NeAlarmStateCheckLicenseProcessor) serverState(state map[string]any, day } return nil } - -// alarmClear 清除告警 -func (s NeAlarmStateCheckLicenseProcessor) alarmClear(neInfo neModel.NeInfo, v neDataModel.Alarm) (neDataModel.Alarm, error) { - // 变更告警ID为告警清除ID - v.AlarmId = fmt.Sprintf("%d%d", v.AlarmCode, v.EventTime) - v.AlarmStatus = "0" - // 告警清除 - v.ClearType = 1 - v.ClearTime = neInfo.UpdateTime - v.ClearUser = "system" - rows := s.alarmService.Update(v) - if rows > 0 { - return v, nil - } - return neDataModel.Alarm{}, fmt.Errorf("clear alarm fail") -} - -// alarmNew 新增告警 -func (s NeAlarmStateCheckLicenseProcessor) alarmNew(neInfo neModel.NeInfo, v alarmParams) (neDataModel.Alarm, error) { - // seq 告警序号 - lastSeq := s.alarmService.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId) - lastTime := neInfo.UpdateTime // 网元最后更新时间 - if lastTime < neInfo.CreateTime { - lastTime = time.Now().UnixMilli() - } - alarm := neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - NeName: neInfo.NeName, - Province: neInfo.Province, - PvFlag: neInfo.PvFlag, - AlarmSeq: lastSeq + 1, - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: constants.ALARM_LICENSE_CHECK, - EventTime: lastTime, - AlarmType: v.AlarmType, - OrigSeverity: v.OrigSeverity, - PerceivedSeverity: v.OrigSeverity, - ObjectUid: neInfo.RmUID, - ObjectName: "NE License", - ObjectType: "license", - LocationInfo: "NE License: Heartbeat", - AlarmStatus: "1", // 活动告警 - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - insertId := s.alarmService.InsertAndForword(alarm) - if insertId > 0 { - alarm.ID = insertId - return alarm, nil - } - return neDataModel.Alarm{}, fmt.Errorf("new alarm fail") -} diff --git a/src/modules/monitor/service/monitor_test.go b/src/modules/monitor/service/monitor_test.go index 44dd2a72..cd64a3d8 100644 --- a/src/modules/monitor/service/monitor_test.go +++ b/src/modules/monitor/service/monitor_test.go @@ -2,6 +2,7 @@ package service import ( "fmt" + "sync" "testing" "time" @@ -14,7 +15,7 @@ import ( func TestInfo(t *testing.T) { s := MonitorInfo{} - s.load(0.5) // 0.5 半分钟 + s.Load(5 * time.Second) // 0.5 半分钟 fmt.Println(s) select {} @@ -28,34 +29,22 @@ type MonitorInfo struct { } // load 执行资源获取 -func (m *MonitorInfo) load(interval float64) { - var itemBase MonitorBase - itemBase.CreateTime = time.Now().UnixMilli() - - 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 - - m.MonitorBase = itemBase - - // 求平均 - m.MonitorIO = loadDiskIO(interval) - m.MonitorNetwork = loadNetIO(interval) +func (m *MonitorInfo) Load(duration time.Duration) { + var wg sync.WaitGroup + wg.Add(3) + go func() { + defer wg.Done() + m.MonitorBase = loadCPUMem(duration) + }() + go func() { + defer wg.Done() + m.MonitorIO = loadDiskIO(duration) + }() + go func() { + defer wg.Done() + m.MonitorNetwork = loadNetIO(duration) + }() + wg.Wait() } // MonitorBase 监控_基本信息 monitor_base @@ -73,25 +62,49 @@ type MonitorBase struct { type MonitorIO struct { CreateTime int64 `json:"createTime"` // 创建时间 Name string `json:"name"` // 磁盘名 - Read int64 `json:"read"` // 读取K - Write int64 `json:"write"` // 写入K - Count int64 `json:"count"` // 次数 - Time int64 `json:"time"` // 耗时 + Read uint64 `json:"read"` // 读取 Bytes + Write uint64 `json:"write"` // 写入 Bytes + Count uint64 `json:"count"` // 次数 + Time uint64 `json:"time"` // 耗时 } // MonitorNetwork 监控_网络IO monitor_network type MonitorNetwork struct { - CreateTime int64 `json:"createTime"` // 创建时间 - Name string `json:"name"` // 网卡名 - Up float64 `json:"up"` // 上行 - Down float64 `json:"down"` // 下行 + CreateTime int64 `json:"createTime"` // 创建时间 + Name string `json:"name"` // 网卡名 + Up uint64 `json:"up"` // 上行 bytes + Down uint64 `json:"down"` // 下行 bytes +} + +// loadCPUMem CPU内存使用率,interval表示采集的平均值(分钟) +func loadCPUMem(duration time.Duration) MonitorBase { + var itemBase MonitorBase + itemBase.CreateTime = time.Now().UnixMilli() + + loadInfo, _ := load.Avg() + itemBase.CPULoad1 = loadInfo.Load1 + itemBase.CPULoad5 = loadInfo.Load5 + itemBase.CPULoad15 = loadInfo.Load15 + totalPercent, _ := cpu.Percent(duration, false) + if len(totalPercent) > 0 { + itemBase.CPU = totalPercent[0] + } + if cpuCount, _ := cpu.Counts(false); cpuCount > 0 { + itemBase.LoadUsage = loadInfo.Load1 / float64(cpuCount) + } else { + itemBase.LoadUsage = 0 + } + + memoryInfo, _ := mem.VirtualMemory() + itemBase.Memory = memoryInfo.UsedPercent + return itemBase } // loadDiskIO 磁盘读写,interval表示采集的平均值(分钟) -func loadDiskIO(interval float64) []MonitorIO { +func loadDiskIO(duration time.Duration) []MonitorIO { ioStat, _ := disk.IOCounters() - time.Sleep(time.Duration(interval) * time.Minute) + time.Sleep(duration) ioStat2, _ := disk.IOCounters() var ioList []MonitorIO @@ -104,32 +117,24 @@ func loadDiskIO(interval float64) []MonitorIO { 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) + itemIO.Read = io2.ReadBytes - io1.ReadBytes } if io2.WriteBytes != 0 && io1.WriteBytes != 0 && io2.WriteBytes > io1.WriteBytes { - itemIO.Write = int64(float64(io2.WriteBytes-io1.WriteBytes) / interval / 60) + itemIO.Write = io2.WriteBytes - io1.WriteBytes } if io2.ReadCount != 0 && io1.ReadCount != 0 && io2.ReadCount > io1.ReadCount { - itemIO.Count = int64(float64(io2.ReadCount-io1.ReadCount) / interval / 60) + itemIO.Count = io2.ReadCount - io1.ReadCount } - 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 + itemIO.Count += io2.WriteCount - io1.WriteCount } if io2.ReadTime != 0 && io1.ReadTime != 0 && io2.ReadTime > io1.ReadTime { - itemIO.Time = int64(float64(io2.ReadTime-io1.ReadTime) / interval / 60) + itemIO.Time = io2.ReadTime - io1.ReadTime } - 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 + itemIO.Time += io2.WriteTime - io1.WriteTime } ioList = append(ioList, itemIO) break @@ -140,7 +145,7 @@ func loadDiskIO(interval float64) []MonitorIO { } // loadNetIO 网络接口(包括虚拟接口),interval表示采集的平均值(分钟) -func loadNetIO(interval float64) []MonitorNetwork { +func loadNetIO(duration time.Duration) []MonitorNetwork { // 获取当前时刻 netStat, _ := net.IOCounters(true) netStatAll, _ := net.IOCounters(false) @@ -148,7 +153,7 @@ func loadNetIO(interval float64) []MonitorNetwork { netStatList = append(netStatList, netStat...) netStatList = append(netStatList, netStatAll...) - time.Sleep(time.Duration(interval) * time.Minute) + time.Sleep(duration) // 获取结束时刻 netStat2, _ := net.IOCounters(true) @@ -168,10 +173,10 @@ func loadNetIO(interval float64) []MonitorNetwork { // 如果结束时刻发送字节数和当前时刻发送字节数都不为零,并且结束时刻发送字节数大于当前时刻发送字节数 if net2.BytesSent != 0 && net1.BytesSent != 0 && net2.BytesSent > net1.BytesSent { - itemNet.Up = float64(net2.BytesSent-net1.BytesSent) / 1024 / interval / 60 + itemNet.Up = net2.BytesSent - net1.BytesSent } if net2.BytesRecv != 0 && net1.BytesRecv != 0 && net2.BytesRecv > net1.BytesRecv { - itemNet.Down = float64(net2.BytesRecv-net1.BytesRecv) / 1024 / interval / 60 + itemNet.Down = net2.BytesRecv - net1.BytesRecv } netList = append(netList, itemNet) break diff --git a/src/modules/monitor/service/sys_job.go b/src/modules/monitor/service/sys_job.go index 3ddb6a1d..7f1cb62b 100644 --- a/src/modules/monitor/service/sys_job.go +++ b/src/modules/monitor/service/sys_job.go @@ -199,9 +199,10 @@ func (s SysJob) ExportData(rows []model.SysJob, fileName string) (string, error) } } misfirePolicy := "放弃执行" - if row.MisfirePolicy == "1" { + switch row.MisfirePolicy { + case "1": misfirePolicy = "立即执行" - } else if row.MisfirePolicy == "2" { + case "2": misfirePolicy = "执行一次" } concurrent := "禁止" diff --git a/src/modules/network_data/controller/all_alarm.go b/src/modules/network_data/controller/all_alarm.go index c2918524..631028ed 100644 --- a/src/modules/network_data/controller/all_alarm.go +++ b/src/modules/network_data/controller/all_alarm.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" @@ -42,7 +43,7 @@ type AlarmController struct { // @Param pvFlag query string false "PV Flag" Enums(PNF,VNF) // @Param alarmCode query string false "alarm status code" // @Param alarmType query string false "Alarm type Communication alarms=1, Equipment alarms=2, Processing faults=3, Environmental alarms=4, Quality of service alarms=5" Enums(1,2,3,4,5) -// @Param alarmStatus query string false "Alarm status 0:clear, 1:active" Enums(0,1) +// @Param alarmStatus query string false "Alarm status Clear Active" Enums(0,1) // @Param origSeverity query string false "Alarm Type 1: Critical, 2: Major, 3: Minor, 4: Warning" Enums(1,2,3,4) // @Param sortField query string false "Sort fields, fill in result fields" default(event_time) // @Param sortOrder query string false "Sort by ascending or descending order, asc desc" default(asc) @@ -107,7 +108,7 @@ func (s AlarmController) Clear(c *gin.Context) { } clearUser := reqctx.LoginUserToUserName(c) - rows, err := s.alarmService.AlarmClearByIds(body.Ids, clearUser) + rows, err := s.alarmService.ClearByIds(body.Ids, clearUser, constants.ALARM_CLEAR_TYPE_MANUAL_CLEAR) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -130,7 +131,7 @@ func (s AlarmController) Ack(c *gin.Context) { } ackUser := reqctx.LoginUserToUserName(c) - rows, err := s.alarmService.AlarmAckByIds(body.Ids, ackUser, body.AckState) + rows, err := s.alarmService.AckByIds(body.Ids, ackUser, constants.ALARM_ACK_STATE_ACK) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -138,6 +139,58 @@ func (s AlarmController) Ack(c *gin.Context) { c.JSON(200, resp.OkData(rows)) } +// 告警级别数量 +// +// GET /count/severity +func (s AlarmController) CountSeverity(c *gin.Context) { + var query struct { + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态 + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + data := s.alarmService.CountSeverity(query.AlarmStatus) + c.JSON(200, resp.OkData(data)) +} + +// 告警类别数量 +// +// GET /count/type +func (s AlarmController) CountType(c *gin.Context) { + var query struct { + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态 + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + data := s.alarmService.CountType(query.AlarmStatus) + c.JSON(200, resp.OkData(data)) +} + +// 告警状态前几排名 +// +// GET /count/ne +func (s AlarmController) CountNe(c *gin.Context) { + var query struct { + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态 + Top int `json:"top" form:"top" binding:"required"` // 前几 + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + data := s.alarmService.CountNe(query.AlarmStatus, query.Top) + c.JSON(200, resp.OkData(data)) +} + // 告警列表导出 // // GET /export diff --git a/src/modules/network_data/controller/all_kpi_c.go b/src/modules/network_data/controller/all_kpi_c.go new file mode 100644 index 00000000..0952e250 --- /dev/null +++ b/src/modules/network_data/controller/all_kpi_c.go @@ -0,0 +1,183 @@ +package controller + +import ( + "fmt" + "strconv" + "strings" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 KPICController 结构体 +var NewKPIC = &KPICController{ + neInfoService: neService.NewNeInfo, + kpicReportService: neDataService.NewKpiCReport, +} + +// 性能统计 +// +// PATH /kpic +type KPICController struct { + neInfoService *neService.NeInfo // 网元信息服务 + kpicReportService *neDataService.KpiCReport // 指标统计服务 +} + +// 获取统计数据 +// +// GET /data +// +// @Tags network_data/kpi +// @Accept json +// @Produce json +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(AMF) +// @Param neId query string true "NE ID" default(001) +// @Param beginTime query number true "begin time (timestamped milliseconds)" default(1729162507596) +// @Param endTime query number true "end time (timestamped milliseconds)" default(1729164187611) +// @Param interval query number true "interval" Enums(5,10,15,30,60,300,600,900,1800,3600) default(60) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Access to statistical data +// @Description Access to statistical data +// @Router /neData/kpic/data [get] +func (s KPICController) KPIData(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var querys model.KPICQuery + if err := c.ShouldBindQuery(&querys); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + querys.RmUID = neInfo.RmUID + + // 查询数据 + kpiData := s.kpicReportService.FindData(querys) + c.JSON(200, resp.OkData(kpiData)) +} + +// 自定义标题列表 +// +// GET /titlelist +func (s KPICController) ListTitle(c *gin.Context) { + query := reqctx.QueryMap(c) + if v, ok := query["status"]; ok && v == "" { + query["status"] = "1" + } + rows, total := s.kpicReportService.TitleFindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) +} + +// 自定义标题新增 +// +// POST /title +func (s KPICController) AddTitle(c *gin.Context) { + var body model.KpiCTitle + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 校验指标是否存在 + kpicTitles := s.kpicReportService.TitleFind(model.KpiCTitle{ + NeType: body.NeType, + KpiId: body.KpiId, + }) + if len(kpicTitles) > 0 { + for _, v := range kpicTitles { + if v.Status == "2" { + c.JSON(200, resp.ErrMsg("custom indicator already exist")) + return + } + } + } + + // 生成自定义指标ID + if body.KpiId == "" { + body.KpiId = fmt.Sprintf("%s.C.01", strings.ToUpper(body.NeType)) + } else { + // 网元类型最后指标ID + lastKpiId := s.kpicReportService.TitleLastKPIId(body.NeType) + if lastKpiId != "" { + // title like AMF.C.01 截断 .C. 并获取后面的数字部分 + parts := strings.Split(lastKpiId, ".C.") + if len(parts) == 2 { + numStr := parts[1] + if num, err := strconv.Atoi(numStr); err == nil { + num++ // 数字加 1 + // 转换为前面补零的 2 位字符串 + body.KpiId = fmt.Sprintf("%s.C.%02d", strings.ToUpper(body.NeType), num) + } + } + } + } + + body.CreatedBy = reqctx.LoginUserToUserName(c) + insertId := s.kpicReportService.TitleInsert(body) + if insertId > 0 { + c.JSON(200, resp.Ok(nil)) + return + } + c.JSON(200, resp.Err(nil)) +} + +// 自定义标题修改 +// +// PUT /title +func (s KPICController) EditTitle(c *gin.Context) { + var body model.KpiCTitle + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + rows := s.kpicReportService.TitleUpdate(body) + if rows > 0 { + c.JSON(200, resp.Ok(nil)) + return + } + c.JSON(200, resp.Err(nil)) +} + +// 自定义标题删除 +// +// DELETE /title/:id +func (s KPICController) RemoveTitle(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Query("id") + if id == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty")) + return + } + + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) + } + + rows, err := s.kpicReportService.TitleDeleteByIds(ids) + if err != nil { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) + c.JSON(200, resp.OkMsg(msg)) +} diff --git a/src/modules/network_data/controller/all_nb_state.go b/src/modules/network_data/controller/all_nb_state.go index 2813d405..5c00ec47 100644 --- a/src/modules/network_data/controller/all_nb_state.go +++ b/src/modules/network_data/controller/all_nb_state.go @@ -72,7 +72,7 @@ func (s NBStateController) List(c *gin.Context) { // 历史记录列表导出 // -// POST /export +// GET /export // // @Tags network_data/amf,network_data/mme // @Accept json @@ -82,7 +82,7 @@ func (s NBStateController) List(c *gin.Context) { // @Security TokenAuth // @Summary Base Station Status List Export // @Description Base Station Status List Export -// @Router /nb-state/export [post] +// @Router /nb-state/export [get] func (s NBStateController) Export(c *gin.Context) { language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index 51cc8fbb..02bbed35 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -8,7 +8,6 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" @@ -19,15 +18,15 @@ import ( // 实例化控制层 AMFController 结构体 var NewAMF = &AMFController{ neInfoService: neService.NewNeInfo, - ueEventService: neDataService.NewUEEventAMF, + ueEventService: neDataService.NewUEEvent, } // 网元AMF // // PATH /amf type AMFController struct { - neInfoService *neService.NeInfo // 网元信息服务 - ueEventService *neDataService.UEEventAMF // UE会话事件服务 + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEvent // UE会话事件服务 } // UE会话列表 @@ -49,23 +48,20 @@ type AMFController struct { // @Router /neData/amf/ue/list [get] func (s *AMFController) UEList(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys model.UEEventAMFQuery - if err := c.ShouldBindQuery(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return + query := reqctx.QueryMap(c) + // 限制导出数据集 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } - - // 查询网元获取IP - neInfo := s.neInfoService.FindByNeTypeAndNeID("AMF", querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + // 查询网元信息 rmUID + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - - // 查询数据 - rows, total := s.ueEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.ueEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -98,7 +94,7 @@ func (s *AMFController) UERemove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.ueEventService.DeleteByIds(ids) + rows, err := s.ueEventService.DeleteByIds("AMF", ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -109,7 +105,7 @@ func (s *AMFController) UERemove(c *gin.Context) { // UE会话列表导出 // -// POST /ue/export +// GET /ue/export // // @Tags network_data/amf // @Accept json @@ -119,28 +115,23 @@ func (s *AMFController) UERemove(c *gin.Context) { // @Security TokenAuth // @Summary UE Session List Export // @Description UE Session List Export -// @Router /neData/amf/ue/export [post] +// @Router /neData/amf/ue/export [get] func (s *AMFController) UEExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) - // 查询结果,根据查询条件结果,单页最大值限制 - var querys model.UEEventAMFQuery - if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } + query := reqctx.QueryMap(c) // 限制导出数据集 - if querys.PageSize > 10000 { - querys.PageSize = 10000 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } - // 查询网元获取IP - neInfo := s.neInfoService.FindByNeTypeAndNeID("AMF", querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + // 查询网元信息 rmUID + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - rows, total := s.ueEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.ueEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) @@ -150,7 +141,7 @@ func (s *AMFController) UEExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("amf_ue_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 导出数据表格 - saveFilePath, err := s.ueEventService.ExportXlsx(rows, fileName, language) + saveFilePath, err := s.ueEventService.ExportAMF(rows, fileName, language) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/network_data/controller/cbc.go b/src/modules/network_data/controller/cbc.go new file mode 100644 index 00000000..52093c77 --- /dev/null +++ b/src/modules/network_data/controller/cbc.go @@ -0,0 +1,317 @@ +package controller + +import ( + "encoding/json" + "fmt" + "strconv" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" +) + +const ( + neType = "CBC" // 网元类型 +) + +// 实例化控制层 CBCController 结构体 +var NewCBC = &CBCController{ + neInfoService: neService.NewNeInfo, + neCBCMessageService: neDataService.NewCBCMessage, +} + +// 网元CBC +type CBCController struct { + neInfoService *neService.NeInfo // 网元信息服务 + neCBCMessageService *neDataService.CBCMessage // CBC消息服务 +} + +func (m *CBCController) List(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Query("neId") + if neId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + var query model.CBCMessageQuery + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + query.NeType = neType + query.NeId = neId + + data, total, err := neDataService.NewCBCMessage.SelectByPage(query) + if err != nil { + c.JSON(500, resp.ErrMsg(err.Error())) + return + } + + // 转换数据格式,确保 MessageJson 正确序列化 + processedData := make([]map[string]interface{}, len(data)) + for i, msg := range data { + var messageJson interface{} + if len(msg.MessageJson) > 0 { + // 尝试解析为 JSON 对象 + if err := json.Unmarshal(msg.MessageJson, &messageJson); err != nil { + // 如果解析失败,就作为字符串 + messageJson = string(msg.MessageJson) + } + } + + processedData[i] = map[string]interface{}{ + "id": msg.Id, + "neType": msg.NeType, + "neId": msg.NeId, + "messageJson": messageJson, // 这里是解析后的 JSON 对象 + "status": msg.Status.Enum(), + "detail": msg.Detail, + "createdAt": msg.CreatedAt, + "updatedAt": msg.UpdatedAt, + } + } + c.JSON(200, resp.Ok(gin.H{ + "total": total, + "data": processedData, + })) +} + +// Update 更新CB消息 +func (m *CBCController) Insert(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + // 绑定请求体 + var msg model.CBCMessage + msg.NeType = neType + msg.NeId = c.Query("neId") + msg.Status = model.CBCEventStatusInactive // 默认状态为 INACTIVE + if msg.NeId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + now := time.Now().UnixMilli() + msg.CreatedAt = now + msg.UpdatedAt = now + + // 使用 ShouldBindBodyWithJSON 读取请求体 + var jsonData interface{} + if err := c.ShouldBindBodyWithJSON(&jsonData); err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 将绑定的数据转换为 JSON + jsonBytes, err := json.Marshal(jsonData) + if err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + msg.MessageJson = json.RawMessage(jsonBytes) + + if err := neDataService.NewCBCMessage.Insert(msg); err != nil { + c.JSON(500, resp.ErrMsg(err.Error())) + return + } + + c.JSON(200, resp.Ok(nil)) +} + +// Update 更新CB消息 +func (m *CBCController) Update(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + + // 获取路径参数 + messageId := c.Param("id") + if messageId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + id, err := strconv.ParseInt(messageId, 10, 64) + if err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 直接读取body为json.RawMessage + var jsonData interface{} + if err := c.ShouldBindBodyWithJSON(&jsonData); err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 将绑定的数据转换为 JSON + jsonBytes, err := json.Marshal(jsonData) + if err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + messageJson := json.RawMessage(jsonBytes) + + if err := neDataService.NewCBCMessage.Update(id, messageJson); err != nil { + c.JSON(500, resp.ErrMsg(err.Error())) + return + } + + c.JSON(200, resp.Ok(nil)) +} + +// UpdateStatus 更新CB消息状态 +// 这里的 neId 参数是为了兼容性,实际更新状态时不需要使用它 +// 但为了保持与原有接口一致,仍然保留该参数 +// 如果需要根据 neId 进行特定的逻辑处理,可以在服务层实现 +// 但在当前实现中,neId 仅用于验证请求的有效性 +// 实际的状态更新逻辑不依赖于 neId +// 该接口用于更新 CB 消息的状态,状态值通过查询参数传递 +// 例如:PUT /:neId/message/status?status=ACTIVE +func (m *CBCController) UpdateStatus(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + + neId := c.Query("neId") + status := c.Param("status") + if neId == "" || status == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + messageId := c.Param("id") + if messageId != "" { + id, err := strconv.ParseInt(messageId, 10, 64) + if err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 如果提供了 messageId,则更新特定消息的状态 + if err := neDataService.NewCBCMessage.UpdateStatus(id, status); err != nil { + c.JSON(500, resp.ErrMsg(err.Error())) + return + } + c.JSON(200, resp.Ok(nil)) + return + } + // 如果没有提供 messageId,则更新所有消息的状态 + if err := neDataService.NewCBCMessage.UpdateStatusByNeId(neId, status); err != nil { + c.JSON(500, resp.ErrMsg(err.Error())) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// Delete 删除CB消息 +func (m *CBCController) Delete(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + + // 获取路径参数 + messageId := c.Param("id") + if messageId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + id, err := strconv.ParseInt(messageId, 10, 64) + if err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + if err := neDataService.NewCBCMessage.Delete(id); err != nil { + c.JSON(500, resp.ErrMsg(err.Error())) + return + } + + c.JSON(200, resp.Ok(nil)) +} + +// ListById 根据ID获取CB消息 +func (m *CBCController) ListById(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + + // 获取路径参数 + idStr := c.Param("id") + if idStr == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + id, err := strconv.ParseInt(idStr, 10, 64) + if err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + data, err := neDataService.NewCBCMessage.SelectById(id) + if err != nil { + c.JSON(500, resp.ErrMsg(err.Error())) + return + } + + if data == nil { + c.JSON(404, resp.CodeMsg(404, i18n.TKey(language, "app.common.err404"))) + return + } + // 转换数据格式,确保 MessageJson 正确序列化 + var messageJson interface{} + if len(data.MessageJson) > 0 { + // 尝试解析为 JSON 对象 + if err := json.Unmarshal(data.MessageJson, &messageJson); err != nil { + // 如果解析失败,就作为字符串 + messageJson = string(data.MessageJson) + } + } + + processedData := map[string]interface{}{ + "id": data.Id, + "neType": data.NeType, + "neId": data.NeId, + "messageJson": messageJson, // 这里是解析后的 JSON 对象 + "status": data.Status.Enum(), + "detail": data.Detail, + "createdAt": data.CreatedAt, + "updatedAt": data.UpdatedAt, + } + + c.JSON(200, resp.Ok(gin.H{ + "data": processedData, + })) +} + +func (m *CBCController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + // 查询结果,根据查询条件结果,单页最大值限制 + var query model.CBCMessageQuery + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + // 限制导出数据集 + if query.PageSize > 10000 { + query.PageSize = 10000 + } + // 查询数据 + rows, total, err := m.neCBCMessageService.SelectByPage(query) + if err != nil { + c.JSON(500, resp.ErrMsg(err.Error())) + return + } + if total == 0 { + // 导出数据记录为空 + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + + // 导出文件名称 + fileName := fmt.Sprintf("cbc_message_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) + // 导出数据表格 + saveFilePath, err := m.neCBCMessageService.ExportXlsx(rows, fileName, language) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + c.FileAttachment(saveFilePath, fileName) +} diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 08861dd2..c4ca4431 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -8,7 +8,6 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" @@ -19,15 +18,15 @@ import ( // 实例化控制层 IMSController 结构体 var NewIMS = &IMSController{ neInfoService: neService.NewNeInfo, - cdrEventService: neDataService.NewCDREventIMS, + cdrEventService: neDataService.NewCDREvent, } // 网元IMS // // PATH /ims type IMSController struct { - neInfoService *neService.NeInfo // 网元信息服务 - cdrEventService *neDataService.CDREventIMS // CDR会话事件服务 + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREvent // CDR会话事件服务 } // CDR会话列表 @@ -50,23 +49,20 @@ type IMSController struct { // @Router /neData/ims/cdr/list [get] func (s *IMSController) CDRList(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys model.CDREventIMSQuery - if err := c.ShouldBindQuery(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return + query := reqctx.QueryMap(c) + // 限制导出数据集 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } - // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - - // 查询数据 - rows, total := s.cdrEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -99,7 +95,7 @@ func (s *IMSController) CDRRemove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.cdrEventService.DeleteByIds(ids) + rows, err := s.cdrEventService.DeleteByIds("IMS", ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -110,7 +106,7 @@ func (s *IMSController) CDRRemove(c *gin.Context) { // CDR会话列表导出 // -// POST /cdr/export +// GET /cdr/export // // @Tags network_data/ims // @Accept json @@ -120,28 +116,23 @@ func (s *IMSController) CDRRemove(c *gin.Context) { // @Security TokenAuth // @Summary CDR Session List Export // @Description CDR Session List Export -// @Router /neData/ims/cdr/export [post] +// @Router /neData/ims/cdr/export [get] func (s *IMSController) CDRExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) - // 查询结果,根据查询条件结果,单页最大值限制 - var querys model.CDREventIMSQuery - if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } + query := reqctx.QueryMap(c) // 限制导出数据集 - if querys.PageSize > 10000 { - querys.PageSize = 10000 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - rows, total := s.cdrEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) @@ -151,7 +142,7 @@ func (s *IMSController) CDRExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("ims_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 导出数据表格 - saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName, language) + saveFilePath, err := s.cdrEventService.ExportIMS(rows, fileName, language) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index a64e15da..057689ab 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -8,7 +8,6 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" @@ -19,15 +18,15 @@ import ( // 实例化控制层 MMEController 结构体 var NewMME = &MMEController{ neInfoService: neService.NewNeInfo, - ueEventService: neDataService.NewUEEventMME, + ueEventService: neDataService.NewUEEvent, } // 网元MME // // PATH /mme type MMEController struct { - neInfoService *neService.NeInfo // 网元信息服务 - ueEventService *neDataService.UEEventMME // UE会话事件服务 + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEvent // UE会话事件服务 } // UE会话列表 @@ -49,23 +48,20 @@ type MMEController struct { // @Router /neData/mme/ue/list [get] func (s *MMEController) UEList(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys model.UEEventMMEQuery - if err := c.ShouldBindQuery(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return + query := reqctx.QueryMap(c) + // 限制导出数据集 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } - - // 查询网元获取IP - neInfo := s.neInfoService.FindByNeTypeAndNeID("MME", querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + // 查询网元信息 rmUID + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - - // 查询数据 - rows, total := s.ueEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.ueEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -98,7 +94,7 @@ func (s *MMEController) UERemove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.ueEventService.DeleteByIds(ids) + rows, err := s.ueEventService.DeleteByIds("MME", ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -109,7 +105,7 @@ func (s *MMEController) UERemove(c *gin.Context) { // UE会话列表导出 // -// POST /ue/export +// GET /ue/export // // @Tags network_data/mme // @Accept json @@ -119,28 +115,23 @@ func (s *MMEController) UERemove(c *gin.Context) { // @Security TokenAuth // @Summary UE Session List Export // @Description UE Session List Export -// @Router /neData/mme/ue/export [post] +// @Router /neData/mme/ue/export [get] func (s *MMEController) UEExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) - // 查询结果,根据查询条件结果,单页最大值限制 - var querys model.UEEventMMEQuery - if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } + query := reqctx.QueryMap(c) // 限制导出数据集 - if querys.PageSize > 10000 { - querys.PageSize = 10000 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } - // 查询网元获取IP - neInfo := s.neInfoService.FindByNeTypeAndNeID("MME", querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + // 查询网元信息 rmUID + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - rows, total := s.ueEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.ueEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) @@ -150,7 +141,7 @@ func (s *MMEController) UEExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("mme_ue_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 导出数据表格 - saveFilePath, err := s.ueEventService.ExportXlsx(rows, fileName, language) + saveFilePath, err := s.ueEventService.ExportMME(rows, fileName, language) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/network_data/controller/n3iwf.go b/src/modules/network_data/controller/n3iwf.go new file mode 100644 index 00000000..0750b082 --- /dev/null +++ b/src/modules/network_data/controller/n3iwf.go @@ -0,0 +1,70 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 N3IWFController 结构体 +var NewN3IWF = &N3IWFController{ + neInfoService: neService.NewNeInfo, +} + +// 网元N3IWF +// +// PATH /n3iwf +type N3IWFController struct { + neInfoService *neService.NeInfo // 网元信息服务 +} + +// 在线订阅用户列表信息 +// +// GET /sub/list +// +// @Tags network_data/n3iwf +// @Accept json +// @Produce json +// @Param neId query string true "NE ID" default(001) +// @Param imsi query string false "imsi" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Online session user list information +// @Description Online session user list information +// @Router /neData/n3iwf/sub/list [get] +func (s N3IWFController) SubUserList(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var query struct { + NeId string `form:"neId" binding:"required"` + IMSI string `form:"imsi"` + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 查询网元信息 + neInfo := s.neInfoService.FindByNeTypeAndNeID("N3IWF", query.NeId) + if neInfo.NeId != query.NeId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元直连 + data, err := neFetchlink.N3IWFSubInfoList(neInfo, map[string]string{ + "imsi": query.IMSI, + }) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/network_data/controller/nssf.go b/src/modules/network_data/controller/nssf.go new file mode 100644 index 00000000..7bb0a5cd --- /dev/null +++ b/src/modules/network_data/controller/nssf.go @@ -0,0 +1,107 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 NSSFController 结构体 +var NewNSSF = &NSSFController{ + neInfoService: neService.NewNeInfo, +} + +// 网元NSSF +// +// PATH /NSSF +type NSSFController struct { + neInfoService *neService.NeInfo // 网元信息服务 +} + +// 在线订阅用户列表信息 +// +// GET /sub/list +// +// @Tags network_data/nssf +// @Accept json +// @Produce json +// @Param neId query string true "NE ID" default(001) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Online session user list information +// @Description Online session user list information +// @Router /neData/nssf/sub/list [get] +func (s NSSFController) SubUserList(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var query struct { + NeId string `form:"neId" binding:"required"` + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 查询网元信息 + neInfo := s.neInfoService.FindByNeTypeAndNeID("NSSF", query.NeId) + if neInfo.NeId != query.NeId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元直连 + data, err := neFetchlink.NSSFSubInfoList(neInfo) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + c.JSON(200, resp.OkData(data)) +} + +// 可用AMF列表信息 +// +// GET /amf/list +// +// @Tags network_data/nssf +// @Accept json +// @Produce json +// @Param neId query string true "NE ID" default(001) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Online session user list information +// @Description Online session user list information +// @Router /neData/nssf/amf/list [get] +func (s NSSFController) AvailableList(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var query struct { + NeId string `form:"neId" binding:"required"` + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 查询网元信息 + neInfo := s.neInfoService.FindByNeTypeAndNeID("NSSF", query.NeId) + if neInfo.NeId != query.NeId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元直连 + data, err := neFetchlink.NSSFAvailableAMFList(neInfo) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/network_data/controller/sgwc.go b/src/modules/network_data/controller/sgwc.go index 8c72f621..ea7589ec 100644 --- a/src/modules/network_data/controller/sgwc.go +++ b/src/modules/network_data/controller/sgwc.go @@ -8,7 +8,6 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" @@ -17,7 +16,7 @@ import ( // 实例化控制层 SGWCController 结构体 var NewSGWC = &SGWCController{ neInfoService: neService.NewNeInfo, - cdrEventService: neDataService.NewCDREventSGWC, + cdrEventService: neDataService.NewCDREvent, UDMExtendService: neDataService.NewUDMExtend, } @@ -25,9 +24,9 @@ var NewSGWC = &SGWCController{ // // PATH /sgwc type SGWCController struct { - neInfoService *neService.NeInfo // 网元信息服务 - cdrEventService *neDataService.CDREventSGWC // CDR会话事件服务 - UDMExtendService *neDataService.UDMExtend // UDM用户信息服务 + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREvent // CDR会话事件服务 + UDMExtendService *neDataService.UDMExtend // UDM用户信息服务 } // CDR会话列表 @@ -50,23 +49,20 @@ type SGWCController struct { // @Router /neData/sgwc/cdr/list [get] func (s *SGWCController) CDRList(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys model.CDREventSGWCQuery - if err := c.ShouldBindQuery(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return + query := reqctx.QueryMap(c) + // 限制导出数据集 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } - // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - - // 查询数据 - rows, total := s.cdrEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -99,7 +95,7 @@ func (s *SGWCController) CDRRemove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.cdrEventService.DeleteByIds(ids) + rows, err := s.cdrEventService.DeleteByIds("SGWC", ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -123,25 +119,20 @@ func (s *SGWCController) CDRRemove(c *gin.Context) { // @Router /neData/sgwc/cdr/export [post] func (s *SGWCController) CDRExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) - // 查询结果,根据查询条件结果,单页最大值限制 - var querys model.CDREventSGWCQuery - if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } + query := reqctx.QueryMap(c) // 限制导出数据集 - if querys.PageSize > 10000 { - querys.PageSize = 10000 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - rows, total := s.cdrEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) @@ -151,7 +142,7 @@ func (s *SGWCController) CDRExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("sgwc_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 导出数据表格 - saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName) + saveFilePath, err := s.cdrEventService.ExportSGWC(rows, fileName) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index 9e382bff..e1e77d9b 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -9,7 +9,6 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" @@ -20,7 +19,7 @@ import ( // 实例化控制层 SMFController 结构体 var NewSMF = &SMFController{ neInfoService: neService.NewNeInfo, - cdrEventService: neDataService.NewCDREventSMF, + cdrEventService: neDataService.NewCDREvent, UDMExtendService: neDataService.NewUDMExtend, } @@ -28,9 +27,9 @@ var NewSMF = &SMFController{ // // PATH /smf type SMFController struct { - neInfoService *neService.NeInfo // 网元信息服务 - cdrEventService *neDataService.CDREventSMF // CDR会话事件服务 - UDMExtendService *neDataService.UDMExtend // UDM用户信息服务 + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREvent // CDR会话事件服务 + UDMExtendService *neDataService.UDMExtend // UDM用户信息服务 } // CDR会话列表 @@ -52,23 +51,20 @@ type SMFController struct { // @Router /neData/smf/cdr/list [get] func (s *SMFController) CDRList(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys model.CDREventSMFQuery - if err := c.ShouldBindQuery(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return + query := reqctx.QueryMap(c) + // 限制导出数据集 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } - // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - - // 查询数据 - rows, total := s.cdrEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -101,7 +97,7 @@ func (s *SMFController) CDRRemove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.cdrEventService.DeleteByIds(ids) + rows, err := s.cdrEventService.DeleteByIds("SMF", ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -112,7 +108,7 @@ func (s *SMFController) CDRRemove(c *gin.Context) { // CDR会话列表导出 // -// POST /cdr/export +// GET /cdr/export // // @Tags network_data/smf // @Accept json @@ -122,28 +118,23 @@ func (s *SMFController) CDRRemove(c *gin.Context) { // @Security TokenAuth // @Summary CDR Session List Export // @Description CDR Session List Export -// @Router /neData/smf/cdr/export [post] +// @Router /neData/smf/cdr/export [get] func (s *SMFController) CDRExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) - // 查询结果,根据查询条件结果,单页最大值限制 - var querys model.CDREventSMFQuery - if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } + query := reqctx.QueryMap(c) // 限制导出数据集 - if querys.PageSize > 10000 { - querys.PageSize = 10000 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - rows, total := s.cdrEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) @@ -153,7 +144,7 @@ func (s *SMFController) CDRExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("smf_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 导出数据表格 - saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName) + saveFilePath, err := s.cdrEventService.ExportSMF(rows, fileName) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -219,7 +210,7 @@ func (s *SMFController) SubUserNum(c *gin.Context) { // @Security TokenAuth // @Summary Online session user list information // @Description Online session user list information -// @Router /neData/smf/session/list [get] +// @Router /neData/smf/sub/list [get] func (s *SMFController) SubUserList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index fc9420e0..f3efc33e 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -8,7 +8,6 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" @@ -18,15 +17,15 @@ import ( // 实例化控制层 SMSCController 结构体 var NewSMSC = &SMSCController{ neInfoService: neService.NewNeInfo, - cdrEventService: neDataService.NewCDREventSMSC, + cdrEventService: neDataService.NewCDREvent, } // 网元SMSC // // PATH /smsc type SMSCController struct { - neInfoService *neService.NeInfo // 网元信息服务 - cdrEventService *neDataService.CDREventSMSC // CDR会话事件服务 + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREvent // CDR会话事件服务 } // CDR会话列表 @@ -49,23 +48,20 @@ type SMSCController struct { // @Router /neData/smsc/cdr/list [get] func (s *SMSCController) CDRList(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys model.CDREventSMSCQuery - if err := c.ShouldBindQuery(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return + query := reqctx.QueryMap(c) + // 限制导出数据集 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } - // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - - // 查询数据 - rows, total := s.cdrEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -98,7 +94,7 @@ func (s *SMSCController) CDRRemove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.cdrEventService.DeleteByIds(ids) + rows, err := s.cdrEventService.DeleteByIds("SMSC", ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -109,7 +105,7 @@ func (s *SMSCController) CDRRemove(c *gin.Context) { // CDR会话列表导出 // -// POST /cdr/export +// GET /cdr/export // // @Tags network_data/smsc // @Accept json @@ -119,28 +115,23 @@ func (s *SMSCController) CDRRemove(c *gin.Context) { // @Security TokenAuth // @Summary CDR Session List Export // @Description CDR Session List Export -// @Router /neData/smsc/cdr/export [post] +// @Router /neData/smsc/cdr/export [get] func (s *SMSCController) CDRExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) - // 查询结果,根据查询条件结果,单页最大值限制 - var querys model.CDREventSMSCQuery - if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } + query := reqctx.QueryMap(c) // 限制导出数据集 - if querys.PageSize > 10000 { - querys.PageSize = 10000 + pageSize := parse.Number(query["pageSize"]) + if pageSize > 10000 { + query["pageSize"] = "10000" } // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { + neInfo := s.neInfoService.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - querys.RmUID = neInfo.RmUID - rows, total := s.cdrEventService.FindByPage(querys) + query["rmUID"] = neInfo.RmUID + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) @@ -150,7 +141,7 @@ func (s *SMSCController) CDRExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("smsc_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 导出数据表格 - saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName, language) + saveFilePath, err := s.cdrEventService.ExportSMSC(rows, fileName, language) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index 3140b4cf..617d071e 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -77,8 +77,8 @@ func (s *UDMAuthController) ResetData(c *gin.Context) { // @Router /neData/udm/auth/list [get] func (s *UDMAuthController) List(c *gin.Context) { query := reqctx.QueryMap(c) - total, rows := s.udmAuthService.FindByPage(query) - c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) + rows, total := s.udmAuthService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // UDM鉴权用户信息 @@ -478,7 +478,7 @@ func (s *UDMAuthController) Export(c *gin.Context) { } query := reqctx.QueryMap(c) - total, rows := s.udmAuthService.FindByPage(query) + rows, total := s.udmAuthService.FindByPage(query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 4b2668e5..0ac82499 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -77,8 +77,8 @@ func (s *UDMSubController) ResetData(c *gin.Context) { // @Router /neData/udm/sub/list [get] func (s *UDMSubController) List(c *gin.Context) { query := reqctx.QueryMap(c) - total, rows := s.udmSubService.FindByPage(query) - c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) + rows, total := s.udmSubService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // UDM签约用户信息 @@ -484,7 +484,7 @@ func (s *UDMSubController) Export(c *gin.Context) { } query := reqctx.QueryMap(c) - total, rows := s.udmSubService.FindByPage(query) + rows, total := s.udmSubService.FindByPage(query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) diff --git a/src/modules/network_data/controller/udm_voip.go b/src/modules/network_data/controller/udm_voip.go index 7b578fa7..5bda45a2 100644 --- a/src/modules/network_data/controller/udm_voip.go +++ b/src/modules/network_data/controller/udm_voip.go @@ -76,8 +76,8 @@ func (s *UDMVOIPController) ResetData(c *gin.Context) { // @Router /neData/udm/voip/list [get] func (s *UDMVOIPController) List(c *gin.Context) { query := reqctx.QueryMap(c) - total, rows := s.udmVOIPService.FindByPage(query) - c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) + rows, total := s.udmVOIPService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // UDMVOIP用户信息 @@ -416,7 +416,7 @@ func (s *UDMVOIPController) Export(c *gin.Context) { } query := reqctx.QueryMap(c) - total, rows := s.udmVOIPService.FindByPage(query) + rows, total := s.udmVOIPService.FindByPage(query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) diff --git a/src/modules/network_data/controller/udm_volte_ims.go b/src/modules/network_data/controller/udm_volte_ims.go index 946124b1..1423e915 100644 --- a/src/modules/network_data/controller/udm_volte_ims.go +++ b/src/modules/network_data/controller/udm_volte_ims.go @@ -76,8 +76,8 @@ func (s *UDMVolteIMSController) ResetData(c *gin.Context) { // @Router /neData/udm/volte-ims/list [get] func (s *UDMVolteIMSController) List(c *gin.Context) { query := reqctx.QueryMap(c) - total, rows := s.udmVolteIMSService.FindByPage(query) - c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) + rows, total := s.udmVolteIMSService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // UDMVolteIMS用户信息 @@ -462,7 +462,7 @@ func (s *UDMVolteIMSController) Export(c *gin.Context) { } query := reqctx.QueryMap(c) - total, rows := s.udmVolteIMSService.FindByPage(query) + rows, total := s.udmVolteIMSService.FindByPage(query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) diff --git a/src/modules/network_data/model/alarm.go b/src/modules/network_data/model/alarm.go index 61abd550..d0a2e104 100644 --- a/src/modules/network_data/model/alarm.go +++ b/src/modules/network_data/model/alarm.go @@ -8,26 +8,26 @@ type Alarm struct { NeName string `json:"neName" gorm:"column:ne_name"` // 网元名称 Province string `json:"province" gorm:"column:province"` // 网元省份地域 PvFlag string `json:"pvFlag" gorm:"column:pv_flag"` // 网元标识虚拟化标识 - AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 同网元类型连续递增 + AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 - EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 秒级 - AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5 - OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - PerceivedSeverity string `json:"perceivedSeverity" gorm:"column:perceived_severity"` // 告警级别 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 + AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 + PerceivedSeverity string `json:"perceivedSeverity" gorm:"column:perceived_severity"` // 告警级别 ObjectUid string `json:"objectUid" gorm:"column:object_uid"` // 对象ID ObjectName string `json:"objectName" gorm:"column:object_name"` // 对象名称 ObjectType string `json:"objectType" gorm:"column:object_type"` // 对象类型 LocationInfo string `json:"locationInfo" gorm:"column:location_info"` // 告警定位信息 - AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 0:clear, 1:active + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 SpecificProblem string `json:"specificProblem" gorm:"column:specific_problem"` // 告警问题原因 SpecificProblemId string `json:"specificProblemId" gorm:"column:specific_problem_id"` // 告警问题原因ID AddInfo string `json:"addInfo" gorm:"column:add_info"` // 告警辅助信息 - AckState int64 `json:"ackState" gorm:"column:ack_state"` // 确认状态 0: Unacked, 1: Acked - AckTime int64 `json:"ackTime" gorm:"column:ack_time"` // 确认时间 秒级 + AckState string `json:"ackState" gorm:"column:ack_state"` // 确认状态 + AckTime int64 `json:"ackTime" gorm:"column:ack_time"` // 确认时间 AckUser string `json:"ackUser" gorm:"column:ack_user"` // 确认用户 - ClearType int64 `json:"clearType" gorm:"column:clear_type"` // 清除状态 0: Unclear, 1: AutoClear, 2: ManualClear + ClearType string `json:"clearType" gorm:"column:clear_type"` // 清除状态 ClearTime int64 `json:"clearTime" gorm:"column:clear_time"` // 清除时间 ClearUser string `json:"clearUser" gorm:"column:clear_user"` // 清除用户 Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 创建时间 @@ -46,9 +46,9 @@ type AlarmQuery struct { PvFlag string `json:"pvFlag" form:"pvFlag"` AlarmCode string `json:"alarmCode" form:"alarmCode"` AlarmType string `json:"alarmType" form:"alarmType"` - AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active - OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态 + OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc diff --git a/src/modules/network_data/model/alarm_event.go b/src/modules/network_data/model/alarm_event.go index e1190720..d157f0e3 100644 --- a/src/modules/network_data/model/alarm_event.go +++ b/src/modules/network_data/model/alarm_event.go @@ -9,16 +9,16 @@ type AlarmEvent struct { AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 - EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 秒级 + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 ObjectUid string `json:"objectUid" gorm:"column:object_uid"` // 对象ID ObjectName string `json:"objectName" gorm:"column:object_name"` // 对象名称 ObjectType string `json:"objectType" gorm:"column:object_type"` // 对象类型 LocationInfo string `json:"locationInfo" gorm:"column:location_info"` // 告警定位信息 - AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 0:clear, 1:active + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 SpecificProblem string `json:"specificProblem" gorm:"column:specific_problem"` // 告警问题原因 SpecificProblemId string `json:"specificProblemId" gorm:"column:specific_problem_id"` // 告警问题原因ID AddInfo string `json:"addInfo" gorm:"column:add_info"` // 告警辅助信息 - ClearType int64 `json:"clearType" gorm:"column:clear_type"` // 清除状态 0: Unclear, 1: AutoClear, 2: ManualClear + ClearType string `json:"clearType" gorm:"column:clear_type"` // 清除状态 ClearTime int64 `json:"clearTime" gorm:"column:clear_time"` // 清除时间 ClearUser string `json:"clearUser" gorm:"column:clear_user"` // 清除用户 Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 创建时间 @@ -34,8 +34,8 @@ type AlarmEventQuery struct { NeType string `json:"neType" form:"neType"` // 网元类型 NeID string `json:"neId" form:"neId"` // 网元ID AlarmCode string `json:"alarmCode" form:"alarmCode"` - AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态 + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc diff --git a/src/modules/network_data/model/alarm_forward_log.go b/src/modules/network_data/model/alarm_forward_log.go index a79c6d1b..93e9bb11 100644 --- a/src/modules/network_data/model/alarm_forward_log.go +++ b/src/modules/network_data/model/alarm_forward_log.go @@ -5,16 +5,16 @@ type AlarmForwardLog struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` NeType string `json:"neType" gorm:"column:ne_type"` NeId string `json:"neId" gorm:"column:ne_id"` - AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 同网元类型连续递增 + AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 - AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 0:clear, 1:active - AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5 - OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 秒级 + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 + AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间 - Type string `json:"type" gorm:"column:type"` // 转发方式 SMS/EMAIL + Type string `json:"type" gorm:"column:type"` // 转发方式 SMS/EMAIL/SMSC Target string `json:"target" gorm:"column:target"` // 发送目标用户 Result string `json:"result" gorm:"column:result"` // 发送结果 } @@ -28,7 +28,7 @@ func (*AlarmForwardLog) TableName() string { type AlarmForwardLogQuery struct { NeType string `json:"neType" form:"neType"` // 网元类型 NeID string `json:"neId" form:"neId"` // 网元ID - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc diff --git a/src/modules/network_data/model/alarm_log.go b/src/modules/network_data/model/alarm_log.go index 8931daf4..841308bd 100644 --- a/src/modules/network_data/model/alarm_log.go +++ b/src/modules/network_data/model/alarm_log.go @@ -5,14 +5,14 @@ type AlarmLog struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` NeType string `json:"neType" gorm:"column:ne_type"` NeId string `json:"neId" gorm:"column:ne_id"` - AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 同网元类型连续递增 + AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 - AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 0:clear, 1:active - AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5 - OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 秒级 + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 + AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间 } @@ -23,11 +23,11 @@ func (*AlarmLog) TableName() string { // AlarmLogQuery 告警日志数据查询参数结构体 type AlarmLogQuery struct { - NeType string `json:"neType" form:"neType"` // 网元类型 - NeID string `json:"neId" form:"neId"` // 网元ID - AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active - OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time + NeType string `json:"neType" form:"neType"` // 网元类型 + NeID string `json:"neId" form:"neId"` // 网元ID + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态 + OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc diff --git a/src/modules/network_data/model/cbc_message.go b/src/modules/network_data/model/cbc_message.go new file mode 100644 index 00000000..37470209 --- /dev/null +++ b/src/modules/network_data/model/cbc_message.go @@ -0,0 +1,112 @@ +package model + +import ( + "database/sql/driver" + "encoding/json" + "errors" + "fmt" + "strconv" + "strings" +) + +type CBCEventStatus int + +// CBCEventStatus CB事件状态枚举 +const ( + CBCEventStatusNull CBCEventStatus = iota // 未知状态 + CBCEventStatusActive + CBCEventStatusInactive +) + +func (status CBCEventStatus) Enum() string { + switch status { + case CBCEventStatusNull: + return "NULL" + case CBCEventStatusActive: + return "ACTIVE" + case CBCEventStatusInactive: + return "INACTIVE" + default: + return "UNKNOWN" + } +} + +func (status CBCEventStatus) String() string { + return fmt.Sprintf("%d", status) +} + +// ParseCBCEventStatus 将字符串转换为 枚举类型 +func ParseCBCEventStatus(s string) CBCEventStatus { + if i, err := strconv.Atoi(s); err == nil { + return CBCEventStatus(i) + } + // 如果转换失败,则按名称匹配(忽略大小写) + switch strings.ToUpper(s) { + case "NULL": + return CBCEventStatusNull + case "ACTIVE": + return CBCEventStatusActive + case "INACTIVE": + return CBCEventStatusInactive + case "": + // 如果字符串为空,则返回未知状态 + return CBCEventStatusNull + default: + // 默认返回未知状态 + return CBCEventStatusNull + } +} + +// CBCMessageQuery 查询条件结构体 +type CBCMessageQuery struct { + NeType string `form:"neType"` // 网元类型 + NeId string `form:"neId"` // 网元ID + EventName string `form:"eventName"` // 事件名称 + Status string `form:"status"` // 消息状态 + StartTime string `form:"startTime"` // 创建时间范围-起始 + EndTime string `form:"endTime"` // 创建时间范围-结束 + PageNum int `form:"pageNum" binding:"required"` + PageSize int `form:"pageSize" binding:"required"` +} + +// @Description CBCMessage CB消息 +type CBCMessage struct { + Id int64 `json:"id" gorm:"column:id"` // CB消息ID + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeId string `json:"neId" gorm:"column:ne_id"` // 网元ID + MessageJson json.RawMessage `json:"messageJson" gorm:"column:message_json"` // 消息内容JSON + Status CBCEventStatus `json:"status" gorm:"column:status"` // 消息状态 + Detail string `json:"detail" gorm:"column:detail"` // 详情 + CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间 + UpdatedAt int64 `json:"updatedAt" gorm:"column:updated_at"` // 更新时间 +} + +// TableName 表名称 +func (*CBCMessage) TableName() string { + return "cbc_message" +} + +// Scan 实现 sql.Scanner 接口,支持从数据库字符串转为 CBCEventStatus +func (s *CBCEventStatus) Scan(value interface{}) error { + switch v := value.(type) { + case string: + *s = ParseCBCEventStatus(v) + return nil + case []byte: + *s = ParseCBCEventStatus(string(v)) + return nil + case int64: + *s = CBCEventStatus(v) + return nil + case int: + *s = CBCEventStatus(v) + return nil + default: + return errors.New("unsupported Scan type for CBCEventStatus") + } +} + +// Value 实现 driver.Valuer 接口,支持将 CBCEventStatus 存为字符串 +func (s CBCEventStatus) Value() (driver.Value, error) { + return s.Enum(), nil +} diff --git a/src/modules/network_data/model/cdr_event.go b/src/modules/network_data/model/cdr_event.go new file mode 100644 index 00000000..8b713d13 --- /dev/null +++ b/src/modules/network_data/model/cdr_event.go @@ -0,0 +1,17 @@ +package model + +// CDREvent CDR会话对象 cdr_event +type CDREvent struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUid string `json:"rmUid" gorm:"column:rm_uid"` // 可能没有 + Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 + CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String + CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 +} + +// TableName 表名称 +func (*CDREvent) TableName() string { + return "cdr_event" +} diff --git a/src/modules/network_data/model/cdr_event_ims.go b/src/modules/network_data/model/cdr_event_ims.go deleted file mode 100644 index 8c383ad2..00000000 --- a/src/modules/network_data/model/cdr_event_ims.go +++ /dev/null @@ -1,33 +0,0 @@ -package model - -// CDREventIMS CDR会话对象IMS cdr_event_ims -type CDREventIMS struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUid string `json:"rmUid" gorm:"column:rm_uid"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 -} - -// TableName 表名称 -func (*CDREventIMS) TableName() string { - return "cdr_event_ims" -} - -// CDREventIMSQuery CDR会话对象IMS查询参数结构体 -type CDREventIMSQuery struct { - NeType string `json:"neType" form:"neType" binding:"required,oneof=IMS"` // 网元类型IMS - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - RecordType string `json:"recordType" form:"recordType"` // 记录行为 MOC MTC - CallerParty string `json:"callerParty" form:"callerParty"` // 主叫号码 - CalledParty string `json:"calledParty" form:"calledParty"` // 被叫号码 - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp - EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` -} diff --git a/src/modules/network_data/model/cdr_event_sgwc.go b/src/modules/network_data/model/cdr_event_sgwc.go deleted file mode 100644 index 26562065..00000000 --- a/src/modules/network_data/model/cdr_event_sgwc.go +++ /dev/null @@ -1,32 +0,0 @@ -package model - -// CDREventSGWC CDR会话对象SGWC cdr_event_sgwc -type CDREventSGWC struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUid string `json:"rmUid" gorm:"column:rm_uid"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 -} - -// TableName 表名称 -func (*CDREventSGWC) TableName() string { - return "cdr_event_sgwc" -} - -// CDREventSGWCQuery CDR会话对象SGWC查询参数结构体 -type CDREventSGWCQuery struct { - NeType string `json:"neType" form:"neType" binding:"required,oneof=SGWC"` // SGWC - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - IMSI string `json:"imsi" form:"imsi"` - MSISDN string `json:"msisdn" form:"msisdn"` - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp - EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` -} diff --git a/src/modules/network_data/model/cdr_event_smf.go b/src/modules/network_data/model/cdr_event_smf.go deleted file mode 100644 index a6df3ced..00000000 --- a/src/modules/network_data/model/cdr_event_smf.go +++ /dev/null @@ -1,33 +0,0 @@ -package model - -// CDREventSMF CDR会话对象SMF cdr_event_smf -type CDREventSMF struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUid string `json:"rmUid" gorm:"column:rm_uid"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 -} - -// TableName 表名称 -func (*CDREventSMF) TableName() string { - return "cdr_event_smf" -} - -// CDREventSMFQuery CDR会话对象SMF查询参数结构体 -type CDREventSMFQuery struct { - NeType string `json:"neType" form:"neType" binding:"required,oneof=SMF"` // 网元类型, 暂时支持SMF - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - RecordType string `json:"recordType" form:"recordType"` // 暂时没用到 - SubscriberID string `json:"subscriberID" form:"subscriberID"` - DNN string `json:"dnn" form:"dnn"` - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp - EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` -} diff --git a/src/modules/network_data/model/cdr_event_smsc.go b/src/modules/network_data/model/cdr_event_smsc.go deleted file mode 100644 index 753e694a..00000000 --- a/src/modules/network_data/model/cdr_event_smsc.go +++ /dev/null @@ -1,33 +0,0 @@ -package model - -// CDREventSMSC CDR会话对象SMSC cdr_event_smsc -type CDREventSMSC struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUid string `json:"rmUid" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 -} - -// TableName 表名称 -func (*CDREventSMSC) TableName() string { - return "cdr_event_smsc" -} - -// CDREventSMSCQuery CDR会话对象SMSC查询参数结构体 -type CDREventSMSCQuery struct { - NeType string `json:"neType" form:"neType" binding:"required,oneof=SMSC"` // 网元类型, 暂时支持SMSC - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - RecordType string `json:"recordType" form:"recordType"` // 记录行为 MOSM MTSM - CallerParty string `json:"callerParty" form:"callerParty"` // 主叫号码 - CalledParty string `json:"calledParty" form:"calledParty"` // 被叫号码 - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp - EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` -} diff --git a/src/modules/network_data/model/ue_event.go b/src/modules/network_data/model/ue_event.go new file mode 100644 index 00000000..5b0b309d --- /dev/null +++ b/src/modules/network_data/model/ue_event.go @@ -0,0 +1,18 @@ +package model + +// UEEvent UE会话对象 ue_event +type UEEvent struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 + Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到时间 + EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 + EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String + CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 +} + +// TableName 表名称 +func (*UEEvent) TableName() string { + return "ue_event" +} diff --git a/src/modules/network_data/model/ue_event_amf.go b/src/modules/network_data/model/ue_event_amf.go deleted file mode 100644 index 23340324..00000000 --- a/src/modules/network_data/model/ue_event_amf.go +++ /dev/null @@ -1,33 +0,0 @@ -package model - -// UEEventAMF UE会话对象AMF ue_event_amf -type UEEventAMF struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 -} - -// TableName 表名称 -func (*UEEventAMF) TableName() string { - return "ue_event_amf" -} - -// UEEventAMFQuery UE会话对象AMF查询参数结构体 -type UEEventAMFQuery struct { - NeType string `json:"neType" form:"neType" binding:"required,oneof=AMF"` // 网元类型, 暂时支持AMF - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state - IMSI string `json:"imsi" form:"imsi"` // imsi - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp - EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` -} diff --git a/src/modules/network_data/model/ue_event_mme.go b/src/modules/network_data/model/ue_event_mme.go deleted file mode 100644 index 5c43eb79..00000000 --- a/src/modules/network_data/model/ue_event_mme.go +++ /dev/null @@ -1,33 +0,0 @@ -package model - -// UEEventMME UE会话对象MME ue_event_mme -type UEEventMME struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 -} - -// TableName 表名称 -func (*UEEventMME) TableName() string { - return "ue_event_mme" -} - -// UEEventMMEQuery UE会话对象MME查询参数结构体 -type UEEventMMEQuery struct { - NeType string `json:"neType" form:"neType" binding:"required,oneof=MME"` // 网元类型, 暂时支持MME - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state - IMSI string `json:"imsi" form:"imsi"` // imsi - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp - EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` -} diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index d0a68959..e41d1683 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -33,6 +33,31 @@ func Setup(router *gin.Engine) { ) } + // 性能自定义统计信息 + kpicGroup := neDataGroup.Group("/kpic") + { + kpicGroup.GET("/data", + middleware.AuthorizeUser(nil), + controller.NewKPIC.KPIData, + ) + kpicGroup.GET("/title/list", + middleware.AuthorizeUser(nil), + controller.NewKPIC.ListTitle, + ) + kpicGroup.POST("/title", + middleware.AuthorizeUser(nil), + controller.NewKPIC.AddTitle, + ) + kpicGroup.PUT("/title", + middleware.AuthorizeUser(nil), + controller.NewKPIC.EditTitle, + ) + kpicGroup.DELETE("/title", + middleware.AuthorizeUser(nil), + controller.NewKPIC.RemoveTitle, + ) + } + // 告警数据信息 alarmGroup := neDataGroup.Group("/alarm") { @@ -59,6 +84,18 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.alarm", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewAlarm.Export, ) + alarmGroup.GET("/count/type", + middleware.AuthorizeUser(nil), + controller.NewAlarm.CountType, + ) + alarmGroup.GET("/count/severity", + middleware.AuthorizeUser(nil), + controller.NewAlarm.CountSeverity, + ) + alarmGroup.GET("/count/ne", + middleware.AuthorizeUser(nil), + controller.NewAlarm.CountNe, + ) } // 告警日志数据信息 @@ -100,7 +137,7 @@ func Setup(router *gin.Engine) { middleware.AuthorizeUser(nil), controller.NewNBState.List, ) - nbStateGroup.POST("/export", + nbStateGroup.GET("/export", middleware.AuthorizeUser(nil), controller.NewNBState.Export, ) @@ -118,7 +155,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewIMS.CDRRemove, ) - imsGroup.POST("/cdr/export", + imsGroup.GET("/cdr/export", middleware.AuthorizeUser(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewIMS.CDRExport, @@ -145,7 +182,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewSMSC.CDRRemove, ) - smscGroup.POST("/cdr/export", + smscGroup.GET("/cdr/export", middleware.AuthorizeUser(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewSMSC.CDRExport, @@ -164,7 +201,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewSMF.CDRRemove, ) - smfGroup.POST("/cdr/export", + smfGroup.GET("/cdr/export", middleware.AuthorizeUser(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewSMF.CDRExport, @@ -191,7 +228,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewAMF.UERemove, ) - amfGroup.POST("/ue/export", + amfGroup.GET("/ue/export", middleware.AuthorizeUser(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewAMF.UEExport, @@ -215,6 +252,29 @@ func Setup(router *gin.Engine) { ) } + // 网元N3IWF + n3iwfGroup := neDataGroup.Group("/n3iwf") + { + n3iwfGroup.GET("/sub/list", + middleware.AuthorizeUser(nil), + controller.NewN3IWF.SubUserList, + ) + } + + // 网元N3IWF + nssf := controller.NewNSSF + nssfGroup := neDataGroup.Group("/nssf") + { + nssfGroup.GET("/sub/list", + middleware.AuthorizeUser(nil), + nssf.SubUserList, + ) + nssfGroup.GET("/amf/list", + middleware.AuthorizeUser(nil), + nssf.AvailableList, + ) + } + // 备份数据 backupGroup := neDataGroup.Group("/backup") { @@ -452,7 +512,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewMME.UERemove, ) - mmeGroup.POST("/ue/export", + mmeGroup.GET("/ue/export", middleware.AuthorizeUser(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewMME.UEExport, @@ -519,6 +579,44 @@ func Setup(router *gin.Engine) { controller.NewPCF.RuleInfoImport, ) } + + // 网元CBC + cbcGroup := neDataGroup.Group("/cbc") + { + cbcGroup.GET("/message/list", + middleware.AuthorizeUser(nil), + controller.NewCBC.List, + ) + cbcGroup.GET("/message/:id", + middleware.AuthorizeUser(nil), + controller.NewCBC.ListById, + ) + cbcGroup.POST("/message", + middleware.AuthorizeUser(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.cbcMessage", collectlogs.BUSINESS_TYPE_IMPORT)), + controller.NewCBC.Insert, + ) + cbcGroup.PUT("/message/:id", + middleware.AuthorizeUser(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.cbcMessage", collectlogs.BUSINESS_TYPE_UPDATE)), + controller.NewCBC.Update, + ) + cbcGroup.PUT("/message/:id/:status", + middleware.AuthorizeUser(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.cbcMessage", collectlogs.BUSINESS_TYPE_UPDATE)), + controller.NewCBC.UpdateStatus, + ) + cbcGroup.DELETE("/message/:id", + middleware.AuthorizeUser(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.cbcMessage", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewCBC.Delete, + ) + cbcGroup.GET("/message/export", + middleware.AuthorizeUser(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.cbcMessage", collectlogs.BUSINESS_TYPE_EXPORT)), + controller.NewCBC.Export, + ) + } } // InitLoad 初始参数 diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go index 9cbbea1c..aa21d678 100644 --- a/src/modules/network_data/repository/alarm.go +++ b/src/modules/network_data/repository/alarm.go @@ -1,6 +1,7 @@ package repository import ( + "fmt" "strings" "time" @@ -32,7 +33,7 @@ func (r Alarm) SelectByPage(query model.AlarmQuery) ([]model.Alarm, int64) { tx = tx.Where("pv_flag = ?", query.PvFlag) } if query.AlarmCode != "" { - tx = tx.Where("alarm_code = ?", query.AlarmCode) + tx = tx.Where("alarm_code like ?", fmt.Sprintf("%%%s%%", query.AlarmCode)) } if query.AlarmType != "" { tx = tx.Where("alarm_type in (?)", strings.Split(query.AlarmType, ",")) @@ -192,3 +193,21 @@ func (r Alarm) SelectAlarmSeqLast(neType, neId string) int64 { } return alarmSeq } + +// GroupTotal 分组统计 +func (r Alarm) GroupTotal(alarmStatus string, group string, limit int) []map[string]any { + tx := db.DB("").Model(&model.Alarm{}) + tx = tx.Select("count(*) as total", group) + tx = tx.Where("alarm_status=?", alarmStatus) + tx = tx.Group(group).Order("total DESC") + // 查询数据 + var rows []map[string]any = make([]map[string]any, 0) + if limit > 0 { + tx = tx.Limit(limit) + } + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} diff --git a/src/modules/network_data/repository/alarm_log.go b/src/modules/network_data/repository/alarm_log.go index 1ee20cec..5008241f 100644 --- a/src/modules/network_data/repository/alarm_log.go +++ b/src/modules/network_data/repository/alarm_log.go @@ -24,6 +24,9 @@ func (r AlarmLog) SelectByPage(query model.AlarmLogQuery) ([]model.AlarmLog, int if query.NeID != "" { tx = tx.Where("ne_id = ?", query.NeID) } + if query.AlarmStatus != "" { + tx = tx.Where("alarm_status = ?", query.AlarmStatus) + } if query.BeginTime != 0 { tx = tx.Where("created_at >= ?", query.BeginTime) } diff --git a/src/modules/network_data/repository/cbc_message.go b/src/modules/network_data/repository/cbc_message.go new file mode 100644 index 00000000..f37c9866 --- /dev/null +++ b/src/modules/network_data/repository/cbc_message.go @@ -0,0 +1,273 @@ +package repository + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/modules/network_data/model" + "gorm.io/gorm" +) + +// 实例化数据层 UEEvent 结构体 +var NewCBCMessage = &CBCMessage{} + +// UEEvent UE会话事件 数据层处理 +type CBCMessage struct{} + +// SelectCBCMessage 根据条件分页查询CB消息 +func (s *CBCMessage) SelectByPage(query model.CBCMessageQuery) ([]model.CBCMessage, int, error) { + var msg []model.CBCMessage + var total int64 + + tx := db.DB("").Table("cbc_message") + + if query.NeType != "" { + tx = tx.Where("ne_type = ?", query.NeType) + } + if query.NeId != "" { + tx = tx.Where("ne_id = ?", query.NeId) + } + if query.EventName != "" { + tx = tx.Where("JSON_EXTRACT(message_json, '$.eventName') = ?", query.EventName) + } + if query.Status != "" { + tx = tx.Where("status = ?", query.Status) + } + + var startMicro, endMicro int64 + var err error + if query.StartTime != "" { + startMicro, err = parseTimeToMilli(query.StartTime) + if err != nil { + return nil, 0, fmt.Errorf("invalid start time: %w", err) + } + } + if query.EndTime != "" { + endMicro, err = parseTimeToMilli(query.EndTime) + if err != nil { + return nil, 0, fmt.Errorf("invalid end time: %w", err) + } + } + if startMicro > 0 && endMicro > 0 { + tx = tx.Where("created_at BETWEEN ? AND ?", startMicro, endMicro) + } else if startMicro > 0 { + tx = tx.Where("created_at >= ?", startMicro) + } else if endMicro > 0 { + tx = tx.Where("created_at <= ?", endMicro) + } + + // 统计总数 + if err := tx.Count(&total).Error; err != nil { + return nil, 0, fmt.Errorf("failed to count CBC message: %w", err) + } + + // 分页查询 + offset := (query.PageNum - 1) * query.PageSize + if err := tx.Limit(query.PageSize).Offset(offset).Order("created_at desc").Find(&msg).Error; err != nil { + return nil, 0, fmt.Errorf("failed to select CBC message: %w", err) + } + + return msg, int(total), nil +} + +// SelectCBCMessageByPage 分页查询CB消息 +// @Description 分页查询CB消息 +// @param page 页码 +// @param pageSize 每页大小 +// @return []model.CBCMessage CB消息列表 +// @return int 总记录数 +// @return error 错误信息 +// @example +// SelectByPage(1, 10) +// func (s *CBCMessage) SelectByPage(pageNum int, pageSize int) ([]model.CBCMessage, int, error) { +// var tickets []model.CBCMessage +// var total int64 + +// // 统计总数 +// if err := db.DB("").Table("cbc_message").Count(&total).Error; err != nil { +// return nil, 0, fmt.Errorf("failed to count CBC message: %w", err) +// } + +// // 分页查询 +// offset := (pageNum - 1) * pageSize +// if err := db.DB("").Table("cbc_message"). +// Limit(pageSize). +// Offset(offset). +// Find(&tickets).Error; err != nil { +// return nil, 0, fmt.Errorf("failed to select CBC message: %w", err) +// } + +// return tickets, int(total), nil +// } + +// InsertCBCMessage 插入CB消息 +// @Description 插入CB消息 +// @param msg CB消息对象 +// @return error 错误信息 +// @example +// CBCMessage.InsertCBCMessage(msg) +func (s *CBCMessage) Insert(msg model.CBCMessage) error { + msg.CreatedAt = time.Now().UnixMilli() + // 这里可以使用ORM或其他方式将ticket插入到数据库中 + if err := db.DB("").Table("cbc_message").Create(&msg).Error; err != nil { + return fmt.Errorf("failed to insert CBC message: %w", err) + } + return nil +} + +// SelectCBCMessageById 根据工单ID查询CB消息 +// @Description 根据工单ID查询CB消息 +// @param id 工单ID +// @return *model.CBCMessage CB消息对象 +// @return error 错误信息 +// @example +// CBCMessage.SelectCBCMessageById(12345) +func (s *CBCMessage) SelectById(id int64) (*model.CBCMessage, error) { + var msg model.CBCMessage + if err := db.DB("").Table("cbc_message"). + Where("id = ?", id). + First(&msg).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, nil + } + return nil, fmt.Errorf("failed to select CBC message: %w", err) + } + return &msg, nil +} + +// SelectByEventName 根据事件名称查询CB消息 +func (s *CBCMessage) SelectByEventName(eventName string) (*model.CBCMessage, error) { + var msg model.CBCMessage + if err := db.DB("").Table("cbc_message"). + Where("JSON_EXTRACT(message_json, '$.eventName') = ?", eventName). + First(&msg).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, nil + } + return nil, err + } + return &msg, nil +} + +// UpdateCBCMessage 更新CB消息 +// @Description 更新CB消息 +// @param msg CB消息对象 +// @return error 错误信息 +// @example +// mfCBCMessageService.UpdateCBCMessage(msg) +func (s *CBCMessage) Update(id int64, messageJson json.RawMessage) (*model.CBCMessage, error) { + var msg model.CBCMessage + now := time.Now().UnixMilli() + + err := db.DB("").Transaction(func(tx *gorm.DB) error { + // 在事务中更新 + if err := tx.Table("cbc_message"). + Where("id = ?", id). + Updates(map[string]any{ + "message_json": messageJson, + "updated_at": now, + }).Error; err != nil { + return fmt.Errorf("failed to update CBC message: %w", err) + } + + // 在事务中查询更新后的记录 + if err := tx.Table("cbc_message"). + Where("id = ?", id). + First(&msg).Error; err != nil { + return fmt.Errorf("failed to fetch updated CBC message: %w", err) + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &msg, nil +} + +// UpdateCBCMessage 更新CB消息 +// @Description 更新CB消息 +// @param msg CB消息对象 +// @return error 错误信息 +// @example +// UpdateCBCMessageDetail(msg) +func (s *CBCMessage) UpdateDetail(eventName, detail string) error { + now := time.Now().UnixMilli() + if err := db.DB("").Table("cbc_message"). + Where("JSON_EXTRACT(message_json, '$.eventName') = ?", eventName). + Updates(map[string]any{ + "detail": detail, + "updated_at": now, + }).Error; err != nil { + return fmt.Errorf("failed to update CBC message: %w", err) + } + + return nil +} + +// DeleteCBCMessage 删除CB消息 +// @Description 删除CB消息 +// @param id 工单ID +// @return error 错误信息 +// @example +// DeleteCBCMessage(12345) +func (s *CBCMessage) Delete(id int64) error { + // 执行删除操作 + if err := db.DB("").Table("cbc_message"). + Where("id = ?", id). + Delete(&model.CBCMessage{}).Error; err != nil { + return fmt.Errorf("failed to delete CBC message: %w", err) + } + return nil +} + +// UpdateCBCMessageStatus 更新CB消息状态 +// @Description 更新CB消息状态,并根据状态变化发送相应的HTTP请求 +// @param status 新状态 +// @return error 错误信息 +func (s *CBCMessage) UpdateStatus(id int64, status model.CBCEventStatus) error { + // 更新数据库状态 + now := time.Now().UnixMilli() + if err := db.DB("").Table("cbc_message"). + Where("id = ?", id). + Updates(map[string]interface{}{ + "status": status, + "updated_at": now, + }).Error; err != nil { + return fmt.Errorf("failed to update CBC message status: %w", err) + } + + return nil +} + +// Select 查询所有CB消息 +func (s *CBCMessage) Select(msgs *[]model.CBCMessage) error { + if err := db.DB("").Table("cbc_message").Find(&msgs).Error; err != nil { + return fmt.Errorf("failed to query CB messages: %w", err) + } + return nil +} + +// SelectByNeId 根据网元ID查询CB消息 +func (s *CBCMessage) SelectByNeId(neId string, msgs *[]model.CBCMessage) error { + if err := db.DB("").Table("cbc_message").Where("ne_id = ?", neId).Find(&msgs).Error; err != nil { + return fmt.Errorf("failed to query CB messages: %w", err) + } + return nil +} + +// 假设 query.StartTime 和 query.EndTime 是 "2006-01-02 15:04:05" 格式字符串 +func parseTimeToMilli(ts string) (int64, error) { + if ts == "" { + return 0, nil + } + t, err := time.ParseInLocation("2006-01-02 15:04:05", ts, time.Local) + if err != nil { + return 0, err + } + return t.UnixMilli(), nil +} diff --git a/src/modules/network_data/repository/cdr_event.go b/src/modules/network_data/repository/cdr_event.go new file mode 100644 index 00000000..d115e3d1 --- /dev/null +++ b/src/modules/network_data/repository/cdr_event.go @@ -0,0 +1,167 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 CDREvent 结构体 +var NewCDREvent = &CDREvent{} + +// CDREvent CDR会话事件 数据层处理 +type CDREvent struct{} + +// SelectByPage 分页查询集合 +func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model.CDREvent, int64) { + // 表名 + tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(neType)) + tx := db.DB("").Table(tableName).Model(&model.CDREvent{}) + // 查询条件拼接 + if v, ok := query["rmUID"]; ok && v != "" { + tx = tx.Where("rm_uid = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = v + "000" + } + tx = tx.Where("created_at >= ?", v) + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = v + "000" + } + tx = tx.Where("created_at <= ?", v) + } + + // 各个网元特殊查询条件 + switch neType { + case "SMSC": + if v, ok := query["callerParty"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["calledParty"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["recordType"]; ok && v != "" { + recordTypes := strings.Split(v, ",") + var querytrArr []string + for _, recordType := range recordTypes { + querytrArr = append(querytrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) + } + tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(querytrArr, " OR "))) + } + case "SMF": + if v, ok := query["recordType"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.recordType') = ?", v) + } + if v, ok := query["subscriberID"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["dnn"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.pDUSessionChargingInformation.dNNID') = ?", v) + } + case "SGWC": + if v, ok := query["imsi"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedIMSI') like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["msisdn"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedMSISDN') like ?", fmt.Sprintf("%%%s%%", v)) + } + case "IMS": + if v, ok := query["callerParty"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["calledParty"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') like ?", fmt.Sprintf("%%%s%%", v)) + } + } + + var total int64 = 0 + rows := []model.CDREvent{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } + + // 分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v + if o, ok := query["sortOrder"]; ok && o != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return rows, total +} + +// SelectByIds 通过ID查询 +func (r CDREvent) SelectByIds(neType string, ids []int64) []model.CDREvent { + rows := []model.CDREvent{} + if len(ids) <= 0 { + return rows + } + // 表名 + tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(neType)) + tx := db.DB("").Table(tableName).Model(&model.CDREvent{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r CDREvent) DeleteByIds(neType string, ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + // 表名 + tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(neType)) + tx := db.DB("").Table(tableName).Where("id in ?", ids) + if err := tx.Delete(&model.CDREvent{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// Insert 新增信息 返回新增数据ID +func (r CDREvent) Insert(param model.CDREvent) int64 { + if param.NeType == "" { + return 0 + } + if param.CreatedAt == 0 { + param.CreatedAt = time.Now().UnixMilli() + } + // 表名 + tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(param.NeType)) + // 执行插入 + if err := db.DB("").Table(tableName).Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} diff --git a/src/modules/network_data/repository/cdr_event_ims.go b/src/modules/network_data/repository/cdr_event_ims.go deleted file mode 100644 index 814bd83d..00000000 --- a/src/modules/network_data/repository/cdr_event_ims.go +++ /dev/null @@ -1,107 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/database/db" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventIMS 结构体 -var NewCDREventIMS = &CDREventIMS{} - -// CDREventIMS CDR会话事件 数据层处理 -type CDREventIMS struct{} - -// SelectByPage 分页查询集合 -func (r CDREventIMS) SelectByPage(query model.CDREventIMSQuery) ([]model.CDREventIMS, int64) { - tx := db.DB("").Model(&model.CDREventIMS{}) - // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.RmUID != "" { - tx = tx.Where("rm_uid = ?", query.RmUID) - } - if query.BeginTime != 0 { - tx = tx.Where("created_at >= ?", query.BeginTime) - } - if query.EndTime != 0 { - tx = tx.Where("created_at <= ?", query.EndTime) - } - if query.CallerParty != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", query.CallerParty) - } - if query.CalledParty != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') = ?", query.CalledParty) - } - - if query.RecordType != "" { - recordTypes := strings.Split(query.RecordType, ",") - var querytrArr []string - for _, recordType := range recordTypes { - querytrArr = append(querytrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) - } - tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(querytrArr, " OR "))) - } - - // 查询结果 - var total int64 = 0 - rows := []model.CDREventIMS{} - - // 查询数量为0直接返回 - if err := tx.Count(&total).Error; err != nil || total <= 0 { - return rows, total - } - - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - - // 查询数据分页 - pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) - tx = tx.Limit(pageSize).Offset(pageSize * pageNum) - err := tx.Find(&rows).Error - if err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows, total - } - return rows, total -} - -// SelectByIds 通过ID查询 -func (r *CDREventIMS) SelectByIds(ids []int64) []model.CDREventIMS { - rows := []model.CDREventIMS{} - if len(ids) <= 0 { - return rows - } - tx := db.DB("").Model(&model.CDREventIMS{}) - // 构建查询条件 - tx = tx.Where("id in ?", ids) - // 查询数据 - if err := tx.Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMS) DeleteByIds(ids []int64) int64 { - if len(ids) <= 0 { - return 0 - } - tx := db.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.CDREventIMS{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/network_data/repository/cdr_event_sgwc.go b/src/modules/network_data/repository/cdr_event_sgwc.go deleted file mode 100644 index 6410120f..00000000 --- a/src/modules/network_data/repository/cdr_event_sgwc.go +++ /dev/null @@ -1,95 +0,0 @@ -package repository - -import ( - "be.ems/src/framework/database/db" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSGWC 结构体 -var NewCDREventSGWC = &CDREventSGWC{} - -// CDREventSGWC CDR会话事件 数据层处理 -type CDREventSGWC struct{} - -// SelectByPage 分页查询集合 -func (r CDREventSGWC) SelectByPage(query model.CDREventSGWCQuery) ([]model.CDREventSGWC, int64) { - tx := db.DB("").Model(&model.CDREventSGWC{}) - // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.RmUID != "" { - tx = tx.Where("rm_uid = ?", query.RmUID) - } - if query.BeginTime != 0 { - tx = tx.Where("timestamp >= ?", query.BeginTime) - } - if query.EndTime != 0 { - tx = tx.Where("timestamp <= ?", query.EndTime) - } - if query.IMSI != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedIMSI') = ?", query.IMSI) - } - if query.MSISDN != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedMSISDN') = ?", query.MSISDN) - } - - // 查询结果 - var total int64 = 0 - rows := []model.CDREventSGWC{} - - // 查询数量为0直接返回 - if err := tx.Count(&total).Error; err != nil || total <= 0 { - return rows, total - } - - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - - // 查询数据分页 - pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) - tx = tx.Limit(pageSize).Offset(pageSize * pageNum) - err := tx.Find(&rows).Error - if err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows, total - } - return rows, total -} - -// SelectByIds 通过ID查询 -func (r *CDREventSGWC) SelectByIds(ids []int64) []model.CDREventSGWC { - rows := []model.CDREventSGWC{} - if len(ids) <= 0 { - return rows - } - tx := db.DB("").Model(&model.CDREventSGWC{}) - // 构建查询条件 - tx = tx.Where("id in ?", ids) - // 查询数据 - if err := tx.Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSGWC) DeleteByIds(ids []int64) int64 { - if len(ids) <= 0 { - return 0 - } - tx := db.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.CDREventSGWC{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/network_data/repository/cdr_event_smf.go b/src/modules/network_data/repository/cdr_event_smf.go deleted file mode 100644 index 6892e19d..00000000 --- a/src/modules/network_data/repository/cdr_event_smf.go +++ /dev/null @@ -1,98 +0,0 @@ -package repository - -import ( - "be.ems/src/framework/database/db" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMF 结构体 -var NewCDREventSMF = &CDREventSMF{} - -// CDREventSMF CDR会话事件 数据层处理 -type CDREventSMF struct{} - -// SelectByPage 分页查询集合 -func (r CDREventSMF) SelectByPage(query model.CDREventSMFQuery) ([]model.CDREventSMF, int64) { - tx := db.DB("").Model(&model.CDREventSMF{}) - // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.RmUID != "" { - tx = tx.Where("rm_uid = ?", query.RmUID) - } - if query.BeginTime != 0 { - tx = tx.Where("timestamp >= ?", query.BeginTime) - } - if query.EndTime != 0 { - tx = tx.Where("timestamp <= ?", query.EndTime) - } - if query.RecordType != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.recordType') = ?", query.RecordType) - } - if query.SubscriberID != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?", query.SubscriberID) - } - if query.DNN != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.pDUSessionChargingInformation.dNNID') = ?", query.DNN) - } - - // 查询结果 - var total int64 = 0 - rows := []model.CDREventSMF{} - - // 查询数量为0直接返回 - if err := tx.Count(&total).Error; err != nil || total <= 0 { - return rows, total - } - - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - - // 查询数据分页 - pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) - tx = tx.Limit(pageSize).Offset(pageSize * pageNum) - err := tx.Find(&rows).Error - if err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows, total - } - return rows, total -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMF) SelectByIds(ids []int64) []model.CDREventSMF { - rows := []model.CDREventSMF{} - if len(ids) <= 0 { - return rows - } - tx := db.DB("").Model(&model.CDREventSMF{}) - // 构建查询条件 - tx = tx.Where("id in ?", ids) - // 查询数据 - if err := tx.Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMF) DeleteByIds(ids []int64) int64 { - if len(ids) <= 0 { - return 0 - } - tx := db.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.CDREventSMF{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/network_data/repository/cdr_event_smsc.go b/src/modules/network_data/repository/cdr_event_smsc.go deleted file mode 100644 index 928e5063..00000000 --- a/src/modules/network_data/repository/cdr_event_smsc.go +++ /dev/null @@ -1,107 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/database/db" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMSC 结构体 -var NewCDREventSMSC = &CDREventSMSC{} - -// CDREventSMSC CDR会话事件 数据层处理 -type CDREventSMSC struct{} - -// SelectByPage 分页查询集合 -func (r CDREventSMSC) SelectByPage(query model.CDREventSMSCQuery) ([]model.CDREventSMSC, int64) { - tx := db.DB("").Model(&model.CDREventSMSC{}) - // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.RmUID != "" { - tx = tx.Where("rm_uid = ?", query.RmUID) - } - if query.BeginTime != 0 { - tx = tx.Where("timestamp >= ?", query.BeginTime) - } - if query.EndTime != 0 { - tx = tx.Where("timestamp <= ?", query.EndTime) - } - if query.CallerParty != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", query.CallerParty) - } - if query.CalledParty != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') = ?", query.CalledParty) - } - - if query.RecordType != "" { - recordTypes := strings.Split(query.RecordType, ",") - var querytrArr []string - for _, recordType := range recordTypes { - querytrArr = append(querytrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) - } - tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(querytrArr, " OR "))) - } - - // 查询结果 - var total int64 = 0 - rows := []model.CDREventSMSC{} - - // 查询数量为0直接返回 - if err := tx.Count(&total).Error; err != nil || total <= 0 { - return rows, total - } - - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - - // 查询数据分页 - pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) - tx = tx.Limit(pageSize).Offset(pageSize * pageNum) - err := tx.Find(&rows).Error - if err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows, total - } - return rows, total -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMSC) SelectByIds(ids []int64) []model.CDREventSMSC { - rows := []model.CDREventSMSC{} - if len(ids) <= 0 { - return rows - } - tx := db.DB("").Model(&model.CDREventSMSC{}) - // 构建查询条件 - tx = tx.Where("id in ?", ids) - // 查询数据 - if err := tx.Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSC) DeleteByIds(ids []int64) int64 { - if len(ids) <= 0 { - return 0 - } - tx := db.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.CDREventSMSC{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/network_data/repository/kpi_c_report.go b/src/modules/network_data/repository/kpi_c_report.go index 44a8ee28..244f9d70 100644 --- a/src/modules/network_data/repository/kpi_c_report.go +++ b/src/modules/network_data/repository/kpi_c_report.go @@ -17,7 +17,7 @@ var NewKpiCReport = &KpiCReport{} type KpiCReport struct{} // SelectGoldKPI 通过网元指标数据信息 -func (r KpiCReport) SelectKPI(query model.KPIQuery) []model.KpiCReport { +func (r KpiCReport) SelectKPI(query model.KPICQuery) []model.KpiCReport { rows := []model.KpiCReport{} if query.NeType == "" { return rows @@ -87,3 +87,132 @@ func (r KpiCReport) SelectKPITitle(neType string) []model.KpiCTitle { } return rows } + +// TitleLastKPIId 查询指标标题最后kpiid +func (r KpiCReport) TitleLastKPIId(neType string) string { + tx := db.DB("").Model(&model.KpiCTitle{}) + tx = tx.Where("ne_type=?", neType) + tx = tx.Select("kpi_id").Order("kpi_id DESC") + // 查询数据 + var kpiId string = "" + if err := tx.Limit(1).Find(&kpiId).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return kpiId + } + return kpiId +} + +// SelectByPageTitle 分页查询集合 +func (r KpiCReport) TitleSelectByPage(query map[string]string) ([]model.KpiCTitle, int64) { + tx := db.DB("").Model(&model.KpiCTitle{}) + // 查询条件拼接 + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["status"]; ok && v != "" { + tx = tx.Where("status = ?", v) + } else { + tx = tx.Where("status != ?", "2") + } + + // 查询结果 + var total int64 = 0 + rows := []model.KpiCTitle{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } + + // 分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v + if o, ok := query["sortOrder"]; ok && o != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return rows, total +} + +// TitleSelect 网元对应的指标名称 +func (r KpiCReport) TitleSelect(param model.KpiCTitle) []model.KpiCTitle { + tx := db.DB("").Model(&model.KpiCTitle{}) + // 构建查询条件 + if param.NeType != "" { + tx = tx.Where("ne_type =?", param.NeType) + } + if param.Title != "" { + tx = tx.Where("title = ?", param.Title) + } + if param.Status != "" { + tx = tx.Where("status = ?", param.Status) + } + // 查询数据 + rows := []model.KpiCTitle{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// TitleInsert 新增信息 +func (r KpiCReport) TitleInsert(param model.KpiCTitle) int64 { + if param.CreatedBy != "" { + param.UpdatedAt = time.Now().UnixMilli() + } + param.Status = "1" + tx := db.DB("").Create(¶m) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return param.ID +} + +// TitleUpdate 修改信息 +func (r KpiCReport) TitleUpdate(param model.KpiCTitle) int64 { + if param.ID <= 0 { + return 0 + } + param.UpdatedAt = time.Now().UnixMilli() + tx := db.DB("").Model(&model.KpiCTitle{}) + // 构建查询条件 + tx = tx.Where("id = ?", param.ID) + tx = tx.Omit("id", "created_by") + // 执行更新 + if err := tx.Updates(param).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// TitleDeleteByIds 批量删除信息 +func (r KpiCReport) TitleDeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.KpiCTitle{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + if err := tx.Update("status", 2).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} diff --git a/src/modules/network_data/repository/nb_state.go b/src/modules/network_data/repository/nb_state.go index 6faf437c..0c3fa1ed 100644 --- a/src/modules/network_data/repository/nb_state.go +++ b/src/modules/network_data/repository/nb_state.go @@ -5,7 +5,6 @@ import ( "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/date" "be.ems/src/modules/network_data/model" ) @@ -36,14 +35,14 @@ func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64) if len(startTime) == 10 { startTime = startTime + "000" } - tx = tx.Where("time >= ?", date.ParseDateToStr(startTime, date.YYYY_MM_DDTHH_MM_SSZ)) + tx = tx.Where("create_time >= ?", startTime) } if query.EndTime != "" { endTime := query.EndTime if len(endTime) == 10 { endTime = endTime + "999" } - tx = tx.Where("time <= ?", date.ParseDateToStr(endTime, date.YYYY_MM_DDTHH_MM_SSZ)) + tx = tx.Where("create_time <= ?", endTime) } // 查询结果 diff --git a/src/modules/network_data/repository/udm_auth.go b/src/modules/network_data/repository/udm_auth.go index 4a9565a5..c665b9de 100644 --- a/src/modules/network_data/repository/udm_auth.go +++ b/src/modules/network_data/repository/udm_auth.go @@ -27,7 +27,7 @@ func (r *UDMAuthUser) ClearAndInsert(neId string, uArr []model.UDMAuthUser) int6 } // SelectPage 根据条件分页查询 -func (r *UDMAuthUser) SelectPage(query map[string]string) (int64, []model.UDMAuthUser) { +func (r *UDMAuthUser) SelectPage(query map[string]string) ([]model.UDMAuthUser, int64) { tx := db.DB("").Model(&model.UDMAuthUser{}) // 查询条件拼接 if v, ok := query["imsi"]; ok && v != "" { @@ -48,7 +48,7 @@ func (r *UDMAuthUser) SelectPage(query map[string]string) (int64, []model.UDMAut // 查询数量 长度为0直接返回 if err := tx.Count(&total).Error; err != nil || total <= 0 { - return total, rows + return rows, total } // 分页 @@ -73,7 +73,7 @@ func (r *UDMAuthUser) SelectPage(query map[string]string) (int64, []model.UDMAut logger.Errorf("query err => %v", err) } - return total, rows + return rows, total } // SelectList 根据实体查询 diff --git a/src/modules/network_data/repository/udm_sub.go b/src/modules/network_data/repository/udm_sub.go index 5e7d2a14..2a939045 100644 --- a/src/modules/network_data/repository/udm_sub.go +++ b/src/modules/network_data/repository/udm_sub.go @@ -27,7 +27,7 @@ func (r *UDMSubUser) ClearAndInsert(neId string, u []model.UDMSubUser) int64 { } // SelectPage 根据条件分页查询字典类型 -func (r *UDMSubUser) SelectPage(query map[string]string) (int64, []model.UDMSubUser) { +func (r *UDMSubUser) SelectPage(query map[string]string) ([]model.UDMSubUser, int64) { tx := db.DB("").Model(&model.UDMSubUser{}) // 查询条件拼接 if v, ok := query["imsi"]; ok && v != "" { @@ -51,7 +51,7 @@ func (r *UDMSubUser) SelectPage(query map[string]string) (int64, []model.UDMSubU // 查询数量 长度为0直接返回 if err := tx.Count(&total).Error; err != nil || total <= 0 { - return total, rows + return rows, total } // 分页 @@ -76,7 +76,7 @@ func (r *UDMSubUser) SelectPage(query map[string]string) (int64, []model.UDMSubU logger.Errorf("query err => %v", err) } - return total, rows + return rows, total } // SelectList 根据实体查询 diff --git a/src/modules/network_data/repository/udm_voip.go b/src/modules/network_data/repository/udm_voip.go index e0fe4a93..ada692aa 100644 --- a/src/modules/network_data/repository/udm_voip.go +++ b/src/modules/network_data/repository/udm_voip.go @@ -27,7 +27,7 @@ func (r UDMVOIPUser) ClearAndInsert(neId string, uArr []model.UDMVOIPUser) int64 } // SelectPage 根据条件分页查询 -func (r UDMVOIPUser) SelectPage(query map[string]string) (int64, []model.UDMVOIPUser) { +func (r UDMVOIPUser) SelectPage(query map[string]string) ([]model.UDMVOIPUser, int64) { tx := db.DB("").Model(&model.UDMVOIPUser{}) // 查询条件拼接 if v, ok := query["username"]; ok && v != "" { @@ -48,7 +48,7 @@ func (r UDMVOIPUser) SelectPage(query map[string]string) (int64, []model.UDMVOIP // 查询数量 长度为0直接返回 if err := tx.Count(&total).Error; err != nil || total <= 0 { - return total, rows + return rows, total } // 分页 @@ -75,7 +75,7 @@ func (r UDMVOIPUser) SelectPage(query map[string]string) (int64, []model.UDMVOIP logger.Errorf("query err => %v", err) } - return total, rows + return rows, total } // SelectList 根据实体查询 diff --git a/src/modules/network_data/repository/udm_volte_ims.go b/src/modules/network_data/repository/udm_volte_ims.go index b4fc935d..984ccc4c 100644 --- a/src/modules/network_data/repository/udm_volte_ims.go +++ b/src/modules/network_data/repository/udm_volte_ims.go @@ -27,7 +27,7 @@ func (r UDMVolteIMSUser) ClearAndInsert(neId string, uArr []model.UDMVolteIMSUse } // SelectPage 根据条件分页查询 -func (r UDMVolteIMSUser) SelectPage(query map[string]string) (int64, []model.UDMVolteIMSUser) { +func (r UDMVolteIMSUser) SelectPage(query map[string]string) ([]model.UDMVolteIMSUser, int64) { tx := db.DB("").Model(&model.UDMVolteIMSUser{}) // 查询条件拼接 if v, ok := query["imsi"]; ok && v != "" { @@ -57,7 +57,7 @@ func (r UDMVolteIMSUser) SelectPage(query map[string]string) (int64, []model.UDM // 查询数量 长度为0直接返回 if err := tx.Count(&total).Error; err != nil || total <= 0 { - return total, rows + return rows, total } // 分页 @@ -84,7 +84,7 @@ func (r UDMVolteIMSUser) SelectPage(query map[string]string) (int64, []model.UDM logger.Errorf("query err => %v", err) } - return total, rows + return rows, total } // SelectList 根据实体查询 diff --git a/src/modules/network_data/repository/ue_event.go b/src/modules/network_data/repository/ue_event.go new file mode 100644 index 00000000..c2eb2579 --- /dev/null +++ b/src/modules/network_data/repository/ue_event.go @@ -0,0 +1,132 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 UEEvent 结构体 +var NewUEEvent = &UEEvent{} + +// UEEvent UE会话事件 数据层处理 +type UEEvent struct{} + +// SelectByPage 分页查询集合 +func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.UEEvent, int64) { + // 表名 + tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType)) + tx := db.DB("").Table(tableName).Model(&model.CDREvent{}) + // 查询条件拼接 + if v, ok := query["rmUID"]; ok && v != "" { + tx = tx.Where("rm_uid = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = v + "000" + } + tx = tx.Where("created_at >= ?", v) + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = v + "000" + } + tx = tx.Where("created_at <= ?", v) + } + if v, ok := query["eventType"]; ok && v != "" { + eventTypes := strings.Split(v, ",") + tx = tx.Where("event_type in ?", eventTypes) + } + if v, ok := query["imsi"]; ok && v != "" { + tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') like ?", fmt.Sprintf("%%%s%%", v)) + } + + // 查询结果 + var total int64 = 0 + rows := []model.UEEvent{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } + + // 分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v + if o, ok := query["sortOrder"]; ok && o != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return rows, total +} + +// SelectByIds 通过ID查询 +func (r UEEvent) SelectByIds(neType string, ids []int64) []model.UEEvent { + rows := []model.UEEvent{} + if len(ids) <= 0 { + return rows + } + // 表名 + tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType)) + tx := db.DB("").Table(tableName).Model(&model.UEEvent{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r UEEvent) DeleteByIds(neType string, ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + // 表名 + tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType)) + tx := db.DB("").Table(tableName).Where("id in ?", ids) + if err := tx.Delete(&model.UEEvent{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// Insert 新增信息 返回新增数据ID +func (r UEEvent) Insert(param model.UEEvent) int64 { + if param.NeType == "" { + return 0 + } + if param.CreatedAt == 0 { + param.CreatedAt = time.Now().UnixMilli() + } + // 表名 + tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(param.NeType)) + // 执行插入 + if err := db.DB("").Table(tableName).Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} diff --git a/src/modules/network_data/repository/ue_event_amf.go b/src/modules/network_data/repository/ue_event_amf.go deleted file mode 100644 index 60c109cc..00000000 --- a/src/modules/network_data/repository/ue_event_amf.go +++ /dev/null @@ -1,98 +0,0 @@ -package repository - -import ( - "strings" - - "be.ems/src/framework/database/db" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 UEEventAMF 结构体 -var NewUEEventAMF = &UEEventAMF{} - -// UEEventAMF UE会话事件 数据层处理 -type UEEventAMF struct{} - -// SelectByPage 分页查询集合 -func (r UEEventAMF) SelectByPage(query model.UEEventAMFQuery) ([]model.UEEventAMF, int64) { - tx := db.DB("").Model(&model.UEEventAMF{}) - // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.RmUID != "" { - tx = tx.Where("rm_uid = ?", query.RmUID) - } - if query.BeginTime != 0 { - tx = tx.Where("timestamp >= ?", query.BeginTime) - } - if query.EndTime != 0 { - tx = tx.Where("timestamp <= ?", query.EndTime) - } - if query.EventType != "" { - eventTypes := strings.Split(query.EventType, ",") - tx = tx.Where("event_type in ?", eventTypes) - } - if query.IMSI != "" { - tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') = ?", query.IMSI) - } - - // 查询结果 - var total int64 = 0 - rows := []model.UEEventAMF{} - - // 查询数量为0直接返回 - if err := tx.Count(&total).Error; err != nil || total <= 0 { - return rows, total - } - - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - - // 查询数据分页 - pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) - tx = tx.Limit(pageSize).Offset(pageSize * pageNum) - err := tx.Find(&rows).Error - if err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows, total - } - return rows, total -} - -// SelectByIds 通过ID查询 -func (r UEEventAMF) SelectByIds(ids []int64) []model.UEEventAMF { - rows := []model.UEEventAMF{} - if len(ids) <= 0 { - return rows - } - tx := db.DB("").Model(&model.UEEventAMF{}) - // 构建查询条件 - tx = tx.Where("id in ?", ids) - // 查询数据 - if err := tx.Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r UEEventAMF) DeleteByIds(ids []int64) int64 { - if len(ids) <= 0 { - return 0 - } - tx := db.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.UEEventAMF{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/network_data/repository/ue_event_mme.go b/src/modules/network_data/repository/ue_event_mme.go deleted file mode 100644 index ffcb6262..00000000 --- a/src/modules/network_data/repository/ue_event_mme.go +++ /dev/null @@ -1,98 +0,0 @@ -package repository - -import ( - "strings" - - "be.ems/src/framework/database/db" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 UEEventMME 结构体 -var NewUEEventMME = &UEEventMME{} - -// UEEventMME UE会话事件 数据层处理 -type UEEventMME struct{} - -// SelectByPage 分页查询集合 -func (r UEEventMME) SelectByPage(query model.UEEventMMEQuery) ([]model.UEEventMME, int64) { - tx := db.DB("").Model(&model.UEEventMME{}) - // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.RmUID != "" { - tx = tx.Where("rm_uid = ?", query.RmUID) - } - if query.BeginTime != 0 { - tx = tx.Where("timestamp >= ?", query.BeginTime) - } - if query.EndTime != 0 { - tx = tx.Where("timestamp <= ?", query.EndTime) - } - if query.EventType != "" { - eventTypes := strings.Split(query.EventType, ",") - tx = tx.Where("event_type in ?", eventTypes) - } - if query.IMSI != "" { - tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') = ?", query.IMSI) - } - - // 查询结果 - var total int64 = 0 - rows := []model.UEEventMME{} - - // 查询数量为0直接返回 - if err := tx.Count(&total).Error; err != nil || total <= 0 { - return rows, total - } - - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - - // 查询数据分页 - pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) - tx = tx.Limit(pageSize).Offset(pageSize * pageNum) - err := tx.Find(&rows).Error - if err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows, total - } - return rows, total -} - -// SelectByIds 通过ID查询 -func (r UEEventMME) SelectByIds(ids []int64) []model.UEEventMME { - rows := []model.UEEventMME{} - if len(ids) <= 0 { - return rows - } - tx := db.DB("").Model(&model.UEEventMME{}) - // 构建查询条件 - tx = tx.Where("id in ?", ids) - // 查询数据 - if err := tx.Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r UEEventMME) DeleteByIds(ids []int64) int64 { - if len(ids) <= 0 { - return 0 - } - tx := db.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.UEEventMME{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/network_data/service/alarm.go b/src/modules/network_data/service/alarm.go index bb98a45a..09a34918 100644 --- a/src/modules/network_data/service/alarm.go +++ b/src/modules/network_data/service/alarm.go @@ -5,6 +5,9 @@ import ( "strconv" "time" + "github.com/tsmask/go-oam" + "github.com/tsmask/go-oam/framework/utils/parse" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" "be.ems/src/framework/utils/date" @@ -65,8 +68,8 @@ func (s Alarm) FindAlarmSeqLast(neType, neId string) int64 { return s.alarmRepository.SelectAlarmSeqLast(neType, neId) } -// AlarmClearByIds 批量清除告警信息 -func (r Alarm) AlarmClearByIds(ids []int64, clearUser string) (int64, error) { +// ClearByIds 批量清除告警信息 +func (r Alarm) ClearByIds(ids []int64, clearUser, clearType string) (int64, error) { // 检查是否存在 arr := r.alarmRepository.SelectByIds(ids) if len(arr) <= 0 { @@ -80,21 +83,20 @@ func (r Alarm) AlarmClearByIds(ids []int64, clearUser string) (int64, error) { if v.AlarmCode == constants.ALARM_STATE_CHECK || v.AlarmCode == constants.ALARM_CMD_CHECK || v.AlarmCode == constants.ALARM_LICENSE_CHECK { v.AlarmId = fmt.Sprintf("%d%d", v.AlarmCode, v.EventTime) } - v.AlarmStatus = "0" + v.AlarmStatus = oam.ALARM_STATUS_CLEAR // 告警清除 - v.ClearType = 2 - v.ClearTime = time.Now().UnixMilli() + v.ClearType = clearType v.ClearUser = clearUser + v.ClearTime = time.Now().UnixMilli() rows += r.alarmRepository.Update(v) } return rows, nil } - // 清除失败! return 0, fmt.Errorf("clear fail") } -// AlarmAckByIds 批量确认清除告警信息 -func (r Alarm) AlarmAckByIds(ids []int64, ackUser string, ackState bool) (int64, error) { +// AckByIds 批量确认清除告警信息 +func (r Alarm) AckByIds(ids []int64, ackUser, ackState string) (int64, error) { // 检查是否存在 arr := r.alarmRepository.SelectByIds(ids) if len(arr) <= 0 { @@ -104,29 +106,86 @@ func (r Alarm) AlarmAckByIds(ids []int64, ackUser string, ackState bool) (int64, if len(arr) == len(ids) { var rows int64 = 0 for _, v := range arr { - // 确认清除 - if ackState { - v.AckState = 1 - } else { - v.AckState = 0 - } + v.AckState = ackState v.AckTime = time.Now().UnixMilli() v.AckUser = ackUser rows += r.alarmRepository.Update(v) } return rows, nil } - // 清除失败! return 0, fmt.Errorf("ack fail") } -// InsertAndForword 新增信息并转发通知 -func (s Alarm) InsertAndForword(param model.Alarm) int64 { - rows := s.alarmRepository.Insert(param) - if rows > 0 { - // 转发通知 TODO +// CountType 告警类别数量 +func (s Alarm) CountType(alarmStatus string) []map[string]any { + data := []map[string]any{} + alarmTypeArr := []string{ + oam.ALARM_TYPE_COMMUNICATION_ALARM, + oam.ALARM_TYPE_EQUIPMENT_ALARM, + oam.ALARM_TYPE_PROCESSING_FAILURE, + oam.ALARM_TYPE_ENVIRONMENTAL_ALARM, + oam.ALARM_TYPE_QUALITY_OF_SERVICE_ALARM, } - return rows + for _, v := range alarmTypeArr { + data = append(data, map[string]any{ + "alarmType": v, + "total": 0, + }) + } + + // 告警类别数量 + rows := s.alarmRepository.GroupTotal(alarmStatus, "alarm_type", -1) + for _, item := range data { + for _, v := range rows { + str := fmt.Sprint(v["alarm_type"]) + if str == item["alarmType"] { + item["alarmType"] = str + item["total"] = parse.Number(v["total"]) + } + } + } + return data +} + +// CountSeverity 告警级别数量 +func (s Alarm) CountSeverity(alarmStatus string) []map[string]any { + data := []map[string]any{} + alarmTypeArr := []string{ + oam.ALARM_SEVERITY_CRITICAL, + oam.ALARM_SEVERITY_MAJOR, + oam.ALARM_SEVERITY_MINOR, + oam.ALARM_SEVERITY_WARNING, + } + for _, v := range alarmTypeArr { + data = append(data, map[string]any{ + "severity": v, + "total": 0, + }) + } + + // 数量 + rows := s.alarmRepository.GroupTotal(alarmStatus, "perceived_severity", -1) + for _, item := range data { + for _, v := range rows { + str := fmt.Sprint(v["perceived_severity"]) + if str == item["severity"] { + item["severity"] = str + item["total"] = parse.Number(v["total"]) + } + } + } + return data +} + +// CountNe 告警状态前几排名 +func (s Alarm) CountNe(alarmStatus string, top int) []map[string]any { + data := s.alarmRepository.GroupTotal(alarmStatus, "ne_type", top) + for _, v := range data { + v["neType"] = fmt.Sprint(v["ne_type"]) + v["total"] = parse.Number(v["total"]) + delete(v, "ne_type") + } + return data } // ExportXlsx 导出数据到 xlsx 文件 diff --git a/src/modules/network_data/service/alarm_event.go b/src/modules/network_data/service/alarm_event.go index e3413d81..4779e4b4 100644 --- a/src/modules/network_data/service/alarm_event.go +++ b/src/modules/network_data/service/alarm_event.go @@ -2,6 +2,9 @@ package service import ( "fmt" + "time" + + "github.com/tsmask/go-oam" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" @@ -9,44 +12,44 @@ import ( // 实例化数据层 AlarmEvent 结构体 var NewAlarmEvent = &AlarmEvent{ - AlarmEventRepository: repository.NewAlarmEvent, + alarmEventRepository: repository.NewAlarmEvent, } // AlarmEvent 告警 服务层处理 type AlarmEvent struct { - AlarmEventRepository *repository.AlarmEvent // 告警数据信息 + alarmEventRepository *repository.AlarmEvent // 告警数据信息 } // FindByPage 根据条件分页查询 func (r AlarmEvent) FindByPage(query model.AlarmEventQuery) ([]model.AlarmEvent, int64) { - return r.AlarmEventRepository.SelectByPage(query) + return r.alarmEventRepository.SelectByPage(query) } // Find 查询 func (r AlarmEvent) Find(param model.AlarmEvent) []model.AlarmEvent { - return r.AlarmEventRepository.Select(param) + return r.alarmEventRepository.Select(param) } // Insert 新增信息 func (s AlarmEvent) Insert(param model.AlarmEvent) int64 { - return s.AlarmEventRepository.Insert(param) + return s.alarmEventRepository.Insert(param) } // Update 修改信息 func (s AlarmEvent) Update(param model.AlarmEvent) int64 { - return s.AlarmEventRepository.Update(param) + return s.alarmEventRepository.Update(param) } // DeleteByIds 批量删除信息 func (r AlarmEvent) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - data := r.AlarmEventRepository.SelectByIds(ids) + data := r.alarmEventRepository.SelectByIds(ids) if len(data) <= 0 { return 0, fmt.Errorf("no data") } if len(data) == len(ids) { - rows := r.AlarmEventRepository.DeleteByIds(ids) + rows := r.alarmEventRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -55,5 +58,28 @@ func (r AlarmEvent) DeleteByIds(ids []int64) (int64, error) { // FindAlarmEventSeqLast 查询网元告警最后一条序号 func (s AlarmEvent) FindAlarmEventSeqLast(neType, neId string) int64 { - return s.AlarmEventRepository.SelectAlarmEventSeqLast(neType, neId) + return s.alarmEventRepository.SelectAlarmEventSeqLast(neType, neId) +} + +// ClearByIds 批量清除告警信息 +func (r AlarmEvent) ClearByIds(ids []int64, clearUser, clearType string) (int64, error) { + // 检查是否存在 + arr := r.alarmEventRepository.SelectByIds(ids) + if len(arr) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(arr) == len(ids) { + var rows int64 = 0 + for _, v := range arr { + v.AlarmStatus = oam.ALARM_STATUS_CLEAR + // 告警清除 + v.ClearType = clearType + v.ClearUser = clearUser + v.ClearTime = time.Now().UnixMilli() + rows += r.alarmEventRepository.Update(v) + } + return rows, nil + } + return 0, fmt.Errorf("clear fail") } diff --git a/src/modules/network_data/service/cbc_message.go b/src/modules/network_data/service/cbc_message.go new file mode 100644 index 00000000..c5aad39c --- /dev/null +++ b/src/modules/network_data/service/cbc_message.go @@ -0,0 +1,453 @@ +package service + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "strconv" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" + neService "be.ems/src/modules/network_element/service" + "gorm.io/gorm" +) + +// 实例化数据层 CBCMessage 结构体 +var NewCBCMessage = &CBCMessage{ + cbcMessageRepository: repository.NewCBCMessage, +} + +// CBCMessage CB消息 服务层处理 +type CBCMessage struct { + cbcMessageRepository *repository.CBCMessage // UE会话事件数据信息 +} + +// SelectByPage 根据条件分页查询CB消息 +func (s *CBCMessage) SelectByPage(query model.CBCMessageQuery) ([]model.CBCMessage, int, error) { + return s.cbcMessageRepository.SelectByPage(query) +} + +// SelectCBCMessageById 根据工单ID查询CB消息 +// @Description 根据工单ID查询CB消息 +// @param id 工单ID +// @return *model.CBCMessage CB消息对象 +// @return error 错误信息 +// @example +// CBCMessage.SelectCBCMessageById(12345) +func (s *CBCMessage) SelectById(id int64) (*model.CBCMessage, error) { + return s.cbcMessageRepository.SelectById(id) +} + +func (s *CBCMessage) Insert(msg model.CBCMessage) error { + // 解析messageJson获取eventName + var messageData map[string]interface{} + if err := json.Unmarshal(msg.MessageJson, &messageData); err != nil { + return fmt.Errorf("failed to parse message_json: %w", err) + } + + // 提取eventName + eventName, ok := messageData["eventName"].(string) + if !ok || eventName == "" { + return fmt.Errorf("eventName is required in message_json") + } + + // 检查是否已存在相同的eventName + var err error + var existingMsg *model.CBCMessage + if existingMsg, err = s.cbcMessageRepository.SelectByEventName(eventName); err != nil { + return fmt.Errorf("failed to check existing CBC message: %w", err) + } + + if existingMsg != nil { + return fmt.Errorf("CBC message with eventName '%s' already exists for neType '%s' and neId '%s'", + eventName, existingMsg.NeType, existingMsg.NeId) + } + return s.cbcMessageRepository.Insert(msg) +} + +// UpdateCBCMessage 更新CB消息 +// @Description 更新CB消息 +// @param msg CB消息对象 +// @return error 错误信息 +// @example +// mfCBCMessageService.UpdateCBCMessage(msg) +func (s *CBCMessage) Update(id int64, messageJson json.RawMessage) error { + // 解析messageJson获取eventName + var messageData map[string]interface{} + if err := json.Unmarshal(messageJson, &messageData); err != nil { + return fmt.Errorf("failed to parse message_json: %w", err) + } + // 提取eventName + eventName, ok := messageData["eventName"].(string) + if !ok || eventName == "" { + return fmt.Errorf("eventName is required in message_json") + } + + // 检查是否已存在相同的eventName + var err error + if _, err = s.cbcMessageRepository.SelectByEventName(eventName); err != nil { + if err == gorm.ErrRecordNotFound { + return fmt.Errorf("no existing CBC message found with eventName: %s", eventName) + } + return fmt.Errorf("failed to query existing CBC message: %w", err) + } + + // 如果存在,更新记录 + var msg *model.CBCMessage + if msg, err = s.cbcMessageRepository.Update(id, messageJson); err != nil { + return fmt.Errorf("failed to update CBC message: %w", err) + } + + // 如果状态是ACTIVE,发送更新请求 + if msg.Status == model.CBCEventStatusActive { + if err := s.sendUpdateRequest(*msg); err != nil { + return fmt.Errorf("failed to send update request: %w", err) + } + } + + return nil +} + +// UpdateCBCMessage 更新CB消息 +// @Description 更新CB消息 +// @param msg CB消息对象 +// @return error 错误信息 +// @example +// UpdateCBCMessageDetail(msg) +func (s *CBCMessage) UpdateDetail(eventName, detail string) error { + if err := s.cbcMessageRepository.UpdateDetail(eventName, detail); err != nil { + return fmt.Errorf("failed to update CBC message detail: %w", err) + } + + return nil +} + +// DeleteCBCMessage 删除CB消息 +// @Description 删除CB消息 +// @param id 工单ID +// @return error 错误信息 +// @example +// mfCBCMessageService.DeleteCBCMessage(12345) +func (s *CBCMessage) Delete(id int64) error { + // 先查询记录状态 + var err error + var msg *model.CBCMessage + if msg, err = s.cbcMessageRepository.SelectById(id); err != nil { + if err == gorm.ErrRecordNotFound { + return fmt.Errorf("CBC message with ID %d not found", id) + } + return fmt.Errorf("failed to query CBC message: %w", err) + } + + // 检查状态是否为ACTIVE + if msg.Status == model.CBCEventStatusActive { + return fmt.Errorf("cannot delete an active CBC message (ID: %d)", id) + } + + // 执行删除操作 + if err := s.cbcMessageRepository.Delete(id); err != nil { + return fmt.Errorf("failed to delete CBC message: %w", err) + } + return nil +} + +// UpdateCBCMessageStatus 更新CB消息状态 +// @Description 更新CB消息状态,并根据状态变化发送相应的HTTP请求 +// @param status 新状态 +// @return error 错误信息 +func (s *CBCMessage) UpdateStatus(id int64, status string) error { + newStatus := model.ParseCBCEventStatus(status) + + // 查询所有需要更新的记录 + var err error + var msg *model.CBCMessage + if msg, err = s.cbcMessageRepository.SelectById(id); err != nil { + if err == gorm.ErrRecordNotFound { + return fmt.Errorf("CBC message with ID %d not found", id) + } + return fmt.Errorf("failed to query CBC message: %w", err) + } + + oldStatus := msg.Status + + // 检查状态是否发生变化 + if oldStatus == newStatus { + return fmt.Errorf("CBC message status is already %s", newStatus.Enum()) + } + + // 更新数据库状态 + if err := s.cbcMessageRepository.UpdateStatus(id, newStatus); err != nil { + return fmt.Errorf("failed to update CBC message status: %w", err) + } + + // 根据状态变化发送HTTP请求 + if err := s.handleStatusChange(*msg, oldStatus, newStatus); err != nil { + // 记录错误但不中断处理其他消息 + fmt.Printf("Failed to handle status change for message %d: %v\n", msg.Id, err) + } + + return nil +} + +// UpdateCBCMessageStatus 更新CB消息状态 +// @Description 更新CB消息状态,并根据状态变化发送相应的HTTP请求 +// @param status 新状态 +// @return error 错误信息 +func (s *CBCMessage) UpdateStatusByNeId(neId string, status string) error { + newStatus := model.ParseCBCEventStatus(status) + + // 查询所有需要更新的记录 + msgs := make([]model.CBCMessage, 0) + if err := s.cbcMessageRepository.SelectByNeId(neId, &msgs); err != nil { + return fmt.Errorf("failed to query CB messages: %w", err) + } + + for _, msg := range msgs { + oldStatus := msg.Status + + // 检查状态是否发生变化 + if oldStatus == newStatus { + continue // 状态没有变化,跳过 + } + + // 更新数据库状态 + if err := s.cbcMessageRepository.UpdateStatus(msg.Id, newStatus); err != nil { + return fmt.Errorf("failed to update CBC message status: %w", err) + } + + // 根据状态变化发送HTTP请求 + if err := s.handleStatusChange(msg, oldStatus, newStatus); err != nil { + // 记录错误但不中断处理其他消息 + fmt.Printf("Failed to handle status change for message %d: %v\n", msg.Id, err) + } + } + + return nil +} + +// UpdateCBCMessageStatus 更新CB消息状态 +// @Description 更新CB消息状态,并根据状态变化发送相应的HTTP请求 +// @param status 新状态 +// @return error 错误信息 +func (s *CBCMessage) UpdateAllStatus(status string) error { + newStatus := model.ParseCBCEventStatus(status) + + // 查询所有需要更新的记录 + msgs := make([]model.CBCMessage, 0) + if err := s.cbcMessageRepository.Select(&msgs); err != nil { + return fmt.Errorf("failed to query CB messages: %w", err) + } + + for _, msg := range msgs { + oldStatus := msg.Status + + // 检查状态是否发生变化 + if oldStatus == newStatus { + continue // 状态没有变化,跳过 + } + + // 更新数据库状态 + if err := s.cbcMessageRepository.UpdateStatus(msg.Id, newStatus); err != nil { + return fmt.Errorf("failed to update CBC message status: %w", err) + } + + // 根据状态变化发送HTTP请求 + if err := s.handleStatusChange(msg, oldStatus, newStatus); err != nil { + // 记录错误但不中断处理其他消息 + fmt.Printf("Failed to handle status change for message %d: %v\n", msg.Id, err) + } + } + + return nil +} + +// ExportXlsx 导出数据到 xlsx 文件 +func (r CBCMessage) ExportXlsx(rows []model.CBCMessage, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": i18n.TKey(language, "alarm.export.alarmType"), + "B1": i18n.TKey(language, "alarm.export.origSeverity"), + "C1": i18n.TKey(language, "alarm.export.alarmTitle"), + "D1": i18n.TKey(language, "alarm.export.eventTime"), + "E1": i18n.TKey(language, "alarm.export.alarmId"), + "F1": i18n.TKey(language, "alarm.export.alarmCode"), + "G1": i18n.TKey(language, "ne.common.neType"), + "H1": i18n.TKey(language, "ne.common.neName"), + "I1": i18n.TKey(language, "ne.common.neId"), + } + + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + + cells := map[string]any{ + "A" + idx: row.NeType, + "B" + idx: row.NeId, + "C" + idx: row.MessageJson, // 这里假设 MessageJson 已经是字符串格式 + "D" + idx: row.Status.Enum(), + "E" + idx: row.Detail, + "F" + idx: time.UnixMilli(row.CreatedAt).Format(time.RFC3339), + "G" + idx: time.UnixMilli(row.UpdatedAt).Format(time.RFC3339), + } + + dataCells = append(dataCells, cells) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} + +// handleStatusChange 处理状态变化时的HTTP请求 +func (s *CBCMessage) handleStatusChange(msg model.CBCMessage, oldStatus, newStatus model.CBCEventStatus) error { + // 从NULL/INACTIVE状态修改为ACTIVE + if (oldStatus == model.CBCEventStatusNull || oldStatus == model.CBCEventStatusInactive) && + newStatus == model.CBCEventStatusActive { + return s.sendActivateRequest(msg) + } + + // 从ACTIVE更改为INACTIVE状态 + if oldStatus == model.CBCEventStatusActive && newStatus == model.CBCEventStatusInactive { + return s.sendDeactivateRequest(msg) + } + + return nil +} + +// getCBCNetworkElement 获取CBC网元的IP和端口信息 +// 这个方法需要根据你的实际网元管理系统来实现 +func (s *CBCMessage) getCBCNetworkElement(neId string) (string, int64, error) { + // 查询网元信息 + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID("CBC", neId) + if neInfo.IP == "" { + return "", 0, fmt.Errorf("CBC network element not found for neId: %s", neId) + } + return neInfo.IP, neInfo.Port, nil +} + +// CBCHTTPClient CBC网元HTTP客户端 +type CBCHTTPClient struct { + client *http.Client + baseURL string +} + +// NewCBCHTTPClient 创建CBC HTTP客户端 +func NewCBCHTTPClient(baseURL string) *CBCHTTPClient { + return &CBCHTTPClient{ + client: &http.Client{ + Timeout: 10 * time.Second, + }, + baseURL: baseURL, + } +} + +// PostMessage 发送POST请求创建消息 +func (c *CBCHTTPClient) PostMessage(messageData []byte) error { + url := fmt.Sprintf("%s/api/v1/cbe/message", c.baseURL) + return c.sendRequest("POST", url, messageData) +} + +// PutMessage 发送PUT请求更新消息 +func (c *CBCHTTPClient) PutMessage(messageData []byte) error { + url := fmt.Sprintf("%s/api/v1/cbe/message", c.baseURL) + return c.sendRequest("PUT", url, messageData) +} + +// DeleteMessage 发送DELETE请求删除消息 +func (c *CBCHTTPClient) DeleteMessage(eventName string, deletePayload []byte) error { + url := fmt.Sprintf("%s/api/v1/cbe/message/%s", c.baseURL, eventName) + return c.sendRequest("DELETE", url, deletePayload) +} + +// sendRequest 发送HTTP请求 +func (c *CBCHTTPClient) sendRequest(method, url string, body []byte) error { + req, err := http.NewRequest(method, url, bytes.NewReader(body)) + if err != nil { + return fmt.Errorf("failed to create %s request: %w", method, err) + } + + req.Header.Set("Content-Type", "application/json") + + resp, err := c.client.Do(req) + if err != nil { + return fmt.Errorf("failed to send %s request: %w", method, err) + } + defer resp.Body.Close() + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + body, _ := io.ReadAll(resp.Body) + return fmt.Errorf("%s request failed with status: %d, body: %s", + method, resp.StatusCode, string(body)) + } + + return nil +} + +// 在CBCMessageService中添加方法 +func (s *CBCMessage) getCBCHTTPClient(neId string) (*CBCHTTPClient, error) { + cbcIP, cbcPort, err := s.getCBCNetworkElement(neId) + if err != nil { + return nil, fmt.Errorf("failed to get CBC network element info: %w", err) + } + + baseURL := fmt.Sprintf("http://%s:%d", cbcIP, cbcPort) + return NewCBCHTTPClient(baseURL), nil +} + +// 重构后的激活请求 +func (s *CBCMessage) sendActivateRequest(msg model.CBCMessage) error { + client, err := s.getCBCHTTPClient(msg.NeId) + if err != nil { + return err + } + // 直接使用 MessageJson 发送POST请求 + return client.PostMessage(msg.MessageJson) +} + +// 重构后的更新请求 +func (s *CBCMessage) sendUpdateRequest(msg model.CBCMessage) error { + client, err := s.getCBCHTTPClient(msg.NeId) + if err != nil { + return err + } + // 直接使用 MessageJson 发送POST请求 + return client.PostMessage(msg.MessageJson) +} + +// 重构后的停用请求 +func (s *CBCMessage) sendDeactivateRequest(msg model.CBCMessage) error { + client, err := s.getCBCHTTPClient(msg.NeId) + if err != nil { + return err + } + + // 解析和构造删除载荷的逻辑保持不变 + var messageData map[string]interface{} + if err := json.Unmarshal(msg.MessageJson, &messageData); err != nil { + return fmt.Errorf("failed to parse message_json: %w", err) + } + + eventName, ok := messageData["eventName"].(string) + if !ok || eventName == "" { + return fmt.Errorf("eventName not found in message_json") + } + + deletePayload := make(map[string]interface{}) + if messageIdProfile, exists := messageData["messageIdProfile"]; exists { + deletePayload["messageIdProfile"] = messageIdProfile + } + if warningAreaList, exists := messageData["warningAreaList"]; exists { + deletePayload["warningAreaList"] = warningAreaList + } + + payloadBytes, err := json.Marshal(deletePayload) + if err != nil { + return fmt.Errorf("failed to marshal delete payload: %w", err) + } + + return client.DeleteMessage(eventName, payloadBytes) +} diff --git a/src/modules/network_data/service/cdr_event.go b/src/modules/network_data/service/cdr_event.go new file mode 100644 index 00000000..952e0ebf --- /dev/null +++ b/src/modules/network_data/service/cdr_event.go @@ -0,0 +1,645 @@ +package service + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" + sysService "be.ems/src/modules/system/service" +) + +// 实例化数据层 CDREvent 结构体 +var NewCDREvent = &CDREvent{ + cdrEventRepository: repository.NewCDREvent, +} + +// CDREvent CDR会话事件 服务层处理 +type CDREvent struct { + cdrEventRepository *repository.CDREvent // CDR会话事件数据信息 +} + +// FindByPage 根据条件分页查询 +func (r CDREvent) FindByPage(neType string, query map[string]string) ([]model.CDREvent, int64) { + return r.cdrEventRepository.SelectByPage(neType, query) +} + +// DeleteByIds 批量删除信息 +func (r CDREvent) DeleteByIds(neType string, ids []int64) (int64, error) { + // 检查是否存在 + rows := r.cdrEventRepository.SelectByIds(neType, ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(rows) == len(ids) { + rows := r.cdrEventRepository.DeleteByIds(neType, ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// Insert 新增信息 +func (s CDREvent) Insert(param model.CDREvent) int64 { + return s.cdrEventRepository.Insert(param) +} + +// ExportSMSC 导出数据到 xlsx 文件 +func (r CDREvent) ExportSMSC(rows []model.CDREvent, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "NE Name", + "C1": "Record Behavior", + "D1": "Service Type", + "E1": "Caller", + "F1": "Called", + "G1": "Result", + "H1": "Time", + } + // 读取字典数据 CDR 原因码 + dictCDRCauseCode := sysService.NewSysDictData.FindByType("cdr_cause_code") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var cdrJSON map[string]interface{} + err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) + if err != nil { + logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) + continue + } + // 记录类型 + recordType := "" + if v, ok := cdrJSON["recordType"]; ok && v != nil { + recordType = v.(string) + } + // 服务类型 + serviceType := "" + if v, ok := cdrJSON["serviceType"]; ok && v != nil { + serviceType = v.(string) + } + // 被叫 + called := "" + if v, ok := cdrJSON["calledParty"]; ok && v != nil { + called = v.(string) + } + // 主叫 + caller := "" + if v, ok := cdrJSON["callerParty"]; ok && v != nil { + caller = v.(string) + } + // 呼叫结果 0失败,1成功 + callResult := "Fail" + if v, ok := cdrJSON["result"]; ok && v != nil { + resultVal := parse.Number(v) + if resultVal == 1 { + callResult = "Success" + } + } + // 结果原因 + if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" { + cause := fmt.Sprint(v) + for _, v := range dictCDRCauseCode { + if cause == v.DataValue { + callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DataLabel)) + break + } + } + } + // 取时间 + timeStr := "" + if v, ok := cdrJSON["updateTime"]; ok && v != nil { + if releaseTime := parse.Number(v); releaseTime > 0 { + timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) + } else { + timeStr = v.(string) + } + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: row.NeName, + "C" + idx: recordType, + "D" + idx: serviceType, + "E" + idx: caller, + "F" + idx: called, + "G" + idx: callResult, + "H" + idx: timeStr, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} + +// ExportSMF 导出数据到 xlsx 文件 +func (r CDREvent) ExportSMF(rows []model.CDREvent, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "Charging ID", + "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 + var cdrJSON map[string]interface{} + err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) + if err != nil { + logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) + continue + } + // 计费ID + chargingID := "" + if v, ok := cdrJSON["chargingID"]; ok && v != nil { + chargingID = fmt.Sprint(parse.Number(v)) + } + // 订阅 ID 类型 + subscriptionIDType := "-" + // 订阅 ID 数据 + subscriptionIDData := "-" + if v, ok := cdrJSON["subscriberIdentifier"]; ok && v != nil { + if sub, subOk := v.(map[string]any); subOk && sub != nil { + subscriptionIDType = sub["subscriptionIDType"].(string) + 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) + } + } + + // 数据量上行链路 + var dataVolumeUplink int64 = 0 + // 数据量下行链路 + var dataVolumeDownlink int64 = 0 + // 数据总量 + var dataTotalVolume int64 = 0 + if v, ok := cdrJSON["listOfMultipleUnitUsage"]; ok && v != nil { + usageList := v.([]any) + if len(usageList) > 0 { + for _, used := range usageList { + usedUnit := used.(map[string]any) + usedUnitList := usedUnit["usedUnitContainer"].([]any) + if len(usedUnitList) > 0 { + for _, data := range usedUnitList { + udata := data.(map[string]any) + if dup, dupOk := udata["dataVolumeUplink"]; dupOk { + dataVolumeUplink += parse.Number(dup) + } + if ddown, ddownOk := udata["dataVolumeDownlink"]; ddownOk { + dataVolumeDownlink += parse.Number(ddown) + } + if dt, dtOk := udata["dataTotalVolume"]; dtOk { + dataTotalVolume += parse.Number(dt) + } + } + } + } + } + } + // 时长 + duration := "-" + if v, ok := cdrJSON["duration"]; ok && v != nil { + duration = fmt.Sprint(parse.Number(v)) + } + // 调用时间 + invocationTimestamp := "" + if v, ok := cdrJSON["invocationTimestamp"]; ok && v != nil { + invocationTimestamp = v.(string) + } + // 记录打开时间 + 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) + + if v, ok := pduInfo["userIdentifier"]; ok && v != nil { + User_Identifier = v.(string) + } + if v, ok := pduInfo["sSCMode"]; ok && v != nil { + SSC_Mode = v.(string) + } + if v, ok := pduInfo["rATType"]; ok && v != nil { + RAT_Type = v.(string) + } + if v, ok := pduInfo["dNNID"]; ok && v != nil { + DNN_ID = v.(string) + } + if v, ok := pduInfo["pDUType"]; ok && v != nil { + PDU_Type = v.(string) + } + if v, ok := pduInfo["pDUAddress"]; ok && v != nil { + pDUAddress := v.(map[string]any) + if addr, ok := pDUAddress["pDUIPv4Address"]; ok && addr != nil { + PDU_IPv4 = addr.(string) + } + if addr, ok := pDUAddress["pDUIPv6AddresswithPrefix"]; ok && addr != nil { + PDU_IPv6 = addr.(string) + } + } + } + + // 记录网络参数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{ + "A" + idx: row.ID, + "B" + idx: chargingID, + "C" + idx: row.NeName, + "D" + idx: row.RmUid, + "E" + idx: subscriptionIDData, + "F" + idx: subscriptionIDType, + "G" + idx: dataVolumeUplink, + "H" + idx: dataVolumeDownlink, + "I" + idx: 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, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} + +// ExportSGWC 导出数据到 xlsx 文件 +func (r CDREvent) ExportSGWC(rows []model.CDREvent, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "NE Name", + "C1": "Resource Unique ID", + "D1": "Charging ID", + "E1": "IMSI", + "F1": "MSISDN", + "G1": "GPRS Uplink", + "H1": "GPRS Downlink", + "I1": "Duration", + "J1": "Invocation Time", + "K1": "PGW Address", + "L1": "SGW Address", + "M1": "RAT Type", + "N1": "PDPPDN Type", + "O1": "PDPPDN Address", + "P1": "Node Address", + "Q1": "Node Type", + "R1": "Record Access Point Name NI", + "S1": "Record Cause For Rec Closing", + "T1": "Record Sequence Number", + "U1": "Local Record Sequence Number", + "V1": "Record Type", + "W1": "Record Opening Time", + } + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var cdrJSON map[string]interface{} + err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) + if err != nil { + logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) + continue + } + // 计费ID + chargingID := "" + if v, ok := cdrJSON["chargingID"]; ok && v != nil { + chargingID = fmt.Sprint(parse.Number(v)) + } + // IMSI + servedIMSI := "" + if v, ok := cdrJSON["servedIMSI"]; ok && v != nil { + servedIMSI = fmt.Sprint(v) + } + // MSISDN + servedMSISDN := "" + if v, ok := cdrJSON["servedMSISDN"]; ok && v != nil { + servedMSISDN = fmt.Sprint(v) + } + // pGWAddressUsed + pGWAddressUsed := "" + if v, ok := cdrJSON["pGWAddressUsed"]; ok && v != nil { + pGWAddressUsed = fmt.Sprint(v) + headerCells["K1"] = "PGW Address" + } + if v, ok := cdrJSON["GGSNAddress"]; ok && v != nil { + pGWAddressUsed = fmt.Sprint(v) + headerCells["K1"] = "GGSN Address" + } + // sGWAddress + sGWAddress := "" + if v, ok := cdrJSON["sGWAddress"]; ok && v != nil { + sGWAddress = fmt.Sprint(v) + headerCells["L1"] = "SGW Address" + } + if v, ok := cdrJSON["SGSNAddress"]; ok && v != nil { + sGWAddress = fmt.Sprint(v) + headerCells["L1"] = "SGSN Address" + } + // recordType + recordType := "" + if v, ok := cdrJSON["recordType"]; ok && v != nil { + recordType = fmt.Sprint(v) + } + // rATType + rATType := "" + if v, ok := cdrJSON["rATType"]; ok && v != nil { + rATType = fmt.Sprint(v) + } + // pdpPDNType + pdpPDNType := "" + if v, ok := cdrJSON["pdpPDNType"]; ok && v != nil { + pdpPDNType = fmt.Sprint(v) + } + // servedPDPPDNAddress + servedPDPPDNAddress := "" + if v, ok := cdrJSON["servedPDPPDNAddress"]; ok && v != nil { + servedPDPPDNAddress = fmt.Sprint(v) + } + // servedPDPPDNAddress + servingNodeAddress := []string{} + if v, ok := cdrJSON["servingNodeAddress"]; ok && v != nil { + for _, v := range v.([]any) { + servingNodeAddress = append(servingNodeAddress, fmt.Sprint(v)) + } + } + // servingNodeType + servingNodeType := []string{} + if v, ok := cdrJSON["servingNodeType"]; ok && v != nil { + for _, v := range v.([]any) { + if v, ok := v.(map[string]any)["servingNodeType"]; ok && v != nil { + servingNodeType = append(servingNodeType, fmt.Sprint(v)) + } + } + } + // accessPointNameNI + accessPointNameNI := "" + if v, ok := cdrJSON["accessPointNameNI"]; ok && v != nil { + accessPointNameNI = fmt.Sprint(v) + } + // causeForRecClosing + causeForRecClosing := "" + if v, ok := cdrJSON["causeForRecClosing"]; ok && v != nil { + causeForRecClosing = fmt.Sprint(v) + } + // recordSequenceNumber + recordSequenceNumber := "" + if v, ok := cdrJSON["recordSequenceNumber"]; ok && v != nil { + recordSequenceNumber = fmt.Sprint(v) + } + // localRecordSequenceNumber + localRecordSequenceNumber := "" + if v, ok := cdrJSON["localRecordSequenceNumber"]; ok && v != nil { + localRecordSequenceNumber = fmt.Sprint(v) + } + // 数据量上行链路 + var dataVolumeGPRSUplink int64 = 0 + // 数据量下行链路 + var dataVolumeGPRSDownlink int64 = 0 + if v, ok := cdrJSON["listOfTrafficVolumes"]; ok && v != nil { + usageList := v.([]any) + if len(usageList) > 0 { + for _, used := range usageList { + usedUnit := used.(map[string]any) + if dup, dupOk := usedUnit["dataVolumeGPRSUplink"]; dupOk { + dataVolumeGPRSUplink = parse.Number(dup) + } + if ddown, ddownOk := usedUnit["dataVolumeGPRSDownlink"]; ddownOk { + dataVolumeGPRSDownlink = parse.Number(ddown) + } + } + } + } + // 时长 + duration := "-" + if v, ok := cdrJSON["duration"]; ok && v != nil { + duration = fmt.Sprint(parse.Number(v)) + } + // 调用时间 + invocationTimestamp := "" + if v, ok := cdrJSON["recordOpeningTime"]; ok && v != nil { + invocationTimestamp = v.(string) + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: row.NeName, + "C" + idx: row.RmUid, + "D" + idx: chargingID, + "E" + idx: servedIMSI, + "F" + idx: servedMSISDN, + "G" + idx: dataVolumeGPRSUplink, + "H" + idx: dataVolumeGPRSDownlink, + "I" + idx: duration, + "J" + idx: invocationTimestamp, + "K" + idx: pGWAddressUsed, + "L" + idx: sGWAddress, + "M" + idx: rATType, + "N" + idx: pdpPDNType, + "O" + idx: servedPDPPDNAddress, + "P" + idx: strings.Join(servingNodeAddress, ","), + "Q" + idx: strings.Join(servingNodeType, ","), + "R" + idx: accessPointNameNI, + "S" + idx: causeForRecClosing, + "T" + idx: recordSequenceNumber, + "U" + idx: localRecordSequenceNumber, + "V" + idx: recordType, + "W" + idx: invocationTimestamp, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} + +// ExportIMS 导出数据到 xlsx 文件 +func (r CDREvent) ExportIMS(rows []model.CDREvent, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "NE Name", + "C1": "Record Behavior", + "D1": "Type", + "E1": "Caller", + "F1": "Called", + "G1": "Duration", + "H1": "Result Code", + "I1": "Result Cause", + "J1": "Call Start Time", + "K1": "Hangup Time", + } + // 读取字典数据 CDR SIP响应代码类别类型 + dictCDRSipCode := sysService.NewSysDictData.FindByType("cdr_sip_code") + // 读取字典数据 CDR SIP响应代码类别类型原因 + dictCDRSipCodeCause := sysService.NewSysDictData.FindByType("cdr_sip_code_cause") + // 读取字典数据 CDR 呼叫类型 + dictCDRCallType := sysService.NewSysDictData.FindByType("cdr_call_type") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var cdrJSON map[string]any + err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) + if err != nil { + logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) + continue + } + // 记录类型 + recordType := "" + if v, ok := cdrJSON["recordType"]; ok && v != nil { + recordType = v.(string) + } + // 呼叫类型 + callType := "sms" + callTypeLable := "SMS" + if v, ok := cdrJSON["callType"]; ok && v != nil { + callType = v.(string) + for _, v := range dictCDRCallType { + if callType == v.DataValue { + callTypeLable = i18n.TKey(language, v.DataLabel) + break + } + } + } + // 被叫 + called := "" + if v, ok := cdrJSON["calledParty"]; ok && v != nil { + called = v.(string) + } + // 主叫 + caller := "" + if v, ok := cdrJSON["callerParty"]; ok && v != nil { + caller = v.(string) + } + // 时长 + duration := "-" + if v, ok := cdrJSON["callDuration"]; ok && v != nil && callType != "sms" { + duration = fmt.Sprintf("%ds", parse.Number(v)) + } + // 呼叫结果 非短信都有code作为结果 sms短信都ok + callResult := "Other" + callCause := "Call failure for other reason" + if callType == "sms" { + callResult = "Success" + callCause = "Normal Send" + } else { + if v, ok := cdrJSON["cause"]; ok && v != nil { + cause := fmt.Sprint(v) + for _, v := range dictCDRSipCode { + if cause == v.DataValue { + callResult = i18n.TKey(language, v.DataLabel) + break + } + } + for _, v := range dictCDRSipCodeCause { + if cause == v.DataValue { + callCause = i18n.TKey(language, v.DataLabel) + break + } + } + } + } + // 呼叫时间 + seizureTimeStr := "" + if v, ok := cdrJSON["seizureTime"]; ok && v != nil { + if seizureTime := parse.Number(v); seizureTime > 0 { + seizureTimeStr = date.ParseDateToStr(seizureTime, date.YYYY_MM_DDTHH_MM_SSZ) + } else { + seizureTimeStr = v.(string) + } + } + // 挂断时间 + releaseTimeStr := "" + if v, ok := cdrJSON["releaseTime"]; ok && v != nil { + if releaseTime := parse.Number(v); releaseTime > 0 { + releaseTimeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) + } else { + releaseTimeStr = v.(string) + } + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: row.NeName, + "C" + idx: recordType, + "D" + idx: callTypeLable, + "E" + idx: caller, + "F" + idx: called, + "G" + idx: duration, + "H" + idx: callResult, + "I" + idx: callCause, + "J" + idx: seizureTimeStr, + "K" + idx: releaseTimeStr, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} diff --git a/src/modules/network_data/service/cdr_event_ims.go b/src/modules/network_data/service/cdr_event_ims.go deleted file mode 100644 index 30ad78a8..00000000 --- a/src/modules/network_data/service/cdr_event_ims.go +++ /dev/null @@ -1,173 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strconv" - - "be.ems/src/framework/i18n" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" - sysService "be.ems/src/modules/system/service" -) - -// 实例化数据层 CDREventIMS 结构体 -var NewCDREventIMS = &CDREventIMS{ - cdrEventIMSRepository: repository.NewCDREventIMS, -} - -// CDREventImpl CDR会话事件IMS 服务层处理 -type CDREventIMS struct { - cdrEventIMSRepository *repository.CDREventIMS // CDR会话事件数据信息 -} - -// FindByPage 根据条件分页查询 -func (r *CDREventIMS) FindByPage(query model.CDREventIMSQuery) ([]model.CDREventIMS, int64) { - return r.cdrEventIMSRepository.SelectByPage(query) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMS) DeleteByIds(ids []int64) (int64, error) { - // 检查是否存在 - rows := r.cdrEventIMSRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(rows) == len(ids) { - rows := r.cdrEventIMSRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// ExportXlsx 导出数据到 xlsx 文件 -func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language string) (string, error) { - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "NE Name", - "C1": "Record Behavior", - "D1": "Type", - "E1": "Caller", - "F1": "Called", - "G1": "Duration", - "H1": "Result Code", - "I1": "Result Cause", - "J1": "Call Start Time", - "K1": "Hangup Time", - } - // 读取字典数据 CDR SIP响应代码类别类型 - dictCDRSipCode := sysService.NewSysDictData.FindByType("cdr_sip_code") - // 读取字典数据 CDR SIP响应代码类别类型原因 - dictCDRSipCodeCause := sysService.NewSysDictData.FindByType("cdr_sip_code_cause") - // 读取字典数据 CDR 呼叫类型 - dictCDRCallType := sysService.NewSysDictData.FindByType("cdr_call_type") - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var cdrJSON map[string]any - err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) - if err != nil { - logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) - continue - } - // 记录类型 - recordType := "" - if v, ok := cdrJSON["recordType"]; ok && v != nil { - recordType = v.(string) - } - // 呼叫类型 - callType := "sms" - callTypeLable := "SMS" - if v, ok := cdrJSON["callType"]; ok && v != nil { - callType = v.(string) - for _, v := range dictCDRCallType { - if callType == v.DataValue { - callTypeLable = i18n.TKey(language, v.DataLabel) - break - } - } - } - // 被叫 - called := "" - if v, ok := cdrJSON["calledParty"]; ok && v != nil { - called = v.(string) - } - // 主叫 - caller := "" - if v, ok := cdrJSON["callerParty"]; ok && v != nil { - caller = v.(string) - } - // 时长 - duration := "-" - if v, ok := cdrJSON["callDuration"]; ok && v != nil && callType != "sms" { - duration = fmt.Sprintf("%ds", parse.Number(v)) - } - // 呼叫结果 非短信都有code作为结果 sms短信都ok - callResult := "Other" - callCause := "Call failure for other reason" - if callType == "sms" { - callResult = "Success" - callCause = "Normal Send" - } else { - if v, ok := cdrJSON["cause"]; ok && v != nil { - cause := fmt.Sprint(v) - for _, v := range dictCDRSipCode { - if cause == v.DataValue { - callResult = i18n.TKey(language, v.DataLabel) - break - } - } - for _, v := range dictCDRSipCodeCause { - if cause == v.DataValue { - callCause = i18n.TKey(language, v.DataLabel) - break - } - } - } - } - // 呼叫时间 - seizureTimeStr := "" - if v, ok := cdrJSON["seizureTime"]; ok && v != nil { - if seizureTime := parse.Number(v); seizureTime > 0 { - seizureTimeStr = date.ParseDateToStr(seizureTime, date.YYYY_MM_DDTHH_MM_SSZ) - } else { - seizureTimeStr = v.(string) - } - } - // 挂断时间 - releaseTimeStr := "" - if v, ok := cdrJSON["releaseTime"]; ok && v != nil { - if releaseTime := parse.Number(v); releaseTime > 0 { - releaseTimeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) - } else { - releaseTimeStr = v.(string) - } - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: row.NeName, - "C" + idx: recordType, - "D" + idx: callTypeLable, - "E" + idx: caller, - "F" + idx: called, - "G" + idx: duration, - "H" + idx: callResult, - "I" + idx: callCause, - "J" + idx: seizureTimeStr, - "K" + idx: releaseTimeStr, - }) - } - - // 导出数据表格 - return file.WriteSheet(headerCells, dataCells, fileName, "") -} diff --git a/src/modules/network_data/service/cdr_event_sgwc.go b/src/modules/network_data/service/cdr_event_sgwc.go deleted file mode 100644 index ca6ede41..00000000 --- a/src/modules/network_data/service/cdr_event_sgwc.go +++ /dev/null @@ -1,235 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strconv" - "strings" - - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 CDREventSGWC 结构体 -var NewCDREventSGWC = &CDREventSGWC{ - cdrEventRepository: repository.NewCDREventSGWC, -} - -// CDREventSGWC CDR会话事件SGWC 服务层处理 -type CDREventSGWC struct { - cdrEventRepository *repository.CDREventSGWC // CDR会话事件数据信息 -} - -// FindByPage 根据条件分页查询 -func (r *CDREventSGWC) FindByPage(query model.CDREventSGWCQuery) ([]model.CDREventSGWC, int64) { - return r.cdrEventRepository.SelectByPage(query) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSGWC) DeleteByIds(ids []int64) (int64, error) { - // 检查是否存在 - rows := r.cdrEventRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(rows) == len(ids) { - rows := r.cdrEventRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// ExportXlsx 导出数据到 xlsx 文件 -func (r CDREventSGWC) ExportXlsx(rows []model.CDREventSGWC, fileName string) (string, error) { - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "NE Name", - "C1": "Resource Unique ID", - "D1": "Charging ID", - "E1": "IMSI", - "F1": "MSISDN", - "G1": "GPRS Uplink", - "H1": "GPRS Downlink", - "I1": "Duration", - "J1": "Invocation Time", - "K1": "PGW Address", - "L1": "SGW Address", - "M1": "RAT Type", - "N1": "PDPPDN Type", - "O1": "PDPPDN Address", - "P1": "Node Address", - "Q1": "Node Type", - "R1": "Record Access Point Name NI", - "S1": "Record Cause For Rec Closing", - "T1": "Record Sequence Number", - "U1": "Local Record Sequence Number", - "V1": "Record Type", - "W1": "Record Opening Time", - } - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) - if err != nil { - logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) - continue - } - // 计费ID - chargingID := "" - if v, ok := cdrJSON["chargingID"]; ok && v != nil { - chargingID = fmt.Sprint(parse.Number(v)) - } - // IMSI - servedIMSI := "" - if v, ok := cdrJSON["servedIMSI"]; ok && v != nil { - servedIMSI = fmt.Sprint(v) - } - // MSISDN - servedMSISDN := "" - if v, ok := cdrJSON["servedMSISDN"]; ok && v != nil { - servedMSISDN = fmt.Sprint(v) - } - // pGWAddressUsed - pGWAddressUsed := "" - if v, ok := cdrJSON["pGWAddressUsed"]; ok && v != nil { - pGWAddressUsed = fmt.Sprint(v) - headerCells["K1"] = "PGW Address" - } - if v, ok := cdrJSON["GGSNAddress"]; ok && v != nil { - pGWAddressUsed = fmt.Sprint(v) - headerCells["K1"] = "GGSN Address" - } - // sGWAddress - sGWAddress := "" - if v, ok := cdrJSON["sGWAddress"]; ok && v != nil { - sGWAddress = fmt.Sprint(v) - headerCells["L1"] = "SGW Address" - } - if v, ok := cdrJSON["SGSNAddress"]; ok && v != nil { - sGWAddress = fmt.Sprint(v) - headerCells["L1"] = "SGSN Address" - } - // recordType - recordType := "" - if v, ok := cdrJSON["recordType"]; ok && v != nil { - recordType = fmt.Sprint(v) - } - // rATType - rATType := "" - if v, ok := cdrJSON["rATType"]; ok && v != nil { - rATType = fmt.Sprint(v) - } - // pdpPDNType - pdpPDNType := "" - if v, ok := cdrJSON["pdpPDNType"]; ok && v != nil { - pdpPDNType = fmt.Sprint(v) - } - // servedPDPPDNAddress - servedPDPPDNAddress := "" - if v, ok := cdrJSON["servedPDPPDNAddress"]; ok && v != nil { - servedPDPPDNAddress = fmt.Sprint(v) - } - // servedPDPPDNAddress - servingNodeAddress := []string{} - if v, ok := cdrJSON["servingNodeAddress"]; ok && v != nil { - for _, v := range v.([]any) { - servingNodeAddress = append(servingNodeAddress, fmt.Sprint(v)) - } - } - // servingNodeType - servingNodeType := []string{} - if v, ok := cdrJSON["servingNodeType"]; ok && v != nil { - for _, v := range v.([]any) { - if v, ok := v.(map[string]any)["servingNodeType"]; ok && v != nil { - servingNodeType = append(servingNodeType, fmt.Sprint(v)) - } - } - } - // accessPointNameNI - accessPointNameNI := "" - if v, ok := cdrJSON["accessPointNameNI"]; ok && v != nil { - accessPointNameNI = fmt.Sprint(v) - } - // causeForRecClosing - causeForRecClosing := "" - if v, ok := cdrJSON["causeForRecClosing"]; ok && v != nil { - causeForRecClosing = fmt.Sprint(v) - } - // recordSequenceNumber - recordSequenceNumber := "" - if v, ok := cdrJSON["recordSequenceNumber"]; ok && v != nil { - recordSequenceNumber = fmt.Sprint(v) - } - // localRecordSequenceNumber - localRecordSequenceNumber := "" - if v, ok := cdrJSON["localRecordSequenceNumber"]; ok && v != nil { - localRecordSequenceNumber = fmt.Sprint(v) - } - // 数据量上行链路 - var dataVolumeGPRSUplink int64 = 0 - // 数据量下行链路 - var dataVolumeGPRSDownlink int64 = 0 - if v, ok := cdrJSON["listOfTrafficVolumes"]; ok && v != nil { - usageList := v.([]any) - if len(usageList) > 0 { - for _, used := range usageList { - usedUnit := used.(map[string]any) - if dup, dupOk := usedUnit["dataVolumeGPRSUplink"]; dupOk { - dataVolumeGPRSUplink = parse.Number(dup) - } - if ddown, ddownOk := usedUnit["dataVolumeGPRSDownlink"]; ddownOk { - dataVolumeGPRSDownlink = parse.Number(ddown) - } - } - } - } - // 时长 - duration := "-" - if v, ok := cdrJSON["duration"]; ok && v != nil { - duration = fmt.Sprint(parse.Number(v)) - } - // 调用时间 - invocationTimestamp := "" - if v, ok := cdrJSON["recordOpeningTime"]; ok && v != nil { - invocationTimestamp = v.(string) - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: row.NeName, - "C" + idx: row.RmUid, - "D" + idx: chargingID, - "E" + idx: servedIMSI, - "F" + idx: servedMSISDN, - "G" + idx: dataVolumeGPRSUplink, - "H" + idx: dataVolumeGPRSDownlink, - "I" + idx: duration, - "J" + idx: invocationTimestamp, - "K" + idx: pGWAddressUsed, - "L" + idx: sGWAddress, - "M" + idx: rATType, - "N" + idx: pdpPDNType, - "O" + idx: servedPDPPDNAddress, - "P" + idx: strings.Join(servingNodeAddress, ","), - "Q" + idx: strings.Join(servingNodeType, ","), - "R" + idx: accessPointNameNI, - "S" + idx: causeForRecClosing, - "T" + idx: recordSequenceNumber, - "U" + idx: localRecordSequenceNumber, - "V" + idx: recordType, - "W" + idx: invocationTimestamp, - }) - } - - // 导出数据表格 - return file.WriteSheet(headerCells, dataCells, fileName, "") -} diff --git a/src/modules/network_data/service/cdr_event_smf.go b/src/modules/network_data/service/cdr_event_smf.go deleted file mode 100644 index cb5bc7fb..00000000 --- a/src/modules/network_data/service/cdr_event_smf.go +++ /dev/null @@ -1,230 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strconv" - - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 CDREventSMF 结构体 -var NewCDREventSMF = &CDREventSMF{ - cdrEventRepository: repository.NewCDREventSMF, -} - -// CDREventSMF CDR会话事件SMF 服务层处理 -type CDREventSMF struct { - cdrEventRepository *repository.CDREventSMF // CDR会话事件数据信息 -} - -// FindByPage 根据条件分页查询 -func (r *CDREventSMF) FindByPage(querys model.CDREventSMFQuery) ([]model.CDREventSMF, int64) { - return r.cdrEventRepository.SelectByPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMF) DeleteByIds(ids []int64) (int64, error) { - // 检查是否存在 - rows := r.cdrEventRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(rows) == len(ids) { - rows := r.cdrEventRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// ExportXlsx 导出数据到 xlsx 文件 -func (r CDREventSMF) ExportXlsx(rows []model.CDREventSMF, fileName string) (string, error) { - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "Charging ID", - "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 - var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) - if err != nil { - logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) - continue - } - // 计费ID - chargingID := "" - if v, ok := cdrJSON["chargingID"]; ok && v != nil { - chargingID = fmt.Sprint(parse.Number(v)) - } - // 订阅 ID 类型 - subscriptionIDType := "-" - // 订阅 ID 数据 - subscriptionIDData := "-" - if v, ok := cdrJSON["subscriberIdentifier"]; ok && v != nil { - if sub, subOk := v.(map[string]any); subOk && sub != nil { - subscriptionIDType = sub["subscriptionIDType"].(string) - 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) - } - } - - // 数据量上行链路 - var dataVolumeUplink int64 = 0 - // 数据量下行链路 - var dataVolumeDownlink int64 = 0 - // 数据总量 - var dataTotalVolume int64 = 0 - if v, ok := cdrJSON["listOfMultipleUnitUsage"]; ok && v != nil { - usageList := v.([]any) - if len(usageList) > 0 { - for _, used := range usageList { - usedUnit := used.(map[string]any) - usedUnitList := usedUnit["usedUnitContainer"].([]any) - if len(usedUnitList) > 0 { - for _, data := range usedUnitList { - udata := data.(map[string]any) - if dup, dupOk := udata["dataVolumeUplink"]; dupOk { - dataVolumeUplink += parse.Number(dup) - } - if ddown, ddownOk := udata["dataVolumeDownlink"]; ddownOk { - dataVolumeDownlink += parse.Number(ddown) - } - if dt, dtOk := udata["dataTotalVolume"]; dtOk { - dataTotalVolume += parse.Number(dt) - } - } - } - } - } - } - // 时长 - duration := "-" - if v, ok := cdrJSON["duration"]; ok && v != nil { - duration = fmt.Sprint(parse.Number(v)) - } - // 调用时间 - invocationTimestamp := "" - if v, ok := cdrJSON["invocationTimestamp"]; ok && v != nil { - invocationTimestamp = v.(string) - } - // 记录打开时间 - 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) - - if v, ok := pduInfo["userIdentifier"]; ok && v != nil { - User_Identifier = v.(string) - } - if v, ok := pduInfo["sSCMode"]; ok && v != nil { - SSC_Mode = v.(string) - } - if v, ok := pduInfo["rATType"]; ok && v != nil { - RAT_Type = v.(string) - } - if v, ok := pduInfo["dNNID"]; ok && v != nil { - DNN_ID = v.(string) - } - if v, ok := pduInfo["pDUType"]; ok && v != nil { - PDU_Type = v.(string) - } - if v, ok := pduInfo["pDUAddress"]; ok && v != nil { - pDUAddress := v.(map[string]any) - if addr, ok := pDUAddress["pDUIPv4Address"]; ok && addr != nil { - PDU_IPv4 = addr.(string) - } - if addr, ok := pDUAddress["pDUIPv6AddresswithPrefix"]; ok && addr != nil { - PDU_IPv6 = addr.(string) - } - } - } - - // 记录网络参数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{ - "A" + idx: row.ID, - "B" + idx: chargingID, - "C" + idx: row.NeName, - "D" + idx: row.RmUid, - "E" + idx: subscriptionIDData, - "F" + idx: subscriptionIDType, - "G" + idx: dataVolumeUplink, - "H" + idx: dataVolumeDownlink, - "I" + idx: 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, - }) - } - - // 导出数据表格 - return file.WriteSheet(headerCells, dataCells, fileName, "") -} diff --git a/src/modules/network_data/service/cdr_event_smsc.go b/src/modules/network_data/service/cdr_event_smsc.go deleted file mode 100644 index 99006c31..00000000 --- a/src/modules/network_data/service/cdr_event_smsc.go +++ /dev/null @@ -1,137 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strconv" - - "be.ems/src/framework/i18n" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" - sysService "be.ems/src/modules/system/service" -) - -// 实例化数据层 CDREventSMSC 结构体 -var NewCDREventSMSC = &CDREventSMSC{ - cdrEventRepository: repository.NewCDREventSMSC, -} - -// CDREventSMSC CDR会话事件SMSC 服务层处理 -type CDREventSMSC struct { - cdrEventRepository *repository.CDREventSMSC // CDR会话事件数据信息 -} - -// FindByPage 根据条件分页查询 -func (r *CDREventSMSC) FindByPage(query model.CDREventSMSCQuery) ([]model.CDREventSMSC, int64) { - return r.cdrEventRepository.SelectByPage(query) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSC) DeleteByIds(ids []int64) (int64, error) { - // 检查是否存在 - rows := r.cdrEventRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(rows) == len(ids) { - rows := r.cdrEventRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// ExportXlsx 导出数据到 xlsx 文件 -func (r CDREventSMSC) ExportXlsx(rows []model.CDREventSMSC, fileName, language string) (string, error) { - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "NE Name", - "C1": "Record Behavior", - "D1": "Service Type", - "E1": "Caller", - "F1": "Called", - "G1": "Result", - "H1": "Time", - } - // 读取字典数据 CDR 原因码 - dictCDRCauseCode := sysService.NewSysDictData.FindByType("cdr_cause_code") - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) - if err != nil { - logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) - continue - } - // 记录类型 - recordType := "" - if v, ok := cdrJSON["recordType"]; ok && v != nil { - recordType = v.(string) - } - // 服务类型 - serviceType := "" - if v, ok := cdrJSON["serviceType"]; ok && v != nil { - serviceType = v.(string) - } - // 被叫 - called := "" - if v, ok := cdrJSON["calledParty"]; ok && v != nil { - called = v.(string) - } - // 主叫 - caller := "" - if v, ok := cdrJSON["callerParty"]; ok && v != nil { - caller = v.(string) - } - // 呼叫结果 0失败,1成功 - callResult := "Fail" - if v, ok := cdrJSON["result"]; ok && v != nil { - resultVal := parse.Number(v) - if resultVal == 1 { - callResult = "Success" - } - } - // 结果原因 - if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" { - cause := fmt.Sprint(v) - for _, v := range dictCDRCauseCode { - if cause == v.DataValue { - callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DataLabel)) - break - } - } - } - // 取时间 - timeStr := "" - if v, ok := cdrJSON["updateTime"]; ok && v != nil { - if releaseTime := parse.Number(v); releaseTime > 0 { - timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) - } else { - timeStr = v.(string) - } - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: row.NeName, - "C" + idx: recordType, - "D" + idx: serviceType, - "E" + idx: caller, - "F" + idx: called, - "G" + idx: callResult, - "H" + idx: timeStr, - }) - } - - // 导出数据表格 - return file.WriteSheet(headerCells, dataCells, fileName, "") -} diff --git a/src/modules/network_data/service/kpi_c_report.go b/src/modules/network_data/service/kpi_c_report.go index 1c70a507..6e30181c 100644 --- a/src/modules/network_data/service/kpi_c_report.go +++ b/src/modules/network_data/service/kpi_c_report.go @@ -21,7 +21,13 @@ type KpiCReport struct { } // FindKPI 通过网元指标数据信息 -func (s KpiCReport) FindData(query model.KPIQuery) []map[string]any { +func (s KpiCReport) FindData(query model.KPICQuery) []map[string]any { + // 标题单位映射 + kpicTitles := s.kpiCReportRepository.SelectKPITitle(query.NeType) + kpicTitleUnitMap := map[string]string{} + for _, v := range kpicTitles { + kpicTitleUnitMap[v.KpiId] = v.Unit + } // 原始数据 rows := s.kpiCReportRepository.SelectKPI(query) if len(rows) <= 0 { @@ -100,17 +106,24 @@ func (s KpiCReport) FindData(query model.KPIQuery) []map[string]any { // 遍历kpiIds数组对lastRecord赋值 for _, kpiId := range kpiIds { if v, ok := record[kpiId]; ok { - // 特殊字段,只取一次收到的非0值 - if kpiId == "AMF.01" || kpiId == "UDM.01" || kpiId == "UDM.02" || kpiId == "UDM.03" || kpiId == "SMF.01" { - // startItem[kpiId] = parse.Number(v) - continue // startIndex的值不累加不取最后 - } else { - value := parse.Number(startItem[kpiId]) - startItem[kpiId] = value + parse.Number(v) - } + value := v.(float64) + startItem[kpiId].(float64) + startItem[kpiId] = value + // value := parse.Number(startItem[kpiId]) + // startItem[kpiId] = value + parse.Number(v) } } } + // 处理单位 + for _, kpiId := range kpiIds { + unit, ok := kpicTitleUnitMap[kpiId] + if !ok { + continue + } + // "Mbps" "%" + if unit == "%" { + startItem[kpiId] = startItem[kpiId].(float64) / float64(len(records)) + } + } } data = append(data, startItem) } @@ -136,3 +149,38 @@ func (s KpiCReport) Insert(param model.KpiCReport) int64 { func (r KpiCReport) FindTitle(neType string) []model.KpiCTitle { return r.kpiCReportRepository.SelectKPITitle(neType) } + +// TitleLastKPIId 指标标题最后kpiid +func (r KpiCReport) TitleLastKPIId(neType string) string { + return r.kpiCReportRepository.TitleLastKPIId(neType) +} + +// FindByPage 根据条件分页查询 +func (r KpiCReport) TitleFindByPage(query map[string]string) ([]model.KpiCTitle, int64) { + return r.kpiCReportRepository.TitleSelectByPage(query) +} + +// TitleFind 查询信息 +func (r KpiCReport) TitleFind(param model.KpiCTitle) []model.KpiCTitle { + return r.kpiCReportRepository.TitleSelect(param) +} + +// TitleUpdate 更新信息 +func (r KpiCReport) TitleUpdate(param model.KpiCTitle) int64 { + return r.kpiCReportRepository.TitleUpdate(param) +} + +// TitleDeleteByIds 批量删除信息 +func (r KpiCReport) TitleDeleteByIds(ids []int64) (int64, error) { + rows := r.kpiCReportRepository.TitleDeleteByIds(ids) + if rows > 0 { + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// TitleInsert 新增信息 +func (r KpiCReport) TitleInsert(param model.KpiCTitle) int64 { + return r.kpiCReportRepository.TitleInsert(param) +} diff --git a/src/modules/network_data/service/udm_auth.go b/src/modules/network_data/service/udm_auth.go index 73e94c7d..c8fcdc60 100644 --- a/src/modules/network_data/service/udm_auth.go +++ b/src/modules/network_data/service/udm_auth.go @@ -99,7 +99,7 @@ func (r *UDMAuthUser) ParseInfo(imsi, neId string, data map[string]string) model } // FindByPage 分页查询数据库 -func (r *UDMAuthUser) FindByPage(query map[string]string) (int64, []model.UDMAuthUser) { +func (r *UDMAuthUser) FindByPage(query map[string]string) ([]model.UDMAuthUser, int64) { return r.udmAuthRepository.SelectPage(query) } diff --git a/src/modules/network_data/service/udm_sub.go b/src/modules/network_data/service/udm_sub.go index 8da74756..2accef0b 100644 --- a/src/modules/network_data/service/udm_sub.go +++ b/src/modules/network_data/service/udm_sub.go @@ -180,7 +180,7 @@ func (r *UDMSubUser) ParseInfo(imsi, neId string, data map[string]string) model. } // FindByPage 分页查询数据库 -func (r *UDMSubUser) FindByPage(query map[string]string) (int64, []model.UDMSubUser) { +func (r *UDMSubUser) FindByPage(query map[string]string) ([]model.UDMSubUser, int64) { return r.udmSubRepository.SelectPage(query) } @@ -318,6 +318,12 @@ func (r *UDMSubUser) ParseCommandParams(item model.UDMSubUser) string { if item.CnTypeRestrictions != "" { conditions = append(conditions, fmt.Sprintf("cn=%s", item.CnTypeRestrictions)) } + if item.RfspIndex != "" { + conditions = append(conditions, fmt.Sprintf("rfsp=%s", item.RfspIndex)) + } + if item.UeUsageType != "" { + conditions = append(conditions, fmt.Sprintf("usagetype=%s", item.UeUsageType)) + } if item.MicoAllowed != "" { conditions = append(conditions, fmt.Sprintf("mico=%s", item.MicoAllowed)) } diff --git a/src/modules/network_data/service/udm_voip.go b/src/modules/network_data/service/udm_voip.go index 10c95d92..e03eed9c 100644 --- a/src/modules/network_data/service/udm_voip.go +++ b/src/modules/network_data/service/udm_voip.go @@ -89,7 +89,7 @@ func (r UDMVOIPUser) ParseInfo(neId string, data map[string]string) model.UDMVOI } // FindByPage 分页查询数据库 -func (r UDMVOIPUser) FindByPage(query map[string]string) (int64, []model.UDMVOIPUser) { +func (r UDMVOIPUser) FindByPage(query map[string]string) ([]model.UDMVOIPUser, int64) { return r.udmVOIPRepository.SelectPage(query) } diff --git a/src/modules/network_data/service/udm_volte_ims.go b/src/modules/network_data/service/udm_volte_ims.go index a489933e..3d3032b9 100644 --- a/src/modules/network_data/service/udm_volte_ims.go +++ b/src/modules/network_data/service/udm_volte_ims.go @@ -110,7 +110,7 @@ func (r UDMVolteIMSUser) ParseInfo(neId string, data map[string]string) model.UD } // FindByPage 分页查询数据库 -func (r UDMVolteIMSUser) FindByPage(query map[string]string) (int64, []model.UDMVolteIMSUser) { +func (r UDMVolteIMSUser) FindByPage(query map[string]string) ([]model.UDMVolteIMSUser, int64) { return r.udmVolteIMSRepository.SelectPage(query) } diff --git a/src/modules/network_data/service/ue_event.go b/src/modules/network_data/service/ue_event.go new file mode 100644 index 00000000..3f3d7a5f --- /dev/null +++ b/src/modules/network_data/service/ue_event.go @@ -0,0 +1,229 @@ +package service + +import ( + "encoding/json" + "fmt" + "strconv" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" + sysService "be.ems/src/modules/system/service" + "github.com/tsmask/go-oam" +) + +// 实例化数据层 UEEvent 结构体 +var NewUEEvent = &UEEvent{ + ueEventRepository: repository.NewUEEvent, +} + +// UEEvent UE会话事件 服务层处理 +type UEEvent struct { + ueEventRepository *repository.UEEvent // UE会话事件数据信息 +} + +// FindByPage 根据条件分页查询 +func (r UEEvent) FindByPage(neType string, query map[string]string) ([]model.UEEvent, int64) { + return r.ueEventRepository.SelectByPage(neType, query) +} + +// DeleteByIds 批量删除信息 +func (r UEEvent) DeleteByIds(neType string, ids []int64) (int64, error) { + // 检查是否存在 + rows := r.ueEventRepository.SelectByIds(neType, ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(rows) == len(ids) { + rows := r.ueEventRepository.DeleteByIds(neType, ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// Insert 新增信息 +func (r UEEvent) Insert(param model.UEEvent) int64 { + return r.ueEventRepository.Insert(param) +} + +// ExportAMF 导出数据到 xlsx 文件 +func (r UEEvent) ExportAMF(rows []model.UEEvent, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "IMSI", + "C1": "Event Type", + "D1": "Result", + "E1": "Time", + } + // 读取字典数据 UE 事件类型 + dictUEEventType := sysService.NewSysDictData.FindByType("ue_event_type") + // 读取字典数据 UE 事件认证代码类型 + dictUEAauthCode := sysService.NewSysDictData.FindByType("ue_auth_code") + // 读取字典数据 UE 事件CM状态 + dictUEEventCmState := sysService.NewSysDictData.FindByType("ue_event_cm_state") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var eventJSON map[string]interface{} + err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) + if err != nil { + logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) + continue + } + + // 取IMSI + imsi := "" + if v, ok := eventJSON["imsi"]; ok && v != nil { + imsi = v.(string) + } + // 取类型 + eventType := "" + for _, v := range dictUEEventType { + if row.EventType == v.DataValue { + eventType = i18n.TKey(language, v.DataLabel) + break + } + } + // 取结果 + eventResult := "" + // 取时间 + timeStr := "" + if row.EventType == oam.UENB_TYPE_AUTH { + if v, ok := eventJSON["authTime"]; ok && v != nil { + timeStr = v.(string) + } + if v, ok := eventJSON["authCode"]; ok && v != nil { + eventResult = v.(string) + for _, v := range dictUEAauthCode { + if eventResult == v.DataValue { + eventResult = i18n.TKey(language, v.DataLabel) + break + } + } + } + } + if row.EventType == oam.UENB_TYPE_DETACH { + if v, ok := eventJSON["detachTime"]; ok && v != nil { + timeStr = v.(string) + } + eventResult = "Success" + } + if row.EventType == oam.UENB_TYPE_CM { + if v, ok := eventJSON["changeTime"]; ok && v != nil { + timeStr = v.(string) + } + if v, ok := eventJSON["status"]; ok && v != nil { + eventResult = fmt.Sprint(v) + for _, v := range dictUEEventCmState { + if eventResult == v.DataValue { + eventResult = i18n.TKey(language, v.DataLabel) + break + } + } + } + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: imsi, + "C" + idx: eventType, + "D" + idx: eventResult, + "E" + idx: timeStr, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} + +// ExportMME 导出数据到 xlsx 文件 +func (r UEEvent) ExportMME(rows []model.UEEvent, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "IMSI", + "C1": "Event Type", + "D1": "Result", + "E1": "Time", + } + // 读取字典数据 UE 事件类型 + dictUEEventType := sysService.NewSysDictData.FindByType("ue_event_type") + // 读取字典数据 UE 事件认证代码类型 + dictUEAauthCode := sysService.NewSysDictData.FindByType("ue_auth_code") + // 读取字典数据 UE 事件CM状态 + dictUEEventCmState := sysService.NewSysDictData.FindByType("ue_event_cm_state") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var eventJSON map[string]interface{} + err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) + if err != nil { + logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) + continue + } + + // 取IMSI + imsi := "" + if v, ok := eventJSON["imsi"]; ok && v != nil { + imsi = v.(string) + } + // 取类型 + eventType := row.EventType + for _, v := range dictUEEventType { + if row.EventType == v.DataValue { + eventType = i18n.TKey(language, v.DataLabel) + break + } + } + // 取结果 + eventResult := "" + if v, ok := eventJSON["result"]; ok && v != nil { + eventResult = v.(string) + if row.EventType == oam.UENB_TYPE_AUTH { + for _, v := range dictUEAauthCode { + if eventResult == v.DataValue { + eventResult = i18n.TKey(language, v.DataLabel) + break + } + } + } + if row.EventType == oam.UENB_TYPE_CM { + for _, v := range dictUEEventCmState { + if eventResult == v.DataValue { + eventResult = i18n.TKey(language, v.DataLabel) + break + } + } + } + } + // 取时间 + timeStr := "" + if v, ok := eventJSON["timestamp"]; ok && v != nil { + rowTime := parse.Number(v) + timeStr = date.ParseDateToStr(rowTime, date.YYYY_MM_DDTHH_MM_SSZ) + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: imsi, + "C" + idx: eventType, + "D" + idx: eventResult, + "E" + idx: timeStr, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") + +} diff --git a/src/modules/network_data/service/ue_event_amf.go b/src/modules/network_data/service/ue_event_amf.go deleted file mode 100644 index 4ff49c8a..00000000 --- a/src/modules/network_data/service/ue_event_amf.go +++ /dev/null @@ -1,138 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strconv" - - "be.ems/src/framework/i18n" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" - sysService "be.ems/src/modules/system/service" -) - -// 实例化数据层 UEEventAMF 结构体 -var NewUEEventAMF = &UEEventAMF{ - ueEventRepository: repository.NewUEEventAMF, -} - -// UEEventAMF UE会话事件AMF 服务层处理 -type UEEventAMF struct { - ueEventRepository *repository.UEEventAMF // UE会话事件数据信息 -} - -// FindByPage 根据条件分页查询 -func (r *UEEventAMF) FindByPage(querys model.UEEventAMFQuery) ([]model.UEEventAMF, int64) { - return r.ueEventRepository.SelectByPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMF) DeleteByIds(ids []int64) (int64, error) { - // 检查是否存在 - rows := r.ueEventRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(rows) == len(ids) { - rows := r.ueEventRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// ExportXlsx 导出数据到 xlsx 文件 -func (r UEEventAMF) ExportXlsx(rows []model.UEEventAMF, fileName, language string) (string, error) { - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "IMSI", - "C1": "Event Type", - "D1": "Result", - "E1": "Time", - } - // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictData.FindByType("ue_event_type") - // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictData.FindByType("ue_auth_code") - // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictData.FindByType("ue_event_cm_state") - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var eventJSON map[string]interface{} - err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) - if err != nil { - logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) - continue - } - - // 取IMSI - imsi := "" - if v, ok := eventJSON["imsi"]; ok && v != nil { - imsi = v.(string) - } - // 取类型 - eventType := "" - for _, v := range dictUEEventType { - if row.EventType == v.DataValue { - eventType = i18n.TKey(language, v.DataLabel) - break - } - } - // 取结果 - eventResult := "" - // 取时间 - timeStr := "" - if row.EventType == "auth-result" { - if v, ok := eventJSON["authTime"]; ok && v != nil { - timeStr = v.(string) - } - if v, ok := eventJSON["authCode"]; ok && v != nil { - eventResult = v.(string) - for _, v := range dictUEAauthCode { - if eventResult == v.DataValue { - eventResult = i18n.TKey(language, v.DataLabel) - break - } - } - } - } - if row.EventType == "detach" { - if v, ok := eventJSON["detachTime"]; ok && v != nil { - timeStr = v.(string) - } - eventResult = "Success" - } - if row.EventType == "cm-state" { - if v, ok := eventJSON["changeTime"]; ok && v != nil { - timeStr = v.(string) - } - if v, ok := eventJSON["status"]; ok && v != nil { - eventResult = fmt.Sprint(v) - for _, v := range dictUEEventCmState { - if eventResult == v.DataValue { - eventResult = i18n.TKey(language, v.DataLabel) - break - } - } - } - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: imsi, - "C" + idx: eventType, - "D" + idx: eventResult, - "E" + idx: timeStr, - }) - } - - // 导出数据表格 - return file.WriteSheet(headerCells, dataCells, fileName, "") -} diff --git a/src/modules/network_data/service/ue_event_mme.go b/src/modules/network_data/service/ue_event_mme.go deleted file mode 100644 index 87cf9c25..00000000 --- a/src/modules/network_data/service/ue_event_mme.go +++ /dev/null @@ -1,130 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strconv" - - "be.ems/src/framework/i18n" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/parse" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" - sysService "be.ems/src/modules/system/service" -) - -// 实例化数据层 UEEventMME 结构体 -var NewUEEventMME = &UEEventMME{ - ueEventRepository: repository.NewUEEventMME, -} - -// UEEventMME UE会话事件MME 服务层处理 -type UEEventMME struct { - ueEventRepository *repository.UEEventMME // UE会话事件数据信息 -} - -// FindByPage 根据条件分页查询 -func (r *UEEventMME) FindByPage(querys model.UEEventMMEQuery) ([]model.UEEventMME, int64) { - return r.ueEventRepository.SelectByPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMME) DeleteByIds(ids []int64) (int64, error) { - // 检查是否存在 - rows := r.ueEventRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(rows) == len(ids) { - rows := r.ueEventRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// ExportXlsx 导出数据到 xlsx 文件 -func (r UEEventMME) ExportXlsx(rows []model.UEEventMME, fileName, language string) (string, error) { - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "IMSI", - "C1": "Event Type", - "D1": "Result", - "E1": "Time", - } - // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictData.FindByType("ue_event_type") - // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictData.FindByType("ue_auth_code") - // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictData.FindByType("ue_event_cm_state") - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var eventJSON map[string]interface{} - err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) - if err != nil { - logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) - continue - } - - // 取IMSI - imsi := "" - if v, ok := eventJSON["imsi"]; ok && v != nil { - imsi = v.(string) - } - // 取类型 - eventType := row.EventType - for _, v := range dictUEEventType { - if row.EventType == v.DataValue { - eventType = i18n.TKey(language, v.DataLabel) - break - } - } - // 取结果 - eventResult := "" - if v, ok := eventJSON["result"]; ok && v != nil { - eventResult = v.(string) - if row.EventType == "auth-result" { - for _, v := range dictUEAauthCode { - if eventResult == v.DataValue { - eventResult = i18n.TKey(language, v.DataLabel) - break - } - } - } - if row.EventType == "cm-state" { - for _, v := range dictUEEventCmState { - if eventResult == v.DataValue { - eventResult = i18n.TKey(language, v.DataLabel) - break - } - } - } - } - // 取时间 - timeStr := "" - if v, ok := eventJSON["timestamp"]; ok && v != nil { - rowTime := parse.Number(v) - timeStr = date.ParseDateToStr(rowTime, date.YYYY_MM_DDTHH_MM_SSZ) - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: imsi, - "C" + idx: eventType, - "D" + idx: eventResult, - "E" + idx: timeStr, - }) - } - - // 导出数据表格 - return file.WriteSheet(headerCells, dataCells, fileName, "") - -} diff --git a/src/modules/network_element/controller/action.go b/src/modules/network_element/controller/action.go index 38675443..34f5e3af 100644 --- a/src/modules/network_element/controller/action.go +++ b/src/modules/network_element/controller/action.go @@ -438,9 +438,10 @@ func (s *NeActionController) Service(c *gin.Context) { neTypeLower := strings.ToLower(neInfo.NeType) cmdStr := fmt.Sprintf("sudo systemctl %s %s", body.Action, neTypeLower) - if neTypeLower == "omc" { - cmdStr = fmt.Sprintf("nohup sh -c \"sleep 5s && sudo systemctl %s omc\" > /dev/null 2>&1 &", body.Action) - } else if neTypeLower == "ims" { + switch neTypeLower { + case "omc": + cmdStr = fmt.Sprintf("nohup sh -c \"sudo systemctl stop omc && sleep 5s && sudo systemctl %s omc\" > /dev/null 2>&1 &", body.Action) + case "ims": if body.Action == "restart" { cmdStr = "ims-stop || true && ims-start" } else { diff --git a/src/modules/network_element/controller/ne_config.go b/src/modules/network_element/controller/ne_config.go index 3fd08c2e..d33df1be 100644 --- a/src/modules/network_element/controller/ne_config.go +++ b/src/modules/network_element/controller/ne_config.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" - cm_omc "be.ems/features/cm/omc" "be.ems/src/framework/i18n" "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" @@ -215,16 +214,6 @@ func (s NeConfigController) DataInfo(c *gin.Context) { } if query.NeType == "OMC" { - if query.ParamName == "alarmEmailForward" || query.ParamName == "alarmSMSForward" { - var o *cm_omc.ConfigOMC - resData, err := o.Query(query.ParamName) - if err != nil { - c.JSON(200, resp.ErrMsg(err.Error())) - return - } - c.JSON(200, resp.OkData(resData)) - return - } resData := s.neConfigService.GetOMCYaml(query.ParamName) c.JSON(200, resp.OkData(resData)) return @@ -274,16 +263,6 @@ func (s NeConfigController) DataEdit(c *gin.Context) { return } if body.NeType == "OMC" { - if body.ParamName == "alarmEmailForward" || body.ParamName == "alarmSMSForward" { - var o *cm_omc.ConfigOMC - resData, err := o.Modify(body.ParamName, body.ParamData) - if err != nil { - c.JSON(200, resp.ErrMsg(err.Error())) - return - } - c.JSON(200, resp.OkData(resData)) - return - } err := s.neConfigService.ModifyOMCYaml(body.ParamName, body.Loc, body.ParamData) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) diff --git a/src/modules/network_element/fetch_link/n3iwf.go b/src/modules/network_element/fetch_link/n3iwf.go new file mode 100644 index 00000000..598e4ef7 --- /dev/null +++ b/src/modules/network_element/fetch_link/n3iwf.go @@ -0,0 +1,64 @@ +package fetchlink + +import ( + "encoding/json" + "fmt" + "strings" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" +) + +// N3IWFSubInfoList N3IWF在线列表信息 +// +// 查询参数 {"imsi":"460302072701181"} +// +// 返回结果 {"rows":[],"total":0} +func N3IWFSubInfoList(neInfo model.NeInfo, data map[string]string) (map[string]any, error) { + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/n3iwf/objectType/ueInfo", neInfo.IP, neInfo.Port) + // 查询参数拼接 + query := []string{} + if v, ok := data["imsi"]; ok && v != "" { + query = append(query, fmt.Sprintf("imsi=%s", v)) + } + if len(query) > 0 { + neUrl = fmt.Sprintf("%s?%s", neUrl, strings.Join(query, "&")) + } + + resBytes, err := fetch.Get(neUrl, nil, 60_000) + if err != nil { + logger.Warnf("N3IWFSubInfo Get \"%s\"", neUrl) + logger.Errorf("N3IWFSubInfo %s", err.Error()) + return nil, fmt.Errorf("NeService N3IWF API Error") + } + + // 序列化结果 + // { + // "data": [ + // { + // "activeTime": "2023-11-29 06:35:43", + // "imsi": "460302072701181", + // "nai": "0460302072701181@nai.epc.mnc030.mcc460.3gppnetwork.org", + // "regState": 1 + // } + // ] + // } + var resData map[string]any + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("N3IWFSubInfo Unmarshal %s", err.Error()) + return nil, err + } + + // 固定返回字段,方便前端解析 + if v, ok := resData["data"]; ok && v != nil { + resData["rows"] = v.([]any) + resData["total"] = len(v.([]any)) + delete(resData, "data") + } else { + resData["rows"] = []any{} + resData["total"] = 0 + } + return resData, nil +} diff --git a/src/modules/network_element/fetch_link/nssf.go b/src/modules/network_element/fetch_link/nssf.go new file mode 100644 index 00000000..c73a35d6 --- /dev/null +++ b/src/modules/network_element/fetch_link/nssf.go @@ -0,0 +1,95 @@ +package fetchlink + +import ( + "encoding/json" + "fmt" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" +) + +// NSSFSubInfoList NSSF在线列表信息 +// +// 返回结果 {"rows":[],"total":0} +func NSSFSubInfoList(neInfo model.NeInfo) (map[string]any, error) { + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/subscriptions", neInfo.IP, neInfo.Port) + resBytes, err := fetch.Get(neUrl, nil, 60_000) + if err != nil { + logger.Warnf("NSSFSubInfo Get \"%s\"", neUrl) + logger.Errorf("NSSFSubInfo %s", err.Error()) + return nil, fmt.Errorf("NeService NSSF API Error") + } + + // 序列化结果 + // { + // "data": [ + // { + // "subscriptionId": "460302072701181", + // "event": "460302072701181", + // "nfNssaiAvailabilityUri": "0460302072701181@nai.epc.mnc030.mcc460.3gppnetwork.org" + // } + // ] + // } + var resData map[string]any + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("NSSFSubInfo Unmarshal %s", err.Error()) + return nil, err + } + + // 固定返回字段,方便前端解析 + if v, ok := resData["data"]; ok && v != nil { + resData["rows"] = v.([]any) + resData["total"] = len(v.([]any)) + delete(resData, "data") + } else { + resData["rows"] = []any{} + resData["total"] = 0 + } + return resData, nil +} + +// NSSFAvailableAMFList NSSF装载AMF信息 +// +// 返回结果 {"rows":[],"total":0} +func NSSFAvailableAMFList(neInfo model.NeInfo) (map[string]any, error) { + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/availableAMFs", neInfo.IP, neInfo.Port) + resBytes, err := fetch.Get(neUrl, nil, 60_000) + if err != nil { + logger.Warnf("NSSFAvailableAMFList Get \"%s\"", neUrl) + logger.Errorf("NSSFAvailableAMFList %s", err.Error()) + return nil, fmt.Errorf("NeService NSSF API Error") + } + + // 序列化结果 + // { + // "data": [ + // { + // "nfId": "001", + // "amfSetId": "001" + // }, + // { + // "nfId": "002", + // "amfSetId": "[001,002]" + // } + // ] + // } + var resData map[string]any + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("NSSFAvailableAMFList Unmarshal %s", err.Error()) + return nil, err + } + + // 固定返回字段,方便前端解析 + if v, ok := resData["data"]; ok && v != nil { + resData["rows"] = v.([]any) + resData["total"] = len(v.([]any)) + delete(resData, "data") + } else { + resData["rows"] = []any{} + resData["total"] = 0 + } + return resData, nil +} diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index da3cf1a8..dc088bba 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -41,6 +41,11 @@ func (r NeInfo) neListSort(arr []model.NeInfo) []model.NeInfo { "CHF", "HLR", "SGWC", + "IP-SM-GW", + "MMTel-AS", + "I-CSCF", + "P-CSCF", + "S-CSCF", } // 创建优先级映射 diff --git a/src/modules/network_element/service/ne_config_omc.go b/src/modules/network_element/service/ne_config_omc.go index 4d288d0c..95e605f1 100644 --- a/src/modules/network_element/service/ne_config_omc.go +++ b/src/modules/network_element/service/ne_config_omc.go @@ -2,15 +2,32 @@ package service import ( "fmt" - "runtime" "strings" - "be.ems/src/framework/cmd" "be.ems/src/framework/config" + "github.com/tsmask/go-oam/framework/utils/parse" ) -// GetOMCYaml 获取OMC网元配置文件 /usr/local/etc/omc/omc.yaml +// GetOMCYaml 获取OMC网元配置文件 func (r NeConfig) GetOMCYaml(paramName string) []map[string]any { + if paramName == "notificationEmail" { + notificationEmailData := config.Get("notification.email").(map[string]any) + for k, v := range notificationEmailData { + if k == "password" && v != nil { + notificationEmailData[k] = parse.SafeContent(fmt.Sprint(v)) + } + } + return []map[string]any{notificationEmailData} + } + if paramName == "notificationSMSC" { + notificationSMSCData := config.Get("notification.smsc").(map[string]any) + for k, v := range notificationSMSCData { + if k == "password" && v != nil { + notificationSMSCData[k] = parse.SafeContent(fmt.Sprint(v)) + } + } + return []map[string]any{notificationSMSCData} + } if paramName == "trace" { traceData := config.Get("trace").(map[string]any) return []map[string]any{traceData} @@ -18,30 +35,113 @@ func (r NeConfig) GetOMCYaml(paramName string) []map[string]any { return []map[string]any{} } -// ModifyOMCYaml 修改OMC网元配置文件 /usr/local/etc/omc/omc.yaml +// ModifyOMCYaml 修改OMC网元配置文件 func (r NeConfig) ModifyOMCYaml(paramName, loc string, paramData any) error { neConfig := r.FindByNeTypeAndParamName("OMC", paramName) if neConfig.ParamType == "list" { + if paramName == "notificationEmail" { + notificationEmailData := config.Get("notification.email").(map[string]any) + for k, v := range paramData.(map[string]any) { + keyLower := strings.ToLower(k) + // 改程序内 + notificationEmailData[keyLower] = v + // 改文件 + switch keyLower { + case "enabled": + pattern := `enabled: (true|false) # email enable` + replacement := fmt.Sprintf(`enabled: %v # email enable`, v) + return config.SedReplace(pattern, replacement) + case "list": + pattern := `list: ".*" # toEmail` + replacement := fmt.Sprintf(`list: "%v" # toEmail`, v) + return config.SedReplace(pattern, replacement) + case "title": + pattern := `title: ".*" # email title` + replacement := fmt.Sprintf(`title: "%v" # email title`, v) + return config.SedReplace(pattern, replacement) + case "smtp": + pattern := `smtp: ".*" # email smtp` + replacement := fmt.Sprintf(`smtp: "%v" # email smtp`, v) + return config.SedReplace(pattern, replacement) + case "port": + pattern := `port: [0-9]+ # email port` + replacement := fmt.Sprintf(`port: %v # email port`, v) + return config.SedReplace(pattern, replacement) + case "user": + pattern := `user: ".*" # email user` + replacement := fmt.Sprintf(`user: "%v" # email user`, v) + return config.SedReplace(pattern, replacement) + case "password": + pattern := `password: ".*" # email password` + replacement := fmt.Sprintf(`password: "%v" # email password`, v) + return config.SedReplace(pattern, replacement) + } + } + } + if paramName == "notificationSMSC" { + notificationSMSCData := config.Get("notification.smsc").(map[string]any) + for k, v := range paramData.(map[string]any) { + keyLower := strings.ToLower(k) + // 改程序内 + notificationSMSCData[keyLower] = v + // 改文件 + switch keyLower { + case "enabled": + pattern := `enabled: (true|false) # smsc enable` + replacement := fmt.Sprintf(`enabled: %v # smsc enable`, v) + return config.SedReplace(pattern, replacement) + case "list": + pattern := `list: ".*" # toMobile` + replacement := fmt.Sprintf(`list: "%v" # toMobile`, v) + return config.SedReplace(pattern, replacement) + case "addr": + pattern := `addr: ".*" # smsc addr` + replacement := fmt.Sprintf(`addr: "%v" # smsc addr`, v) + return config.SedReplace(pattern, replacement) + case "systemid": + pattern := `systemid: ".*" # smsc system id` + replacement := fmt.Sprintf(`systemid: "%v" # smsc system id`, v) + return config.SedReplace(pattern, replacement) + case "systemtype": + pattern := `systemtype: ".*" # smsc system type` + replacement := fmt.Sprintf(`systemtype: "%v" # smsc system type`, v) + return config.SedReplace(pattern, replacement) + case "password": + pattern := `password: ".*" # smsc password` + replacement := fmt.Sprintf(`password: "%v" # smsc password`, v) + return config.SedReplace(pattern, replacement) + case "coding": + pattern := `coding: [0-9]+ # smsc codingMap` + replacement := fmt.Sprintf(`coding: %v # smsc codingMap`, v) + return config.SedReplace(pattern, replacement) + case "servicenumber": + pattern := `servicenumber: ".*" # smsc service number` + replacement := fmt.Sprintf(`servicenumber: "%v" # smsc service number`, v) + return config.SedReplace(pattern, replacement) + + } + } + } if paramName == "trace" { - configPath := fmt.Sprint(config.Get("config")) // 获取配置文件路径 - paramDataMap := paramData.(map[string]any) - for k, v := range paramDataMap { - config.Set(fmt.Sprintf("trace.%s", strings.ToLower(k)), v) - if runtime.GOOS == "windows" { - continue // Windows系统不支持sed命令 - } - // 修改参数较少,直接命令改文件内容 - if k == "enabled" { - // sed 's/enabled: \(true\|false\) # trace enabled/enabled: true # trace enabled/' /usr/local/etc/omc/omc.yaml - cmd.Execf("sed -i 's/enabled: \\(true\\|false\\) # trace enabled/enabled: %v # trace enabled/' %s", v, configPath) - } - if k == "host" { - // sed 's/host: ".*" # trace host/host: "127.2.2.2" # trace host/' /usr/local/etc/omc/omc.yaml - cmd.Execf("sed -i 's/host: \".*\" # trace host/host: \"%v\" # trace host/' %s", v, configPath) - } - if k == "port" { - // sed 's/port: [0-9]\+ # trace port/port: 6964 # trace port/' /usr/local/etc/omc/omc.yaml - cmd.Execf("sed -i 's/port: [0-9]\\+ # trace port/port: %v # trace port/' %s", v, configPath) + traceData := config.Get("trace").(map[string]any) + for k, v := range paramData.(map[string]any) { + keyLower := strings.ToLower(k) + // 改程序内 + traceData[keyLower] = v + // 改文件 + switch keyLower { + case "enabled": + pattern := `enabled: (true|false) # trace enabled` + replacement := fmt.Sprintf(`enabled: %v # trace enabled`, v) + return config.SedReplace(pattern, replacement) + case "host": + pattern := `host: ".*" # trace host` + replacement := fmt.Sprintf(`host: "%v" # trace host`, v) + return config.SedReplace(pattern, replacement) + case "port": + pattern := `port: [0-9]+ # trace port` + replacement := fmt.Sprintf(`port: %v # trace port`, v) + return config.SedReplace(pattern, replacement) } } // 重开跟踪任务信令数据通道UDP diff --git a/src/modules/network_element/service/ne_license.go b/src/modules/network_element/service/ne_license.go index 66ca9d7e..e5f3e581 100644 --- a/src/modules/network_element/service/ne_license.go +++ b/src/modules/network_element/service/ne_license.go @@ -186,9 +186,10 @@ func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error { // 重启服务 if neLicense.Reload { cmdStr := fmt.Sprintf("sudo systemctl restart %s", neTypeLower) - if neTypeLower == "ims" { + switch neTypeLower { + case "ims": cmdStr = "ims-stop || true && ims-start" - } else if neTypeLower == "omc" { + case "omc": cmdStr = "sudo systemctl restart omc" } cmd.Exec(cmdStr) diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index be75b16a..aeee6cc2 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -248,7 +248,8 @@ func (r NeVersion) operateCommand(action, neType string, neFilePaths []string) ( // 组合命令输入 cmdStrArr := []string{} - if neType == "OMC" { + switch neType { + case "OMC": omcStrArr := []string{} if action == "install" { // 安装软件包 @@ -274,7 +275,7 @@ func (r NeVersion) operateCommand(action, neType string, neFilePaths []string) ( cmdStrArr = append(cmdStrArr, "nohup sh -c \"sleep 2s && systemctl start omc-exec\" & \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr)) return okFlagStr, cmdStrArr, nil - } else if neType == "IMS" { + case "IMS": if action == "install" { para5GData := r.neInfoService.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") @@ -316,7 +317,7 @@ func (r NeVersion) operateCommand(action, neType string, neFilePaths []string) ( cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") cmdStrArr = append(cmdStrArr, "ims-start \n") } - } else { + default: if action == "install" { para5GData := r.neInfoService.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") diff --git a/src/modules/notification/notification.go b/src/modules/notification/notification.go new file mode 100644 index 00000000..cda49a9c --- /dev/null +++ b/src/modules/notification/notification.go @@ -0,0 +1,11 @@ +package notification + +import ( + "be.ems/src/framework/logger" + "github.com/gin-gonic/gin" +) + +// 模块路由注册 +func Setup(router *gin.Engine) { + logger.Infof("开始加载 ====> notification 模块路由") +} diff --git a/src/modules/notification/service/email.go b/src/modules/notification/service/email.go new file mode 100644 index 00000000..d9a42add --- /dev/null +++ b/src/modules/notification/service/email.go @@ -0,0 +1,126 @@ +package service + +import ( + "bytes" + "crypto/tls" + "fmt" + ht "html/template" + "strings" + "time" + + "github.com/wneessen/go-mail" + + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + neDataModel "be.ems/src/modules/network_data/model" +) + +// EmailAlarm 发告警邮件 +func EmailAlarm(a neDataModel.Alarm, neIP string) error { + emailList := fmt.Sprint(config.Get("notification.email.list")) + if len(emailList) == 0 { + return fmt.Errorf("email list is empty") + } + + // 模板 + htmlBodyTemplate := ` + Alarm information +

Sequence: {{.AlarmSeq}}

+

NE Name: {{.NeName}}

+

NE IP: {{.NeIp}}

+

Title: {{.AlarmTitle}}

+

Severity: {{.OrigSeverity}}

+

Event Time: {{.AlarmTime}}

+

Alarm Status: {{.AlarmStatus}}

+ Automatic sent by OMC, please do not reply! + ` + htmlTpl, err := ht.New("htmltpl").Parse(htmlBodyTemplate) + if err != nil { + return fmt.Errorf("EmailAlarm Parse alarmId:%s fail %s", a.AlarmId, err.Error()) + } + // 参数值 + data := map[string]any{ + "AlarmSeq": a.AlarmSeq, + "NeName": a.NeName, + "NeIp": neIP, + "AlarmTitle": a.AlarmTitle, + "OrigSeverity": a.OrigSeverity, + "AlarmTime": date.ParseDateToStr(a.EventTime, time.RFC3339), + "AlarmStatus": a.AlarmStatus, + } + buffer := bytes.NewBuffer(nil) + if err := htmlTpl.Execute(buffer, data); err != nil { + return fmt.Errorf("EmailAlarm Execute alarmId:%s fail %s", a.AlarmId, err.Error()) + } + htmlStr := buffer.String() + + // 发送邮件 + err = EmailSendHTML(htmlStr, strings.Split(emailList, ",")) + if err != nil { + return fmt.Errorf("EmailAlarm alarmId:%s fail %s", a.AlarmId, err.Error()) + } + return err +} + +// EmailSendHTML 发送HTML邮件 +func EmailSendHTML(htmlStr string, toEmailArr []string) error { + // QQ 邮箱: + // SMTP 服务器地址:smtp.qq.com(SSL协议端口:465/994 | 非SSL协议端口:25) + // 163 邮箱: + // SMTP 服务器地址:smtp.163.com(端口:25) + // host := "mail.agrandtech.com" + // port := 25 + // userName := "smtpext@agrandtech.com" + // password := "1000smtp@omc!" + + emailConf := config.Get("notification.email").(map[string]any) + enable := parse.Boolean(emailConf["enable"]) + if !enable { + return fmt.Errorf("email notification not enable") + } + title := fmt.Sprint(emailConf["title"]) + smtp := fmt.Sprint(emailConf["smtp"]) + port := parse.Number(emailConf["port"]) + user := fmt.Sprint(emailConf["user"]) + password := fmt.Sprint(emailConf["password"]) + + message := mail.NewMsg() + // 发件人 + if err := message.From(user); err != nil { + return fmt.Errorf("failed to set From address: %s", err) + } + // 收件人 + hasTo := false + for _, v := range toEmailArr { + if err := message.AddTo(v); err != nil { + logger.Errorf("failed to set To address: %v %s", v, err) + continue + } + hasTo = true + } + if !hasTo { + return fmt.Errorf("failed to set To address not has") + } + // 邮件主题 + message.Subject(title) + // 邮件HTML内容 + message.SetBodyString(mail.TypeTextHTML, htmlStr) + // 连接到邮件SMTP服务器 + client, err := mail.NewClient(smtp, + mail.WithSMTPAuth(mail.SMTPAuthAutoDiscover), + mail.WithUsername(user), + mail.WithPort(int(port)), + mail.WithPassword(password), + mail.WithTLSConfig(&tls.Config{InsecureSkipVerify: true}), + ) + if err != nil { + return fmt.Errorf("failed to create mail client: %s", err) + } + // 发送 + if err := client.DialAndSend(message); err != nil { + return fmt.Errorf("failed to send mail: %s", err) + } + return nil +} diff --git a/src/modules/notification/service/smsc.go b/src/modules/notification/service/smsc.go new file mode 100644 index 00000000..be039b31 --- /dev/null +++ b/src/modules/notification/service/smsc.go @@ -0,0 +1,164 @@ +package service + +import ( + "bytes" + "fmt" + "strings" + tt "text/template" + "time" + + "github.com/linxGnu/gosmpp" + "github.com/linxGnu/gosmpp/data" + "github.com/linxGnu/gosmpp/pdu" + + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + neDataModel "be.ems/src/modules/network_data/model" +) + +var smscSession *gosmpp.Session + +// connSM 连接smsc +func connSM() *gosmpp.Session { + if smscSession != nil { + return smscSession + } + smscAddr := fmt.Sprint(config.Get("notification.smsc.addr")) + systemType := fmt.Sprint(config.Get("notification.smsc.systemtype")) + systemID := fmt.Sprint(config.Get("notification.smsc.systemid")) + password := fmt.Sprint(config.Get("notification.smsc.password")) + // 建立连接 + session, err := gosmpp.NewSession( + gosmpp.TXConnector(gosmpp.NonTLSDialer, gosmpp.Auth{ + SMSC: smscAddr, + SystemID: systemID, + Password: password, + SystemType: systemType, + }), + gosmpp.Settings{ + ReadTimeout: 2 * time.Second, + OnSubmitError: func(_ pdu.PDU, err error) { + logger.Errorf("failed to smpp submit error: %s", err.Error()) + }, + OnRebindingError: func(err error) { + logger.Errorf("failed to smpp rebinding error: %s", err.Error()) + }, + }, -1) + if err != nil { + logger.Errorf("failed to create smpp new session error: %s", err.Error()) + return nil + } + // defer session.Close() + smscSession = session + return smscSession +} + +// newSubmitSM 构建短信提交 +func newSubmitSM(destSM string, message string) (*pdu.SubmitSM, error) { + dataCoding := parse.Number(config.Get("notification.smsc.coding")) + enc := data.FromDataCoding(byte(dataCoding)) + srcSM := fmt.Sprint(config.Get("notification.smsc.servicenumber")) + // 源地址 + srcAddr := pdu.NewAddress() + srcAddr.SetTon(5) + srcAddr.SetNpi(0) + err := srcAddr.SetAddress(srcSM) + if err != nil { + return nil, err + } + destAddr := pdu.NewAddress() + destAddr.SetTon(1) + destAddr.SetNpi(1) + err = destAddr.SetAddress(destSM) + if err != nil { + return nil, err + } + // build up submitSM + submitSM := pdu.NewSubmitSM().(*pdu.SubmitSM) + submitSM.SourceAddr = srcAddr + submitSM.DestAddr = destAddr + if err = submitSM.Message.SetMessageWithEncoding(message, enc); err != nil { + return nil, err + } + submitSM.ProtocolID = 0 + submitSM.RegisteredDelivery = 1 + submitSM.ReplaceIfPresentFlag = 0 + submitSM.EsmClass = 0 + return submitSM, nil +} + +// SMSCAlarm 发告警短信 +func SMSCAlarm(a neDataModel.Alarm, neIP string) error { + mobileList := fmt.Sprint(config.Get("notification.smsc.list")) + if len(mobileList) == 0 { + return fmt.Errorf("smsc list is empty") + } + + // 模板 + textBodyTemplate := `Alarm Notification + Sequence: {{.AlarmSeq}}, + NE Name: {{.NeName}} + NE IP: {{.NeIp}} + Title: {{.AlarmTitle}} + Severity: {{.OrigSeverity}} + Event Time: {{.AlarmTime}} + Alarm Status: {{.AlarmStatus}} + Automatic sent by OMC, please do not reply!` + textTpl, err := tt.New("texttpl").Parse(textBodyTemplate) + if err != nil { + return fmt.Errorf("SMSCAlarm alarmId:%s fail %s", a.AlarmId, err.Error()) + } + // 参数值 + data := map[string]any{ + "AlarmSeq": a.AlarmSeq, + "NeName": a.NeName, + "NeIp": neIP, + "AlarmTitle": a.AlarmTitle, + "OrigSeverity": a.OrigSeverity, + "AlarmTime": date.ParseDateToStr(a.EventTime, time.RFC3339), + "AlarmStatus": a.AlarmStatus, + } + buffer := bytes.NewBuffer(nil) + if err := textTpl.Execute(buffer, data); err != nil { + return fmt.Errorf("EmailAlarm Execute alarmId:%s fail %s", a.AlarmId, err.Error()) + } + textStr := buffer.String() + + // 发送短信 + err = SMSCSendText(textStr, strings.Split(mobileList, ",")) + if err != nil { + return fmt.Errorf("EmailAlarm alarmId:%s fail %s", a.AlarmId, err.Error()) + } + return err +} + +// SMSCSendText 发送文本短信 +func SMSCSendText(textStr string, toMobileArr []string) error { + enable := parse.Boolean(config.Get("notification.smsc.enable")) + if !enable { + return fmt.Errorf("smsc notification not enable") + } + sm := connSM() + if sm == nil { + return fmt.Errorf("smpp new session create failed") + } + + errArr := []string{} + for _, v := range toMobileArr { + submitSM, err := newSubmitSM(v, textStr) + if err != nil { + errArr = append(errArr, err.Error()) + continue + } + if err = sm.Transceiver().Submit(submitSM); err != nil { + errArr = append(errArr, err.Error()) + continue + } + } + if len(errArr) > 0 { + return fmt.Errorf("%s", strings.Join(errArr, ",")) + } + return nil +} diff --git a/src/modules/oam/controller/api_rest.go b/src/modules/oam/controller/api_rest.go new file mode 100644 index 00000000..cfcd2822 --- /dev/null +++ b/src/modules/oam/controller/api_rest.go @@ -0,0 +1,722 @@ +package controller + +import ( + "encoding/json" + "fmt" + "strings" + "time" + + "github.com/gin-gonic/gin" + "github.com/tsmask/go-oam" + goOamState "github.com/tsmask/go-oam/modules/state/service" + + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/resp" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" + oamService "be.ems/src/modules/oam/service" +) + +// NewAPIRest 实例化控制层 +var NewAPIRest = &APIRestController{} + +// APIRestController 北向定义 控制层处理 +// +// PATH /api/rest +type APIRestController struct{} + +// ResolveAlarm 接收告警 +// +// POST /faultManagement/v1/elementType/:elementTypeValue/objectType/alarms +func (s APIRestController) ResolveAlarm(c *gin.Context) { + var body []struct { + AlarmSeq int `json:"alarmSeq"` + AlarmId string `json:"alarmId"` + NeId string `json:"neId"` // 收到实际是rmUID + AlarmCode int `json:"alarmCode"` + AlarmTitle string `json:"alarmTitle"` + EventTime string `json:"eventTime"` + AlarmType string `json:"alarmType"` + OrigSeverity string `json:"origSeverity"` + PerceivedSeverity string `json:"perceivedSeverity"` + PVFlag string `json:"pvFlag"` + NeName string `json:"neName"` + NeType string `json:"neType"` + ObjectUid string `json:"objectUid"` + ObjectName string `json:"objectName"` + ObjectType string `json:"objectType"` + LocationInfo string `json:"locationInfo"` + Province string `json:"province"` + AlarmStatus int `json:"alarmStatus"` + SpecificProblem string `json:"specificProblem"` + SpecificProblemID string `json:"specificProblemID"` + AddInfo string `json:"addInfo"` + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + elementTypeValue := c.Param("elementTypeValue") + + // alarmTypeValue 映射值 + alarmTypeValue := func(str string) string { + arr := []string{ + oam.ALARM_TYPE_COMMUNICATION_ALARM, + oam.ALARM_TYPE_EQUIPMENT_ALARM, + oam.ALARM_TYPE_PROCESSING_FAILURE, + oam.ALARM_TYPE_ENVIRONMENTAL_ALARM, + oam.ALARM_TYPE_QUALITY_OF_SERVICE_ALARM, + } + for k, v := range arr { + if v == str { + return v + } + if fmt.Sprint(k+1) == str { + return v + } + } + return str + } + + // origSeverityValue 映射值 + origSeverityValue := func(str string) string { + arr := []string{ + oam.ALARM_SEVERITY_CRITICAL, + oam.ALARM_SEVERITY_MAJOR, + oam.ALARM_SEVERITY_MINOR, + oam.ALARM_SEVERITY_WARNING, + oam.ALARM_SEVERITY_EVENT, + } + for k, v := range arr { + if v == str { + return v + } + if fmt.Sprint(k+1) == str { + return v + } + } + return str + } + + // alarmStatusValue 映射值 + alarmStatusValue := func(value int) string { + arr := []string{ + oam.ALARM_STATUS_CLEAR, + oam.ALARM_STATUS_ACTIVE, + } + for k, v := range arr { + if k == value { + return v + } + } + return oam.ALARM_STATUS_ACTIVE + } + + alarmArr := make([]oam.Alarm, 0) + for _, v := range body { + if !strings.EqualFold(v.NeType, elementTypeValue) { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "elementType is inconsistent with neType")) + return + } + // 产生时间 + eventTime := date.ParseStrToDate(v.EventTime, time.RFC3339) + // 创建告警 + alarm := oam.Alarm{ + NeUid: v.NeId, // 网元唯一标识 + AlarmTime: eventTime.UnixMilli(), // 事件产生时间 + AlarmId: v.AlarmId, // 告警ID 唯一,清除时对应 + AlarmCode: v.AlarmCode, // 告警状态码 + AlarmType: alarmTypeValue(v.AlarmType), // 告警类型 + AlarmTitle: v.AlarmTitle, // 告警标题 + PerceivedSeverity: origSeverityValue(v.OrigSeverity), // 告警级别 + AlarmStatus: alarmStatusValue(v.AlarmStatus), // 告警状态 + SpecificProblem: v.SpecificProblem, // 告警问题原因 + SpecificProblemID: v.SpecificProblemID, // 告警问题原因ID + AddInfo: v.AddInfo, // 告警辅助信息 + LocationInfo: v.LocationInfo, // 告警定位信息 + } + alarmArr = append(alarmArr, alarm) + } + + errArr := make([]string, 0) + for _, alarm := range alarmArr { + if err := oamService.NewAlarm.Resolve(alarm); err != nil { + errArr = append(errArr, err.Error()) + } + } + + if len(errArr) > 0 { + c.JSON(200, resp.ErrData(errArr)) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// ResolveCDR 接收话单 +// +// POST /cdrManagement/v1/elementType/:elementTypeValue/objectType/cdrEvent +func (s APIRestController) ResolveCDR(c *gin.Context) { + var body struct { + NeType string `json:"neType" ` + NeName string `json:"neName" ` + RmUID string `json:"rmUID" ` + Timestamp int `json:"timestamp" ` + CDR map[string]any `json:"CDR" ` + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + elementTypeValue := c.Param("elementTypeValue") + if !strings.EqualFold(body.NeType, elementTypeValue) { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "elementType is inconsistent with neType")) + return + } + + recordTime := time.Now() + if body.Timestamp > 1e12 { + recordTime = time.UnixMilli(int64(body.Timestamp)) + } else if body.Timestamp > 1e9 { + recordTime = time.Unix(int64(body.Timestamp), 0) + } + // 创建CDR + cdr := oam.CDR{ + NeUid: body.RmUID, // 网元唯一标识 + RecordTime: recordTime.UnixMilli(), // 记录时间 时间戳毫秒,Push时自动填充 + Data: body.CDR, // 话单信息 + } + if err := oamService.NewCDR.Resolve(cdr); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// ResolveKPI 接收KPI +// +// POST /performanceManagement/v1/elementType/:elementTypeValue/objectType/kpiReport/:index +func (s APIRestController) ResolveKPI(c *gin.Context) { + var body struct { + Timestamp string `json:"TimeStamp" binding:"required"` + Task struct { + Period struct { + StartTime string `json:"StartTime"` + EndTime string `json:"EndTime"` + } `json:"Period" binding:"required"` + NE struct { + NEName string `json:"NEName"` + RmUID string `json:"rmUID"` + NeType string `json:"NeType"` + KPIs []struct { + KPIID string `json:"KPIID"` + Value int64 `json:"Value"` + Err string `json:"Err"` + } `json:"KPIs" binding:"required"` + } `json:"NE" binding:"required"` + } `json:"Task" binding:"required"` + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + elementTypeValue := c.Param("elementTypeValue") + if !strings.EqualFold(body.Task.NE.NeType, elementTypeValue) { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "elementType is inconsistent with neType")) + return + } + // index := c.Param("index") + + timestamp := body.Timestamp + taskPeriod := body.Task.Period + taskNeKPIs := body.Task.NE.KPIs + // 时间数据处理 + receiverTime := date.ParseStrToDate(timestamp, date.YYYY_MM_DDTHH_MM_SSZ) + startTime := date.ParseStrToDate(taskPeriod.StartTime, date.YYYY_MM_DDTHH_MM_SSZ) + endTime := date.ParseStrToDate(taskPeriod.EndTime, date.YYYY_MM_DDTHH_MM_SSZ) + granularity := parse.Number(endTime.Sub(startTime).Seconds()) + // kpi data数据 + KpiValues := make(map[string]float64, 0) + for _, v := range taskNeKPIs { + KpiValues[v.KPIID] = float64(v.Value) + } + + // 创建KPI + kpi := oam.KPI{ + NeUid: body.Task.NE.RmUID, // 网元唯一标识 + RecordTime: receiverTime.UnixMilli(), // 记录时间 时间戳毫秒,Push时自动填充 + Granularity: granularity, // 时间间隔 5/10/.../60/300 (秒) + Data: KpiValues, // 指标信息 + } + if err := oamService.NewKPI.Resolve(kpi); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// ResolveNBState 接收基站状态变更 +// +// POST /ueManagement/v1/elementType/:elementTypeValue/objectType/nbState +func (s APIRestController) ResolveNBState(c *gin.Context) { + var body struct { + NeType string `json:"neType" ` + NeName string `json:"neName" ` + RmUID string `json:"rmUID"` + StateList []struct { + Address string `json:"address" ` + Name string `json:"name" ` + Position string `json:"position" ` + NbName string `json:"nbName" ` + State string `json:"state" ` // "OFF" or "ON" + OffTime string `json:"offTime" ` //if State=OFF, will set it + OnTime string `json:"onTime" ` //if State=ON , will set it + } + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + elementTypeValue := c.Param("elementTypeValue") + if !strings.EqualFold(body.NeType, elementTypeValue) { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "elementType is inconsistent with neType")) + return + } + + if len(body.StateList) == 0 { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "no stateList")) + return + } + + nbStateArr := make([]oam.NBState, 0) + for _, v := range body.StateList { + if v.Address == "" || v.State == "" { + continue + } + stateTime := date.ParseStrToDate(v.OffTime, time.RFC3339) + stateStr := oam.NB_STATE_OFF + if v.State == "ON" { + stateTime = date.ParseStrToDate(v.OnTime, time.RFC3339) + stateStr = oam.NB_STATE_ON + } + + // 创建NbState + nbState := oam.NBState{ + NeUid: body.RmUID, // 网元唯一标识 + RecordTime: time.Now().UnixMilli(), // 记录时间 时间戳毫秒,Push时自动填充 + Address: v.Address, // 基站地址 + DeviceName: v.NbName, // 基站设备名称 + State: stateStr, // 基站状态 ON/OFF + StateTime: stateTime.UnixMilli(), // 基站状态时间 时间戳毫秒 + Name: v.Name, // 基站名称 网元标记 + Position: v.Position, // 基站位置 网元标记 + } + nbStateArr = append(nbStateArr, nbState) + } + + errArr := make([]string, 0) + for _, nbState := range nbStateArr { + if err := oamService.NewNBState.Resolve(nbState); err != nil { + errArr = append(errArr, err.Error()) + } + } + + if len(errArr) > 0 { + c.JSON(200, resp.ErrData(errArr)) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// ResolveUENB 接收终端接入基站 +// +// POST /logManagement/v1/elementType/:elementTypeValue/objectType/ueEvent +func (s APIRestController) ResolveUENB(c *gin.Context) { + var body struct { + NeType string `json:"neType" ` + NeName string `json:"neName" ` + RmUID string `json:"rmUID" ` + Timestamp int64 `json:"timestamp" ` + EventType string `json:"eventType" ` + EventJson map[string]any `json:"eventJSON" ` + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + elementTypeValue := c.Param("elementTypeValue") + if !strings.EqualFold(body.NeType, elementTypeValue) { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "elementType is inconsistent with neType")) + return + } + + // 记录时间 + recordTime := time.Now() + if body.Timestamp > 1e12 { + recordTime = time.UnixMilli(int64(body.Timestamp)) + } else if body.Timestamp > 1e9 { + recordTime = time.Unix(int64(body.Timestamp), 0) + } + + // 创建UENB + uenb := oam.UENB{ + NeUid: body.RmUID, // 网元唯一标识 + RecordTime: recordTime.UnixMilli(), // 记录时间 + NBId: "0", // 基站ID + CellId: "0", // 小区ID + TAC: "", // TAC + IMSI: "", // IMSI + Result: oam.UENB_RESULT_AUTH_SUCCESS, // 结果值 + Type: oam.UENB_TYPE_DETACH, // 终端接入基站类型 + } + + // 基站ID + if v, ok := body.EventJson["eNBID"]; ok && v != nil { + uenb.NBId = fmt.Sprint(v) + } + if v, ok := body.EventJson["gNBID"]; ok && v != nil { + uenb.NBId = fmt.Sprint(v) + } + // 小区ID + if v, ok := body.EventJson["cellID"]; ok && v != nil { + uenb.CellId = fmt.Sprint(v) + } + // TAC + if v, ok := body.EventJson["tacID"]; ok && v != nil { + uenb.TAC = fmt.Sprint(v) + } + // IMSI + if v, ok := body.EventJson["imsi"]; ok && v != nil { + uenb.IMSI = fmt.Sprint(v) + } + // 结果值 + if v, ok := body.EventJson["result"]; ok && v != nil { + uenb.Result = fmt.Sprint(v) + } + // 终端接入基站类型 + if v, ok := body.EventJson["type"]; ok && v != nil { + switch v := fmt.Sprint(v); v { + case "detach": + uenb.Type = oam.UENB_TYPE_DETACH + case "auth-result": + uenb.Type = oam.UENB_TYPE_AUTH + case "cm-state": + uenb.Type = oam.UENB_TYPE_CM + } + } + + if err := oamService.NewUENB.Resolve(uenb); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// ResolveUENBByAMF 接收终端接入基站-AMF +// +// POST /upload-ue/v1/:eventType +func (s APIRestController) ResolveUENBByAMF(c *gin.Context) { + var body map[string]any + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 创建UENB + uenb := oam.UENB{ + NeUid: "4400HXAMF001", // 网元唯一标识 + RecordTime: 0, // 记录时间 + NBId: "0", // 基站ID + CellId: "0", // 小区ID + TAC: "", // TAC + IMSI: "", // IMSI + Result: oam.UENB_RESULT_AUTH_SUCCESS, // 结果值 + Type: oam.UENB_TYPE_DETACH, // 终端接入基站类型 + } + + // 从eventJson中获取rmUID + if v, ok := body["rmUID"]; ok { + uenb.NeUid = fmt.Sprint(v) + } + + // 统一格式 + eventType := c.Param("eventType") + switch eventType { + case "auth-result": + // {"authCode":"200","authMessage":"成功","authTime":"2024-12-07 16:48:37","cellID":"3","gNBID":"1","imsi":"460002082100000","onlineNumber":1,"tacID":"81"} + if v, ok := body["imsi"]; ok { + uenb.IMSI = fmt.Sprint(v) + } + if v, ok := body["cellID"]; ok { + uenb.CellId = fmt.Sprint(v) + } + if v, ok := body["gNBID"]; ok { + uenb.NBId = fmt.Sprint(v) + } + if v, ok := body["tacID"]; ok { + uenb.TAC = fmt.Sprint(v) + } + + if v, ok := body["authCode"]; ok { + uenb.Result = fmt.Sprint(v) + } + if v, ok := body["authTime"]; ok { + authTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) + uenb.RecordTime = authTime.UnixMilli() + } + uenb.Type = oam.UENB_TYPE_AUTH + case "detach": + // {"detachResult":0,"detachTime":"2024-12-07 18:00:47","imsi":"460002082100000"} + if v, ok := body["imsi"]; ok { + uenb.IMSI = fmt.Sprint(v) + } + if v, ok := body["detachResult"]; ok { + if v == "0" { + uenb.Result = oam.UENB_RESULT_AUTH_SUCCESS + } else { + uenb.Result = fmt.Sprint(v) + } + } + if v, ok := body["detachTime"]; ok { + detachTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) + uenb.RecordTime = detachTime.UnixMilli() + } + uenb.Type = oam.UENB_TYPE_DETACH + case "cm-state": + // {"changeTime":"2024-12-07 17:07:52","imsi":"460002082100000","onlineNumber":1,"status":2} + if v, ok := body["imsi"]; ok { + uenb.IMSI = fmt.Sprint(v) + } + if v, ok := body["status"]; ok { + uenb.Result = fmt.Sprint(v) + } + if v, ok := body["changeTime"]; ok { + changeTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) + uenb.RecordTime = changeTime.UnixMilli() + } + uenb.Type = oam.UENB_TYPE_CM + } + + if err := oamService.NewUENB.Resolve(uenb); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// ResolveAlarmHistory 拉取告警历史 +// +// GET /faultManagement/v1/elementType/:elementTypeValue/objectType/alarms +func (s APIRestController) ResolveAlarmHistory(c *gin.Context) { + elementTypeValue := c.Param("elementTypeValue") + + // Get alarms from OMC return 204 + if strings.ToLower(elementTypeValue) == "omc" { + c.JSON(200, resp.OkMsg("omc alarms no content")) + return + } + + // alarmTypeValue 映射值 + alarmTypeValue := func(str string) string { + arr := []string{ + oam.ALARM_TYPE_COMMUNICATION_ALARM, + oam.ALARM_TYPE_EQUIPMENT_ALARM, + oam.ALARM_TYPE_PROCESSING_FAILURE, + oam.ALARM_TYPE_ENVIRONMENTAL_ALARM, + oam.ALARM_TYPE_QUALITY_OF_SERVICE_ALARM, + } + for k, v := range arr { + if v == str { + return v + } + if fmt.Sprint(k+1) == str { + return v + } + } + return str + } + + // origSeverityValue 映射值 + origSeverityValue := func(str string) string { + arr := []string{ + oam.ALARM_SEVERITY_CRITICAL, + oam.ALARM_SEVERITY_MAJOR, + oam.ALARM_SEVERITY_MINOR, + oam.ALARM_SEVERITY_WARNING, + oam.ALARM_SEVERITY_EVENT, + } + for k, v := range arr { + if v == str { + return v + } + if fmt.Sprint(k+1) == str { + return v + } + } + return str + } + + // alarmStatusValue 映射值 + alarmStatusValue := func(value int) string { + arr := []string{ + oam.ALARM_STATUS_CLEAR, + oam.ALARM_STATUS_ACTIVE, + } + for k, v := range arr { + if k == value { + return v + } + } + return oam.ALARM_STATUS_ACTIVE + } + + alarmArr := make([]oam.Alarm, 0) + type body struct { + AlarmSeq int `json:"alarmSeq"` + AlarmId string `json:"alarmId"` + NeId string `json:"neId"` // 收到实际是rmUID + AlarmCode int `json:"alarmCode"` + AlarmTitle string `json:"alarmTitle"` + EventTime string `json:"eventTime"` + AlarmType string `json:"alarmType"` + OrigSeverity string `json:"origSeverity"` + PerceivedSeverity string `json:"perceivedSeverity"` + PVFlag string `json:"pvFlag"` + NeName string `json:"neName"` + NeType string `json:"neType"` + ObjectUid string `json:"objectUid"` + ObjectName string `json:"objectName"` + ObjectType string `json:"objectType"` + LocationInfo string `json:"locationInfo"` + Province string `json:"province"` + AlarmStatus int `json:"alarmStatus"` + SpecificProblem string `json:"specificProblem"` + SpecificProblemID string `json:"specificProblemID"` + AddInfo string `json:"addInfo"` + } + parseItem := func(v body) oam.Alarm { + // 产生时间 + eventTime := date.ParseStrToDate(v.EventTime, time.RFC3339) + // 创建告警 + alarm := oam.Alarm{ + NeUid: v.NeId, // 网元唯一标识 + AlarmTime: eventTime.UnixMilli(), // 事件产生时间 + AlarmId: v.AlarmId, // 告警ID 唯一,清除时对应 + AlarmCode: v.AlarmCode, // 告警状态码 + AlarmType: alarmTypeValue(v.AlarmType), // 告警类型 + AlarmTitle: v.AlarmTitle, // 告警标题 + PerceivedSeverity: origSeverityValue(v.OrigSeverity), // 告警级别 + AlarmStatus: alarmStatusValue(v.AlarmStatus), // 告警状态 + SpecificProblem: v.SpecificProblem, // 告警问题原因 + SpecificProblemID: v.SpecificProblemID, // 告警问题原因ID + AddInfo: v.AddInfo, // 告警辅助信息 + LocationInfo: v.LocationInfo, // 告警定位信息 + } + return alarm + } + var neInfos []neModel.NeInfo + if elementTypeValue == "all" { + neInfos = neService.NewNeInfo.Find(neModel.NeInfo{}, false, false) + } else { + neInfos = neService.NewNeInfo.FindByNeType(strings.ToUpper(elementTypeValue)) + } + for _, neInfo := range neInfos { + data, err := neFetchlink.AlarmHistory(neInfo) + if err != nil { + logger.Errorf("failed to fetch alarm history:%s", err.Error()) + continue + } + if len(data) == 0 { + logger.Warnf("not found sync alarms %s", neInfo.RmUID) + continue + } + + bodyArr := make([]body, 0) + // 将 []map[string]any 序列化为 JSON 字符串 + jsonData, err := json.Marshal(data) + if err != nil { + logger.Errorf("marshal error: %s", err.Error()) + continue + } + // 反序列化到结构体 + err = json.Unmarshal(jsonData, &bodyArr) + if err != nil { + logger.Errorf("Error unmarshal error: %s", err.Error()) + continue + } + + for _, v := range bodyArr { + alarmArr = append(alarmArr, parseItem(v)) + } + } + + errArr := make([]string, 0) + for _, alarm := range alarmArr { + if err := oamService.NewAlarm.Resolve(alarm); err != nil { + errArr = append(errArr, err.Error()) + } + } + + if len(errArr) > 0 { + c.JSON(200, resp.OkData(errArr)) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// QuerySystemState 查询系统状态 +// +// GET /systemManagement/v1/elementType/:elementTypeValue/objectType/systemState +func (s APIRestController) QuerySystemState(c *gin.Context) { + elementTypeValue := c.Param("elementTypeValue") + if strings.ToLower(elementTypeValue) != "omc" { + c.JSON(200, resp.ErrMsg("elementType only omc")) + return + } + info := goOamState.NewState.Info() + info.SerialNum = "-" + info.ExpiryDate = "-" + info.Capability = 50 + info.Version = config.Version + c.JSON(200, info) +} + +// NeConfigOMC 网元配置对端网管信息 +// +// PUT /systemManagement/v1/elementType/:elementTypeValue/objectType/config/omcNeConfig +func (s APIRestController) NeConfigOMC(c *gin.Context) { + c.JSON(204, nil) +} + +// @Description CBSManagement CB消息 +type CBSState struct { + NeName string `json:"neName"` // 网元名称 + RmUID string `json:"rmUID"` // 网元唯一标识 + EventData []oamService.CBSEventData `json:"eventData"` // 事件数据 +} + +func (s APIRestController) ResolveCBSState(c *gin.Context) { + var state CBSState + if err := c.ShouldBindBodyWithJSON(&state); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + for _, eventData := range state.EventData { + if err := oamService.NewCBS.Resolve(eventData); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + } + c.JSON(200, resp.Ok(nil)) +} diff --git a/src/modules/oam/oam.go b/src/modules/oam/oam.go new file mode 100644 index 00000000..54dd3a68 --- /dev/null +++ b/src/modules/oam/oam.go @@ -0,0 +1,43 @@ +package oam + +import ( + "github.com/gin-gonic/gin" + "github.com/tsmask/go-oam" + + "be.ems/src/framework/logger" + "be.ems/src/modules/oam/controller" + "be.ems/src/modules/oam/service" +) + +// Setup 模块路由注册 +func Setup(router *gin.Engine) { + logger.Infof("开始加载 ====> oam 模块路由") + + // 网管接收端收告警 + oam.AlarmReceiveRoute(router, service.NewAlarm.Resolve) + // 网管接收端收终端接入基站 + oam.UENBReceiveRoute(router, service.NewUENB.Resolve) + // 网管接收端收基站状态 + oam.NBStateReceiveRoute(router, service.NewNBState.Resolve) + // 网管接收端收话单 + oam.CDRReceiveRoute(router, service.NewCDR.Resolve) + // 网管接收端收KPI + oam.KPIReceiveRoute(router, service.NewKPI.Resolve) + + // APIRest 北向定义 + aprRest := controller.NewAPIRest + aprRestGroup := router.Group("/api/rest") + { + aprRestGroup.GET("/faultManagement/v1/elementType/:elementTypeValue/objectType/alarms", aprRest.ResolveAlarmHistory) + aprRestGroup.POST("/faultManagement/v1/elementType/:elementTypeValue/objectType/alarms", aprRest.ResolveAlarm) + aprRestGroup.POST("/cdrManagement/v1/elementType/:elementTypeValue/objectType/cdrEvent", aprRest.ResolveCDR) + aprRestGroup.POST("/performanceManagement/v1/elementType/:elementTypeValue/objectType/kpiReport/:index", aprRest.ResolveKPI) + aprRestGroup.POST("/ueManagement/v1/elementType/:elementTypeValue/objectType/nbState", aprRest.ResolveNBState) + aprRestGroup.POST("/ueManagement/v1/elementType/:elementTypeValue/objectType/cbsState", aprRest.ResolveCBSState) + aprRestGroup.POST("/logManagement/v1/elementType/:elementTypeValue/objectType/ueEvent", aprRest.ResolveUENB) + router.POST("/upload-ue/v1/:eventType", aprRest.ResolveUENBByAMF) // AMF特殊上报 + aprRestGroup.GET("/systemManagement/v1/elementType/:elementTypeValue/objectType/systemState", aprRest.QuerySystemState) + aprRestGroup.PUT("/systemManagement/v1/elementType/:elementTypeValue/objectType/config/omcNeConfig", aprRest.NeConfigOMC) + } + +} diff --git a/src/modules/oauth2/open_api.go b/src/modules/oam/oauth2_api.go similarity index 85% rename from src/modules/oauth2/open_api.go rename to src/modules/oam/oauth2_api.go index 84f96e03..f8022cff 100644 --- a/src/modules/oauth2/open_api.go +++ b/src/modules/oam/oauth2_api.go @@ -1,4 +1,4 @@ -package oauth2 +package oam import ( "github.com/gin-gonic/gin" @@ -8,8 +8,8 @@ import ( neController "be.ems/src/modules/network_element/controller" ) -// openAPI 客户端授权开放接口 -func openAPI(router *gin.Engine) { +// SetupOauth2 客户端授权开放接口 +func SetupOauth2(router *gin.Engine) { openApiGroup := router.Group("/open-api") // 监控 diff --git a/src/modules/oam/service/alarm.go b/src/modules/oam/service/alarm.go new file mode 100644 index 00000000..33d8cbe9 --- /dev/null +++ b/src/modules/oam/service/alarm.go @@ -0,0 +1,301 @@ +package service + +import ( + "fmt" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/parse" + "github.com/tsmask/go-oam" + + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + notificationService "be.ems/src/modules/notification/service" + traceService "be.ems/src/modules/trace/service" + wsService "be.ems/src/modules/ws/service" +) + +// 实例化服务层 Alarm 结构体 +var NewAlarm = &Alarm{ + neInfoService: neService.NewNeInfo, + wsService: wsService.NewWSSend, + alarmService: neDataService.NewAlarm, + alarmEventService: neDataService.NewAlarmEvent, + alarmLogService: neDataService.NewAlarmLog, + alarmForwardLogService: neDataService.NewAlarmForwardLog, +} + +// Alarm 消息处理 +type Alarm struct { + neInfoService *neService.NeInfo + wsService *wsService.WSSend + alarmService *neDataService.Alarm + alarmEventService *neDataService.AlarmEvent + alarmLogService *neDataService.AlarmLog + alarmForwardLogService *neDataService.AlarmForwardLog + + alarm neDataModel.Alarm +} + +// Resolve 接收处理 +func (s *Alarm) Resolve(a oam.Alarm) error { + // 是否存在网元 + neInfo := s.neInfoService.FindByRmuid(a.NeUid) + if neInfo.NeType == "" || neInfo.RmUID != a.NeUid { + return fmt.Errorf("resolve alarm network element does not exist %s", a.NeUid) + } + + // seq 告警序号 + lastSeq := neDataService.NewAlarm.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId) + + // 告警信息 + s.alarm = neDataModel.Alarm{ + NeType: neInfo.NeType, + NeId: neInfo.NeId, + NeName: neInfo.NeName, + Province: neInfo.Province, + PvFlag: neInfo.PvFlag, + AlarmSeq: lastSeq + 1, + AlarmId: a.AlarmId, + AlarmTitle: a.AlarmTitle, + AlarmCode: int64(a.AlarmCode), + EventTime: a.AlarmTime, + AlarmType: a.AlarmType, + OrigSeverity: a.PerceivedSeverity, + PerceivedSeverity: a.PerceivedSeverity, + ObjectUid: neInfo.RmUID, + ObjectName: neInfo.NeName, + ObjectType: neInfo.NeType, + LocationInfo: a.LocationInfo, + AlarmStatus: a.AlarmStatus, + SpecificProblem: a.SpecificProblem, + SpecificProblemId: a.SpecificProblemID, + AddInfo: a.AddInfo, + } + + // 进行清除 + if a.AlarmStatus == oam.ALARM_STATUS_CLEAR { + if a.PerceivedSeverity == oam.ALARM_SEVERITY_EVENT { + if err := s.clearEvent(); err != nil { + return err + } + } else { + if err := s.clear(); err != nil { + return err + } + } + + } + // 进行新增 + if a.AlarmStatus == oam.ALARM_STATUS_ACTIVE { + if a.PerceivedSeverity == oam.ALARM_SEVERITY_EVENT { + if err := s.addEvent(); err != nil { + return err + } + } else { + if err := s.add(); err != nil { + return err + } + } + } + + // 记录日志 + if err := s.saveLog(); err != nil { + return err + } + // 推送 + s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId), s.alarm) + // 通知 + go s.notify(neInfo.IP) + return nil +} + +// saveLog 记录日志 +func (s *Alarm) saveLog() error { + alarmLog := neDataModel.AlarmLog{ + NeType: s.alarm.NeType, + NeId: s.alarm.NeId, + AlarmSeq: s.alarm.AlarmSeq, + AlarmId: s.alarm.AlarmId, + AlarmTitle: s.alarm.AlarmTitle, + AlarmCode: s.alarm.AlarmCode, + AlarmStatus: s.alarm.AlarmStatus, + AlarmType: s.alarm.AlarmType, + OrigSeverity: s.alarm.PerceivedSeverity, + EventTime: s.alarm.EventTime, + } + insertId := s.alarmLogService.Insert(alarmLog) + if insertId <= 0 { + return fmt.Errorf("save alarm log fail") + } + return nil +} + +// add 新增告警 +func (s *Alarm) add() error { + // 检查网元告警ID是否唯一 + alarmIdArr := s.alarmService.Find(neDataModel.Alarm{ + NeType: s.alarm.NeType, + NeId: s.alarm.NeId, + AlarmId: s.alarm.AlarmId, + }) + if len(alarmIdArr) > 0 { + return fmt.Errorf("already exists alarmId:%s", s.alarm.AlarmId) + } + insertId := s.alarmService.Insert(s.alarm) + if insertId > 0 { + s.alarm.ID = insertId + return nil + } + return fmt.Errorf("add alarm fail") +} + +// clear 清除告警 +func (s *Alarm) clear() error { + // 检查网元告警ID是否唯一 + alarmIdArr := s.alarmService.Find(neDataModel.Alarm{ + NeType: s.alarm.NeType, + NeId: s.alarm.NeId, + AlarmId: s.alarm.AlarmId, + }) + if len(alarmIdArr) != 1 { + return fmt.Errorf("not exists alarmId:%s", s.alarm.AlarmId) + } + + // 告警清除 + rows, _ := s.alarmService.ClearByIds([]int64{alarmIdArr[0].ID}, s.alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) + if rows > 0 { + return nil + } + return fmt.Errorf("clear fail alarmId:%s", s.alarm.AlarmId) +} + +// addEvent 新增告警事件 +func (s *Alarm) addEvent() error { + // 检查网元告警ID是否唯一 + alarmIdArr := s.alarmEventService.Find(neDataModel.AlarmEvent{ + NeType: s.alarm.NeType, + NeId: s.alarm.NeId, + AlarmId: s.alarm.AlarmId, + }) + if len(alarmIdArr) > 0 { + return fmt.Errorf("event already exists alarmId:%s", s.alarm.AlarmId) + } + // seq 告警序号 + lastSeq := s.alarmEventService.FindAlarmEventSeqLast(s.alarm.NeType, s.alarm.NeId) + + alarmEvent := neDataModel.AlarmEvent{ + NeType: s.alarm.NeType, + NeId: s.alarm.NeId, + AlarmSeq: lastSeq + 1, + AlarmId: s.alarm.AlarmId, + AlarmTitle: s.alarm.AlarmTitle, + AlarmCode: s.alarm.AlarmCode, + EventTime: s.alarm.EventTime, + ObjectUid: s.alarm.ObjectUid, + ObjectName: s.alarm.ObjectName, + ObjectType: s.alarm.ObjectType, + LocationInfo: s.alarm.LocationInfo, + AlarmStatus: s.alarm.AlarmStatus, + SpecificProblem: s.alarm.SpecificProblem, + SpecificProblemId: s.alarm.SpecificProblemId, + AddInfo: s.alarm.AddInfo, + } + insertId := s.alarmEventService.Insert(alarmEvent) + if insertId > 0 { + alarmEvent.ID = insertId + // 网元重启后,清除活动告警 + if s.alarm.AlarmCode == constants.ALARM_EVENT_REBOOT { + rows := s.alarmService.Find(neDataModel.Alarm{ + NeType: s.alarm.NeType, + NeId: s.alarm.NeId, + AlarmStatus: oam.ALARM_STATUS_ACTIVE, + }) + ids := make([]int64, 0) + for _, v := range rows { + ids = append(ids, v.ID) + } + s.alarmService.ClearByIds(ids, s.alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) + } + // 网元重启后,有跟踪任务的需要重新补发启动任务 + if s.alarm.AlarmCode == constants.ALARM_EVENT_REBOOT { + traceService.NewTraceTask.RunUnstopped(s.alarm.NeType, s.alarm.NeId) + } + return nil + } + return fmt.Errorf("event add fail") +} + +// clearEvent 清除告警事件 +func (s *Alarm) clearEvent() error { + alarmEventService := neDataService.NewAlarmEvent + // 检查网元告警ID是否唯一 + alarmIdArr := alarmEventService.Find(neDataModel.AlarmEvent{ + NeType: s.alarm.NeType, + NeId: s.alarm.NeId, + AlarmId: s.alarm.AlarmId, + }) + if len(alarmIdArr) != 1 { + return fmt.Errorf("event not exists alarmId:%s", s.alarm.AlarmId) + } + + // 告警清除 + rows, _ := s.alarmEventService.ClearByIds([]int64{alarmIdArr[0].ID}, s.alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) + if rows > 0 { + return nil + } + return fmt.Errorf("event clear fail alarmId:%s", s.alarm.AlarmId) +} + +// notify 通知 +func (s *Alarm) notify(neIp string) { + // 邮箱 + emailEnable := parse.Boolean(config.Get("notification.email.enable")) + if emailEnable { + emailList := fmt.Sprint(config.Get("notification.email.emailList")) + emailResult := "Sent Successfully!" + emailErr := notificationService.EmailAlarm(s.alarm, neIp) + if emailErr != nil { + emailResult = emailErr.Error() + } + s.notifyLog("EMAIL", emailList, emailResult) + } + + // 短信 + smscEnable := parse.Boolean(config.Get("notification.smsc.enable")) + if smscEnable { + mobileList := fmt.Sprint(config.Get("notification.smsc.mobileList")) + smscResult := "Sent Successfully!" + smscErr := notificationService.SMSCAlarm(s.alarm, neIp) + if smscErr != nil { + smscResult = smscErr.Error() + } + s.notifyLog("SMSC", mobileList, smscResult) + } +} + +// notifyLog 通知日志 +func (s *Alarm) notifyLog(forwardBy, toUser, result string) error { + alarmForwardLog := neDataModel.AlarmForwardLog{ + NeType: s.alarm.NeType, + NeId: s.alarm.NeId, + AlarmSeq: s.alarm.AlarmSeq, + AlarmId: s.alarm.AlarmId, + AlarmTitle: s.alarm.AlarmTitle, + AlarmCode: s.alarm.AlarmCode, + AlarmStatus: s.alarm.AlarmStatus, + AlarmType: s.alarm.AlarmType, + OrigSeverity: s.alarm.OrigSeverity, + EventTime: s.alarm.EventTime, + Type: forwardBy, + Target: toUser, + Result: result, + } + // 记录日志 + insertId := s.alarmForwardLogService.Insert(alarmForwardLog) + if insertId <= 0 { + return fmt.Errorf("notify alarm log fail") + } + return nil +} diff --git a/src/modules/oam/service/cbs_state.go b/src/modules/oam/service/cbs_state.go new file mode 100644 index 00000000..3b898621 --- /dev/null +++ b/src/modules/oam/service/cbs_state.go @@ -0,0 +1,29 @@ +package service + +import ( + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" +) + +// 实例化服务层 CDR 结构体 +var NewCBS = &CBS{ + neInfoService: neService.NewNeInfo, + cbcMessageService: neDataService.NewCBCMessage, +} + +// CDR 消息处理 +type CBS struct { + neInfoService *neService.NeInfo + cbcMessageService *neDataService.CBCMessage // CDR会话事件服务 +} + +type CBSEventData struct { + EventName string `json:"eventName"` // 事件名称 + MessageId int64 `json:"messageId"` // 消息ID + Detail string `json:"detail"` // 详情 +} + +// Resolve 接收处理 +func (s *CBS) Resolve(c CBSEventData) error { + return s.cbcMessageService.UpdateDetail(c.EventName, c.Detail) +} diff --git a/src/modules/oam/service/cdr.go b/src/modules/oam/service/cdr.go new file mode 100644 index 00000000..8b1e2427 --- /dev/null +++ b/src/modules/oam/service/cdr.go @@ -0,0 +1,71 @@ +package service + +import ( + "encoding/json" + "fmt" + + "github.com/tsmask/go-oam" + + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + wsService "be.ems/src/modules/ws/service" +) + +// 实例化服务层 CDR 结构体 +var NewCDR = &CDR{ + neInfoService: neService.NewNeInfo, + wsService: wsService.NewWSSend, + cdrEventService: neDataService.NewCDREvent, +} + +// CDR 消息处理 +type CDR struct { + neInfoService *neService.NeInfo + wsService *wsService.WSSend + cdrEventService *neDataService.CDREvent // CDR会话事件服务 +} + +// Resolve 接收处理 +func (s *CDR) Resolve(c oam.CDR) error { + if c.Data == nil { + return fmt.Errorf("cdr data is nil") + } + // 是否存在网元 + neInfo := s.neInfoService.FindByRmuid(c.NeUid) + if neInfo.NeType == "" || neInfo.RmUID != c.NeUid { + return fmt.Errorf("resolve cdr network element does not exist %s", c.NeUid) + } + + cdrByte, _ := json.Marshal(c.Data) + cdrEvent := neDataModel.CDREvent{ + NeType: neInfo.NeType, + NeName: neInfo.NeName, + RmUid: neInfo.RmUID, + Timestamp: c.RecordTime, + CdrJson: string(cdrByte), + CreatedAt: c.RecordTime, + } + insertId := s.cdrEventService.Insert(cdrEvent) + if insertId <= 0 { + return fmt.Errorf("add cdr data fail") + } + cdrEvent.ID = insertId + + // 推送到ws订阅组 + switch neInfo.NeType { + case "IMS": + dataMap := c.Data.(map[string]any) + v, ok := dataMap["recordType"] + if ok && (v == "MOC" || v == "MTSM") { + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_IMS_CDR, neInfo.NeId), cdrEvent) + } + case "SMF": + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMF_CDR, neInfo.NeId), cdrEvent) + case "SMSC": + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMSC_CDR, neInfo.NeId), cdrEvent) + case "SGWC": + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SGWC_CDR, neInfo.NeId), cdrEvent) + } + return nil +} diff --git a/src/modules/oam/service/kpi.go b/src/modules/oam/service/kpi.go new file mode 100644 index 00000000..c9f567bb --- /dev/null +++ b/src/modules/oam/service/kpi.go @@ -0,0 +1,241 @@ +package service + +import ( + "encoding/json" + "fmt" + "math" + "time" + + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/expr" + "be.ems/src/framework/utils/parse" + "github.com/tsmask/go-oam" + + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" + wsService "be.ems/src/modules/ws/service" +) + +// 实例化服务层 KPI 结构体 +var NewKPI = &KPI{ + neInfoService: neService.NewNeInfo, + wsService: wsService.NewWSSend, + kpiReportService: neDataService.NewKpiReport, + kpiCReportService: neDataService.NewKpiCReport, +} + +// KPI 消息处理 +type KPI struct { + neInfoService *neService.NeInfo + wsService *wsService.WSSend + kpiReportService *neDataService.KpiReport + kpiCReportService *neDataService.KpiCReport +} + +// Resolve 接收处理 +func (s *KPI) Resolve(k oam.KPI) error { + if len(k.Data) == 0 { + return fmt.Errorf("kpi data is nil") + } + // 是否存在网元 + neInfo := s.neInfoService.FindByRmuid(k.NeUid) + if neInfo.NeType == "" || neInfo.RmUID != k.NeUid { + return fmt.Errorf("resolve kpi network element does not exist %s", k.NeUid) + } + + // 时间片 + curTime := time.Now() + curSeconds := curTime.Hour()*3600 + curTime.Minute()*60 + curTime.Second() + index := int64(curSeconds) / k.Granularity + + if err := s.saveKPIData(neInfo, k, index); err != nil { + return err + } + if err := s.saveKPIDataC(neInfo, k, index); err != nil { + return err + } + return nil +} + +// saveKPIData 存储KPI数据并推送到ws订阅组 +func (s KPI) saveKPIData(neInfo neModel.NeInfo, k oam.KPI, index int64) error { + // 时间数据处理 + recordTime := time.Now() + if k.RecordTime > 1e12 { + recordTime = time.UnixMilli(k.RecordTime) + } else if k.RecordTime > 1e9 { + recordTime = time.Unix(k.RecordTime, 0) + } + recordDate := date.ParseDateToStr(recordTime, "2006-01-02") + recordEndTime := date.ParseDateToStr(recordTime, "15:04:05") + startTime := recordTime.Add(-time.Duration(k.Granularity) * time.Second) + recordStartTime := date.ParseDateToStr(startTime, "15:04:05") + + // kpi data数据json + kpiTitles := s.kpiReportService.FindTitle(neInfo.NeType) + KpiValues := make([]map[string]any, 0) + for _, kt := range kpiTitles { + item := map[string]any{ + "kpiId": kt.KpiId, + "value": 0, + "err": "", + } + // 匹配指标记录 + for k, v := range k.Data { + if k == kt.KpiId { + item["value"] = v + } + } + KpiValues = append(KpiValues, item) + } + + KpiValuesByte, err := json.Marshal(KpiValues) + if err != nil { + return err + } + + // KPI 信息 + kpiData := neDataModel.KpiReport{ + NeType: neInfo.NeType, + NeName: neInfo.NeName, + RmUid: neInfo.RmUID, + Date: recordDate, + StartTime: recordStartTime, + EndTime: recordEndTime, + Index: index, + Granularity: k.Granularity, + KpiValues: string(KpiValuesByte), + CreatedAt: k.RecordTime, + } + insertId := s.kpiReportService.Insert(kpiData) + if insertId <= 0 { + return fmt.Errorf("add kpi data fail") + } + kpiData.ID = insertId + + // 指标事件对象 + data := map[string]any{ + "neType": kpiData.NeType, + "neName": kpiData.NeName, + "rmUID": kpiData.RmUid, + "startIndex": kpiData.Index, + "timeGroup": kpiData.CreatedAt, + // kip_id ... + } + for _, v := range KpiValues { + data[fmt.Sprint(v["kpiId"])] = v["value"] + } + + // 推送到ws订阅组 + s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), data) + // 更新UPF总流量 + if neInfo.NeType == "UPF" { + upValue := parse.Number(data["UPF.03"]) + downValue := parse.Number(data["UPF.06"]) + s.kpiReportService.UPFTodayFlowUpdate(neInfo.RmUID, upValue, downValue) + } + return nil +} + +// saveKPIDataC 存储自定义KPI数据并推送到ws订阅组 +func (s KPI) saveKPIDataC(neInfo neModel.NeInfo, k oam.KPI, index int64) error { + // 时间数据处理 + recordTime := time.Now() + if k.RecordTime > 1e12 { + recordTime = time.UnixMilli(k.RecordTime) + } else if k.RecordTime > 1e9 { + recordTime = time.Unix(k.RecordTime, 0) + } + recordDate := date.ParseDateToStr(recordTime, "2006-01-02") + recordEndTime := date.ParseDateToStr(recordTime, "15:04:05") + startTime := recordTime.Add(-time.Duration(k.Granularity) * time.Second) + recordStartTime := date.ParseDateToStr(startTime, "15:04:05") + + // kpi data数据json + kpiCTitles := s.kpiCReportService.FindTitle(neInfo.NeType) + KpiValues := make([]map[string]any, 0) + // 自定义指标的表达式环境变量 + KpiExprEnv := make(map[string]any, 0) + for k, v := range k.Data { + KpiExprEnv[k] = v + } + // 自定义指标的计算 + for _, v := range kpiCTitles { + item := map[string]any{ + "kpiId": v.KpiId, + "value": 0, + "err": "", + } + + // 匹配指标记录 + if envValue, envOk := KpiExprEnv[v.KpiId]; envOk { + item["value"] = envValue + } + + // 计算结果 + exprStr, exprEnv := expr.ParseExprEnv(v.Expression, KpiExprEnv) + result, err := expr.Eval(exprStr, exprEnv) + if err != nil { + item["value"] = 0 + item["err"] = err.Error() + } else { + if v.Unit == "%" { + resultV, ok := result.(float64) + if !ok || math.IsNaN(resultV) { + resultV = 0 + } + if resultV > 100 { + result = 100 + } + if resultV <= 0 { + result = 0 + } + } + + item["value"] = result + } + KpiValues = append(KpiValues, item) + } + KpiValuesByte, err := json.Marshal(KpiValues) + if err != nil { + return err + } + + // KPI 信息 + kpiCData := neDataModel.KpiCReport{ + NeType: neInfo.NeType, + NeName: neInfo.NeName, + RmUid: neInfo.RmUID, + Date: recordDate, + StartTime: recordStartTime, + EndTime: recordEndTime, + Index: index, + Granularity: k.Granularity, + KpiValues: string(KpiValuesByte), + CreatedAt: k.RecordTime, + } + insertId := s.kpiCReportService.Insert(kpiCData) + if insertId <= 0 { + return fmt.Errorf("add kpic data fail") + } + kpiCData.ID = insertId + + // 指标事件对象 + data := map[string]any{ + "neType": kpiCData.NeType, + "neName": kpiCData.NeName, + "rmUID": kpiCData.RmUid, + "startIndex": kpiCData.Index, + "timeGroup": kpiCData.CreatedAt, + // kip_id ... + } + for _, v := range KpiValues { + data[fmt.Sprint(v["kpiId"])] = v["value"] + } + + // 推送到ws订阅组 + s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), data) + return nil +} diff --git a/src/modules/oam/service/nb_state.go b/src/modules/oam/service/nb_state.go new file mode 100644 index 00000000..3f85a49f --- /dev/null +++ b/src/modules/oam/service/nb_state.go @@ -0,0 +1,65 @@ +package service + +import ( + "fmt" + "time" + + "be.ems/src/framework/utils/date" + "github.com/tsmask/go-oam" + + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + wsService "be.ems/src/modules/ws/service" +) + +// 实例化服务层 NBState 结构体 +var NewNBState = &NBState{ + neInfoService: neService.NewNeInfo, + wsService: wsService.NewWSSend, + nbStateService: neDataService.NewNBState, +} + +// NBState 消息处理 +type NBState struct { + neInfoService *neService.NeInfo + wsService *wsService.WSSend + nbStateService *neDataService.NBState +} + +// Resolve 接收处理 +func (s *NBState) Resolve(n oam.NBState) error { + // 是否存在网元 + neInfo := s.neInfoService.FindByRmuid(n.NeUid) + if neInfo.NeType == "" || neInfo.RmUID != n.NeUid { + return fmt.Errorf("resolve nb_state network element does not exist %s", n.NeUid) + } + + nbState := neDataModel.NBState{ + NeType: neInfo.NeType, + NeId: neInfo.NeId, + RmUid: neInfo.RmUID, + Address: n.Address, + Name: n.Name, + Position: n.Position, + NbName: n.DeviceName, + State: n.State, + Time: date.ParseDateToStr(n.StateTime, time.RFC3339), + } + insertId := s.nbStateService.Insert(nbState) + if insertId <= 0 { + return fmt.Errorf("add nb_state data fail") + } + nbState.ID = insertId + + // 推送到ws订阅组 + switch neInfo.NeType { + case "AMF": + s.wsService.ByGroupID(wsService.GROUP_AMF_NB, nbState) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_AMF_NB, neInfo.NeId), nbState) + case "MME": + s.wsService.ByGroupID(wsService.GROUP_MME_NB, nbState) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_MME_NB, neInfo.NeId), nbState) + } + return nil +} diff --git a/src/modules/oam/service/ue_nb.go b/src/modules/oam/service/ue_nb.go new file mode 100644 index 00000000..55904013 --- /dev/null +++ b/src/modules/oam/service/ue_nb.go @@ -0,0 +1,62 @@ +package service + +import ( + "encoding/json" + "fmt" + + "github.com/tsmask/go-oam" + + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + wsService "be.ems/src/modules/ws/service" +) + +// 实例化服务层 UENB 结构体 +var NewUENB = &UENB{ + neInfoService: neService.NewNeInfo, + wsService: wsService.NewWSSend, + ueEventService: neDataService.NewUEEvent, +} + +// UENB 消息处理 +type UENB struct { + neInfoService *neService.NeInfo + wsService *wsService.WSSend + ueEventService *neDataService.UEEvent // UE会话事件服务 +} + +// Resolve 接收处理 +func (s *UENB) Resolve(u oam.UENB) error { + // 是否存在网元 + neInfo := s.neInfoService.FindByRmuid(u.NeUid) + if neInfo.NeType == "" || neInfo.RmUID != u.NeUid { + return fmt.Errorf("resolve ue_nb network element does not exist %s", u.NeUid) + } + + uenbByte, _ := json.Marshal(u) + uenbEvent := neDataModel.UEEvent{ + NeType: neInfo.NeType, + NeName: neInfo.NeName, + RmUID: neInfo.RmUID, + Timestamp: u.RecordTime, + EventType: u.Type, + EventJSONStr: string(uenbByte), + } + insertId := s.ueEventService.Insert(uenbEvent) + if insertId <= 0 { + return fmt.Errorf("add ue_nb data fail") + } + uenbEvent.ID = insertId + + // 推送到ws订阅组 + switch neInfo.NeType { + case "AMF": + s.wsService.ByGroupID(wsService.GROUP_AMF_UE, uenbEvent) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_AMF_UE, neInfo.NeId), uenbEvent) + case "MME": + s.wsService.ByGroupID(wsService.GROUP_MME_UE, uenbEvent) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_MME_UE, neInfo.NeId), uenbEvent) + } + return nil +} diff --git a/src/modules/oauth2/model/code_query.go b/src/modules/oauth2/model/code_query.go deleted file mode 100644 index 9c32a195..00000000 --- a/src/modules/oauth2/model/code_query.go +++ /dev/null @@ -1,8 +0,0 @@ -package model - -// CodeQuery 重定向授权码参数 -type CodeQuery struct { - RedirectUrl string `form:"redirectUrl" binding:"required"` // 授权回调地址 - ClientId string `form:"clientId" binding:"required"` // 申请得到的客户端ID - State string `form:"state" binding:"required"` // 随机字符串,认证服务器会原封不动地返回这个值 -} diff --git a/src/modules/oauth2/oauth2.go b/src/modules/oauth2/oauth2.go deleted file mode 100644 index 7cc1cbac..00000000 --- a/src/modules/oauth2/oauth2.go +++ /dev/null @@ -1,74 +0,0 @@ -package oauth2 - -import ( - "github.com/gin-gonic/gin" - - "be.ems/src/framework/logger" - "be.ems/src/framework/middleware" - "be.ems/src/modules/oauth2/controller" -) - -// Setup 模块路由注册 -func Setup(router *gin.Engine) { - logger.Infof("开始加载 ====> oauth2 模块路由") - - // 客户端授权管理 - oauth2ClientGroup := router.Group("/oauth2/client") - { - oauth2ClientGroup.GET("/list", - middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), - controller.NewOauth2Client.List, - ) - oauth2ClientGroup.GET("/:clientId", - middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), - controller.NewOauth2Client.Info, - ) - oauth2ClientGroup.POST("", - middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), - middleware.OperateLog(middleware.OptionNew("log.operate.title.oauth2client", middleware.BUSINESS_TYPE_INSERT)), - controller.NewOauth2Client.Add, - ) - oauth2ClientGroup.PUT("", - middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), - middleware.OperateLog(middleware.OptionNew("log.operate.title.oauth2client", middleware.BUSINESS_TYPE_UPDATE)), - controller.NewOauth2Client.Edit, - ) - oauth2ClientGroup.DELETE("/:id", - middleware.AuthorizeUser(map[string][]string{"matchRoles": {"admin"}}), - middleware.OperateLog(middleware.OptionNew("log.operate.title.oauth2client", middleware.BUSINESS_TYPE_DELETE)), - controller.NewOauth2Client.Remove, - ) - } - - // 授权认证 - oauth2Group := router.Group("/oauth2") - { - oauth2Group.GET("/authorize", - middleware.RateLimit(middleware.LimitOption{ - Time: 60, - Count: 30, - Type: middleware.LIMIT_IP, - }), - controller.NewOauth2.Authorize, - ) - oauth2Group.POST("/token", - middleware.RateLimit(middleware.LimitOption{ - Time: 180, - Count: 15, - Type: middleware.LIMIT_IP, - }), - controller.NewOauth2.Token, - ) - oauth2Group.POST("/refresh-token", - middleware.RateLimit(middleware.LimitOption{ - Time: 60, - Count: 5, - Type: middleware.LIMIT_IP, - }), - controller.NewOauth2.RefreshToken, - ) - } - - // ==== 授权认证的开放接口 ==== - openAPI(router) -} diff --git a/src/modules/system/controller/sys_login_source.go b/src/modules/system/controller/sys_login_source.go new file mode 100644 index 00000000..2349af9b --- /dev/null +++ b/src/modules/system/controller/sys_login_source.go @@ -0,0 +1,163 @@ +package controller + +import ( + "encoding/json" + "fmt" + + "github.com/gin-gonic/gin" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" +) + +// NewLoginSource 实例化控制层 +var NewSysLoginSource = &SysLoginSourceController{ + sysLoginSourceService: service.NewSysLoginSource, +} + +// SysLoginSourceController 认证源管理 控制层处理 +// +// PATH /sys/login-source +type SysLoginSourceController struct { + sysLoginSourceService *service.SysLoginSource // 认证源信息服务 +} + +// List 列表 +// +// GET /list +func (s SysLoginSourceController) List(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.sysLoginSourceService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) +} + +// Info 信息 +// +// GET /:id +func (s SysLoginSourceController) Info(c *gin.Context) { + id := c.Param("id") + if id == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty")) + return + } + + info := s.sysLoginSourceService.FindById(parse.Number(id)) + if info.Id == parse.Number(id) { + c.JSON(200, resp.OkData(info)) + return + } + c.JSON(200, resp.ErrMsg("id does not exist")) +} + +// Add 新增 +// +// POST / +func (s SysLoginSourceController) Add(c *gin.Context) { + var body model.SysLoginSource + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + if body.Id > 0 { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id not is empty")) + return + } + if len(body.Config) < 7 || !json.Valid([]byte(body.Config)) { + c.JSON(200, resp.ErrMsg("config json format error")) + return + } + configStr, err := s.sysLoginSourceService.CheckConfigJSON(body.Type, body.Config) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + body.Config = configStr + + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysLoginSourceService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) + return + } + c.JSON(200, resp.Err(nil)) +} + +// Edit 更新 +// +// PUT / +func (s SysLoginSourceController) Edit(c *gin.Context) { + var body model.SysLoginSource + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + if body.Id <= 0 { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty")) + return + } + if len(body.Config) < 7 || !json.Valid([]byte(body.Config)) { + c.JSON(200, resp.ErrMsg("config json format error")) + return + } + configStr, err := s.sysLoginSourceService.CheckConfigJSON(body.Type, body.Config) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + body.Config = configStr + + // 查询信息 + info := s.sysLoginSourceService.FindById(body.Id) + if info.Id != body.Id { + c.JSON(200, resp.ErrMsg("modification failed, data not exist")) + return + } + + info.Type = body.Type + info.Name = body.Name + info.Icon = body.Icon + info.Config = body.Config + info.ActiveFlag = body.ActiveFlag + info.Remark = body.Remark + info.UpdateBy = reqctx.LoginUserToUserName(c) + rowsAffected := s.sysLoginSourceService.Update(info) + if rowsAffected > 0 { + c.JSON(200, resp.Ok(nil)) + return + } + c.JSON(200, resp.Err(nil)) +} + +// Remove 删除 +// +// DELETE /:id +func (s SysLoginSourceController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty")) + return + } + + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) + } + + rows, err := s.sysLoginSourceService.DeleteByIds(ids) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) + c.JSON(200, resp.OkMsg(msg)) +} diff --git a/src/modules/system/controller/sys_profile.go b/src/modules/system/controller/sys_profile.go index 659fcf08..6dfbd9b2 100644 --- a/src/modules/system/controller/sys_profile.go +++ b/src/modules/system/controller/sys_profile.go @@ -290,17 +290,17 @@ func (s *SysProfileController) PasswordForce(c *gin.Context) { return } - // 首次登录 - forcePasswdChange := userInfo.LoginCount <= 2 - // 非首次登录,判断密码是否过期 - if !forcePasswdChange { - alert, _ := s.sysUserService.ValidatePasswordExpireTime(userInfo.PasswordUpdateTime) - forcePasswdChange = alert - } - if !forcePasswdChange { - c.JSON(403, resp.ErrMsg("not matching the amendment")) - return - } + // // 首次登录 + // forcePasswdChange := userInfo.LoginCount <= 2 + // // 非首次登录,判断密码是否过期 + // if !forcePasswdChange { + // alert, _ := s.sysUserService.ValidatePasswordExpireTime(userInfo.PasswordUpdateTime) + // forcePasswdChange = alert + // } + // if !forcePasswdChange { + // c.JSON(403, resp.ErrMsg("not matching the amendment")) + // return + // } // 检查密码是否与历史密码一致 err = s.sysUserService.ValidatePasswordNotAllowedHistory(userInfo.UserId, body.Password) diff --git a/src/modules/system/controller/sys_user.go b/src/modules/system/controller/sys_user.go index 60758dc3..cd63404d 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -186,7 +186,7 @@ func (s *SysUserController) Add(c *gin.Context) { } if !regular.ValidUsername(body.UserName) { // msg := fmt.Sprintf("新增用户【%s】失败,登录账号用户账号只能包含大写小写字母,数字,且不少于4位", body.UserName) - msg := fmt.Sprintf("Add a new user [%s] failed to log in the account user account can only contain upper and lower case letters, numbers, and not less than 4 digits", body.UserName) + msg := fmt.Sprintf("Add a new user [%s] failed to log in the account user account not less than 4 digits", body.UserName) c.JSON(400, resp.ErrMsg(msg)) return } @@ -550,15 +550,19 @@ func (s *SysUserController) Export(c *gin.Context) { "C1": i18n.TKey(language, "user.export.nick"), "D1": i18n.TKey(language, "user.export.role"), "E1": i18n.TKey(language, "user.export.deptName"), - "F1": i18n.TKey(language, "user.export.loginIP"), - "G1": i18n.TKey(language, "user.export.loginDate"), - "H1": i18n.TKey(language, "user.export.status"), + "F1": i18n.TKey(language, "user.export.userType"), + "G1": i18n.TKey(language, "user.export.loginIP"), + "H1": i18n.TKey(language, "user.export.loginDate"), + "I1": i18n.TKey(language, "user.export.status"), // "F1": i18n.TKey(language, "user.export.sex"), // "E1": i18n.TKey(language, "user.export.phone"), // "D1": i18n.TKey(language, "user.export.email"), // "I1": i18n.TKey(language, "user.export.deptID"), // "K1": i18n.TKey(language, "user.export.deptLeader"), } + // 读取用户性别字典数据 + dictSysUserType := service.NewSysDictType.FindDataByType("sys_user_type") + // 读取用户性别字典数据 // dictSysUserSex := s.sysDictDataService.SelectDictDataByType("sys_user_sex") // 从第二行开始的数据 @@ -573,6 +577,14 @@ func (s *SysUserController) Export(c *gin.Context) { // break // } // } + // 用户类型 + userType := row.UserType + for _, v := range dictSysUserType { + if row.UserType == v.DataValue && row.UserSource != "#" { + userType = i18n.TKey(language, v.DataLabel) + " " + row.UserSource + break + } + } // 帐号状态 statusValue := i18n.TKey(language, "dictData.disable") if row.StatusFlag == "1" { @@ -581,7 +593,11 @@ func (s *SysUserController) Export(c *gin.Context) { // 用户角色, 默认导出首个 userRole := "" if len(row.Roles) > 0 { - userRole = i18n.TKey(language, row.Roles[0].RoleName) + arr := make([]string, 0) + for _, v := range row.Roles { + arr = append(arr, i18n.TKey(language, v.RoleName)) + } + userRole = strings.Join(arr, ",") } dataCells = append(dataCells, map[string]any{ "A" + idx: row.UserId, @@ -589,9 +605,10 @@ func (s *SysUserController) Export(c *gin.Context) { "C" + idx: row.NickName, "D" + idx: userRole, "E" + idx: row.Dept.DeptName, - "F" + idx: row.LoginIp, - "G" + idx: date.ParseDateToStr(row.LoginTime, date.YYYY_MM_DDTHH_MM_SSZ), - "H" + idx: statusValue, + "F" + idx: userType, + "G" + idx: row.LoginIp, + "H" + idx: date.ParseDateToStr(row.LoginTime, date.YYYY_MM_DDTHH_MM_SSZ), + "I" + idx: statusValue, // "E" + idx: row.PhoneNumber, // "F" + idx: sysUserSex, // "D" + idx: row.Email, @@ -725,7 +742,7 @@ func (s *SysUserController) Import(c *gin.Context) { } // 验证是否存在这个用户 - newSysUser := s.sysUserService.FindByUserName(row["B"]) + newSysUser := s.sysUserService.FindByUserName(row["B"], "System", "#") newSysUser.Password = initPassword newSysUser.UserName = row["B"] newSysUser.NickName = row["C"] diff --git a/src/modules/system/model/sys_login_source.go b/src/modules/system/model/sys_login_source.go new file mode 100644 index 00000000..6f62dedb --- /dev/null +++ b/src/modules/system/model/sys_login_source.go @@ -0,0 +1,22 @@ +package model + +// SysLoginSource 系统第三方认证源 sys_login_source +type SysLoginSource struct { + Id int64 `gorm:"column:id;primaryKey;autoIncrement" json:"id"` // ID + UID string `gorm:"column:uid" json:"uid"` // UID 16位长度字符串 + Type string `gorm:"column:type" json:"type" binding:"required,oneof=LDAP SMTP OAuth2"` // 认证类型 LDAP SMTP OAuth2 + Name string `gorm:"column:name" json:"name" binding:"required"` // 认证名称 + Icon string `gorm:"column:icon" json:"icon"` // 图标 + ActiveFlag string `gorm:"column:active_flag" json:"activeFlag"` // 激活标记(0未激活 1激活) + SyncFlag string `gorm:"column:sync_flag" json:"syncFlag"` // 同步标记(0未同步 1同步) + Config string `gorm:"column:config" json:"config" binding:"required"` // 配置JSON字符串 + CreateBy string `gorm:"column:create_by" json:"createBy"` // 创建者 + CreateTime int64 `gorm:"column:create_time" json:"createTime"` // 创建时间 + UpdateBy string `gorm:"column:update_by" json:"updateBy"` // 更新者 + UpdateTime int64 `gorm:"column:update_time" json:"updateTime"` // 更新时间 + Remark string `gorm:"column:remark" json:"remark"` // 备注 +} + +func (*SysLoginSource) TableName() string { + return "sys_login_source" +} diff --git a/src/modules/system/model/sys_user.go b/src/modules/system/model/sys_user.go index e2594b0f..e90b66a3 100644 --- a/src/modules/system/model/sys_user.go +++ b/src/modules/system/model/sys_user.go @@ -11,6 +11,8 @@ type SysUser struct { Sex string `json:"sex" gorm:"column:sex"` // 用户性别(0未选择 1男 2女) Avatar string `json:"avatar" gorm:"column:avatar"` // 头像地址 Password string `json:"-" gorm:"column:password"` // 密码 + UserType string `json:"userType" gorm:"column:user_type"` // 用户类型(System系统用户) + UserSource string `json:"userSource" gorm:"column:user_source"` // 用户来源UID (系统#)) StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 账号状态(0停用 1正常) DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) PasswordUpdateTime int64 `json:"passwordUpdateTime" gorm:"column:password_update_time"` // 密码更新时间 diff --git a/src/modules/system/model/vo/login_source.go b/src/modules/system/model/vo/login_source.go new file mode 100644 index 00000000..5f401d6e --- /dev/null +++ b/src/modules/system/model/vo/login_source.go @@ -0,0 +1,28 @@ +package vo + +// SysLoginSourceLDAP LDAP认证源 +type SysLoginSourceLDAP struct { + URL string `json:"url"` // LDAP 服务器(ldap://192.168.9.58:11389) + BaseDN string `json:"baseDN"` // base DN(dc=example,dc=org) + UserFilter string `json:"userFilter"` // 用户过滤规则((&(objectClass=organizationalPerson)(uid=%s))) + BindDN string `json:"bindDN"` // 绑定 DN(cn=admin,dc=example,dc=org) + BindPassword string `json:"bindPassword"` // 绑定密码(adminpassword) +} + +// SysLoginSourceSMTP SMTP认证源 +type SysLoginSourceSMTP struct { + Host string `json:"host"` // SMTP 服务器(smtp.gmail.com) + Port int `json:"port"` // SMTP 端口(587) +} + +// SysLoginSourceOAuth2 OAuth2认证源 +type SysLoginSourceOAuth2 struct { + ClientID string `json:"clientID"` // 客户端ID + ClientSecret string `json:"clientSecret"` // 客户端密钥 + AuthURL string `json:"authURL"` // 认证URL + TokenURL string `json:"tokenURL"` // 令牌URL + Scopes []string `json:"scopes"` // 授权范围 + RedirectURL string `json:"redirectURL"` // 重定向URL + UserURL string `json:"userURL"` // 用户信息URL + AccountField string `json:"accountField"` // 账号字段从用户信息中获取 +} diff --git a/src/modules/system/repository/sys_login_source.go b/src/modules/system/repository/sys_login_source.go new file mode 100644 index 00000000..3bde7b91 --- /dev/null +++ b/src/modules/system/repository/sys_login_source.go @@ -0,0 +1,164 @@ +package repository + +import ( + "fmt" + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) + +// NewSysLoginSource 实例化数据层 +var NewSysLoginSource = &SysLoginSource{} + +// SysLoginSource 认证源数据层处理 +type SysLoginSource struct{} + +// SelectByPage 分页查询集合 +func (r SysLoginSource) SelectByPage(query map[string]string) ([]model.SysLoginSource, int64) { + tx := db.DB("").Model(&model.SysLoginSource{}) + // 查询条件拼接 + if v, ok := query["name"]; ok && v != "" { + tx = tx.Where("name like ?", v+"%") + } + if v, ok := query["type"]; ok && v != "" { + tx = tx.Where("type = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + } + tx = tx.Where("create_time >= ?", v) + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + } + tx = tx.Where("create_time <= ?", v) + } + + // 查询结果 + var total int64 = 0 + rows := []model.SysLoginSource{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } + + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error + if err != nil { + return rows, total + } + return rows, total +} + +// Select 查询集合 +func (r SysLoginSource) Select(param model.SysLoginSource) []model.SysLoginSource { + tx := db.DB("").Model(&model.SysLoginSource{}) + // 查询条件拼接 + if param.UID != "" { + tx = tx.Where("uid = ?", param.UID) + } + if param.Type != "" { + tx = tx.Where("type = ?", param.Type) + } + if param.Name != "" { + tx = tx.Where("name = ?", param.Name) + } + if param.ActiveFlag != "" { + tx = tx.Where("active_flag = ?", param.ActiveFlag) + } + + // 查询数据 + rows := []model.SysLoginSource{} + if err := tx.Find(&rows).Error; err != nil { + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysLoginSource) SelectByIds(ids []int64) []model.SysLoginSource { + rows := []model.SysLoginSource{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysLoginSource{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r SysLoginSource) Insert(param model.SysLoginSource) int64 { + if param.CreateBy != "" { + ms := time.Now().UnixMilli() + param.UpdateBy = param.CreateBy + param.UpdateTime = ms + param.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.Id +} + +// Update 修改信息 返回受影响行数 +func (r SysLoginSource) Update(param model.SysLoginSource) int64 { + if param.Id <= 0 { + return 0 + } + if param.UpdateBy != "" { + param.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysLoginSource{}) + // 构建查询条件 + tx = tx.Where("id = ?", param.Id) + tx = tx.Omit("id", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(param).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 返回受影响行数 +func (r SysLoginSource) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + // 执行删除 + if err := tx.Delete(&model.SysLoginSource{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByUserSource 通过用户源删除用户 返回受影响行数 +func (r SysLoginSource) DeleteByUserSource(uid string) int64 { + if uid == "" || uid == "#" { + return 0 + } + tx := db.DB("").Where("user_source = ?", uid) + // 执行删除 + if err := tx.Delete(&model.SysUser{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} diff --git a/src/modules/system/repository/sys_menu.go b/src/modules/system/repository/sys_menu.go index 3b84a319..146655dc 100644 --- a/src/modules/system/repository/sys_menu.go +++ b/src/modules/system/repository/sys_menu.go @@ -83,14 +83,15 @@ func (r SysMenu) Insert(sysMenu model.SysMenu) int64 { } // 根据菜单类型重置参数 - if sysMenu.MenuType == constants.MENU_TYPE_BUTTON { + switch sysMenu.MenuType { + case constants.MENU_TYPE_BUTTON: sysMenu.Component = "" sysMenu.FrameFlag = "1" sysMenu.CacheFlag = "1" sysMenu.VisibleFlag = "1" sysMenu.MenuPath = "" sysMenu.Icon = "#" - } else if sysMenu.MenuType == constants.MENU_TYPE_DIR { + case constants.MENU_TYPE_DIR: sysMenu.Component = "" sysMenu.FrameFlag = "1" sysMenu.CacheFlag = "1" @@ -118,14 +119,15 @@ func (r SysMenu) Update(sysMenu model.SysMenu) int64 { } // 根据菜单类型重置参数 - if sysMenu.MenuType == constants.MENU_TYPE_BUTTON { + switch sysMenu.MenuType { + case constants.MENU_TYPE_BUTTON: sysMenu.Component = "" sysMenu.FrameFlag = "1" sysMenu.CacheFlag = "1" sysMenu.VisibleFlag = "1" sysMenu.MenuPath = "" sysMenu.Icon = "#" - } else if sysMenu.MenuType == constants.MENU_TYPE_DIR { + case constants.MENU_TYPE_DIR: sysMenu.Component = "" sysMenu.FrameFlag = "1" sysMenu.CacheFlag = "1" diff --git a/src/modules/system/repository/sys_user.go b/src/modules/system/repository/sys_user.go index 987e28ae..962df1b2 100644 --- a/src/modules/system/repository/sys_user.go +++ b/src/modules/system/repository/sys_user.go @@ -31,6 +31,12 @@ func (r SysUser) SelectByPage(query map[string]string, dataScopeSQL string) ([]m if v, ok := query["phone"]; ok && v != "" { tx = tx.Where("phone like ?", fmt.Sprintf("%s%%", v)) } + if v, ok := query["userType"]; ok && v != "" { + tx = tx.Where("user_type = ?", v) + } + if v, ok := query["userSource"]; ok && v != "" { + tx = tx.Where("user_source = ?", v) + } if v, ok := query["statusFlag"]; ok && v != "" { tx = tx.Where("status_flag = ?", v) } @@ -198,6 +204,12 @@ func (r SysUser) CheckUnique(sysUser model.SysUser) int64 { if sysUser.Email != "" { tx = tx.Where("email = ?", sysUser.Email) } + if sysUser.UserType != "" { + tx = tx.Where("user_type = ?", sysUser.UserType) + } + if sysUser.UserSource != "" { + tx = tx.Where("user_source = ?", sysUser.UserSource) + } // 查询数据 var id int64 = 0 @@ -209,14 +221,20 @@ func (r SysUser) CheckUnique(sysUser model.SysUser) int64 { } // SelectByUserName 通过登录账号查询信息 -func (r SysUser) SelectByUserName(userName string) model.SysUser { +func (r SysUser) SelectByUserName(userName, userType, userSource string) model.SysUser { item := model.SysUser{} if userName == "" { return item } + if userType == "" { + userType = "System" + } + if userSource == "" { + userSource = "#" + } tx := db.DB("").Model(&model.SysUser{}) // 构建查询条件 - tx = tx.Where("user_name = ? and del_flag = '0'", userName) + tx = tx.Where("user_name = ? and user_type = ? and user_source = ? and del_flag = '0'", userName, userType, userSource) // 查询数据 if err := tx.Limit(1).Find(&item).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) diff --git a/src/modules/system/service/sys_login_source.go b/src/modules/system/service/sys_login_source.go new file mode 100644 index 00000000..61a28a4e --- /dev/null +++ b/src/modules/system/service/sys_login_source.go @@ -0,0 +1,98 @@ +package service + +import ( + "encoding/json" + "fmt" + + "be.ems/src/framework/utils/generate" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/model/vo" + "be.ems/src/modules/system/repository" +) + +// NewSysLoginSource 实例化服务层 +var NewSysLoginSource = &SysLoginSource{ + sysLoginSourceRepository: repository.NewSysLoginSource, +} + +// SysLoginSource 认证源 服务层处理 +type SysLoginSource struct { + sysLoginSourceRepository *repository.SysLoginSource // 认证源表 +} + +// FindByPage 分页查询 +func (s SysLoginSource) FindByPage(query map[string]string) ([]model.SysLoginSource, int64) { + return s.sysLoginSourceRepository.SelectByPage(query) +} + +// FindById 查询ID +func (s SysLoginSource) FindById(id int64) model.SysLoginSource { + rows := s.sysLoginSourceRepository.SelectByIds([]int64{id}) + if len(rows) > 0 { + return rows[0] + } + return model.SysLoginSource{} +} + +// Insert 新增 +func (s SysLoginSource) Insert(param model.SysLoginSource) int64 { + param.UID = generate.Code(8) + return s.sysLoginSourceRepository.Insert(param) +} + +// Update 更新 +func (s SysLoginSource) Update(param model.SysLoginSource) int64 { + return s.sysLoginSourceRepository.Update(param) +} + +// DeleteByIds 批量删除 +func (s SysLoginSource) DeleteByIds(ids []int64) (int64, error) { + // 检查是否存在 + arr := s.sysLoginSourceRepository.SelectByIds(ids) + if len(arr) <= 0 { + // return 0, fmt.Errorf("没有权限访问认证源数据!") + return 0, fmt.Errorf("no permission to access authentication source data") + } + if len(arr) == len(ids) { + for _, v := range arr { + s.sysLoginSourceRepository.DeleteByUserSource(v.UID) + } + return s.sysLoginSourceRepository.DeleteByIds(ids), nil + } + // return 0, fmt.Errorf("删除认证源信息失败!") + return 0, fmt.Errorf("failed to delete authentication source information") +} + +// FindByActive 查询激活 +func (s SysLoginSource) FindByActive(uid string) []model.SysLoginSource { + param := model.SysLoginSource{ + ActiveFlag: "1", + } + if uid != "" { + param.UID = uid + } + return s.sysLoginSourceRepository.Select(param) +} + +// CheckConfigJSON 检查配置JSON +func (s SysLoginSource) CheckConfigJSON(sType, sConfig string) (string, error) { + var source any + switch sType { + case "LDAP": + source = new(vo.SysLoginSourceLDAP) + case "SMTP": + source = new(vo.SysLoginSourceSMTP) + case "OAuth2": + source = new(vo.SysLoginSourceOAuth2) + default: + return "", fmt.Errorf("unsupported login source type: %s", sType) + } + if err := json.Unmarshal([]byte(sConfig), &source); err != nil { + return "", fmt.Errorf("config json format error for %s type: %s", sType, err.Error()) + } + configByte, err := json.Marshal(source) + if err != nil { + return "", fmt.Errorf("config json format error") + } + return string(configByte), nil +} diff --git a/src/modules/system/service/sys_user.go b/src/modules/system/service/sys_user.go index 1f734149..6cd2b33a 100644 --- a/src/modules/system/service/sys_user.go +++ b/src/modules/system/service/sys_user.go @@ -189,7 +189,9 @@ func (s SysUser) DeleteByIds(userIds []int64) (int64, error) { // CheckUniqueByUserName 检查用户名称是否唯一 func (s SysUser) CheckUniqueByUserName(userName string, userId int64) bool { uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ - UserName: userName, + UserName: userName, + UserType: "System", + UserSource: "#", }) if uniqueId == userId { return true @@ -200,7 +202,9 @@ func (s SysUser) CheckUniqueByUserName(userName string, userId int64) bool { // CheckUniqueByPhone 检查手机号码是否唯一 func (s SysUser) CheckUniqueByPhone(phone string, userId int64) bool { uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ - Phone: phone, + Phone: phone, + UserType: "System", + UserSource: "#", }) if uniqueId == userId { return true @@ -211,7 +215,9 @@ func (s SysUser) CheckUniqueByPhone(phone string, userId int64) bool { // CheckUniqueByEmail 检查Email是否唯一 func (s SysUser) CheckUniqueByEmail(email string, userId int64) bool { uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ - Email: email, + Email: email, + UserType: "System", + UserSource: "#", }) if uniqueId == userId { return true @@ -220,8 +226,10 @@ func (s SysUser) CheckUniqueByEmail(email string, userId int64) bool { } // FindByUserName 通过用户名查询用户信息 -func (s SysUser) FindByUserName(userName string) model.SysUser { - userinfo := s.sysUserRepository.SelectByUserName(userName) +// userType 系统sys +// userSource 系统# +func (s SysUser) FindByUserName(userName, userType, userSource string) model.SysUser { + userinfo := s.sysUserRepository.SelectByUserName(userName, userType, userSource) if userinfo.UserName != userName { return userinfo } diff --git a/src/modules/system/system.go b/src/modules/system/system.go index d4cca368..18e861c1 100644 --- a/src/modules/system/system.go +++ b/src/modules/system/system.go @@ -429,6 +429,35 @@ func Setup(router *gin.Engine) { controller.NewSysUser.Import, ) } + + // 第三方认证-配置认证源 + sysLoginSource := controller.NewSysLoginSource + sysLoginSourceGroup := router.Group("/system/login-source") + { + sysLoginSourceGroup.GET("/list", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:list"}}), + sysLoginSource.List, + ) + sysLoginSourceGroup.GET("/:id", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:query"}}), + sysLoginSource.Info, + ) + sysLoginSourceGroup.POST("", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:add"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLoginSource", middleware.BUSINESS_TYPE_INSERT)), + sysLoginSource.Add, + ) + sysLoginSourceGroup.PUT("", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:edit"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLoginSource", middleware.BUSINESS_TYPE_UPDATE)), + sysLoginSource.Edit, + ) + sysLoginSourceGroup.DELETE("/:id", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:remove"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLoginSource", middleware.BUSINESS_TYPE_DELETE)), + sysLoginSource.Remove, + ) + } } // InitLoad 初始参数 diff --git a/src/modules/tool/controller/mml.go b/src/modules/tool/controller/mml.go new file mode 100644 index 00000000..16dcda09 --- /dev/null +++ b/src/modules/tool/controller/mml.go @@ -0,0 +1,129 @@ +package controller + +import ( + "fmt" + "strings" + + "github.com/gin-gonic/gin" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/tool/model" + "be.ems/src/modules/tool/service" +) + +// 实例化控制层 MMLController 结构体 +var NewMML = &MMLController{ + neInfoService: neService.NewNeInfo, + mmlSystemService: service.NewMMLSystem, + mmlSubscriberService: service.NewMMLSubscriber, + mmlLogService: service.NewMMLLog, +} + +// MML 网元MML +// +// PATH /tool/mml +type MMLController struct { + neInfoService *neService.NeInfo // 网元信息服务 + mmlSystemService *service.MMLSystem + mmlSubscriberService *service.MMLSubscriber + mmlLogService *service.MMLLog +} + +// SystemList MML网元列表 +// +// GET /system/list +func (s MMLController) SystemList(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.mmlSystemService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) +} + +// SubscriberList MML网元UDM列表 +// +// GET /subscriber/list +func (s MMLController) SubscriberList(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.mmlSubscriberService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) +} + +// LogList MML日志列表 +// +// GET /log/list +func (s MMLController) LogList(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.mmlLogService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) +} + +// Command MML命令执行 +// +// POST /command +func (s MMLController) Command(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body struct { + NeType string `json:"neType" binding:"required"` // 网元类型 + NeId string `json:"neId" binding:"required"` // 网元ID + Command []string `json:"command" binding:"required"` // 命令 + Type string `json:"type" binding:"required,oneof=General Standard"` // 类型UPF标准版 General Standard + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID(body.NeType, body.NeId) + if neInfo.NeId != body.NeId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + num := 1 + if body.NeType == "UPF" && body.Type == "Standard" { + num = 2 + } + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.NeType, neInfo.NeId, num) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + if body.NeType != "IMS" { + telnetClient.RunCMD("\r\n") + } + if body.NeType == "UPF" && body.Type == "Standard" { + telnetClient.WindowChange(1024, 1024) + } + // 发送MML + result := []string{} + resultStr := "Success" + for _, v := range body.Command { + if v == "" { + continue + } + output, err := telnetClient.RunCMD(v + "\r\n") + if err != nil { + result = append(result, err.Error()) + resultStr = "there is an error" + continue + } + result = append(result, strings.TrimSpace(output)) + } + + // 记录日志 + mmlLog := model.MMLLog{ + NeType: body.NeType, + NeId: body.NeId, + User: reqctx.LoginUserToUserName(c), + Ip: c.ClientIP(), + Command: strings.Join(body.Command, ";"), + Result: resultStr, + } + s.mmlLogService.Insert(mmlLog) + c.JSON(200, resp.OkData(result)) +} diff --git a/src/modules/tool/model/mml_log.go b/src/modules/tool/model/mml_log.go new file mode 100644 index 00000000..383a0943 --- /dev/null +++ b/src/modules/tool/model/mml_log.go @@ -0,0 +1,18 @@ +package model + +// MMLLog MML网元命令 +type MMLLog struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + User string `json:"user" gorm:"column:user"` + Ip string `json:"ip" gorm:"column:ip"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeId string `json:"neId" gorm:"column:ne_id"` + Command string `json:"command" gorm:"column:command"` // 命令 + Result string `json:"result" gorm:"column:result"` + LogTime int64 `json:"logTime" gorm:"column:log_time"` +} + +// TableName 表名称 +func (*MMLLog) TableName() string { + return "mml_log" +} diff --git a/src/modules/tool/model/mml_subscriber.go b/src/modules/tool/model/mml_subscriber.go new file mode 100644 index 00000000..a514c922 --- /dev/null +++ b/src/modules/tool/model/mml_subscriber.go @@ -0,0 +1,19 @@ +package model + +// MMLSubscriber MML网元UDM命令 +type MMLSubscriber struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + Category string `json:"category" gorm:"column:category"` + CatDisplay string `json:"catDisplay" gorm:"column:cat_display"` + Operation string `json:"operation" gorm:"column:operation"` + Object string `json:"object" gorm:"column:object"` + MmlDisplay string `json:"mmlDisplay" gorm:"column:mml_display"` + ParamJson string `json:"paramJson" gorm:"column:param_json"` + Status string `json:"status" gorm:"column:status"` // 激活: Active 未激活: Inactive +} + +// TableName 表名称 +func (*MMLSubscriber) TableName() string { + return "mml_subscriber" +} diff --git a/src/modules/tool/model/mml_system.go b/src/modules/tool/model/mml_system.go new file mode 100644 index 00000000..7ad0a6d1 --- /dev/null +++ b/src/modules/tool/model/mml_system.go @@ -0,0 +1,20 @@ +package model + +// MMLSystem MML网元命令 +type MMLSystem struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + Category string `json:"category" gorm:"column:category"` + CatDisplay string `json:"catDisplay" gorm:"column:cat_display"` + Operation string `json:"operation" gorm:"column:operation"` // 操作行为 + Object string `json:"object" gorm:"column:object"` // 操作对象 + MmlDisplay string `json:"mmlDisplay" gorm:"column:mml_display"` // 显示 + ObjectType string `json:"objectType" gorm:"column:object_type"` + ParamJson string `json:"paramJson" gorm:"column:param_json"` + Status string `json:"status" gorm:"column:status"` // 激活: Active 未激活: Inactive +} + +// TableName 表名称 +func (*MMLSystem) TableName() string { + return "mml_system" +} diff --git a/src/modules/tool/repository/mml_log.go b/src/modules/tool/repository/mml_log.go new file mode 100644 index 00000000..52422396 --- /dev/null +++ b/src/modules/tool/repository/mml_log.go @@ -0,0 +1,67 @@ +package repository + +import ( + "fmt" + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/tool/model" +) + +// 实例化数据层 MMLLog 结构体 +var NewMMLLog = &MMLLog{} + +// MMLLog MML日志 数据层处理 +type MMLLog struct{} + +// SelectByPage 分页查询集合 +func (r MMLLog) SelectByPage(query map[string]string) ([]model.MMLLog, int64) { + tx := db.DB("").Model(&model.MMLLog{}) + // 查询条件拼接 + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + } + tx = tx.Where("log_time >= ?", v) + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + } + tx = tx.Where("log_time <= ?", v) + } + + // 查询结果 + var total int64 = 0 + rows := []model.MMLLog{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } + + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// Insert 新增信息 返回新增数据ID +func (r MMLLog) Insert(param model.MMLLog) int64 { + param.LogTime = time.Now().UnixMilli() + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} diff --git a/src/modules/tool/repository/mml_subscriber.go b/src/modules/tool/repository/mml_subscriber.go new file mode 100644 index 00000000..a899c41f --- /dev/null +++ b/src/modules/tool/repository/mml_subscriber.go @@ -0,0 +1,44 @@ +package repository + +import ( + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/tool/model" +) + +// 实例化数据层 MMLSubscriber 结构体 +var NewMMLSubscriber = &MMLSubscriber{} + +// MMLSubscriber MML网元UDM命令 数据层处理 +type MMLSubscriber struct{} + +// SelectByPage 分页查询集合 +func (r MMLSubscriber) SelectByPage(query map[string]string) ([]model.MMLSubscriber, int64) { + tx := db.DB("").Model(&model.MMLSubscriber{}) + // 查询条件拼接 + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["status"]; ok && v != "" { + tx = tx.Where("status = ?", v) + } + + // 查询结果 + var total int64 = 0 + rows := []model.MMLSubscriber{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } + + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} diff --git a/src/modules/tool/repository/mml_system.go b/src/modules/tool/repository/mml_system.go new file mode 100644 index 00000000..834590b1 --- /dev/null +++ b/src/modules/tool/repository/mml_system.go @@ -0,0 +1,44 @@ +package repository + +import ( + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/tool/model" +) + +// 实例化数据层 MMLSystem 结构体 +var NewMMLSystem = &MMLSystem{} + +// MMLSystem MML网元命令 数据层处理 +type MMLSystem struct{} + +// SelectByPage 分页查询集合 +func (r MMLSystem) SelectByPage(query map[string]string) ([]model.MMLSystem, int64) { + tx := db.DB("").Model(&model.MMLSystem{}) + // 查询条件拼接 + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["status"]; ok && v != "" { + tx = tx.Where("status = ?", v) + } + + // 查询结果 + var total int64 = 0 + rows := []model.MMLSystem{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } + + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} diff --git a/src/modules/tool/service/mml_log.go b/src/modules/tool/service/mml_log.go new file mode 100644 index 00000000..f7d31cdd --- /dev/null +++ b/src/modules/tool/service/mml_log.go @@ -0,0 +1,26 @@ +package service + +import ( + "be.ems/src/modules/tool/model" + "be.ems/src/modules/tool/repository" +) + +// 实例化数据层 MMLLog 结构体 +var NewMMLLog = &MMLLog{ + mmlLogRepository: repository.NewMMLLog, +} + +// MMLLog MML网元日志 服务层处理 +type MMLLog struct { + mmlLogRepository *repository.MMLLog +} + +// FindByPage 分页查询列表数据 +func (s MMLLog) FindByPage(query map[string]string) ([]model.MMLLog, int64) { + return s.mmlLogRepository.SelectByPage(query) +} + +// Insert 新增日志 +func (s MMLLog) Insert(param model.MMLLog) int64 { + return s.mmlLogRepository.Insert(param) +} diff --git a/src/modules/tool/service/mml_subscriber.go b/src/modules/tool/service/mml_subscriber.go new file mode 100644 index 00000000..8b4c28b3 --- /dev/null +++ b/src/modules/tool/service/mml_subscriber.go @@ -0,0 +1,21 @@ +package service + +import ( + "be.ems/src/modules/tool/model" + "be.ems/src/modules/tool/repository" +) + +// 实例化数据层 MMLSubscriber 结构体 +var NewMMLSubscriber = &MMLSubscriber{ + mmlSubscriberRepository: repository.NewMMLSubscriber, +} + +// MMLSubscriber MML网元命令 服务层处理 +type MMLSubscriber struct { + mmlSubscriberRepository *repository.MMLSubscriber +} + +// FindByPage 分页查询列表数据 +func (s MMLSubscriber) FindByPage(query map[string]string) ([]model.MMLSubscriber, int64) { + return s.mmlSubscriberRepository.SelectByPage(query) +} diff --git a/src/modules/tool/service/mml_system.go b/src/modules/tool/service/mml_system.go new file mode 100644 index 00000000..021c0439 --- /dev/null +++ b/src/modules/tool/service/mml_system.go @@ -0,0 +1,21 @@ +package service + +import ( + "be.ems/src/modules/tool/model" + "be.ems/src/modules/tool/repository" +) + +// 实例化数据层 MMLSystem 结构体 +var NewMMLSystem = &MMLSystem{ + mmlSystemRepository: repository.NewMMLSystem, +} + +// MMLSystem MML网元命令 服务层处理 +type MMLSystem struct { + mmlSystemRepository *repository.MMLSystem +} + +// FindByPage 分页查询列表数据 +func (s MMLSystem) FindByPage(query map[string]string) ([]model.MMLSystem, int64) { + return s.mmlSystemRepository.SelectByPage(query) +} diff --git a/src/modules/tool/tool.go b/src/modules/tool/tool.go index ce37e8c1..355b238d 100644 --- a/src/modules/tool/tool.go +++ b/src/modules/tool/tool.go @@ -54,4 +54,27 @@ func Setup(router *gin.Engine) { controller.NewPing.Run, ) } + + // MML 网元MML + mml := controller.NewMML + mmlGroup := router.Group("/tool/mml") + { + mmlGroup.GET("/system/list", + middleware.AuthorizeUser(nil), + mml.SystemList, + ) + mmlGroup.GET("/subscriber/list", + middleware.AuthorizeUser(nil), + mml.SubscriberList, + ) + mmlGroup.GET("/log/list", + middleware.AuthorizeUser(nil), + mml.LogList, + ) + mmlGroup.POST("/command", + middleware.AuthorizeUser(nil), + mml.Command, + ) + } + } diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go index 2085f282..d326ae06 100644 --- a/src/modules/trace/service/trace_task.go +++ b/src/modules/trace/service/trace_task.go @@ -6,9 +6,10 @@ import ( "net" "strings" + "github.com/tsmask/go-oam/framework/socket" + "be.ems/src/framework/config" "be.ems/src/framework/logger" - "be.ems/src/framework/socket" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/parse" neFetchlink "be.ems/src/modules/network_element/fetch_link" @@ -21,16 +22,14 @@ import ( // 实例化数据层 TraceTask 结构体 var NewTraceTask = &TraceTask{ - udpService: socket.SocketUDP{}, - tcpService: socket.SocketTCP{}, traceTaskRepository: repository.NewTraceTask, traceDataRepository: repository.NewTraceData, } // TraceTask 跟踪任务 服务层处理 type TraceTask struct { - udpService socket.SocketUDP // UDP服务对象 - tcpService socket.SocketTCP // 测试用,后续调整TODO + udpService socket.ServerUDP // UDP服务对象 + tcpService socket.ServerTCP // 测试用,后续调整TODO traceTaskRepository *repository.TraceTask // 跟踪_任务数据信息 traceDataRepository *repository.TraceData // 跟踪_数据信息 } @@ -48,8 +47,8 @@ func (r *TraceTask) CreateUDP(reload bool) error { } // 初始化UDP服务 - r.udpService = socket.SocketUDP{Addr: host, Port: port} - if _, err := r.udpService.New(); err != nil { + r.udpService = socket.ServerUDP{Addr: host, Port: fmt.Sprint(port)} + if err := r.udpService.Listen(); err != nil { return err } @@ -87,21 +86,20 @@ func (r *TraceTask) CreateUDP(reload bool) error { // ============ 本地测试接收网元UDP发过来的数据 后续调整TODO if config.Env() == "local" { // 初始化TCP服务 - r.tcpService = socket.SocketTCP{Addr: host, Port: port + 1} - if _, err := r.tcpService.New(); err != nil { + r.tcpService = socket.ServerTCP{Addr: host, Port: fmt.Sprint(port + 1)} + if err := r.tcpService.Listen(); err != nil { return err } // 接收处理TCP数据 - go r.tcpService.Resolve(func(conn *net.Conn, err error) { + go r.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) + n, err := conn.Read(buf) if err != nil { logger.Errorf("TCP Resolve Read Error: %s", err.Error()) return @@ -117,7 +115,7 @@ func (r *TraceTask) CreateUDP(reload bool) error { } // 发送响应 - if _, err = c.Write([]byte("tcp>")); err != nil { + if _, err = conn.Write([]byte("tcp>")); err != nil { logger.Errorf("TCP Resolve Write Error: %s", err.Error()) } buf = nil diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go index efd972f5..e5023ab7 100644 --- a/src/modules/trace/service/trace_task_hlr.go +++ b/src/modules/trace/service/trace_task_hlr.go @@ -60,7 +60,7 @@ func (r *TraceTaskHlr) DeleteByIds(ids []int64) (int64, error) { if len(rows) == len(ids) { // 停止任务 - neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) + neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "UDM"}, false, false) for _, r := range rows { if r.Status == "0" { continue @@ -98,7 +98,7 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (int64, error) { } // 发送创建任务 - neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) + neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "UDM"}, false, false) for _, neInfo := range neInfos { hlrItem := map[string]any{ "neType": neInfo.NeType, @@ -129,7 +129,7 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (int64, error) { func (r *TraceTaskHlr) Stop(task model.TraceTaskHlr) error { hlrList := []map[string]any{} // 发送停止任务 - neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) + neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "UDM"}, false, false) for _, neInfo := range neInfos { hlrItem := map[string]any{ "neType": neInfo.NeType, @@ -161,7 +161,7 @@ func (r *TraceTaskHlr) Stop(task model.TraceTaskHlr) error { func (r *TraceTaskHlr) File(traceId, dirPath string) ([]map[string]any, error) { hlrList := []map[string]any{} // 查询所有匹配的网元类型 - neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) + neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "UDM"}, false, false) if len(neInfos) == 0 { return nil, fmt.Errorf("not found network element") } diff --git a/src/modules/ws/processor/cdr_connect.go b/src/modules/ws/processor/cdr_connect.go index a3848860..884008c4 100644 --- a/src/modules/ws/processor/cdr_connect.go +++ b/src/modules/ws/processor/cdr_connect.go @@ -6,79 +6,29 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/resp" - neDataModel "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neInfoService "be.ems/src/modules/network_element/service" ) -// GetCDRConnectByIMS 获取CDR会话事件-IMS -func GetCDRConnectByIMS(requestID string, data any) ([]byte, error) { - msgByte, _ := json.Marshal(data) - var query neDataModel.CDREventIMSQuery - err := json.Unmarshal(msgByte, &query) - if err != nil { - logger.Warnf("ws processor GetCDRConnect err: %s", err.Error()) - return nil, fmt.Errorf("query data structure error") +// GetCDRConnect 获取CDR会话事件 +func GetCDRConnect(requestID string, data any) ([]byte, error) { + if data == nil { + logger.Errorf("ws processor GetCDRConnect data is nil") + return nil, fmt.Errorf("query data error") + } + dataMap := data.(map[string]any) + query := make(map[string]string, 0) + for k, v := range dataMap { + query[k] = fmt.Sprintf("%v", v) } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfo.FindByNeTypeAndNeID(query.NeType, query.NeID) - if neInfo.NeId != query.NeID || neInfo.IP == "" { + neInfo := neInfoService.NewNeInfo.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { return nil, fmt.Errorf("query neinfo not found") } - query.RmUID = neInfo.RmUID - - rows, total := neDataService.NewCDREventIMS.FindByPage(query) - resultByte, err := json.Marshal(resp.Ok(map[string]any{ - "requestId": requestID, - "data": map[string]any{"rows": rows, "total": total}, - })) - return resultByte, err -} - -// GetCDRConnectBySMF 获取CDR会话事件-SMF -func GetCDRConnectBySMF(requestID string, data any) ([]byte, error) { - msgByte, _ := json.Marshal(data) - var query neDataModel.CDREventSMFQuery - err := json.Unmarshal(msgByte, &query) - if err != nil { - logger.Warnf("ws processor GetCDRConnect err: %s", err.Error()) - return nil, fmt.Errorf("query data structure error") - } - - // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfo.FindByNeTypeAndNeID(query.NeType, query.NeID) - if neInfo.NeId != query.NeID || neInfo.IP == "" { - return nil, fmt.Errorf("query neinfo not found") - } - query.RmUID = neInfo.RmUID - - rows, total := neDataService.NewCDREventSMF.FindByPage(query) - resultByte, err := json.Marshal(resp.Ok(map[string]any{ - "requestId": requestID, - "data": map[string]any{"rows": rows, "total": total}, - })) - return resultByte, err -} - -// GetCDRConnectBySMSC 获取CDR会话事件-SMSC -func GetCDRConnectBySMSC(requestID string, data any) ([]byte, error) { - msgByte, _ := json.Marshal(data) - var query neDataModel.CDREventSMSCQuery - err := json.Unmarshal(msgByte, &query) - if err != nil { - logger.Warnf("ws processor GetCDRConnect err: %s", err.Error()) - return nil, fmt.Errorf("query data structure error") - } - - // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfo.FindByNeTypeAndNeID(query.NeType, query.NeID) - if neInfo.NeId != query.NeID || neInfo.IP == "" { - return nil, fmt.Errorf("query neinfo not found") - } - query.RmUID = neInfo.RmUID - - rows, total := neDataService.NewCDREventSMSC.FindByPage(query) + query["rmUID"] = neInfo.RmUID + rows, total := neDataService.NewCDREvent.FindByPage(neInfo.NeType, query) resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{"rows": rows, "total": total}, diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index 79d99952..20ebf461 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -6,54 +6,29 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/resp" - neDataModel "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" ) -// GetUEConnectByAMF 获取UE会话事件-AMF -func GetUEConnectByAMF(requestID string, data any) ([]byte, error) { - msgByte, _ := json.Marshal(data) - var query neDataModel.UEEventAMFQuery - err := json.Unmarshal(msgByte, &query) - if err != nil { - logger.Warnf("ws processor GetUEConnectByAMF err: %s", err.Error()) - return nil, fmt.Errorf("query data structure error") +// GetUEConnect 获取UE会话事件 +func GetUEConnect(requestID string, data any) ([]byte, error) { + if data == nil { + logger.Errorf("ws processor GetUEConnect data is nil") + return nil, fmt.Errorf("query data error") + } + dataMap := data.(map[string]any) + query := make(map[string]string, 0) + for k, v := range dataMap { + query[k] = fmt.Sprintf("%v", v) } - // 查询网元获取IP - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID("AMF", query.NeID) - if neInfo.NeId != query.NeID || neInfo.IP == "" { - return nil, fmt.Errorf("not fount neId info") + // 查询网元信息 rmUID + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(query["neType"], query["neId"]) + if neInfo.NeType == "" { + return nil, fmt.Errorf("query neinfo not found") } - query.RmUID = neInfo.RmUID - - rows, total := neDataService.NewUEEventAMF.FindByPage(query) - resultByte, err := json.Marshal(resp.Ok(map[string]any{ - "requestId": requestID, - "data": map[string]any{"rows": rows, "total": total}, - })) - return resultByte, err -} - -// GetUEConnectByMME 获取UE会话事件-MME -func GetUEConnectByMME(requestID string, data any) ([]byte, error) { - msgByte, _ := json.Marshal(data) - var query neDataModel.UEEventMMEQuery - err := json.Unmarshal(msgByte, &query) - if err != nil { - logger.Warnf("ws processor GetUEConnectByMME err: %s", err.Error()) - return nil, fmt.Errorf("query data structure error") - } - - // 查询网元获取IP - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID("MME", query.NeID) - if neInfo.NeId != query.NeID || neInfo.IP == "" { - return nil, fmt.Errorf("not fount neId info") - } - query.RmUID = neInfo.RmUID - - rows, total := neDataService.NewUEEventMME.FindByPage(query) + query["rmUID"] = neInfo.RmUID + rows, total := neDataService.NewUEEvent.FindByPage(neInfo.NeType, query) resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{"rows": rows, "total": total}, diff --git a/src/modules/ws/service/ws_receive.go b/src/modules/ws/service/ws_receive.go index 36791072..09e1a685 100644 --- a/src/modules/ws/service/ws_receive.go +++ b/src/modules/ws/service/ws_receive.go @@ -63,16 +63,10 @@ func (s *WSReceive) Commont(client *model.WSClient, reqMsg model.WSRequest) { resByte, err = processor.GetProcessData(reqMsg.RequestID, reqMsg.Data) case "net": resByte, err = processor.GetNetConnections(reqMsg.RequestID, reqMsg.Data) - case "ims_cdr": - resByte, err = processor.GetCDRConnectByIMS(reqMsg.RequestID, reqMsg.Data) - case "smf_cdr": - resByte, err = processor.GetCDRConnectBySMF(reqMsg.RequestID, reqMsg.Data) - case "smsc_cdr": - resByte, err = processor.GetCDRConnectBySMSC(reqMsg.RequestID, reqMsg.Data) - case "amf_ue": - resByte, err = processor.GetUEConnectByAMF(reqMsg.RequestID, reqMsg.Data) - case "mme_ue": - resByte, err = processor.GetUEConnectByMME(reqMsg.RequestID, reqMsg.Data) + case "ims_cdr", "smf_cdr", "smsc_cdr", "sgwc_cdr": + resByte, err = processor.GetCDRConnect(reqMsg.RequestID, reqMsg.Data) + case "amf_ue", "mme_ue": + resByte, err = processor.GetUEConnect(reqMsg.RequestID, reqMsg.Data) case "upf_tf": resByte, err = processor.GetUPFTotalFlow(reqMsg.RequestID, reqMsg.Data) case "ne_state": diff --git a/src/modules/ws/service/ws_send.go b/src/modules/ws/service/ws_send.go index adcccaef..b419e1fa 100644 --- a/src/modules/ws/service/ws_send.go +++ b/src/modules/ws/service/ws_send.go @@ -34,6 +34,10 @@ const ( GROUP_AMF_UE = "1010" // 组号-MME_UE会话事件 1011_neId GROUP_MME_UE = "1011" + // 组号-AMF_NB状态事件 1014_neId + GROUP_AMF_NB = "1014" + // 组号-MME_NB状态事件 1015_neId + GROUP_MME_NB = "1015" // 组号-告警 2000_neType_neId GROUP_ALARM = "2000" // 组号-告警事件 2002_neType_neId diff --git a/src/modules/ws/ws.go b/src/modules/ws/ws.go index af8147f4..8407c478 100644 --- a/src/modules/ws/ws.go +++ b/src/modules/ws/ws.go @@ -14,36 +14,33 @@ func Setup(router *gin.Engine) { logger.Infof("开始加载 ====> ws 模块路由") // WebSocket 协议 + ws := controller.NewWSController wsGroup := router.Group("/ws") { wsGroup.GET("", middleware.AuthorizeUser(nil), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewWSController.WS, + ws.WS, ) wsGroup.GET("/test", middleware.AuthorizeUser(nil), - controller.NewWSController.Test, + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), + ws.Test, ) wsGroup.GET("/ssh", middleware.AuthorizeUser(nil), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewWSController.SSH, + ws.SSH, ) wsGroup.GET("/telnet", middleware.AuthorizeUser(nil), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewWSController.Telnet, + ws.Telnet, ) wsGroup.GET("/redis", middleware.AuthorizeUser(nil), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewWSController.Redis, + ws.Redis, ) wsGroup.GET("/view", middleware.AuthorizeUser(nil), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewWSController.ShellView, + ws.ShellView, ) } } diff --git a/sshsvc/.ssh/id_rsa b/sshsvc/.ssh/id_rsa deleted file mode 100644 index b9e6a0e2..00000000 --- a/sshsvc/.ssh/id_rsa +++ /dev/null @@ -1,38 +0,0 @@ ------BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn -NhAAAAAwEAAQAAAYEAo8xNDB8tD9rEJhtTirwK8CxM0e+wcMT6fuDfTSgc/JRMjXIeM6B7 -6Cw2lCSjwTME60nGZ8Yb0STXXuoc+WdEFcWaJVSlfeXzH4G/WCAsw3zxdwaYWnuavzwWFC -TX6wvUgI0Hh1eAgjusZOi1fDvzX8PLml8Lbjd8n6VFneZkVijHNxh1eL8Xq3yqCEGTenrS -4SBGImwIQidtT9LqFs2Ze3Hi5pBvuqq0Um8gtGwp6zd/sIzeG8LX5axBSZN10BrkW1bGC8 -7sfpjJvadtvgiz0ZfxVDxd8eP8CgrKq+yQ0scfNB0j4ZOIP9Zwk6Q0fYQHxegPcMNr2v5P -IzHmDwTvDsHu3qyxGc74OVkAEd1o9OXiaSQ/fQXgvdUuSlugBUA3wx8Vlqa0om3fyY/XbX -LdqStmcVtKYfTiePX7UYc09YlYuFJycJxuf6i38Jek58fqp0NSH//ZWP/fXqwkwE8xUzEi -Jiq0c+wp7j5XMPFpMwmKViintJCS5C9nEQ+UIuMpAAAFiMzUaEPM1GhDAAAAB3NzaC1yc2 -EAAAGBAKPMTQwfLQ/axCYbU4q8CvAsTNHvsHDE+n7g300oHPyUTI1yHjOge+gsNpQko8Ez -BOtJxmfGG9Ek117qHPlnRBXFmiVUpX3l8x+Bv1ggLMN88XcGmFp7mr88FhQk1+sL1ICNB4 -dXgII7rGTotXw781/Dy5pfC243fJ+lRZ3mZFYoxzcYdXi/F6t8qghBk3p60uEgRiJsCEIn -bU/S6hbNmXtx4uaQb7qqtFJvILRsKes3f7CM3hvC1+WsQUmTddAa5FtWxgvO7H6Yyb2nbb -4Is9GX8VQ8XfHj/AoKyqvskNLHHzQdI+GTiD/WcJOkNH2EB8XoD3DDa9r+TyMx5g8E7w7B -7t6ssRnO+DlZABHdaPTl4mkkP30F4L3VLkpboAVAN8MfFZamtKJt38mP121y3akrZnFbSm -H04nj1+1GHNPWJWLhScnCcbn+ot/CXpOfH6qdDUh//2Vj/316sJMBPMVMxIiYqtHPsKe4+ -VzDxaTMJilYop7SQkuQvZxEPlCLjKQAAAAMBAAEAAAGATRJTapG8zUn9o4SWIaBrcSkXGG -0000sMJuk+iPqH8R0CjEeXCGnKA6vSHpDC8KRF+0QidC/WZOl14XY9HelGMwxghJI4sG2j -oT6WvyuchHtkzsGurFyeqr7mEKJpanKNkdNKKJe2oxDbBDwvMP6wfG4PflqccUbwf9nvUO -XYbmYPntAGbkNUKt+kze+1Khti4IUkGwxEMoSEvdubRBGH13r17dEmkWnDIUqi0+JVMxVR -IsyVsfBTUAFmUu1ssPgFnD81z9G9OTic2A5zd+QDfXlJWbjJACtuM/4IotkZZ/M6rsVlYn -AY8Vqfs/8C53giSF5R4iiR29FIU3Luts9dJJQyQ94rXunK00iifyh18qisBKwh9rjxYn3J -wFeZeXzKRg/cLuY1Z74QBWjWzukadvu7dC9bWFZ2k3zKBPTodcpXr1QDwFT4mgEYAFXbQN -8RjFGZrhr2jbsnoM71QlcGv9RjxMPNep+BwnYvPSZ1Piu3nmQqNtysg6ur3ZEHJeLVAAAA -wHZ5m4TECDOgkL138faHQycfd9Yi/Yj1akSwVvtGpiPd35ir1bOp52H/Ea3ymDwh6PvOSk -NjpvwqCXSX5nIQWrQQiDHMKA4pCfAtzbJ68fhWmfzWUaWGIcrnhnoxXzMYgXS/Gp6fwqOf -5JH4jm3uM5knXLTz0E0WofYnLgDo6CAuANl9bSQDfPYh8tuNndoQd9190r+15uLhv/pIM7 -MsZzifBrE2cgSBIunIERdQbD9JwNCeDPIrV8aQbOJDyuJDbwAAAMEA1nYx8GVZM/0cSZqG -V9C4i6debJEep2k91z7XvjFRZJrTYYZavWJPEUmmqNjsJg0Bdad4g3SdK2iJ4W5CHzDm2S -Zn08j7on/ybcD2c1ZnXbwKrzPXRymc62xxwSDD95m/R5cSvN/Pmy57QfymQNPaNXMkhKq1 -nzF56bljW0FHVFnrgUHpbLUOEc0QHXO4d2PaUNptLVxquOJI/VDW2GKKQWaIsdYKPJEDO9 -GBe/LaUDzodd1s1isly86DLEgT2HwbAAAAwQDDhgO/kOI1N0jMOpE5gotcrhQc353jrP16 -mKOdcp9MVHiioRybsyRdnbDIYKXbQz2ZRwmz2RBh55uPQjLcfi82GlIm2rdTL8KzP9vLpc -WAbZ7dcbv1lLyIlr4Yf33LgAChxJQTGNad771cwYFrtwTYk16O0Mdv302L0DgDTJUvhzJb -0ZuIk2nmzumSH1pOYmZl8Oa+UM7YSZNCWEpM7/S5laNISQ6dF/yy6Del2sQk/1/JCMUK0d -GLCkyCiaW9igsAAAASc2ltb25Ac2ltb256aGFuZ3N6AQ== ------END OPENSSH PRIVATE KEY----- diff --git a/sshsvc/.ssh/id_rsa.pub b/sshsvc/.ssh/id_rsa.pub deleted file mode 100644 index 93e845fa..00000000 --- a/sshsvc/.ssh/id_rsa.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCjzE0MHy0P2sQmG1OKvArwLEzR77BwxPp+4N9NKBz8lEyNch4zoHvoLDaUJKPBMwTrScZnxhvRJNde6hz5Z0QVxZolVKV95fMfgb9YICzDfPF3Bphae5q/PBYUJNfrC9SAjQeHV4CCO6xk6LV8O/Nfw8uaXwtuN3yfpUWd5mRWKMc3GHV4vxerfKoIQZN6etLhIEYibAhCJ21P0uoWzZl7ceLmkG+6qrRSbyC0bCnrN3+wjN4bwtflrEFJk3XQGuRbVsYLzux+mMm9p22+CLPRl/FUPF3x4/wKCsqr7JDSxx80HSPhk4g/1nCTpDR9hAfF6A9ww2va/k8jMeYPBO8Owe7erLEZzvg5WQAR3Wj05eJpJD99BeC91S5KW6AFQDfDHxWWprSibd/Jj9dtct2pK2ZxW0ph9OJ49ftRhzT1iVi4UnJwnG5/qLfwl6Tnx+qnQ1If/9lY/99erCTATzFTMSImKrRz7CnuPlcw8WkzCYpWKKe0kJLkL2cRD5Qi4yk= simon@simonzhangsz diff --git a/sshsvc/.ssh/private_key.pem b/sshsvc/.ssh/private_key.pem deleted file mode 100644 index b9e6a0e2..00000000 --- a/sshsvc/.ssh/private_key.pem +++ /dev/null @@ -1,38 +0,0 @@ ------BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn -NhAAAAAwEAAQAAAYEAo8xNDB8tD9rEJhtTirwK8CxM0e+wcMT6fuDfTSgc/JRMjXIeM6B7 -6Cw2lCSjwTME60nGZ8Yb0STXXuoc+WdEFcWaJVSlfeXzH4G/WCAsw3zxdwaYWnuavzwWFC -TX6wvUgI0Hh1eAgjusZOi1fDvzX8PLml8Lbjd8n6VFneZkVijHNxh1eL8Xq3yqCEGTenrS -4SBGImwIQidtT9LqFs2Ze3Hi5pBvuqq0Um8gtGwp6zd/sIzeG8LX5axBSZN10BrkW1bGC8 -7sfpjJvadtvgiz0ZfxVDxd8eP8CgrKq+yQ0scfNB0j4ZOIP9Zwk6Q0fYQHxegPcMNr2v5P -IzHmDwTvDsHu3qyxGc74OVkAEd1o9OXiaSQ/fQXgvdUuSlugBUA3wx8Vlqa0om3fyY/XbX -LdqStmcVtKYfTiePX7UYc09YlYuFJycJxuf6i38Jek58fqp0NSH//ZWP/fXqwkwE8xUzEi -Jiq0c+wp7j5XMPFpMwmKViintJCS5C9nEQ+UIuMpAAAFiMzUaEPM1GhDAAAAB3NzaC1yc2 -EAAAGBAKPMTQwfLQ/axCYbU4q8CvAsTNHvsHDE+n7g300oHPyUTI1yHjOge+gsNpQko8Ez -BOtJxmfGG9Ek117qHPlnRBXFmiVUpX3l8x+Bv1ggLMN88XcGmFp7mr88FhQk1+sL1ICNB4 -dXgII7rGTotXw781/Dy5pfC243fJ+lRZ3mZFYoxzcYdXi/F6t8qghBk3p60uEgRiJsCEIn -bU/S6hbNmXtx4uaQb7qqtFJvILRsKes3f7CM3hvC1+WsQUmTddAa5FtWxgvO7H6Yyb2nbb -4Is9GX8VQ8XfHj/AoKyqvskNLHHzQdI+GTiD/WcJOkNH2EB8XoD3DDa9r+TyMx5g8E7w7B -7t6ssRnO+DlZABHdaPTl4mkkP30F4L3VLkpboAVAN8MfFZamtKJt38mP121y3akrZnFbSm -H04nj1+1GHNPWJWLhScnCcbn+ot/CXpOfH6qdDUh//2Vj/316sJMBPMVMxIiYqtHPsKe4+ -VzDxaTMJilYop7SQkuQvZxEPlCLjKQAAAAMBAAEAAAGATRJTapG8zUn9o4SWIaBrcSkXGG -0000sMJuk+iPqH8R0CjEeXCGnKA6vSHpDC8KRF+0QidC/WZOl14XY9HelGMwxghJI4sG2j -oT6WvyuchHtkzsGurFyeqr7mEKJpanKNkdNKKJe2oxDbBDwvMP6wfG4PflqccUbwf9nvUO -XYbmYPntAGbkNUKt+kze+1Khti4IUkGwxEMoSEvdubRBGH13r17dEmkWnDIUqi0+JVMxVR -IsyVsfBTUAFmUu1ssPgFnD81z9G9OTic2A5zd+QDfXlJWbjJACtuM/4IotkZZ/M6rsVlYn -AY8Vqfs/8C53giSF5R4iiR29FIU3Luts9dJJQyQ94rXunK00iifyh18qisBKwh9rjxYn3J -wFeZeXzKRg/cLuY1Z74QBWjWzukadvu7dC9bWFZ2k3zKBPTodcpXr1QDwFT4mgEYAFXbQN -8RjFGZrhr2jbsnoM71QlcGv9RjxMPNep+BwnYvPSZ1Piu3nmQqNtysg6ur3ZEHJeLVAAAA -wHZ5m4TECDOgkL138faHQycfd9Yi/Yj1akSwVvtGpiPd35ir1bOp52H/Ea3ymDwh6PvOSk -NjpvwqCXSX5nIQWrQQiDHMKA4pCfAtzbJ68fhWmfzWUaWGIcrnhnoxXzMYgXS/Gp6fwqOf -5JH4jm3uM5knXLTz0E0WofYnLgDo6CAuANl9bSQDfPYh8tuNndoQd9190r+15uLhv/pIM7 -MsZzifBrE2cgSBIunIERdQbD9JwNCeDPIrV8aQbOJDyuJDbwAAAMEA1nYx8GVZM/0cSZqG -V9C4i6debJEep2k91z7XvjFRZJrTYYZavWJPEUmmqNjsJg0Bdad4g3SdK2iJ4W5CHzDm2S -Zn08j7on/ybcD2c1ZnXbwKrzPXRymc62xxwSDD95m/R5cSvN/Pmy57QfymQNPaNXMkhKq1 -nzF56bljW0FHVFnrgUHpbLUOEc0QHXO4d2PaUNptLVxquOJI/VDW2GKKQWaIsdYKPJEDO9 -GBe/LaUDzodd1s1isly86DLEgT2HwbAAAAwQDDhgO/kOI1N0jMOpE5gotcrhQc353jrP16 -mKOdcp9MVHiioRybsyRdnbDIYKXbQz2ZRwmz2RBh55uPQjLcfi82GlIm2rdTL8KzP9vLpc -WAbZ7dcbv1lLyIlr4Yf33LgAChxJQTGNad771cwYFrtwTYk16O0Mdv302L0DgDTJUvhzJb -0ZuIk2nmzumSH1pOYmZl8Oa+UM7YSZNCWEpM7/S5laNISQ6dF/yy6Del2sQk/1/JCMUK0d -GLCkyCiaW9igsAAAASc2ltb25Ac2ltb256aGFuZ3N6AQ== ------END OPENSSH PRIVATE KEY----- diff --git a/sshsvc/config/config.go b/sshsvc/config/config.go deleted file mode 100644 index fcf978a4..00000000 --- a/sshsvc/config/config.go +++ /dev/null @@ -1,185 +0,0 @@ -package config - -import ( - "flag" - "fmt" - "os" - "strings" - - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/sshsvc/logmml" - - "gopkg.in/yaml.v3" -) - -type DbConfig 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"` - ConnParam string `yaml:"connParam,omitempty"` - Backup string `yaml:"backup"` -} - -// Yaml struct of config -type YamlConfig struct { - Logger struct { - File string `yaml:"file"` - Level string `yaml:"level"` - Duration int `yaml:"duration"` - Count int `yaml:"count"` - } `yaml:"logger"` - - Logmml struct { - File string `yaml:"file"` - Duration int `yaml:"duration"` - Count int `yaml:"count"` - Level string `yaml:"level"` - } `yaml:"logmml"` - - Sshd struct { - ListenAddr string `yaml:"listenAddr"` - ListenPort uint16 `yaml:"listenPort"` - PrivateKey string `yaml:"privateKey"` - MaxConnNum int `yaml:"maxConnNum"` - Timeout uint16 `yaml:"timeout"` - Session string `yaml:"session"` - MmlHome string `yaml:"mmlHome"` - UserName string `yaml:"userName"` - Password string `yaml:"password"` - AuthType string `yaml:"authType"` - TagNE string `yaml:"tagNE"` - } `yaml:"sshd"` - - TelnetServer struct { - ListenAddr string `yaml:"listenAddr"` - ListenPort uint16 `yaml:"listenPort"` - MaxConnNum int `yaml:"maxConnNum"` - Timeout uint16 `yaml:"timeout"` - Session string `yaml:"session"` - MmlHome string `yaml:"mmlHome"` - UserName string `yaml:"userName"` - Password string `yaml:"password"` - AuthType string `yaml:"authType"` - TagNE string `yaml:"tagNE"` - } `yaml:"telnetServer"` - - SNMPServer struct { - ListenAddr string `yaml:"listenAddr"` - ListenPort uint16 `yaml:"listenPort"` - UserName string `yaml:"userName"` - AuthPass string `yaml:"authPass"` - AuthProto string `yaml:"authProto"` - PrivPass string `yaml:"privPass"` - PrivProto string `yaml:"privProto"` - EngineID string `yaml:"engineID"` - TrapPort uint16 `yaml:"trapPort"` - TrapListen bool `yaml:"trapListen"` - TrapBool bool `yaml:"trapBool"` - TrapTick uint16 `yaml:"trapTick"` - TimeOut uint16 `yaml:"timeOut"` - TrapTarget string `yaml:"trapTarget"` - } `yaml:"snmpServer"` - - Database DbConfig `yaml:"database"` - - OMC struct { - HttpUri string `yaml:"httpUri"` - UserCrypt string `yaml:"userCrypt"` - } `yaml:"omc"` -} - -var yamlConfig YamlConfig = NewYamlConfig() - -// set default value for yaml config -func NewYamlConfig() YamlConfig { - return YamlConfig{ - Database: DbConfig{ - Type: "mysql", - ConnParam: "charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True", - }, - } -} - -func ReadConfig(configFile string) { - yamlFile, err := os.ReadFile(configFile) - if err != nil { - fmt.Println("Read yaml config file error:", err) - os.Exit(2) - } - - err = yaml.Unmarshal(yamlFile, &yamlConfig) - if err != nil { - fmt.Println("Unmarshal error:", err) - os.Exit(3) - } -} - -func GetYamlConfig() *YamlConfig { - return &yamlConfig -} - -func GetLogLevel() log.LogLevel { - var logLevel log.LogLevel - switch strings.ToLower(yamlConfig.Logger.Level) { - case "trace": - logLevel = log.LOG_TRACE - case "info": - logLevel = log.LOG_INFO - case "debug": - logLevel = log.LOG_DEBUG - case "warn": - logLevel = log.LOG_WARN - case "error": - logLevel = log.LOG_ERROR - case "fatal": - logLevel = log.LOG_FATAL - case "off": - logLevel = log.LOG_OFF - default: - logLevel = log.LOG_DEBUG - } - return logLevel -} - -func GetLogMmlLevel() logmml.LogLevel { - var logLevel logmml.LogLevel - switch strings.ToLower(yamlConfig.Logmml.Level) { - case "cmd", "command": - logLevel = logmml.LOG_CMD - case "ret", "result": - logLevel = logmml.LOG_RET - default: - logLevel = logmml.LOG_CMD - } - return logLevel -} - -func GetDefaultUserAgent() string { - return "OMC-sshsvc/" + global.Version -} - -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 || *pversion { - fmt.Printf("OMC sshsvc version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) - os.Exit(0) - } - if *ph || *phelp { - flag.Usage() - os.Exit(0) - } - - ReadConfig(*cfile) -} diff --git a/sshsvc/dborm/dborm.go b/sshsvc/dborm/dborm.go deleted file mode 100644 index 45449317..00000000 --- a/sshsvc/dborm/dborm.go +++ /dev/null @@ -1,161 +0,0 @@ -package dborm - -import ( - "database/sql" - "fmt" - "time" - - "be.ems/lib/log" - - _ "github.com/go-sql-driver/mysql" - "xorm.io/xorm" - "xorm.io/xorm/core" -) - -const ( - TableNameMeasureTask = "measure_task" - TableNameNeInfo = "ne_info" -) - -type Menu struct { - Id int `json:"id"` - Title string `json:"title"` - Icon string `json:"icon"` - Href string `json:"href"` - ParentId int `json:"parent_id"` - Remark int `json:"remark"` -} - -type DatabaseClient struct { - dbType string - dbUrl string - dbConnMaxLifetime time.Duration - dbMaxIdleConns int - dbMaxOpenConns int - IsShowSQL bool - - XEngine *xorm.Engine -} - -var DbClient DatabaseClient - -func InitDbClient(dbType, dbUser, dbPassword, dbHost, dbPort, dbName, dbParam string) error { - DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s", - dbUser, dbPassword, dbHost, dbPort, dbName, dbParam) - DbClient.dbType = dbType - DbClient.dbConnMaxLifetime = 0 - DbClient.dbMaxIdleConns = 0 - DbClient.dbMaxOpenConns = 0 - if log.GetLevel() == log.LOG_TRACE { - DbClient.IsShowSQL = true - } - log.Debugf("dbType:%s dbUrl:%s:", dbType, DbClient.dbUrl) - - var err error - DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl) - if err != nil { - log.Error("Failed to connet database:", err) - return err - } - DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime) - DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns) - DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns) - DbClient.XEngine.DatabaseTZ = time.Local // 必须 - DbClient.XEngine.TZLocation = time.Local // 必须 - if DbClient.IsShowSQL { - DbClient.XEngine.ShowSQL(true) - } - - xEngine = DbClient.XEngine - - return nil -} - -// func InitDbClient() error { -// db := config.GetYamlConfig().Database -// DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", db.User, db.Password, db.Host, db.Port, db.Name) -// DbClient.dbType = db.Type -// DbClient.dbConnMaxLifetime = 0 -// DbClient.dbMaxIdleConns = 0 -// DbClient.dbMaxOpenConns = 0 -// if log.GetLevel() == log.LOG_TRACE { -// DbClient.IsShowSQL = true -// } -// log.Debugf("dbType:%s dbUrl:%s:******@tcp(%s:%s)/%s", DbClient.dbType, db.User, db.Host, db.Port, db.Name) -// var err error -// DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl) -// if err != nil { -// log.Error("Failed to connet database:", err) -// return err -// } -// DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime) -// DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns) -// DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns) -// if DbClient.IsShowSQL { -// DbClient.XEngine.ShowSQL(true) -// } -// xEngine = DbClient.XEngine - -// return nil -// } - -var xEngine *xorm.Engine - -func XormConnectDatabase(dbType, dbUser, dbPassword, dbHost, dbPort, dbName string) (*xorm.Engine, error) { - sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", - dbUser, dbPassword, dbHost, dbPort, dbName) - log.Debugf("dbType:%s Connect to:%s:******@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", - dbType, dbUser, dbHost, dbPort, dbName) - var err error - xEngine, err = xorm.NewEngine(dbType, sqlStr) //1、Create xorm engine - if err != nil { - log.Error("Failed to connect database:", err) - return nil, err - } - if log.GetLevel() == log.LOG_TRACE { - xEngine.ShowSQL(true) - } - return xEngine, nil -} - -func XCoreDB() *core.DB { - return xEngine.DB() -} - -func XEngDB() *xorm.Engine { - return xEngine -} - -type Session struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - AccountId string `json:"accountId" xorm:"account_id"` - Name string `json:"name" xorm:"name"` - Host string `json:"host" xorm:"host"` - AccessToken string `json:"accessToken" xorm:"access_token"` - Expires uint32 `json:"expires" xorm:"expires"` - Status string `json:"status" xorm:"status"` - LoginTime string `json:"loginTime" xorm:"-"` - ShakeTime sql.NullTime `son:"shakeTime" xorm:"shake_time"` - LogoutTime sql.NullTime `json:"logoutTime" xorm:"logout_time"` -} - -// XormUpdateSession update session -func XormLogoutUpdateSession(token string) (Session, error) { - log.Info("XormLogoutUpdateSession processing... ") - - session := Session{Status: "offline", AccessToken: token} - session.LogoutTime.Valid = true - session.LogoutTime.Time = time.Now() - - xSession := xEngine.NewSession() - defer xSession.Close() - _, err := xSession.Table("session").Where("access_token = ?", token).Update(session) - xSession.Commit() - // 查询记录返回 - if err == nil { - session := Session{} - _, err = xSession.Table("session").Where("access_token = ?", token).Get(&session) - return session, err - } - return session, err -} diff --git a/sshsvc/etc/sshsvc.yaml b/sshsvc/etc/sshsvc.yaml deleted file mode 100644 index e9019c4f..00000000 --- a/sshsvc/etc/sshsvc.yaml +++ /dev/null @@ -1,89 +0,0 @@ -# file: log file name -# level: /trace/debug/info/warn/error/fatal, default: debug -# duration: rotation time with xx hours, example: 1/12/24 hours -# count: rotation count of log, default is 30 rotation -logger: - file: d:/omc.git/be.ems/sshsvc/log/sshsvc.log - level: trace - duration: 24 - count: 30 - -# file: MML log file name -# duration: rotation time with xx hours, example: 1/12/24 hours -# count: rotation count of log, default is 30 rotation -# level: cmd/ret log cmd/log cmd & result -logmml: - file: d:/omc.git/be.ems/sshsvc/mmllog/omcmml.log - duration: 24 - count: 30 - level: ret - -# ssh service listen ipv4/v6 and port, support multiple routines -# ip: 0.0.0.0 or ::0, support IPv4/v6 -# session: single/multiple session for one user -# authType: local/radius -sshd: - listenAddr: 0.0.0.0 - listenPort: 32222 - privateKey: ./.ssh/id_rsa - maxConnNum: 2 - timeout: 1800 - session: multiple - mmlHome: ./mmlhome - userName: manager - password: pass123 - authType: local - tagNE: hlr - -# authType: local/omc -telnetServer: - listenAddr: 0.0.0.0 - listenPort: 32323 - maxConnNum: 2 - timeout: 1800 - session: multiple - mmlHome: ./mmlhome - userName: manager - password: pass123 - authType: local - tagNE: hlr - -# authproto: NoAuth/MD5/SHA -# privProto: NoPriv/DES/AES/AES192/AES256 -snmpServer: - listenAddr: '[::]' - listenPort: 34957 - userName: manager - authPass: pass123 - authproto: MD5 - privPass: "3F2A1B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2C3D4E" - privProto: DES - #engineID: "800007db03360102101101" - engineID: "8000000004323030313a6462383a3a39313636" - trapPort: 34958 - trapListen: false - trapBool: false - trapTick: 60 - timeOut: 5 - trapTarget: "2001:db8::9219" - -database: - type: mysql - user: administrator - password: "*86#ROtartsinim" - host: 192.168.13.117 - port: 3306 - name: OMC_PUB - connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True - -omc: - httpUri: http://127.0.0.1:3040 - userCrypt: bcrypt - -ne: - port: 4100 - sleep: 200 - user: admin - password: admin - - diff --git a/sshsvc/logmml/logmml.go b/sshsvc/logmml/logmml.go deleted file mode 100644 index 70fa5172..00000000 --- a/sshsvc/logmml/logmml.go +++ /dev/null @@ -1,187 +0,0 @@ -// logger for omc/ems - -package logmml - -import ( - "fmt" - "io" - "log" -) - -// LogLevel defines a log level -type LogLevel int - -// enum all LogLevels -const ( - // following level also match syslog.Priority value - LOG_RET LogLevel = iota - LOG_CMD - LOG_OFF - LOG_NODEF -) - -// default log options -const ( - DEFAULT_LOG_PREFIX = "omc:mml" - DEFAULT_LOG_FLAG = log.Ldate | log.Ltime | log.Lmsgprefix - DEFAULT_LOG_LEVEL = LOG_CMD - DEFAULT_CALL_DEPTH = 0 -) - -// Logger is a logger interface -type Logger interface { - Ret(v ...interface{}) - Retf(format string, v ...interface{}) - Cmd(v ...interface{}) - Cmdf(format string, v ...interface{}) - - Level() LogLevel - LevelString() string - SetLevel(l LogLevel) -} - -var _ Logger = DiscardLogger{} - -// DiscardLogger don't log implementation for ILogger -type DiscardLogger struct{} - -// Trace empty implementation -func (DiscardLogger) Ret(v ...interface{}) {} - -// Tracef empty implementation -func (DiscardLogger) Retf(format string, v ...interface{}) {} - -// Debug empty implementation -func (DiscardLogger) Cmd(v ...interface{}) {} - -// Debugf empty implementation -func (DiscardLogger) Cmdf(format string, v ...interface{}) {} - -// Level empty implementation -func (DiscardLogger) Level() LogLevel { - return LOG_NODEF -} - -// Level empty implementation -func (DiscardLogger) LevelString() string { - return "" -} - -// SetLevel empty implementation -func (DiscardLogger) SetLevel(l LogLevel) {} - -// EmsLogger is the default implment of ILogger -type MMLLogger struct { - RET *log.Logger - CMD *log.Logger - level LogLevel - levelString []string - //depth int -} - -var _ Logger = &MMLLogger{} - -// NewEmsLogger2 let you customrize your logger prefix and flag -func NewMmlLogger2(out io.Writer, prefix string, flag int) *MMLLogger { - return NewMmlLogger3(out, prefix, flag, DEFAULT_LOG_LEVEL) -} - -// NewEmsLogger3 let you customrize your logger prefix and flag and logLevel -func NewMmlLogger3(out io.Writer, prefix string, flag int, l LogLevel) *MMLLogger { - return &MMLLogger{ - RET: log.New(out, fmt.Sprintf("[%s] [ret]: ", prefix), flag), - CMD: log.New(out, fmt.Sprintf("[%s] [cmd]: ", prefix), flag), - level: l, - levelString: []string{"ret", "cmd"}, - //depth: DEFAULT_CALL_DEPTH, - } -} - -// Trace implement ILogger -func (s *MMLLogger) Ret(v ...interface{}) { - if s.level <= LOG_RET { - //_ = s.RET.Output(s.depth, fmt.Sprintln(v...)) - _ = s.RET.Output(0, fmt.Sprintln(v...)) - } -} - -// Tracef implement ILogger -func (s *MMLLogger) Retf(format string, v ...interface{}) { - if s.level <= LOG_RET { - _ = s.RET.Output(0, fmt.Sprintf(format, v...)) - } -} - -// Debug implement ILogger -func (s *MMLLogger) Cmd(v ...interface{}) { - if s.level <= LOG_CMD { - _ = s.CMD.Output(0, fmt.Sprintln(v...)) - } -} - -// Debugf implement ILogger -func (s *MMLLogger) Cmdf(format string, v ...interface{}) { - if s.level <= LOG_CMD { - _ = s.CMD.Output(0, fmt.Sprintf(format, v...)) - } -} - -// Info implement ILogger - -// Level implement ILogger -func (s *MMLLogger) Level() LogLevel { - return s.level -} - -// Level implement ILogger -func (s *MMLLogger) LevelString() string { - return s.levelString[s.level] -} - -// SetLevel implement ILogger -func (s *MMLLogger) SetLevel(l LogLevel) { - s.level = l -} - -var Elogger Logger - -func InitMmlLogger(logFile string, period int, count int, prefix string, logLevel LogLevel) { - logWriter := getLogWriter(logFile, period, count) - Elogger = NewMmlLogger3(logWriter, prefix, DEFAULT_LOG_FLAG, logLevel) - fmt.Printf("logFile=%s, period=%d, count=%d, prefix=%s, logLevel=%s\n", logFile, period, count, prefix, GetLevelString()) -} - -// Trace implement ILogger -func Ret(v ...interface{}) { - Elogger.Ret(v...) -} - -// Tracef implement ILogger -func Retf(format string, v ...interface{}) { - Elogger.Retf(format, v...) -} - -// Debug implement ILogger -func Cmd(v ...interface{}) { - Elogger.Cmd(v...) -} - -// Debugf implement ILogger -func Cmdf(format string, v ...interface{}) { - Elogger.Cmdf(format, v...) -} - -// Level implement ILogger -func GetLevel() LogLevel { - return Elogger.Level() -} - -// Level implement ILogger -func GetLevelString() string { - return Elogger.LevelString() -} - -// SetLevel implement ILogger -func SetLevel(l LogLevel) { - Elogger.SetLevel(l) -} diff --git a/sshsvc/logmml/partition.go b/sshsvc/logmml/partition.go deleted file mode 100644 index 23380dcb..00000000 --- a/sshsvc/logmml/partition.go +++ /dev/null @@ -1,71 +0,0 @@ -package logmml - -import ( - "io" - "time" - - rotatelogs "github.com/lestrrat/go-file-rotatelogs" -) - -type WriteSyncer interface { - io.Writer - Sync() error -} - -// 得到LogWriter -func getLogWriter(filePath string, period, count int) WriteSyncer { - warnIoWriter := getWriter(filePath, period, count) - return addSync(warnIoWriter) -} - -// 日志文件切割 -func getWriter(filename string, period, count int) io.Writer { - // 保存日志count天,每period小时分割一次日志 - duration := time.Hour * time.Duration(period) - var logfile string - if period >= 24 { - logfile = filename + "-%Y%m%d" - } else { - logfile = filename + "-%Y%m%d%H" - } - hook, err := rotatelogs.New( - - logfile, - rotatelogs.WithLinkName(filename), - // rotatelogs.WithMaxAge(duration), - rotatelogs.WithRotationCount(count), - rotatelogs.WithRotationTime(duration), - rotatelogs.WithLocation(time.Local), - ) - - //保存日志30天,每1分钟分割一次日志 - /* - hook, err := rotatelogs.New( - filename+"_%Y%m%d%H%M.log", - rotatelogs.WithLinkName(filename), - rotatelogs.WithMaxAge(time.Hour*24*30), - rotatelogs.WithRotationTime(time.Minute*1), - ) - */ - if err != nil { - panic(err) - } - return hook -} - -func addSync(w io.Writer) WriteSyncer { - switch w := w.(type) { - case WriteSyncer: - return w - default: - return writerWrapper{w} - } -} - -type writerWrapper struct { - io.Writer -} - -func (w writerWrapper) Sync() error { - return nil -} diff --git a/sshsvc/makefile b/sshsvc/makefile deleted file mode 100644 index b9386207..00000000 --- a/sshsvc/makefile +++ /dev/null @@ -1,18 +0,0 @@ -# Makefile for OMC-OMC-crontask project - -PROJECT = OMC -VERSION = 2.2503.9 -LIBDIR = be.ems/lib -BINNAME = sshsvc - -.PHONY: build $(BINNAME) -build $(BINNAME): - go build -o $(BINNAME) -v -ldflags "-s -w -X '$(LIBDIR)/global.Version=$(VERSION)' \ - -X '$(LIBDIR)/global.BuildTime=`date`' \ - -X '$(LIBDIR)/global.GoVer=`go version`'" - -run: $(BINNAME) - ./$(BINNAME) - -clean: - rm ./$(BINNAME) diff --git a/sshsvc/mibs/CINTEL-HLR-MIB.my b/sshsvc/mibs/CINTEL-HLR-MIB.my deleted file mode 100644 index 7fcb47e9..00000000 --- a/sshsvc/mibs/CINTEL-HLR-MIB.my +++ /dev/null @@ -1,7567 +0,0 @@ --- --- CINTEL-SS-HLR-MIB.my --- MIB generated by MG-SOFT Visual MIB Builder Version 7.0 Build 209 --- Monday, September 13, 2010 at 17:22:53 --- - - CINTEL-HLR-MIB DEFINITIONS ::= BEGIN - - IMPORTS - cintelSS, RowStatus - FROM CINTEL-MIB - Opaque, OBJECT-TYPE, MODULE-IDENTITY - FROM SNMPv2-SMI; - - - -- 1.3.6.1.4.1.1379.2.3.3.3 - hlr MODULE-IDENTITY - LAST-UPDATED "201706291606Z" -- June 29, 2007 at 16:06 GMT - ORGANIZATION - "CINTEL" - CONTACT-INFO - "cintel - support@cintel.com.cn" - DESCRIPTION - "Description." - REVISION "201706051219Z" -- June 05, 2007 at 12:19 GMT - DESCRIPTION - "This is the first release version of the HLR MIB" - ::= { application 3 } - - - --- --- Type definitions --- - - AvailStateChoices ::= INTEGER - { - inTest(0), - failed(1), - powerOff(2), - offLine(3), - onLine(4), - dependency(5), - degraded(6), - notInstalled(7) - } - - --- --- Node definitions --- - --- Node definitions --- --- The MIB module for ctcn. --- 1.3.6.1.4.1.1379.1.3 - -- 1.3.6.1.4.1.1379.2.3 - ctcn OBJECT IDENTIFIER ::= { cintelSS 3 } - - --- 1.3.6.1.4.1.1379.1.3.3 - -- 1.3.6.1.4.1.1379.2.3.3 - application OBJECT IDENTIFIER ::= { ctcn 3 } - - --- 1.3.6.1.4.1.1379.1.3.3.2.2 - -- 1.3.6.1.4.1.1379.2.3.3.3.1 - management OBJECT IDENTIFIER ::= { hlr 1 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.1.1 - instance OBJECT IDENTIFIER ::= { management 1 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.1.1 - instName OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..4)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:instName - Remark:Instance Name" - ::= { instance 1 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.1.2 - instStatus OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..16)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:instStatus - Remark:System status: Normal, Abnormal" - ::= { instance 2 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.1.3 - instDesc OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..64)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:instDesc - Remark:Instance Description" - ::= { instance 3 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.1.4 - instLocation OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..12)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:instLocation - Remark: Instance location" - ::= { instance 4 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.1.5 - instContact OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:instContact - Remark:Instance contact." - ::= { instance 5 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.1.7 - instOpTime OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Name:instOpTime - The value of instOpTime at the time of the most recent - change in state." - ::= { instance 7 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.1.9 - instService OBJECT-TYPE - SYNTAX INTEGER - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:instService - The instance service event state, 0: Normal, 1: Link Down, 2: Link Up, 3: Authentication Failure." - ::= { instance 9 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2 - parameter OBJECT IDENTIFIER ::= { hlr 2 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2 - system OBJECT IDENTIFIER ::= { parameter 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1 - cC OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..4)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:CC - Remark:Country Code" - ::= { system 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.2 - nDC OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..6)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:NDC - Remark:National Destination Code" - ::= { system 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.3 - startSN OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..12)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:SN Start - Remark:The beginning of the VLR SN range." - ::= { system 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.4 - endSN OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..12)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:SN End - Remark:The end of the VLR SN range." - ::= { system 4 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.5 - maxLicenses OBJECT-TYPE - SYNTAX INTEGER - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Name:Max License - Remark:(Read Only) The maximum subscriber capacity of HLR determined by License Control." - ::= { system 5 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.6 - usedLicenses OBJECT-TYPE - SYNTAX INTEGER - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Name:Used License - Remark:(Read Only) The number of registered HLR subscribers." - ::= { system 6 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.7 - provisionedSubs OBJECT-TYPE - SYNTAX INTEGER - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Name:Provisioned Users - Remark:(Read Only) The number of service enabled HLR subscribers." - ::= { system 7 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.8 - registeredSubs OBJECT-TYPE - SYNTAX INTEGER - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Name:Registered Users - Remark:(Read Only) The number of registered (both service enabled and disabled) HLR subscribers." - ::= { system 8 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.9 - roamingSubs OBJECT-TYPE - SYNTAX INTEGER - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Name:Roaming Users - Remark:(Read Only) The number of provisioned HLR subscribers currently roaming to VPLMNs." - ::= { system 9 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.10 - softwareVersion OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..16)) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Name:Software Version - Remark:(Read Only) Version of HLR software." - ::= { system 10 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.11 - dataVersion OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..16)) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Name:Data Version - Remark:(Read Only) Version of HLR subscriber data structure." - ::= { system 11 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.12 - cDRFlag OBJECT-TYPE - SYNTAX INTEGER - { - off(0), - on(1) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:CDR Flag - Remark:Enable or disable CDR generation of HLR." - ::= { system 12 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.13 - reloadState OBJECT-TYPE - SYNTAX INTEGER - { - idle(0), - reload(1) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:Reload State - Remark:Select reload to load backup HLR subscriber data from HLR server hard disk." - ::= { system 13 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.14 - saveParamCommand OBJECT-TYPE - SYNTAX INTEGER { saveParameter(1) } - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Remark:Save the HLR parameters residing in memory to harddisk." - ::= { system 14 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.15 - saveDataCommand OBJECT-TYPE - SYNTAX INTEGER { saveData(1) } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Remark:Save the HLR subscriber data to both HLR
harddisk and EMS database." - ::= { system 15 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.16 - saveUSSDParamCommand OBJECT-TYPE - SYNTAX INTEGER { saveUSSDParam(1) } - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Remark:Save the USSD parameters residing
in memory to harddisk." - ::= { system 16 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.17 - resetUSSDParamCommand OBJECT-TYPE - SYNTAX INTEGER { resetUSSDParam(1) } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Remark:Reload and activate all USSD
parameters to default values." - ::= { system 17 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.18 - importSubs OBJECT-TYPE - SYNTAX Opaque (SIZE (7)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Hidden Flag:Yes - OPAQUE DECODE RULE: - [unit]Command[u]00.0-00.7[u]select - [v]0[opt]Idle - [v]1[opt]Sending Command - [v]2[opt]In Processing - [v]3[opt]Succeeded - [v]4[opt]Failed - [unit]Total Numbers[u]01.0-03.7[u]input - [v]toDec-high-0 - [unit]Success Numbers[u]04.0-06.7[u]input - [v]toDec-high-0" - ::= { system 18 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2 - vPLMN OBJECT IDENTIFIER ::= { parameter 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1 - vPLMNTable OBJECT-TYPE - SYNTAX SEQUENCE OF VPLMNEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Description." - ::= { vPLMN 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1.1 - vPLMNEntry OBJECT-TYPE - SYNTAX VPLMNEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Description." - INDEX { vplmnIndex } - ::= { vPLMNTable 1 } - - - VPLMNEntry ::= - SEQUENCE { - vplmnIndex - INTEGER, - vplmnCC - OCTET STRING, - vplmnNDC - OCTET STRING, - vplmnStartSN - OCTET STRING, - vplmnEndSN - OCTET STRING, - vplmnRowStatus - RowStatus - } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1.1.1 - vplmnIndex OBJECT-TYPE - SYNTAX INTEGER (0..255) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Index - Remark:VPLMN index number ranges from 0 to 255." - ::= { vPLMNEntry 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1.1.2 - vplmnCC OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..4)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:CC - Remark:The Country Code of the VPLMN." - ::= { vPLMNEntry 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1.1.3 - vplmnNDC OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..6)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:NDC - Remark:The National Destination Code of the VPLMN." - ::= { vPLMNEntry 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1.1.4 - vplmnStartSN OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..12)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:SN Start - Remark:The beginning of the VLR range in the VPLMN." - ::= { vPLMNEntry 4 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1.1.5 - vplmnEndSN OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..12)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:SN End - Remark:The end of the VLR range in the VPLMN." - ::= { vPLMNEntry 5 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.2.1.1.6 - vplmnRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes" - ::= { vPLMNEntry 6 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3 - cSRRList OBJECT IDENTIFIER ::= { parameter 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3.1 - cSRR0 OBJECT-TYPE - SYNTAX Opaque (SIZE (32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "OPAQUE DECODE RULE: - [unit]VPLMN0[u]00.0-00.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN1[u]00.1-00.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN2[u]00.2-00.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN3[u]00.3-00.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN4[u]00.4-00.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN5[u]00.5-00.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN6[u]00.6-00.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN7[u]00.7-00.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN8[u]01.0-01.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN9[u]01.1-01.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN10[u]01.2-01.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN11[u]01.3-01.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN12[u]01.4-01.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN13[u]01.5-01.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN14[u]01.6-01.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN15[u]01.7-01.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN16[u]02.0-02.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN17[u]02.1-02.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN18[u]02.2-02.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN19[u]02.3-02.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN20[u]02.4-02.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN21[u]02.5-02.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN22[u]02.6-02.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN23[u]02.7-02.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN24[u]03.0-03.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN25[u]03.1-03.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN26[u]03.2-03.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN27[u]03.3-03.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN28[u]03.4-03.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN29[u]03.5-03.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN30[u]03.6-03.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN31[u]03.7-03.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN32[u]04.0-04.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN33[u]04.1-04.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN34[u]04.2-04.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN35[u]04.3-04.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN36[u]04.4-04.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN37[u]04.5-04.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN38[u]04.6-04.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN39[u]04.7-04.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN40[u]05.0-05.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN41[u]05.1-05.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN42[u]05.2-05.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN43[u]05.3-05.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN44[u]05.4-05.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN45[u]05.5-05.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN46[u]05.6-05.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN47[u]05.7-05.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN48[u]06.0-06.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN49[u]06.1-06.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN50[u]06.2-06.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN51[u]06.3-06.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN52[u]06.4-06.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN53[u]06.5-06.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN54[u]06.6-06.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN55[u]06.7-06.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN56[u]07.0-07.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN57[u]07.1-07.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN58[u]07.2-07.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN59[u]07.3-07.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN60[u]07.4-07.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN61[u]07.5-07.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN62[u]07.6-07.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN63[u]07.7-07.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN64[u]08.0-08.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN65[u]08.1-08.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN66[u]08.2-08.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN67[u]08.3-08.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN68[u]08.4-08.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN69[u]08.5-08.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN70[u]08.6-08.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN71[u]08.7-08.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN72[u]09.0-09.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN73[u]09.1-09.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN74[u]09.2-09.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN75[u]09.3-09.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN76[u]09.4-09.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN77[u]09.5-09.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN78[u]09.6-09.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN79[u]09.7-09.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN80[u]10.0-10.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN81[u]10.1-10.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN82[u]10.2-10.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN83[u]10.3-10.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN84[u]10.4-10.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN85[u]10.5-10.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN86[u]10.6-10.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN87[u]10.7-10.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN88[u]11.0-11.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN89[u]11.1-11.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN90[u]11.2-11.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN91[u]11.3-11.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN92[u]11.4-11.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN93[u]11.5-11.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN94[u]11.6-11.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN95[u]11.7-11.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN96[u]12.0-12.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN97[u]12.1-12.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN98[u]12.2-12.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN99[u]12.3-12.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN100[u]12.4-12.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN101[u]12.5-12.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN102[u]12.6-12.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN103[u]12.7-12.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN104[u]13.0-13.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN105[u]13.1-13.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN106[u]13.2-13.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN107[u]13.3-13.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN108[u]13.4-13.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN109[u]13.5-13.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN110[u]13.6-13.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN111[u]13.7-13.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN112[u]14.0-14.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN113[u]14.1-14.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN114[u]14.2-14.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN115[u]14.3-14.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN116[u]14.4-14.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN117[u]14.5-14.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN118[u]14.6-14.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN119[u]14.7-14.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN120[u]15.0-15.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN121[u]15.1-15.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN122[u]15.2-15.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN123[u]15.3-15.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN124[u]15.4-15.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN125[u]15.5-15.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN126[u]15.6-15.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN127[u]15.7-15.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN128[u]16.0-16.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN129[u]16.1-16.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN130[u]16.2-16.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN131[u]16.3-16.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN132[u]16.4-16.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN133[u]16.5-16.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN134[u]16.6-16.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN135[u]16.7-16.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN136[u]17.0-17.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN137[u]17.1-17.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN138[u]17.2-17.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN139[u]17.3-17.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN140[u]17.4-17.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN141[u]17.5-17.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN142[u]17.6-17.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN143[u]17.7-17.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN144[u]18.0-18.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN145[u]18.1-18.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN146[u]18.2-18.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN147[u]18.3-18.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN148[u]18.4-18.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN149[u]18.5-18.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN150[u]18.6-18.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN151[u]18.7-18.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN152[u]19.0-19.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN153[u]19.1-19.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN154[u]19.2-19.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN155[u]19.3-19.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN156[u]19.4-19.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN157[u]19.5-19.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN158[u]19.6-19.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN159[u]19.7-19.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN160[u]20.0-20.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN161[u]20.1-20.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN162[u]20.2-20.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN163[u]20.3-20.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN164[u]20.4-20.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN165[u]20.5-20.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN166[u]20.6-20.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN167[u]20.7-20.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN168[u]21.0-21.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN169[u]21.1-21.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN170[u]21.2-21.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN171[u]21.3-21.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN172[u]21.4-21.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN173[u]21.5-21.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN174[u]21.6-21.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN175[u]21.7-21.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN176[u]22.0-22.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN177[u]22.1-22.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN178[u]22.2-22.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN179[u]22.3-22.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN180[u]22.4-22.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN181[u]22.5-22.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN182[u]22.6-22.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN183[u]22.7-22.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN184[u]23.0-23.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN185[u]23.1-23.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN186[u]23.2-23.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN187[u]23.3-23.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN188[u]23.4-23.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN189[u]23.5-23.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN190[u]23.6-23.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN191[u]23.7-23.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN192[u]24.0-24.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN193[u]24.1-24.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN194[u]24.2-24.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN195[u]24.3-24.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN196[u]24.4-24.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN197[u]24.5-24.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN198[u]24.6-24.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN199[u]24.7-24.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN200[u]25.0-25.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN201[u]25.1-25.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN202[u]25.2-25.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN203[u]25.3-25.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN204[u]25.4-25.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN205[u]25.5-25.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN206[u]25.6-25.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN207[u]25.7-25.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN208[u]26.0-26.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN209[u]26.1-26.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN210[u]26.2-26.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN211[u]26.3-26.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN212[u]26.4-26.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN213[u]26.5-26.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN214[u]26.6-26.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN215[u]26.7-26.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN216[u]27.0-27.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN217[u]27.1-27.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN218[u]27.2-27.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN219[u]27.3-27.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN220[u]27.4-27.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN221[u]27.5-27.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN222[u]27.6-27.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN223[u]27.7-27.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN224[u]28.0-28.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN225[u]28.1-28.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN226[u]28.2-28.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN227[u]28.3-28.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN228[u]28.4-28.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN229[u]28.5-28.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN230[u]28.6-28.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN231[u]28.7-28.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN232[u]29.0-29.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN233[u]29.1-29.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN234[u]29.2-29.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN235[u]29.3-29.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN236[u]29.4-29.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN237[u]29.5-29.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN238[u]29.6-29.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN239[u]29.7-29.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN240[u]30.0-30.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN241[u]30.1-30.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN242[u]30.2-30.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN243[u]30.3-30.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN244[u]30.4-30.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN245[u]30.5-30.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN246[u]30.6-30.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN247[u]30.7-30.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN248[u]31.0-31.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN249[u]31.1-31.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN250[u]31.2-31.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN251[u]31.3-31.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN252[u]31.4-31.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN253[u]31.5-31.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN254[u]31.6-31.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN255[u]31.7-31.7[u]select - [v]0[opt]N - [v]1[opt]Y - [remark]
Define CSRR 0(country specific roaming restriction) lists to confine the roaming range of a subscriber.
The CSRR list defines the roaming restriction for 256 VPLMN ranges.
" - ::= { cSRRList 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3.2 - cSRR1 OBJECT-TYPE - SYNTAX Opaque (SIZE (32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "OPAQUE DECODE RULE: - [unit]VPLMN0[u]00.0-00.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN1[u]00.1-00.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN2[u]00.2-00.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN3[u]00.3-00.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN4[u]00.4-00.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN5[u]00.5-00.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN6[u]00.6-00.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN7[u]00.7-00.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN8[u]01.0-01.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN9[u]01.1-01.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN10[u]01.2-01.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN11[u]01.3-01.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN12[u]01.4-01.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN13[u]01.5-01.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN14[u]01.6-01.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN15[u]01.7-01.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN16[u]02.0-02.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN17[u]02.1-02.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN18[u]02.2-02.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN19[u]02.3-02.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN20[u]02.4-02.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN21[u]02.5-02.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN22[u]02.6-02.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN23[u]02.7-02.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN24[u]03.0-03.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN25[u]03.1-03.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN26[u]03.2-03.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN27[u]03.3-03.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN28[u]03.4-03.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN29[u]03.5-03.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN30[u]03.6-03.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN31[u]03.7-03.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN32[u]04.0-04.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN33[u]04.1-04.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN34[u]04.2-04.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN35[u]04.3-04.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN36[u]04.4-04.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN37[u]04.5-04.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN38[u]04.6-04.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN39[u]04.7-04.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN40[u]05.0-05.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN41[u]05.1-05.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN42[u]05.2-05.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN43[u]05.3-05.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN44[u]05.4-05.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN45[u]05.5-05.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN46[u]05.6-05.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN47[u]05.7-05.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN48[u]06.0-06.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN49[u]06.1-06.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN50[u]06.2-06.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN51[u]06.3-06.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN52[u]06.4-06.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN53[u]06.5-06.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN54[u]06.6-06.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN55[u]06.7-06.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN56[u]07.0-07.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN57[u]07.1-07.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN58[u]07.2-07.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN59[u]07.3-07.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN60[u]07.4-07.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN61[u]07.5-07.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN62[u]07.6-07.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN63[u]07.7-07.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN64[u]08.0-08.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN65[u]08.1-08.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN66[u]08.2-08.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN67[u]08.3-08.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN68[u]08.4-08.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN69[u]08.5-08.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN70[u]08.6-08.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN71[u]08.7-08.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN72[u]09.0-09.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN73[u]09.1-09.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN74[u]09.2-09.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN75[u]09.3-09.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN76[u]09.4-09.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN77[u]09.5-09.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN78[u]09.6-09.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN79[u]09.7-09.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN80[u]10.0-10.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN81[u]10.1-10.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN82[u]10.2-10.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN83[u]10.3-10.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN84[u]10.4-10.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN85[u]10.5-10.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN86[u]10.6-10.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN87[u]10.7-10.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN88[u]11.0-11.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN89[u]11.1-11.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN90[u]11.2-11.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN91[u]11.3-11.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN92[u]11.4-11.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN93[u]11.5-11.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN94[u]11.6-11.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN95[u]11.7-11.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN96[u]12.0-12.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN97[u]12.1-12.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN98[u]12.2-12.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN99[u]12.3-12.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN100[u]12.4-12.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN101[u]12.5-12.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN102[u]12.6-12.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN103[u]12.7-12.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN104[u]13.0-13.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN105[u]13.1-13.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN106[u]13.2-13.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN107[u]13.3-13.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN108[u]13.4-13.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN109[u]13.5-13.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN110[u]13.6-13.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN111[u]13.7-13.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN112[u]14.0-14.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN113[u]14.1-14.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN114[u]14.2-14.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN115[u]14.3-14.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN116[u]14.4-14.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN117[u]14.5-14.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN118[u]14.6-14.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN119[u]14.7-14.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN120[u]15.0-15.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN121[u]15.1-15.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN122[u]15.2-15.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN123[u]15.3-15.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN124[u]15.4-15.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN125[u]15.5-15.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN126[u]15.6-15.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN127[u]15.7-15.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN128[u]16.0-16.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN129[u]16.1-16.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN130[u]16.2-16.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN131[u]16.3-16.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN132[u]16.4-16.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN133[u]16.5-16.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN134[u]16.6-16.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN135[u]16.7-16.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN136[u]17.0-17.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN137[u]17.1-17.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN138[u]17.2-17.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN139[u]17.3-17.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN140[u]17.4-17.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN141[u]17.5-17.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN142[u]17.6-17.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN143[u]17.7-17.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN144[u]18.0-18.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN145[u]18.1-18.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN146[u]18.2-18.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN147[u]18.3-18.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN148[u]18.4-18.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN149[u]18.5-18.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN150[u]18.6-18.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN151[u]18.7-18.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN152[u]19.0-19.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN153[u]19.1-19.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN154[u]19.2-19.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN155[u]19.3-19.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN156[u]19.4-19.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN157[u]19.5-19.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN158[u]19.6-19.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN159[u]19.7-19.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN160[u]20.0-20.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN161[u]20.1-20.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN162[u]20.2-20.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN163[u]20.3-20.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN164[u]20.4-20.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN165[u]20.5-20.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN166[u]20.6-20.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN167[u]20.7-20.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN168[u]21.0-21.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN169[u]21.1-21.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN170[u]21.2-21.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN171[u]21.3-21.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN172[u]21.4-21.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN173[u]21.5-21.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN174[u]21.6-21.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN175[u]21.7-21.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN176[u]22.0-22.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN177[u]22.1-22.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN178[u]22.2-22.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN179[u]22.3-22.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN180[u]22.4-22.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN181[u]22.5-22.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN182[u]22.6-22.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN183[u]22.7-22.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN184[u]23.0-23.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN185[u]23.1-23.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN186[u]23.2-23.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN187[u]23.3-23.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN188[u]23.4-23.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN189[u]23.5-23.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN190[u]23.6-23.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN191[u]23.7-23.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN192[u]24.0-24.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN193[u]24.1-24.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN194[u]24.2-24.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN195[u]24.3-24.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN196[u]24.4-24.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN197[u]24.5-24.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN198[u]24.6-24.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN199[u]24.7-24.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN200[u]25.0-25.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN201[u]25.1-25.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN202[u]25.2-25.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN203[u]25.3-25.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN204[u]25.4-25.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN205[u]25.5-25.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN206[u]25.6-25.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN207[u]25.7-25.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN208[u]26.0-26.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN209[u]26.1-26.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN210[u]26.2-26.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN211[u]26.3-26.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN212[u]26.4-26.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN213[u]26.5-26.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN214[u]26.6-26.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN215[u]26.7-26.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN216[u]27.0-27.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN217[u]27.1-27.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN218[u]27.2-27.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN219[u]27.3-27.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN220[u]27.4-27.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN221[u]27.5-27.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN222[u]27.6-27.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN223[u]27.7-27.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN224[u]28.0-28.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN225[u]28.1-28.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN226[u]28.2-28.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN227[u]28.3-28.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN228[u]28.4-28.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN229[u]28.5-28.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN230[u]28.6-28.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN231[u]28.7-28.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN232[u]29.0-29.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN233[u]29.1-29.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN234[u]29.2-29.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN235[u]29.3-29.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN236[u]29.4-29.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN237[u]29.5-29.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN238[u]29.6-29.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN239[u]29.7-29.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN240[u]30.0-30.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN241[u]30.1-30.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN242[u]30.2-30.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN243[u]30.3-30.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN244[u]30.4-30.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN245[u]30.5-30.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN246[u]30.6-30.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN247[u]30.7-30.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN248[u]31.0-31.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN249[u]31.1-31.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN250[u]31.2-31.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN251[u]31.3-31.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN252[u]31.4-31.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN253[u]31.5-31.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN254[u]31.6-31.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN255[u]31.7-31.7[u]select - [v]0[opt]N - [v]1[opt]Y - [remark]
Define CSRR 1(country specific roaming restriction) lists to confine the roaming range of a subscriber.
The CSRR list defines the roaming restriction for 256 VPLMN ranges.
" - ::= { cSRRList 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3.3 - cSRR2 OBJECT-TYPE - SYNTAX Opaque (SIZE (32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "OPAQUE DECODE RULE: - [unit]VPLMN0[u]00.0-00.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN1[u]00.1-00.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN2[u]00.2-00.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN3[u]00.3-00.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN4[u]00.4-00.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN5[u]00.5-00.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN6[u]00.6-00.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN7[u]00.7-00.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN8[u]01.0-01.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN9[u]01.1-01.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN10[u]01.2-01.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN11[u]01.3-01.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN12[u]01.4-01.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN13[u]01.5-01.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN14[u]01.6-01.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN15[u]01.7-01.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN16[u]02.0-02.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN17[u]02.1-02.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN18[u]02.2-02.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN19[u]02.3-02.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN20[u]02.4-02.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN21[u]02.5-02.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN22[u]02.6-02.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN23[u]02.7-02.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN24[u]03.0-03.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN25[u]03.1-03.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN26[u]03.2-03.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN27[u]03.3-03.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN28[u]03.4-03.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN29[u]03.5-03.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN30[u]03.6-03.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN31[u]03.7-03.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN32[u]04.0-04.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN33[u]04.1-04.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN34[u]04.2-04.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN35[u]04.3-04.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN36[u]04.4-04.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN37[u]04.5-04.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN38[u]04.6-04.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN39[u]04.7-04.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN40[u]05.0-05.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN41[u]05.1-05.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN42[u]05.2-05.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN43[u]05.3-05.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN44[u]05.4-05.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN45[u]05.5-05.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN46[u]05.6-05.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN47[u]05.7-05.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN48[u]06.0-06.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN49[u]06.1-06.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN50[u]06.2-06.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN51[u]06.3-06.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN52[u]06.4-06.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN53[u]06.5-06.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN54[u]06.6-06.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN55[u]06.7-06.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN56[u]07.0-07.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN57[u]07.1-07.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN58[u]07.2-07.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN59[u]07.3-07.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN60[u]07.4-07.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN61[u]07.5-07.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN62[u]07.6-07.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN63[u]07.7-07.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN64[u]08.0-08.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN65[u]08.1-08.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN66[u]08.2-08.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN67[u]08.3-08.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN68[u]08.4-08.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN69[u]08.5-08.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN70[u]08.6-08.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN71[u]08.7-08.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN72[u]09.0-09.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN73[u]09.1-09.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN74[u]09.2-09.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN75[u]09.3-09.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN76[u]09.4-09.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN77[u]09.5-09.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN78[u]09.6-09.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN79[u]09.7-09.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN80[u]10.0-10.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN81[u]10.1-10.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN82[u]10.2-10.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN83[u]10.3-10.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN84[u]10.4-10.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN85[u]10.5-10.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN86[u]10.6-10.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN87[u]10.7-10.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN88[u]11.0-11.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN89[u]11.1-11.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN90[u]11.2-11.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN91[u]11.3-11.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN92[u]11.4-11.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN93[u]11.5-11.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN94[u]11.6-11.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN95[u]11.7-11.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN96[u]12.0-12.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN97[u]12.1-12.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN98[u]12.2-12.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN99[u]12.3-12.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN100[u]12.4-12.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN101[u]12.5-12.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN102[u]12.6-12.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN103[u]12.7-12.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN104[u]13.0-13.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN105[u]13.1-13.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN106[u]13.2-13.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN107[u]13.3-13.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN108[u]13.4-13.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN109[u]13.5-13.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN110[u]13.6-13.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN111[u]13.7-13.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN112[u]14.0-14.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN113[u]14.1-14.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN114[u]14.2-14.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN115[u]14.3-14.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN116[u]14.4-14.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN117[u]14.5-14.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN118[u]14.6-14.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN119[u]14.7-14.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN120[u]15.0-15.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN121[u]15.1-15.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN122[u]15.2-15.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN123[u]15.3-15.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN124[u]15.4-15.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN125[u]15.5-15.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN126[u]15.6-15.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN127[u]15.7-15.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN128[u]16.0-16.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN129[u]16.1-16.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN130[u]16.2-16.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN131[u]16.3-16.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN132[u]16.4-16.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN133[u]16.5-16.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN134[u]16.6-16.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN135[u]16.7-16.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN136[u]17.0-17.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN137[u]17.1-17.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN138[u]17.2-17.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN139[u]17.3-17.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN140[u]17.4-17.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN141[u]17.5-17.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN142[u]17.6-17.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN143[u]17.7-17.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN144[u]18.0-18.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN145[u]18.1-18.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN146[u]18.2-18.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN147[u]18.3-18.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN148[u]18.4-18.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN149[u]18.5-18.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN150[u]18.6-18.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN151[u]18.7-18.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN152[u]19.0-19.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN153[u]19.1-19.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN154[u]19.2-19.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN155[u]19.3-19.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN156[u]19.4-19.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN157[u]19.5-19.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN158[u]19.6-19.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN159[u]19.7-19.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN160[u]20.0-20.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN161[u]20.1-20.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN162[u]20.2-20.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN163[u]20.3-20.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN164[u]20.4-20.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN165[u]20.5-20.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN166[u]20.6-20.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN167[u]20.7-20.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN168[u]21.0-21.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN169[u]21.1-21.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN170[u]21.2-21.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN171[u]21.3-21.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN172[u]21.4-21.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN173[u]21.5-21.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN174[u]21.6-21.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN175[u]21.7-21.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN176[u]22.0-22.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN177[u]22.1-22.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN178[u]22.2-22.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN179[u]22.3-22.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN180[u]22.4-22.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN181[u]22.5-22.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN182[u]22.6-22.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN183[u]22.7-22.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN184[u]23.0-23.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN185[u]23.1-23.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN186[u]23.2-23.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN187[u]23.3-23.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN188[u]23.4-23.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN189[u]23.5-23.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN190[u]23.6-23.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN191[u]23.7-23.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN192[u]24.0-24.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN193[u]24.1-24.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN194[u]24.2-24.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN195[u]24.3-24.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN196[u]24.4-24.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN197[u]24.5-24.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN198[u]24.6-24.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN199[u]24.7-24.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN200[u]25.0-25.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN201[u]25.1-25.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN202[u]25.2-25.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN203[u]25.3-25.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN204[u]25.4-25.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN205[u]25.5-25.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN206[u]25.6-25.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN207[u]25.7-25.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN208[u]26.0-26.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN209[u]26.1-26.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN210[u]26.2-26.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN211[u]26.3-26.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN212[u]26.4-26.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN213[u]26.5-26.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN214[u]26.6-26.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN215[u]26.7-26.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN216[u]27.0-27.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN217[u]27.1-27.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN218[u]27.2-27.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN219[u]27.3-27.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN220[u]27.4-27.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN221[u]27.5-27.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN222[u]27.6-27.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN223[u]27.7-27.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN224[u]28.0-28.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN225[u]28.1-28.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN226[u]28.2-28.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN227[u]28.3-28.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN228[u]28.4-28.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN229[u]28.5-28.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN230[u]28.6-28.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN231[u]28.7-28.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN232[u]29.0-29.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN233[u]29.1-29.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN234[u]29.2-29.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN235[u]29.3-29.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN236[u]29.4-29.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN237[u]29.5-29.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN238[u]29.6-29.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN239[u]29.7-29.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN240[u]30.0-30.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN241[u]30.1-30.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN242[u]30.2-30.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN243[u]30.3-30.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN244[u]30.4-30.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN245[u]30.5-30.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN246[u]30.6-30.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN247[u]30.7-30.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN248[u]31.0-31.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN249[u]31.1-31.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN250[u]31.2-31.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN251[u]31.3-31.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN252[u]31.4-31.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN253[u]31.5-31.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN254[u]31.6-31.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN255[u]31.7-31.7[u]select - [v]0[opt]N - [v]1[opt]Y - [remark]
Define CSRR 2(country specific roaming restriction) lists to confine the roaming range of a subscriber.
The CSRR list defines the roaming restriction for 256 VPLMN ranges.
" - ::= { cSRRList 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3.4 - cSRR3 OBJECT-TYPE - SYNTAX Opaque (SIZE (32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "OPAQUE DECODE RULE: - [unit]VPLMN0[u]00.0-00.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN1[u]00.1-00.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN2[u]00.2-00.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN3[u]00.3-00.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN4[u]00.4-00.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN5[u]00.5-00.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN6[u]00.6-00.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN7[u]00.7-00.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN8[u]01.0-01.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN9[u]01.1-01.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN10[u]01.2-01.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN11[u]01.3-01.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN12[u]01.4-01.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN13[u]01.5-01.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN14[u]01.6-01.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN15[u]01.7-01.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN16[u]02.0-02.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN17[u]02.1-02.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN18[u]02.2-02.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN19[u]02.3-02.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN20[u]02.4-02.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN21[u]02.5-02.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN22[u]02.6-02.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN23[u]02.7-02.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN24[u]03.0-03.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN25[u]03.1-03.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN26[u]03.2-03.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN27[u]03.3-03.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN28[u]03.4-03.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN29[u]03.5-03.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN30[u]03.6-03.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN31[u]03.7-03.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN32[u]04.0-04.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN33[u]04.1-04.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN34[u]04.2-04.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN35[u]04.3-04.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN36[u]04.4-04.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN37[u]04.5-04.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN38[u]04.6-04.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN39[u]04.7-04.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN40[u]05.0-05.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN41[u]05.1-05.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN42[u]05.2-05.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN43[u]05.3-05.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN44[u]05.4-05.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN45[u]05.5-05.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN46[u]05.6-05.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN47[u]05.7-05.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN48[u]06.0-06.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN49[u]06.1-06.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN50[u]06.2-06.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN51[u]06.3-06.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN52[u]06.4-06.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN53[u]06.5-06.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN54[u]06.6-06.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN55[u]06.7-06.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN56[u]07.0-07.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN57[u]07.1-07.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN58[u]07.2-07.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN59[u]07.3-07.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN60[u]07.4-07.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN61[u]07.5-07.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN62[u]07.6-07.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN63[u]07.7-07.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN64[u]08.0-08.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN65[u]08.1-08.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN66[u]08.2-08.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN67[u]08.3-08.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN68[u]08.4-08.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN69[u]08.5-08.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN70[u]08.6-08.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN71[u]08.7-08.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN72[u]09.0-09.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN73[u]09.1-09.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN74[u]09.2-09.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN75[u]09.3-09.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN76[u]09.4-09.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN77[u]09.5-09.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN78[u]09.6-09.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN79[u]09.7-09.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN80[u]10.0-10.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN81[u]10.1-10.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN82[u]10.2-10.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN83[u]10.3-10.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN84[u]10.4-10.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN85[u]10.5-10.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN86[u]10.6-10.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN87[u]10.7-10.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN88[u]11.0-11.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN89[u]11.1-11.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN90[u]11.2-11.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN91[u]11.3-11.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN92[u]11.4-11.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN93[u]11.5-11.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN94[u]11.6-11.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN95[u]11.7-11.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN96[u]12.0-12.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN97[u]12.1-12.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN98[u]12.2-12.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN99[u]12.3-12.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN100[u]12.4-12.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN101[u]12.5-12.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN102[u]12.6-12.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN103[u]12.7-12.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN104[u]13.0-13.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN105[u]13.1-13.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN106[u]13.2-13.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN107[u]13.3-13.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN108[u]13.4-13.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN109[u]13.5-13.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN110[u]13.6-13.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN111[u]13.7-13.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN112[u]14.0-14.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN113[u]14.1-14.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN114[u]14.2-14.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN115[u]14.3-14.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN116[u]14.4-14.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN117[u]14.5-14.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN118[u]14.6-14.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN119[u]14.7-14.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN120[u]15.0-15.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN121[u]15.1-15.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN122[u]15.2-15.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN123[u]15.3-15.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN124[u]15.4-15.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN125[u]15.5-15.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN126[u]15.6-15.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN127[u]15.7-15.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN128[u]16.0-16.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN129[u]16.1-16.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN130[u]16.2-16.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN131[u]16.3-16.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN132[u]16.4-16.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN133[u]16.5-16.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN134[u]16.6-16.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN135[u]16.7-16.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN136[u]17.0-17.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN137[u]17.1-17.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN138[u]17.2-17.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN139[u]17.3-17.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN140[u]17.4-17.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN141[u]17.5-17.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN142[u]17.6-17.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN143[u]17.7-17.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN144[u]18.0-18.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN145[u]18.1-18.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN146[u]18.2-18.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN147[u]18.3-18.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN148[u]18.4-18.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN149[u]18.5-18.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN150[u]18.6-18.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN151[u]18.7-18.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN152[u]19.0-19.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN153[u]19.1-19.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN154[u]19.2-19.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN155[u]19.3-19.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN156[u]19.4-19.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN157[u]19.5-19.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN158[u]19.6-19.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN159[u]19.7-19.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN160[u]20.0-20.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN161[u]20.1-20.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN162[u]20.2-20.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN163[u]20.3-20.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN164[u]20.4-20.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN165[u]20.5-20.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN166[u]20.6-20.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN167[u]20.7-20.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN168[u]21.0-21.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN169[u]21.1-21.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN170[u]21.2-21.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN171[u]21.3-21.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN172[u]21.4-21.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN173[u]21.5-21.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN174[u]21.6-21.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN175[u]21.7-21.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN176[u]22.0-22.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN177[u]22.1-22.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN178[u]22.2-22.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN179[u]22.3-22.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN180[u]22.4-22.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN181[u]22.5-22.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN182[u]22.6-22.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN183[u]22.7-22.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN184[u]23.0-23.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN185[u]23.1-23.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN186[u]23.2-23.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN187[u]23.3-23.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN188[u]23.4-23.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN189[u]23.5-23.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN190[u]23.6-23.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN191[u]23.7-23.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN192[u]24.0-24.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN193[u]24.1-24.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN194[u]24.2-24.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN195[u]24.3-24.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN196[u]24.4-24.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN197[u]24.5-24.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN198[u]24.6-24.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN199[u]24.7-24.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN200[u]25.0-25.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN201[u]25.1-25.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN202[u]25.2-25.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN203[u]25.3-25.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN204[u]25.4-25.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN205[u]25.5-25.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN206[u]25.6-25.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN207[u]25.7-25.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN208[u]26.0-26.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN209[u]26.1-26.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN210[u]26.2-26.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN211[u]26.3-26.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN212[u]26.4-26.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN213[u]26.5-26.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN214[u]26.6-26.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN215[u]26.7-26.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN216[u]27.0-27.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN217[u]27.1-27.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN218[u]27.2-27.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN219[u]27.3-27.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN220[u]27.4-27.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN221[u]27.5-27.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN222[u]27.6-27.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN223[u]27.7-27.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN224[u]28.0-28.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN225[u]28.1-28.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN226[u]28.2-28.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN227[u]28.3-28.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN228[u]28.4-28.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN229[u]28.5-28.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN230[u]28.6-28.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN231[u]28.7-28.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN232[u]29.0-29.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN233[u]29.1-29.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN234[u]29.2-29.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN235[u]29.3-29.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN236[u]29.4-29.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN237[u]29.5-29.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN238[u]29.6-29.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN239[u]29.7-29.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN240[u]30.0-30.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN241[u]30.1-30.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN242[u]30.2-30.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN243[u]30.3-30.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN244[u]30.4-30.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN245[u]30.5-30.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN246[u]30.6-30.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN247[u]30.7-30.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN248[u]31.0-31.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN249[u]31.1-31.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN250[u]31.2-31.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN251[u]31.3-31.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN252[u]31.4-31.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN253[u]31.5-31.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN254[u]31.6-31.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN255[u]31.7-31.7[u]select - [v]0[opt]N - [v]1[opt]Y - [remark]
Define CSRR 3(country specific roaming restriction) lists to confine the roaming range of a subscriber.
The CSRR list defines the roaming restriction for 256 VPLMN ranges.
" - ::= { cSRRList 4 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3.5 - cSRR4 OBJECT-TYPE - SYNTAX Opaque (SIZE (32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "OPAQUE DECODE RULE: - [unit]VPLMN0[u]00.0-00.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN1[u]00.1-00.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN2[u]00.2-00.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN3[u]00.3-00.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN4[u]00.4-00.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN5[u]00.5-00.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN6[u]00.6-00.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN7[u]00.7-00.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN8[u]01.0-01.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN9[u]01.1-01.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN10[u]01.2-01.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN11[u]01.3-01.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN12[u]01.4-01.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN13[u]01.5-01.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN14[u]01.6-01.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN15[u]01.7-01.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN16[u]02.0-02.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN17[u]02.1-02.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN18[u]02.2-02.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN19[u]02.3-02.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN20[u]02.4-02.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN21[u]02.5-02.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN22[u]02.6-02.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN23[u]02.7-02.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN24[u]03.0-03.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN25[u]03.1-03.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN26[u]03.2-03.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN27[u]03.3-03.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN28[u]03.4-03.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN29[u]03.5-03.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN30[u]03.6-03.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN31[u]03.7-03.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN32[u]04.0-04.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN33[u]04.1-04.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN34[u]04.2-04.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN35[u]04.3-04.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN36[u]04.4-04.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN37[u]04.5-04.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN38[u]04.6-04.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN39[u]04.7-04.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN40[u]05.0-05.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN41[u]05.1-05.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN42[u]05.2-05.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN43[u]05.3-05.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN44[u]05.4-05.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN45[u]05.5-05.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN46[u]05.6-05.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN47[u]05.7-05.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN48[u]06.0-06.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN49[u]06.1-06.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN50[u]06.2-06.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN51[u]06.3-06.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN52[u]06.4-06.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN53[u]06.5-06.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN54[u]06.6-06.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN55[u]06.7-06.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN56[u]07.0-07.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN57[u]07.1-07.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN58[u]07.2-07.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN59[u]07.3-07.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN60[u]07.4-07.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN61[u]07.5-07.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN62[u]07.6-07.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN63[u]07.7-07.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN64[u]08.0-08.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN65[u]08.1-08.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN66[u]08.2-08.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN67[u]08.3-08.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN68[u]08.4-08.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN69[u]08.5-08.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN70[u]08.6-08.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN71[u]08.7-08.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN72[u]09.0-09.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN73[u]09.1-09.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN74[u]09.2-09.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN75[u]09.3-09.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN76[u]09.4-09.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN77[u]09.5-09.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN78[u]09.6-09.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN79[u]09.7-09.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN80[u]10.0-10.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN81[u]10.1-10.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN82[u]10.2-10.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN83[u]10.3-10.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN84[u]10.4-10.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN85[u]10.5-10.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN86[u]10.6-10.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN87[u]10.7-10.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN88[u]11.0-11.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN89[u]11.1-11.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN90[u]11.2-11.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN91[u]11.3-11.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN92[u]11.4-11.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN93[u]11.5-11.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN94[u]11.6-11.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN95[u]11.7-11.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN96[u]12.0-12.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN97[u]12.1-12.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN98[u]12.2-12.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN99[u]12.3-12.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN100[u]12.4-12.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN101[u]12.5-12.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN102[u]12.6-12.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN103[u]12.7-12.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN104[u]13.0-13.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN105[u]13.1-13.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN106[u]13.2-13.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN107[u]13.3-13.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN108[u]13.4-13.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN109[u]13.5-13.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN110[u]13.6-13.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN111[u]13.7-13.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN112[u]14.0-14.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN113[u]14.1-14.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN114[u]14.2-14.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN115[u]14.3-14.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN116[u]14.4-14.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN117[u]14.5-14.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN118[u]14.6-14.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN119[u]14.7-14.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN120[u]15.0-15.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN121[u]15.1-15.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN122[u]15.2-15.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN123[u]15.3-15.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN124[u]15.4-15.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN125[u]15.5-15.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN126[u]15.6-15.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN127[u]15.7-15.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN128[u]16.0-16.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN129[u]16.1-16.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN130[u]16.2-16.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN131[u]16.3-16.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN132[u]16.4-16.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN133[u]16.5-16.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN134[u]16.6-16.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN135[u]16.7-16.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN136[u]17.0-17.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN137[u]17.1-17.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN138[u]17.2-17.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN139[u]17.3-17.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN140[u]17.4-17.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN141[u]17.5-17.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN142[u]17.6-17.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN143[u]17.7-17.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN144[u]18.0-18.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN145[u]18.1-18.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN146[u]18.2-18.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN147[u]18.3-18.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN148[u]18.4-18.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN149[u]18.5-18.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN150[u]18.6-18.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN151[u]18.7-18.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN152[u]19.0-19.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN153[u]19.1-19.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN154[u]19.2-19.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN155[u]19.3-19.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN156[u]19.4-19.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN157[u]19.5-19.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN158[u]19.6-19.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN159[u]19.7-19.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN160[u]20.0-20.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN161[u]20.1-20.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN162[u]20.2-20.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN163[u]20.3-20.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN164[u]20.4-20.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN165[u]20.5-20.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN166[u]20.6-20.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN167[u]20.7-20.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN168[u]21.0-21.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN169[u]21.1-21.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN170[u]21.2-21.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN171[u]21.3-21.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN172[u]21.4-21.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN173[u]21.5-21.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN174[u]21.6-21.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN175[u]21.7-21.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN176[u]22.0-22.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN177[u]22.1-22.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN178[u]22.2-22.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN179[u]22.3-22.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN180[u]22.4-22.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN181[u]22.5-22.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN182[u]22.6-22.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN183[u]22.7-22.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN184[u]23.0-23.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN185[u]23.1-23.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN186[u]23.2-23.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN187[u]23.3-23.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN188[u]23.4-23.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN189[u]23.5-23.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN190[u]23.6-23.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN191[u]23.7-23.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN192[u]24.0-24.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN193[u]24.1-24.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN194[u]24.2-24.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN195[u]24.3-24.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN196[u]24.4-24.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN197[u]24.5-24.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN198[u]24.6-24.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN199[u]24.7-24.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN200[u]25.0-25.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN201[u]25.1-25.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN202[u]25.2-25.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN203[u]25.3-25.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN204[u]25.4-25.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN205[u]25.5-25.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN206[u]25.6-25.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN207[u]25.7-25.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN208[u]26.0-26.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN209[u]26.1-26.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN210[u]26.2-26.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN211[u]26.3-26.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN212[u]26.4-26.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN213[u]26.5-26.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN214[u]26.6-26.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN215[u]26.7-26.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN216[u]27.0-27.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN217[u]27.1-27.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN218[u]27.2-27.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN219[u]27.3-27.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN220[u]27.4-27.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN221[u]27.5-27.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN222[u]27.6-27.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN223[u]27.7-27.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN224[u]28.0-28.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN225[u]28.1-28.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN226[u]28.2-28.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN227[u]28.3-28.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN228[u]28.4-28.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN229[u]28.5-28.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN230[u]28.6-28.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN231[u]28.7-28.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN232[u]29.0-29.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN233[u]29.1-29.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN234[u]29.2-29.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN235[u]29.3-29.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN236[u]29.4-29.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN237[u]29.5-29.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN238[u]29.6-29.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN239[u]29.7-29.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN240[u]30.0-30.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN241[u]30.1-30.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN242[u]30.2-30.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN243[u]30.3-30.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN244[u]30.4-30.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN245[u]30.5-30.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN246[u]30.6-30.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN247[u]30.7-30.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN248[u]31.0-31.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN249[u]31.1-31.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN250[u]31.2-31.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN251[u]31.3-31.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN252[u]31.4-31.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN253[u]31.5-31.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN254[u]31.6-31.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN255[u]31.7-31.7[u]select - [v]0[opt]N - [v]1[opt]Y - [remark]
Define CSRR 4(country specific roaming restriction) lists to confine the roaming range of a subscriber.
The CSRR list defines the roaming restriction for 256 VPLMN ranges.
" - ::= { cSRRList 5 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3.6 - cSRR5 OBJECT-TYPE - SYNTAX Opaque (SIZE (32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "OPAQUE DECODE RULE: - [unit]VPLMN0[u]00.0-00.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN1[u]00.1-00.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN2[u]00.2-00.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN3[u]00.3-00.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN4[u]00.4-00.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN5[u]00.5-00.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN6[u]00.6-00.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN7[u]00.7-00.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN8[u]01.0-01.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN9[u]01.1-01.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN10[u]01.2-01.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN11[u]01.3-01.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN12[u]01.4-01.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN13[u]01.5-01.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN14[u]01.6-01.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN15[u]01.7-01.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN16[u]02.0-02.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN17[u]02.1-02.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN18[u]02.2-02.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN19[u]02.3-02.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN20[u]02.4-02.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN21[u]02.5-02.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN22[u]02.6-02.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN23[u]02.7-02.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN24[u]03.0-03.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN25[u]03.1-03.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN26[u]03.2-03.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN27[u]03.3-03.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN28[u]03.4-03.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN29[u]03.5-03.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN30[u]03.6-03.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN31[u]03.7-03.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN32[u]04.0-04.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN33[u]04.1-04.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN34[u]04.2-04.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN35[u]04.3-04.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN36[u]04.4-04.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN37[u]04.5-04.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN38[u]04.6-04.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN39[u]04.7-04.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN40[u]05.0-05.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN41[u]05.1-05.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN42[u]05.2-05.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN43[u]05.3-05.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN44[u]05.4-05.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN45[u]05.5-05.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN46[u]05.6-05.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN47[u]05.7-05.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN48[u]06.0-06.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN49[u]06.1-06.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN50[u]06.2-06.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN51[u]06.3-06.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN52[u]06.4-06.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN53[u]06.5-06.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN54[u]06.6-06.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN55[u]06.7-06.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN56[u]07.0-07.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN57[u]07.1-07.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN58[u]07.2-07.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN59[u]07.3-07.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN60[u]07.4-07.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN61[u]07.5-07.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN62[u]07.6-07.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN63[u]07.7-07.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN64[u]08.0-08.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN65[u]08.1-08.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN66[u]08.2-08.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN67[u]08.3-08.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN68[u]08.4-08.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN69[u]08.5-08.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN70[u]08.6-08.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN71[u]08.7-08.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN72[u]09.0-09.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN73[u]09.1-09.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN74[u]09.2-09.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN75[u]09.3-09.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN76[u]09.4-09.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN77[u]09.5-09.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN78[u]09.6-09.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN79[u]09.7-09.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN80[u]10.0-10.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN81[u]10.1-10.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN82[u]10.2-10.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN83[u]10.3-10.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN84[u]10.4-10.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN85[u]10.5-10.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN86[u]10.6-10.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN87[u]10.7-10.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN88[u]11.0-11.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN89[u]11.1-11.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN90[u]11.2-11.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN91[u]11.3-11.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN92[u]11.4-11.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN93[u]11.5-11.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN94[u]11.6-11.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN95[u]11.7-11.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN96[u]12.0-12.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN97[u]12.1-12.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN98[u]12.2-12.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN99[u]12.3-12.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN100[u]12.4-12.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN101[u]12.5-12.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN102[u]12.6-12.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN103[u]12.7-12.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN104[u]13.0-13.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN105[u]13.1-13.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN106[u]13.2-13.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN107[u]13.3-13.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN108[u]13.4-13.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN109[u]13.5-13.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN110[u]13.6-13.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN111[u]13.7-13.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN112[u]14.0-14.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN113[u]14.1-14.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN114[u]14.2-14.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN115[u]14.3-14.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN116[u]14.4-14.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN117[u]14.5-14.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN118[u]14.6-14.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN119[u]14.7-14.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN120[u]15.0-15.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN121[u]15.1-15.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN122[u]15.2-15.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN123[u]15.3-15.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN124[u]15.4-15.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN125[u]15.5-15.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN126[u]15.6-15.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN127[u]15.7-15.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN128[u]16.0-16.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN129[u]16.1-16.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN130[u]16.2-16.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN131[u]16.3-16.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN132[u]16.4-16.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN133[u]16.5-16.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN134[u]16.6-16.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN135[u]16.7-16.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN136[u]17.0-17.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN137[u]17.1-17.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN138[u]17.2-17.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN139[u]17.3-17.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN140[u]17.4-17.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN141[u]17.5-17.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN142[u]17.6-17.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN143[u]17.7-17.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN144[u]18.0-18.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN145[u]18.1-18.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN146[u]18.2-18.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN147[u]18.3-18.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN148[u]18.4-18.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN149[u]18.5-18.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN150[u]18.6-18.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN151[u]18.7-18.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN152[u]19.0-19.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN153[u]19.1-19.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN154[u]19.2-19.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN155[u]19.3-19.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN156[u]19.4-19.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN157[u]19.5-19.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN158[u]19.6-19.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN159[u]19.7-19.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN160[u]20.0-20.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN161[u]20.1-20.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN162[u]20.2-20.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN163[u]20.3-20.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN164[u]20.4-20.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN165[u]20.5-20.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN166[u]20.6-20.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN167[u]20.7-20.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN168[u]21.0-21.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN169[u]21.1-21.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN170[u]21.2-21.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN171[u]21.3-21.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN172[u]21.4-21.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN173[u]21.5-21.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN174[u]21.6-21.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN175[u]21.7-21.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN176[u]22.0-22.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN177[u]22.1-22.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN178[u]22.2-22.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN179[u]22.3-22.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN180[u]22.4-22.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN181[u]22.5-22.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN182[u]22.6-22.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN183[u]22.7-22.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN184[u]23.0-23.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN185[u]23.1-23.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN186[u]23.2-23.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN187[u]23.3-23.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN188[u]23.4-23.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN189[u]23.5-23.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN190[u]23.6-23.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN191[u]23.7-23.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN192[u]24.0-24.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN193[u]24.1-24.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN194[u]24.2-24.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN195[u]24.3-24.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN196[u]24.4-24.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN197[u]24.5-24.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN198[u]24.6-24.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN199[u]24.7-24.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN200[u]25.0-25.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN201[u]25.1-25.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN202[u]25.2-25.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN203[u]25.3-25.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN204[u]25.4-25.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN205[u]25.5-25.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN206[u]25.6-25.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN207[u]25.7-25.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN208[u]26.0-26.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN209[u]26.1-26.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN210[u]26.2-26.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN211[u]26.3-26.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN212[u]26.4-26.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN213[u]26.5-26.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN214[u]26.6-26.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN215[u]26.7-26.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN216[u]27.0-27.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN217[u]27.1-27.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN218[u]27.2-27.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN219[u]27.3-27.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN220[u]27.4-27.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN221[u]27.5-27.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN222[u]27.6-27.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN223[u]27.7-27.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN224[u]28.0-28.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN225[u]28.1-28.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN226[u]28.2-28.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN227[u]28.3-28.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN228[u]28.4-28.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN229[u]28.5-28.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN230[u]28.6-28.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN231[u]28.7-28.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN232[u]29.0-29.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN233[u]29.1-29.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN234[u]29.2-29.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN235[u]29.3-29.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN236[u]29.4-29.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN237[u]29.5-29.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN238[u]29.6-29.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN239[u]29.7-29.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN240[u]30.0-30.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN241[u]30.1-30.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN242[u]30.2-30.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN243[u]30.3-30.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN244[u]30.4-30.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN245[u]30.5-30.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN246[u]30.6-30.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN247[u]30.7-30.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN248[u]31.0-31.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN249[u]31.1-31.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN250[u]31.2-31.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN251[u]31.3-31.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN252[u]31.4-31.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN253[u]31.5-31.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN254[u]31.6-31.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN255[u]31.7-31.7[u]select - [v]0[opt]N - [v]1[opt]Y - [remark]
Define CSRR 5(country specific roaming restriction) lists to confine the roaming range of a subscriber.
The CSRR list defines the roaming restriction for 256 VPLMN ranges.
" - ::= { cSRRList 6 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3.7 - cSRR6 OBJECT-TYPE - SYNTAX Opaque (SIZE (32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "OPAQUE DECODE RULE: - [unit]VPLMN0[u]00.0-00.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN1[u]00.1-00.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN2[u]00.2-00.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN3[u]00.3-00.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN4[u]00.4-00.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN5[u]00.5-00.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN6[u]00.6-00.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN7[u]00.7-00.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN8[u]01.0-01.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN9[u]01.1-01.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN10[u]01.2-01.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN11[u]01.3-01.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN12[u]01.4-01.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN13[u]01.5-01.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN14[u]01.6-01.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN15[u]01.7-01.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN16[u]02.0-02.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN17[u]02.1-02.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN18[u]02.2-02.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN19[u]02.3-02.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN20[u]02.4-02.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN21[u]02.5-02.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN22[u]02.6-02.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN23[u]02.7-02.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN24[u]03.0-03.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN25[u]03.1-03.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN26[u]03.2-03.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN27[u]03.3-03.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN28[u]03.4-03.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN29[u]03.5-03.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN30[u]03.6-03.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN31[u]03.7-03.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN32[u]04.0-04.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN33[u]04.1-04.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN34[u]04.2-04.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN35[u]04.3-04.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN36[u]04.4-04.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN37[u]04.5-04.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN38[u]04.6-04.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN39[u]04.7-04.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN40[u]05.0-05.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN41[u]05.1-05.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN42[u]05.2-05.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN43[u]05.3-05.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN44[u]05.4-05.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN45[u]05.5-05.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN46[u]05.6-05.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN47[u]05.7-05.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN48[u]06.0-06.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN49[u]06.1-06.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN50[u]06.2-06.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN51[u]06.3-06.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN52[u]06.4-06.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN53[u]06.5-06.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN54[u]06.6-06.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN55[u]06.7-06.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN56[u]07.0-07.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN57[u]07.1-07.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN58[u]07.2-07.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN59[u]07.3-07.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN60[u]07.4-07.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN61[u]07.5-07.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN62[u]07.6-07.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN63[u]07.7-07.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN64[u]08.0-08.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN65[u]08.1-08.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN66[u]08.2-08.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN67[u]08.3-08.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN68[u]08.4-08.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN69[u]08.5-08.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN70[u]08.6-08.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN71[u]08.7-08.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN72[u]09.0-09.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN73[u]09.1-09.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN74[u]09.2-09.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN75[u]09.3-09.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN76[u]09.4-09.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN77[u]09.5-09.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN78[u]09.6-09.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN79[u]09.7-09.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN80[u]10.0-10.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN81[u]10.1-10.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN82[u]10.2-10.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN83[u]10.3-10.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN84[u]10.4-10.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN85[u]10.5-10.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN86[u]10.6-10.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN87[u]10.7-10.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN88[u]11.0-11.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN89[u]11.1-11.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN90[u]11.2-11.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN91[u]11.3-11.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN92[u]11.4-11.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN93[u]11.5-11.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN94[u]11.6-11.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN95[u]11.7-11.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN96[u]12.0-12.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN97[u]12.1-12.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN98[u]12.2-12.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN99[u]12.3-12.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN100[u]12.4-12.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN101[u]12.5-12.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN102[u]12.6-12.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN103[u]12.7-12.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN104[u]13.0-13.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN105[u]13.1-13.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN106[u]13.2-13.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN107[u]13.3-13.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN108[u]13.4-13.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN109[u]13.5-13.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN110[u]13.6-13.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN111[u]13.7-13.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN112[u]14.0-14.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN113[u]14.1-14.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN114[u]14.2-14.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN115[u]14.3-14.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN116[u]14.4-14.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN117[u]14.5-14.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN118[u]14.6-14.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN119[u]14.7-14.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN120[u]15.0-15.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN121[u]15.1-15.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN122[u]15.2-15.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN123[u]15.3-15.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN124[u]15.4-15.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN125[u]15.5-15.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN126[u]15.6-15.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN127[u]15.7-15.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN128[u]16.0-16.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN129[u]16.1-16.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN130[u]16.2-16.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN131[u]16.3-16.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN132[u]16.4-16.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN133[u]16.5-16.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN134[u]16.6-16.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN135[u]16.7-16.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN136[u]17.0-17.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN137[u]17.1-17.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN138[u]17.2-17.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN139[u]17.3-17.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN140[u]17.4-17.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN141[u]17.5-17.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN142[u]17.6-17.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN143[u]17.7-17.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN144[u]18.0-18.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN145[u]18.1-18.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN146[u]18.2-18.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN147[u]18.3-18.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN148[u]18.4-18.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN149[u]18.5-18.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN150[u]18.6-18.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN151[u]18.7-18.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN152[u]19.0-19.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN153[u]19.1-19.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN154[u]19.2-19.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN155[u]19.3-19.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN156[u]19.4-19.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN157[u]19.5-19.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN158[u]19.6-19.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN159[u]19.7-19.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN160[u]20.0-20.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN161[u]20.1-20.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN162[u]20.2-20.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN163[u]20.3-20.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN164[u]20.4-20.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN165[u]20.5-20.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN166[u]20.6-20.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN167[u]20.7-20.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN168[u]21.0-21.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN169[u]21.1-21.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN170[u]21.2-21.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN171[u]21.3-21.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN172[u]21.4-21.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN173[u]21.5-21.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN174[u]21.6-21.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN175[u]21.7-21.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN176[u]22.0-22.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN177[u]22.1-22.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN178[u]22.2-22.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN179[u]22.3-22.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN180[u]22.4-22.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN181[u]22.5-22.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN182[u]22.6-22.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN183[u]22.7-22.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN184[u]23.0-23.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN185[u]23.1-23.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN186[u]23.2-23.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN187[u]23.3-23.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN188[u]23.4-23.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN189[u]23.5-23.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN190[u]23.6-23.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN191[u]23.7-23.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN192[u]24.0-24.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN193[u]24.1-24.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN194[u]24.2-24.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN195[u]24.3-24.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN196[u]24.4-24.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN197[u]24.5-24.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN198[u]24.6-24.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN199[u]24.7-24.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN200[u]25.0-25.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN201[u]25.1-25.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN202[u]25.2-25.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN203[u]25.3-25.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN204[u]25.4-25.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN205[u]25.5-25.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN206[u]25.6-25.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN207[u]25.7-25.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN208[u]26.0-26.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN209[u]26.1-26.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN210[u]26.2-26.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN211[u]26.3-26.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN212[u]26.4-26.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN213[u]26.5-26.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN214[u]26.6-26.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN215[u]26.7-26.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN216[u]27.0-27.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN217[u]27.1-27.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN218[u]27.2-27.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN219[u]27.3-27.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN220[u]27.4-27.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN221[u]27.5-27.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN222[u]27.6-27.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN223[u]27.7-27.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN224[u]28.0-28.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN225[u]28.1-28.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN226[u]28.2-28.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN227[u]28.3-28.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN228[u]28.4-28.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN229[u]28.5-28.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN230[u]28.6-28.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN231[u]28.7-28.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN232[u]29.0-29.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN233[u]29.1-29.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN234[u]29.2-29.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN235[u]29.3-29.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN236[u]29.4-29.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN237[u]29.5-29.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN238[u]29.6-29.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN239[u]29.7-29.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN240[u]30.0-30.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN241[u]30.1-30.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN242[u]30.2-30.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN243[u]30.3-30.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN244[u]30.4-30.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN245[u]30.5-30.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN246[u]30.6-30.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN247[u]30.7-30.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN248[u]31.0-31.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN249[u]31.1-31.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN250[u]31.2-31.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN251[u]31.3-31.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN252[u]31.4-31.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN253[u]31.5-31.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN254[u]31.6-31.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN255[u]31.7-31.7[u]select - [v]0[opt]N - [v]1[opt]Y - [remark]
Define CSRR 6(country specific roaming restriction) lists to confine the roaming range of a subscriber.
The CSRR list defines the roaming restriction for 256 VPLMN ranges.
" - ::= { cSRRList 7 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.3.8 - cSRR7 OBJECT-TYPE - SYNTAX Opaque (SIZE (32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "OPAQUE DECODE RULE: - [unit]VPLMN0[u]00.0-00.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN1[u]00.1-00.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN2[u]00.2-00.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN3[u]00.3-00.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN4[u]00.4-00.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN5[u]00.5-00.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN6[u]00.6-00.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN7[u]00.7-00.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN8[u]01.0-01.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN9[u]01.1-01.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN10[u]01.2-01.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN11[u]01.3-01.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN12[u]01.4-01.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN13[u]01.5-01.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN14[u]01.6-01.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN15[u]01.7-01.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN16[u]02.0-02.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN17[u]02.1-02.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN18[u]02.2-02.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN19[u]02.3-02.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN20[u]02.4-02.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN21[u]02.5-02.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN22[u]02.6-02.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN23[u]02.7-02.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN24[u]03.0-03.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN25[u]03.1-03.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN26[u]03.2-03.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN27[u]03.3-03.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN28[u]03.4-03.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN29[u]03.5-03.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN30[u]03.6-03.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN31[u]03.7-03.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN32[u]04.0-04.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN33[u]04.1-04.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN34[u]04.2-04.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN35[u]04.3-04.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN36[u]04.4-04.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN37[u]04.5-04.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN38[u]04.6-04.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN39[u]04.7-04.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN40[u]05.0-05.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN41[u]05.1-05.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN42[u]05.2-05.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN43[u]05.3-05.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN44[u]05.4-05.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN45[u]05.5-05.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN46[u]05.6-05.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN47[u]05.7-05.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN48[u]06.0-06.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN49[u]06.1-06.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN50[u]06.2-06.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN51[u]06.3-06.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN52[u]06.4-06.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN53[u]06.5-06.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN54[u]06.6-06.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN55[u]06.7-06.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN56[u]07.0-07.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN57[u]07.1-07.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN58[u]07.2-07.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN59[u]07.3-07.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN60[u]07.4-07.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN61[u]07.5-07.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN62[u]07.6-07.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN63[u]07.7-07.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN64[u]08.0-08.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN65[u]08.1-08.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN66[u]08.2-08.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN67[u]08.3-08.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN68[u]08.4-08.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN69[u]08.5-08.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN70[u]08.6-08.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN71[u]08.7-08.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN72[u]09.0-09.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN73[u]09.1-09.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN74[u]09.2-09.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN75[u]09.3-09.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN76[u]09.4-09.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN77[u]09.5-09.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN78[u]09.6-09.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN79[u]09.7-09.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN80[u]10.0-10.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN81[u]10.1-10.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN82[u]10.2-10.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN83[u]10.3-10.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN84[u]10.4-10.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN85[u]10.5-10.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN86[u]10.6-10.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN87[u]10.7-10.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN88[u]11.0-11.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN89[u]11.1-11.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN90[u]11.2-11.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN91[u]11.3-11.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN92[u]11.4-11.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN93[u]11.5-11.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN94[u]11.6-11.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN95[u]11.7-11.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN96[u]12.0-12.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN97[u]12.1-12.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN98[u]12.2-12.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN99[u]12.3-12.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN100[u]12.4-12.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN101[u]12.5-12.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN102[u]12.6-12.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN103[u]12.7-12.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN104[u]13.0-13.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN105[u]13.1-13.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN106[u]13.2-13.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN107[u]13.3-13.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN108[u]13.4-13.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN109[u]13.5-13.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN110[u]13.6-13.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN111[u]13.7-13.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN112[u]14.0-14.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN113[u]14.1-14.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN114[u]14.2-14.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN115[u]14.3-14.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN116[u]14.4-14.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN117[u]14.5-14.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN118[u]14.6-14.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN119[u]14.7-14.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN120[u]15.0-15.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN121[u]15.1-15.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN122[u]15.2-15.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN123[u]15.3-15.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN124[u]15.4-15.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN125[u]15.5-15.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN126[u]15.6-15.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN127[u]15.7-15.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN128[u]16.0-16.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN129[u]16.1-16.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN130[u]16.2-16.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN131[u]16.3-16.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN132[u]16.4-16.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN133[u]16.5-16.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN134[u]16.6-16.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN135[u]16.7-16.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN136[u]17.0-17.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN137[u]17.1-17.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN138[u]17.2-17.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN139[u]17.3-17.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN140[u]17.4-17.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN141[u]17.5-17.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN142[u]17.6-17.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN143[u]17.7-17.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN144[u]18.0-18.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN145[u]18.1-18.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN146[u]18.2-18.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN147[u]18.3-18.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN148[u]18.4-18.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN149[u]18.5-18.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN150[u]18.6-18.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN151[u]18.7-18.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN152[u]19.0-19.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN153[u]19.1-19.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN154[u]19.2-19.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN155[u]19.3-19.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN156[u]19.4-19.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN157[u]19.5-19.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN158[u]19.6-19.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN159[u]19.7-19.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN160[u]20.0-20.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN161[u]20.1-20.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN162[u]20.2-20.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN163[u]20.3-20.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN164[u]20.4-20.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN165[u]20.5-20.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN166[u]20.6-20.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN167[u]20.7-20.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN168[u]21.0-21.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN169[u]21.1-21.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN170[u]21.2-21.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN171[u]21.3-21.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN172[u]21.4-21.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN173[u]21.5-21.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN174[u]21.6-21.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN175[u]21.7-21.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN176[u]22.0-22.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN177[u]22.1-22.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN178[u]22.2-22.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN179[u]22.3-22.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN180[u]22.4-22.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN181[u]22.5-22.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN182[u]22.6-22.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN183[u]22.7-22.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN184[u]23.0-23.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN185[u]23.1-23.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN186[u]23.2-23.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN187[u]23.3-23.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN188[u]23.4-23.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN189[u]23.5-23.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN190[u]23.6-23.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN191[u]23.7-23.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN192[u]24.0-24.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN193[u]24.1-24.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN194[u]24.2-24.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN195[u]24.3-24.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN196[u]24.4-24.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN197[u]24.5-24.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN198[u]24.6-24.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN199[u]24.7-24.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN200[u]25.0-25.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN201[u]25.1-25.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN202[u]25.2-25.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN203[u]25.3-25.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN204[u]25.4-25.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN205[u]25.5-25.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN206[u]25.6-25.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN207[u]25.7-25.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN208[u]26.0-26.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN209[u]26.1-26.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN210[u]26.2-26.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN211[u]26.3-26.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN212[u]26.4-26.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN213[u]26.5-26.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN214[u]26.6-26.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN215[u]26.7-26.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN216[u]27.0-27.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN217[u]27.1-27.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN218[u]27.2-27.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN219[u]27.3-27.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN220[u]27.4-27.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN221[u]27.5-27.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN222[u]27.6-27.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN223[u]27.7-27.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN224[u]28.0-28.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN225[u]28.1-28.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN226[u]28.2-28.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN227[u]28.3-28.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN228[u]28.4-28.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN229[u]28.5-28.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN230[u]28.6-28.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN231[u]28.7-28.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN232[u]29.0-29.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN233[u]29.1-29.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN234[u]29.2-29.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN235[u]29.3-29.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN236[u]29.4-29.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN237[u]29.5-29.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN238[u]29.6-29.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN239[u]29.7-29.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN240[u]30.0-30.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN241[u]30.1-30.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN242[u]30.2-30.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN243[u]30.3-30.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN244[u]30.4-30.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN245[u]30.5-30.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN246[u]30.6-30.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN247[u]30.7-30.7[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN248[u]31.0-31.0[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN249[u]31.1-31.1[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN250[u]31.2-31.2[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN251[u]31.3-31.3[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN252[u]31.4-31.4[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN253[u]31.5-31.5[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN254[u]31.6-31.6[u]select - [v]0[opt]N - [v]1[opt]Y - [unit]VPLMN255[u]31.7-31.7[u]select - [v]0[opt]N - [v]1[opt]Y - [remark]
Define CSRR 7(country specific roaming restriction) lists to confine the roaming range of a subscriber.
The CSRR list defines the roaming restriction for 256 VPLMN ranges.
" - ::= { cSRRList 8 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.4 - rSZIList OBJECT IDENTIFIER ::= { parameter 4 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.4.1 - rSZITable OBJECT-TYPE - SYNTAX SEQUENCE OF RSZIEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Description." - ::= { rSZIList 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.4.1.1 - rSZIEntry OBJECT-TYPE - SYNTAX RSZIEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Description." - INDEX { rsziIndex } - ::= { rSZITable 1 } - - - RSZIEntry ::= - SEQUENCE { - rsziIndex - INTEGER, - rsziCC - OCTET STRING, - rsziNDC - OCTET STRING, - rsziZoneCode - INTEGER, - rsziRowStatus - RowStatus - } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.4.1.1.1 - rsziIndex OBJECT-TYPE - SYNTAX INTEGER (0..255) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Index - Remark:RSZI (Regional Subscription Zone Identity) index number ranges from 0 to 255." - ::= { rSZIEntry 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.4.1.1.2 - rsziCC OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..4)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:CC - Remark:The Country Code of the regional subscription zone." - ::= { rSZIEntry 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.4.1.1.3 - rsziNDC OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..6)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:NDC - Remark:The National Destination Code of the regional subscription zone." - ::= { rSZIEntry 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.4.1.1.4 - rsziZoneCode OBJECT-TYPE - SYNTAX INTEGER (0..65535) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Zone Code - Remark:The regional subscription zone code." - ::= { rSZIEntry 4 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.4.1.1.5 - rsziRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes" - ::= { rSZIEntry 5 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.5 - faxGSMBC OBJECT IDENTIFIER ::= { parameter 5 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.5.1 - faxGSMBCTable OBJECT-TYPE - SYNTAX SEQUENCE OF FaxGSMBCEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Description." - ::= { faxGSMBC 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.5.1.1 - faxGSMBCEntry OBJECT-TYPE - SYNTAX FaxGSMBCEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Description." - INDEX { fgIndex } - ::= { faxGSMBCTable 1 } - - - FaxGSMBCEntry ::= - SEQUENCE { - fgIndex - INTEGER, - fgBearerCapability - OCTET STRING, - fgRowStatus - RowStatus - } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.5.1.1.1 - fgIndex OBJECT-TYPE - SYNTAX INTEGER (0..15) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Index - Remark:Index number of this Fax GSM Bearer Capability entry." - ::= { faxGSMBCEntry 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.5.1.1.2 - fgBearerCapability OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..14)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Bearer Capability - Remark:Define the GSM Bearer Capability for fax service.
- Default = A3B88120156380" - ::= { faxGSMBCEntry 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.5.1.1.3 - fgRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes" - ::= { faxGSMBCEntry 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.6 - dataGSMBC OBJECT IDENTIFIER ::= { parameter 6 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.6.1 - dataGSMBCTable OBJECT-TYPE - SYNTAX SEQUENCE OF DataGSMBCEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Description." - ::= { dataGSMBC 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.6.1.1 - dataGSMBCEntry OBJECT-TYPE - SYNTAX DataGSMBCEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Description." - INDEX { dgIndex } - ::= { dataGSMBCTable 1 } - - - DataGSMBCEntry ::= - SEQUENCE { - dgIndex - INTEGER, - dgBearerCapability - OCTET STRING, - dgRowStatus - RowStatus - } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.6.1.1.1 - dgIndex OBJECT-TYPE - SYNTAX INTEGER (0..15) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Index - Remark:Index number of this Data GSM Bearer Capability entry." - ::= { dataGSMBCEntry 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.6.1.1.2 - dgBearerCapability OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..14)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Bearer Capability - Remark:Define the GSM Bearer Capability for data service.
- Default = A28881211563A8" - ::= { dataGSMBCEntry 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.6.1.1.3 - dgRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes" - ::= { dataGSMBCEntry 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8 - uSSD OBJECT IDENTIFIER ::= { parameter 8 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.1 - uSSDFormatString OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..64)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:USSD Format - Remark:The access code of USSD service. Start with 2-3 digits of '*' or '#' . End with '#'. Separate sections by '*'.
Contents can be added:

- C/c = Service Code
- R/r = Router Indicator
- B = Blank
- S = Supplement Info

For example: **C3B*S#" - ::= { uSSD 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.2 - uGCsiServiceCode0 OBJECT-TYPE - SYNTAX INTEGER (0..9999) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:UG-CSI Service Code 0 - Remark:Service code for UG-CSI (USSD General - CAMEL Subscription Information). Prepaid subscriber dials service code to apply different prepaid services.
For example: Service Code = 111, prepaid user dials **1215111*# to enquire account info." - ::= { uSSD 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.3 - uGCsiGSMSCFAddr0 OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..18)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:UG-CSI SCF Address 0 - Remark:SCP address for UG-CSI (USSD General - CAMEL Subscription Information). The E.164 number of the SCP-MAP.
- Format = 91+CC+NDC+SN" - ::= { uSSD 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.4 - uGCsiServiceCode1 OBJECT-TYPE - SYNTAX INTEGER (0..65535) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:UG-CSI Service Code 1 - Remark:Service code for UG-CSI (USSD General - CAMEL Subscription Information). Prepaid subscriber dials service code to apply different prepaid services." - ::= { uSSD 4 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.5 - uGCsiGSMSCFAddr1 OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..18)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:UG-CSI SCF Address 1 - Remark:SCP address for UG-CSI (USSD General - CAMEL Subscription Information). The E.164 number of the SCP-MAP.
- Format = 91+CC+NDC+SN" - ::= { uSSD 5 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.6 - uGCsiServiceCode2 OBJECT-TYPE - SYNTAX INTEGER (0..65535) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:UG-CSI Service Code 2 - Remark:Service code for UG-CSI (USSD General - CAMEL Subscription Information). Prepaid subscriber dials service code to apply different prepaid services." - ::= { uSSD 6 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.7 - uGCsiGSMSCFAddr2 OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..18)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:UG-CSI SCF Address 2 - Remark:SCP address for UG-CSI (USSD General - CAMEL Subscription Information). The E.164 number of the SCP-MAP.
- Format = 91+CC+NDC+SN" - ::= { uSSD 7 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.8 - uGCsiServiceCode3 OBJECT-TYPE - SYNTAX INTEGER (0..65535) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:UG-CSI Service Code 3 - Remark:Service code for UG-CSI (USSD General - CAMEL Subscription Information). Prepaid subscriber dials service code to apply different prepaid services." - ::= { uSSD 8 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.8.9 - uGCsiGSMSCFAddr3 OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..18)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Name:UG-CSI SCF Address 3 - Remark:SCP address for UG-CSI (USSD General - CAMEL Subscription Information). The E.164 number of the SCP-MAP.
- Format = 91+CC+NDC+SN" - ::= { uSSD 9 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.20 - ussdEAE OBJECT IDENTIFIER ::= { parameter 10 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.20.1 - ussdEAETable OBJECT-TYPE - SYNTAX SEQUENCE OF UssdEAEEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Name:USSD EAE" - ::= { ussdEAE 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.20.1.1 - ussdEAEEntry OBJECT-TYPE - SYNTAX UssdEAEEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "level:1 Name:USSD EAE" - INDEX { ueIndex } - ::= { ussdEAETable 1 } - - - UssdEAEEntry ::= - SEQUENCE { - ueIndex - INTEGER, - ueServiceCode - INTEGER, - ueServiceNum - OCTET STRING, - ueRowStatus - RowStatus - } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.20.1.1.1 - ueIndex OBJECT-TYPE - SYNTAX INTEGER (0..127) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Index - Remark:USSD EAE (Extended Application Entity) index number ranges from 0 to 127." - ::= { ussdEAEEntry 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.20.1.1.2 - ueServiceCode OBJECT-TYPE - SYNTAX INTEGER (0..9999) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Service Code - Remark:Subscriber dials service code to access different USSD services." - ::= { ussdEAEEntry 2 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.20.1.1.3 - ueServiceNum OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..9)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Service Number - Remark:Enter the identical Service Number as that set in SMPP configuration to connect with the third party USSD server." - ::= { ussdEAEEntry 3 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.20.1.1.4 - ueRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes" - ::= { ussdEAEEntry 4 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21 - epsAPN OBJECT IDENTIFIER ::= { parameter 11 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1 - epsAPNTable OBJECT-TYPE - SYNTAX SEQUENCE OF EpsAPNEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Name:EPS APN" - ::= { epsAPN 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1.1 - epsAPNEntry OBJECT-TYPE - SYNTAX EpsAPNEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "level:1 Name:EPS APN" - INDEX { apnIndex } - ::= { epsAPNTable 1 } - - - EpsAPNEntry ::= - SEQUENCE { - apnIndex - INTEGER, - apnContextId - INTEGER, - apnPDNType - INTEGER, - apnQOSClassId - INTEGER, - apnVPLMNAllowed - INTEGER, - apnVisitedNetworkId - OCTET STRING, - apnPDNGWAllocationType - INTEGER, - apnPDNGWIdentity - OCTET STRING, - apnAMBRUL - INTEGER, - apnAMBRDL - INTEGER, - apnChargingCharacteristics - OCTET STRING, - apnServiceSelection - OCTET STRING, - apnOIReplacement - OCTET STRING, - apnRowStatus - RowStatus - } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1.1.1 - apnIndex OBJECT-TYPE - SYNTAX INTEGER (0..15) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Index" - ::= { epsAPNEntry 1 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1.1.2 - apnContextId OBJECT-TYPE - SYNTAX INTEGER (0..127) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Context Id" - ::= { epsAPNEntry 2 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1.1.3 - apnPDNType OBJECT-TYPE - SYNTAX INTEGER - { - IPv4(0), - IPv6(1), - IPv4v6(2), - IPv4orIPv6(3) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:PDN Type" - DEFVAL { IPv4 } - ::= { epsAPNEntry 3 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1.1.4 - apnQOSClassId OBJECT-TYPE - SYNTAX INTEGER (0..16) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Qos Class Id" - ::= { epsAPNEntry 4 } - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1.1.5 - apnVPLMNAllowed OBJECT-TYPE - SYNTAX INTEGER - { - NOTALLOWED(0), - ALLOWED(1) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter" - DEFVAL { ALLOWED } - ::= { epsAPNEntry 5 } - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1.1.6 - apnVisitedNetworkId OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..128)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter" - ::= { epsAPNEntry 6 } - - apnPDNGWAllocationType OBJECT-TYPE - SYNTAX INTEGER - { - STATIC(0), - DYNAMIC(1) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter" - DEFVAL { DYNAMIC } - ::= { epsAPNEntry 7 } - - apnPDNGWIdentity OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter" - ::= { epsAPNEntry 8 } - - apnAMBRUL OBJECT-TYPE - SYNTAX INTEGER (0..2147483647) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:AMBR UL" - ::= { epsAPNEntry 9 } - - apnAMBRDL OBJECT-TYPE - SYNTAX INTEGER (0..2147483647) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:AMBR DL" - ::= { epsAPNEntry 10 } - - apnChargingCharacteristics OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter" - ::= { epsAPNEntry 11 } - - apnServiceSelection OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Service Selection" - ::= { epsAPNEntry 12 } - - apnOIReplacement OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..128)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter" - ::= { epsAPNEntry 13 } - - apnRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes" - ::= { epsAPNEntry 14 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.22 - epsQOS OBJECT IDENTIFIER ::= { parameter 12 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.22.1 - epsQOSTable OBJECT-TYPE - SYNTAX SEQUENCE OF EpsQOSEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Name:EPS QOS" - ::= { epsQOS 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.22.1.1 - epsQOSEntry OBJECT-TYPE - SYNTAX EpsQOSEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "level:1 Name:EPS QOS" - INDEX { qosIndex } - ::= { epsQOSTable 1 } - - - EpsQOSEntry ::= - SEQUENCE { - qosIndex - INTEGER, - qosQosClassId - INTEGER, - qosPriorityLevel - INTEGER, - qosPreEmptionCapability - INTEGER, - qosPreEmptionVulnerability - INTEGER, - qosRowStatus - RowStatus - } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.22.1.1.1 - qosIndex OBJECT-TYPE - SYNTAX INTEGER (0..15) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Index" - ::= { epsQOSEntry 1 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.21.1.1.2 - qosQosClassId OBJECT-TYPE - SYNTAX INTEGER (0..32) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Qos Class Id" - ::= { epsQOSEntry 2 } - - qosPriorityLevel OBJECT-TYPE - SYNTAX INTEGER (0..32) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Priority Level" - ::= { epsQOSEntry 3 } - - qosPreEmptionCapability OBJECT-TYPE - SYNTAX INTEGER - { - Disable(0), - Enable(1) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:PreEmptionCapability" - DEFVAL { Disable } - ::= { epsQOSEntry 4 } - - qosPreEmptionVulnerability OBJECT-TYPE - SYNTAX INTEGER - { - Disable(0), - Enable(1) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:PreEmptionVulnerability" - DEFVAL { Disable } - ::= { epsQOSEntry 5 } - - qosRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes" - ::= { epsQOSEntry 6 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.23 - epsTPL OBJECT IDENTIFIER ::= { parameter 13 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.23.1 - epsTPLTable OBJECT-TYPE - SYNTAX SEQUENCE OF EpsTPLEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Name:EPS TPL" - ::= { epsTPL 1 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.23.1.1 - epsTPLEntry OBJECT-TYPE - SYNTAX EpsTPLEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "level:1 Name:EPS TPL" - INDEX { tplIndex } - ::= { epsTPLTable 1 } - - - EpsTPLEntry ::= - SEQUENCE { - tplIndex - INTEGER, - tplName - OCTET STRING, - tplUeAmbrUL - INTEGER, - tplUeAmbrDL - INTEGER, - tplUeApnOiReplacement - OCTET STRING, - tplRfsp - INTEGER, - tplRauTauTimer - INTEGER, - tplChargingCharacteristic - OCTET STRING, - tplRowStatus - RowStatus - } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.23.1.1.1 - tplIndex OBJECT-TYPE - SYNTAX INTEGER (0..15) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Index" - ::= { epsTPLEntry 1 } - - -- 1.3.6.1.4.1.1379.2.3.3.3.2.23.1.1.2 - tplName OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..32)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:Template name" - ::= { epsTPLEntry 2 } - - tplUeAmbrUL OBJECT-TYPE - SYNTAX INTEGER (0..2147483647) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:UE AMBR UL" - ::= { epsTPLEntry 3 } - - tplUeAmbrDL OBJECT-TYPE - SYNTAX INTEGER (0..2147483647) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes Name:UE AMBR DL" - ::= { epsTPLEntry 4 } - - tplUeApnOiReplacement OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..128)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Description." - ::= { epsTPLEntry 5 } - - tplRfsp OBJECT-TYPE - SYNTAX INTEGER (0..127) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Description." - ::= { epsTPLEntry 6 } - - tplRauTauTimer OBJECT-TYPE - SYNTAX INTEGER (0..255) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Description." - ::= { epsTPLEntry 7 } - - tplChargingCharacteristic OBJECT-TYPE - SYNTAX OCTET STRING (SIZE (0..128)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Description." - ::= { epsTPLEntry 8 } - - tplRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Key Parameter:Yes" - ::= { epsTPLEntry 9 } - - - -- 1.3.6.1.4.1.1379.2.3.3.3.3 - hlrtraps OBJECT IDENTIFIER ::= { hlr 3 } - - -- Severity Object Definition - severity OBJECT-TYPE - SYNTAX INTEGER { - critical(1), - major(2), - minor(3), - warning(4), - event(5) - } - MAX-ACCESS read-only - STATUS current - DESCRIPTION "The severity level of the trap." - ::= { hlr 4 } - - linkDown NOTIFICATION-TYPE - OBJECTS { severity } - STATUS current - DESCRIPTION - "A trap indicating that a link is down." - ::= { hlrtraps 1 } - - linkUp NOTIFICATION-TYPE - OBJECTS { severity } - STATUS current - DESCRIPTION - "A trap indicating that a link is up." - ::= { hlrtraps 2 } - - authenticationFailure NOTIFICATION-TYPE - OBJECTS { severity } - STATUS current - DESCRIPTION - "A trap indicating an authentication failure." - ::= { hlrtraps 3 } - -END --- --- CINTEL-HLR-MIB.my --- diff --git a/sshsvc/mibs/CINTEL-HLR-MIB.smidb b/sshsvc/mibs/CINTEL-HLR-MIB.smidb deleted file mode 100644 index 411ce61a..00000000 Binary files a/sshsvc/mibs/CINTEL-HLR-MIB.smidb and /dev/null differ diff --git a/sshsvc/mibs/CINTEL-MIB.my b/sshsvc/mibs/CINTEL-MIB.my deleted file mode 100644 index 378eedd3..00000000 --- a/sshsvc/mibs/CINTEL-MIB.my +++ /dev/null @@ -1,656 +0,0 @@ --- --- CINTEL-MIB.my --- MIB generated by MG-SOFT Visual MIB Builder Version 7.0 Build 209 --- Friday, December 16, 2011 at 15:52:13 --- - - CINTEL-MIB DEFINITIONS ::= BEGIN - - IMPORTS - enterprises, TimeTicks, MODULE-IDENTITY - FROM SNMPv2-SMI - TEXTUAL-CONVENTION - FROM SNMPv2-TC; - - - -- 1.3.6.1.4.1.1379.2 - cintelSS MODULE-IDENTITY - LAST-UPDATED "201706041222Z" -- June 04, 2017 at 12:22 GMT - ORGANIZATION - "CINTEL" - CONTACT-INFO - "cintel - support@cintel.com.cn" - DESCRIPTION - "The MIB module for cintel's Softswitch products." - REVISION "201706041223Z" -- June 04, 2017 at 12:23 GMT - DESCRIPTION - "This is the first release version of the MIB" - ::= { cintelNS 2 } - - - --- --- Type definitions --- - - AdminStateChoices ::= INTEGER - { - locked(0), - unlocked(1), - shutDown(2) - } - - OperStateChoices ::= INTEGER - { - disable(0), - enable(1) - } - - AvailStateChoices ::= INTEGER - { - inTest(0), - failed(1), - powerOff(2), - offLine(3), - onLine(4), - dependency(5), - degraded(6), - notInstalled(7) - } - - --- --- Textual conventions --- - --- TEXTUAL-CONVENTION MACRO ::= --- BEGIN --- TYPE NOTATION ::= --- DisplayPart --- "STATUS" Status --- "DESCRIPTION" Text --- ReferPart --- "SYNTAX" Syntax --- --- VALUE NOTATION ::= --- value(VALUE Syntax) --- --- DisplayPart ::= --- "DISPLAY-HINT" Text --- | empty --- --- Status ::= --- "current" --- | "deprecated" --- | "obsolete" --- --- ReferPart ::= --- "REFERENCE" Text --- | empty --- --- -- -- uses the NVT ASCII character set --- Text ::= """" string """" --- --- Syntax ::= --- type(ObjectSyntax) --- | "BITS" "{" Kibbles "}" --- Kibbles ::= --- Kibble --- | Kibbles "," Kibble --- Kibble ::= --- identifier "(" nonNegativeNumber ")" --- END - DisplayString8 ::= TEXTUAL-CONVENTION - DISPLAY-HINT - "8a" - STATUS current - DESCRIPTION - "Represents textual information taken from the NVT ASCII - character set, as defined in pages 4, 10-11 of RFC 854. - - To summarize RFC 854, the NVT ASCII repertoire specifies: - - - the use of character codes 0-127 (decimal) - - - the graphics characters (32-126) are interpreted as - US ASCII - - - NUL, LF, CR, BEL, BS, HT, VT and FF have the special - meanings specified in RFC 854 - - - the other 25 codes have no standard interpretation - - - the sequence 'CR LF' means newline - - - the sequence 'CR NUL' means carriage-return - - - an 'LF' not preceded by a 'CR' means moving to the - same column on the next line. - - - the sequence 'CR x' for any x other than LF or NUL is - illegal. (Note that this also means that a string may - end with either 'CR LF' or 'CR NUL', but not with CR.) - - Any object defined using this syntax may not exceed 255 - characters in length." - SYNTAX OCTET STRING (SIZE (0..8)) - - DisplayString16 ::= TEXTUAL-CONVENTION - DISPLAY-HINT - "16a" - STATUS current - DESCRIPTION - "A version of DisplayString that contains only 16 characters most." - SYNTAX OCTET STRING (SIZE (0..16)) - - DisplayString32 ::= TEXTUAL-CONVENTION - DISPLAY-HINT - "32a" - STATUS current - DESCRIPTION - "A version of DisplayString that contains only 32 characters most." - SYNTAX OCTET STRING (SIZE (0..32)) - - DisplayString64 ::= TEXTUAL-CONVENTION - DISPLAY-HINT - "64a" - STATUS current - DESCRIPTION - "A version of DisplayString that contains only 64 characters most." - SYNTAX OCTET STRING (SIZE (0..64)) - - DisplayString ::= TEXTUAL-CONVENTION - DISPLAY-HINT - "255a" - STATUS current - DESCRIPTION - "A version of DisplayString that contains only 255 characters most." - SYNTAX OCTET STRING (SIZE (0..255)) - - RowStatus ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The RowStatus textual convention is used to manage the - creation and deletion of conceptual rows, and is used as the - value of the SYNTAX clause for the status column of a - conceptual row (as described in Section 7.7.1 of [2].) - - The status column has six defined values: - - - `active', which indicates that the conceptual row is - available for use by the managed device; - - - `notInService', which indicates that the conceptual - row exists in the agent, but is unavailable for use by - the managed device (see NOTE below); - - - `notReady', which indicates that the conceptual row - exists in the agent, but is missing information - necessary in order to be available for use by the - managed device; - - - `createAndGo', which is supplied by a management - station wishing to create a new instance of a - conceptual row and to have its status automatically set - to active, making it available for use by the managed - device; - - - `createAndWait', which is supplied by a management - station wishing to create a new instance of a - conceptual row (but not make it available for use by - the managed device); and, - - - `destroy', which is supplied by a management station - wishing to delete all of the instances associated with - an existing conceptual row. - - Whereas five of the six values (all except `notReady') may - be specified in a management protocol set operation, only - three values will be returned in response to a management - protocol retrieval operation: `notReady', `notInService' or - `active'. That is, when queried, an existing conceptual row - has only three states: it is either available for use by - the managed device (the status column has value `active'); - it is not available for use by the managed device, though - the agent has sufficient information to make it so (the - status column has value `notInService'); or, it is not - available for use by the managed device, and an attempt to - make it so would fail because the agent has insufficient - information (the state column has value `notReady'). - - NOTE WELL - - This textual convention may be used for a MIB table, - irrespective of whether the values of that table's - conceptual rows are able to be modified while it is - active, or whether its conceptual rows must be taken - out of service in order to be modified. That is, it is - the responsibility of the DESCRIPTION clause of the - status column to specify whether the status column must - not be `active' in order for the value of some other - column of the same conceptual row to be modified. If - such a specification is made, affected columns may be - changed by an SNMP set PDU if the RowStatus would not - be equal to `active' either immediately before or after - processing the PDU. In other words, if the PDU also - contained a varbind that would change the RowStatus - value, the column in question may be changed if the - RowStatus was not equal to `active' as the PDU was - received, or if the varbind sets the status to a value - other than 'active'. - - - Also note that whenever any elements of a row exist, the - RowStatus column must also exist. - - To summarize the effect of having a conceptual row with a - status column having a SYNTAX clause value of RowStatus, - consider the following state diagram: - - - STATE - +--------------+-----------+-------------+------------- - | A | B | C | D - | |status col.|status column| - |status column | is | is |status column - ACTION |does not exist| notReady | notInService| is active - --------------+--------------+-----------+-------------+------------- - set status |noError ->D|inconsist- |inconsistent-|inconsistent- - column to | or | entValue| Value| Value - createAndGo |inconsistent- | | | - | Value| | | - --------------+--------------+-----------+-------------+------------- - set status |noError see 1|inconsist- |inconsistent-|inconsistent- - column to | or | entValue| Value| Value - createAndWait |wrongValue | | | - --------------+--------------+-----------+-------------+------------- - set status |inconsistent- |inconsist- |noError |noError - column to | Value| entValue| | - active | | | | - | | or | | - | | | | - | |see 2 ->D| ->D| ->D - --------------+--------------+-----------+-------------+------------- - set status |inconsistent- |inconsist- |noError |noError ->C - column to | Value| entValue| | - notInService | | | | - | | or | | or - | | | | - | |see 3 ->C| ->C|wrongValue - --------------+--------------+-----------+-------------+------------- - set status |noError |noError |noError |noError - column to | | | | - destroy | ->A| ->A| ->A| ->A - --------------+--------------+-----------+-------------+------------- - set any other |see 4 |noError |noError |see 5 - column to some| | | | - value | | see 1| ->C| ->D - --------------+--------------+-----------+-------------+------------- - - (1) goto B or C, depending on information available to the - agent. - - (2) if other variable bindings included in the same PDU, - provide values for all columns which are missing but - required, then return noError and goto D. - - (3) if other variable bindings included in the same PDU, - provide values for all columns which are missing but - required, then return noError and goto C. - - (4) at the discretion of the agent, the return value may be - either: - - inconsistentName: because the agent does not choose to - create such an instance when the corresponding - RowStatus instance does not exist, or - - inconsistentValue: if the supplied value is - inconsistent with the state of some other MIB object's - value, or - - noError: because the agent chooses to create the - instance. - - If noError is returned, then the instance of the status - column must also be created, and the new state is B or C, - depending on the information available to the agent. If - inconsistentName or inconsistentValue is returned, the row - remains in state A. - - (5) depending on the MIB definition for the column/table, - either noError or inconsistentValue may be returned. - - NOTE: Other processing of the set request may result in a - response other than noError being returned, e.g., - wrongValue, noCreation, etc. - - - Conceptual Row Creation - - There are four potential interactions when creating a - conceptual row: selecting an instance-identifier which is - not in use; creating the conceptual row; initializing any - objects for which the agent does not supply a default; and, - making the conceptual row available for use by the managed - device. - - Interaction 1: Selecting an Instance-Identifier - - The algorithm used to select an instance-identifier varies - for each conceptual row. In some cases, the instance- - identifier is semantically significant, e.g., the - destination address of a route, and a management station - selects the instance-identifier according to the semantics. - - In other cases, the instance-identifier is used solely to - distinguish conceptual rows, and a management station - without specific knowledge of the conceptual row might - examine the instances present in order to determine an - unused instance-identifier. (This approach may be used, but - it is often highly sub-optimal; however, it is also a - questionable practice for a naive management station to - attempt conceptual row creation.) - - Alternately, the MIB module which defines the conceptual row - might provide one or more objects which provide assistance - in determining an unused instance-identifier. For example, - if the conceptual row is indexed by an integer-value, then - an object having an integer-valued SYNTAX clause might be - defined for such a purpose, allowing a management station to - issue a management protocol retrieval operation. In order - to avoid unnecessary collisions between competing management - stations, `adjacent' retrievals of this object should be - different. - - Finally, the management station could select a pseudo-random - number to use as the index. In the event that this index - was already in use and an inconsistentValue was returned in - response to the management protocol set operation, the - management station should simply select a new pseudo-random - number and retry the operation. - - A MIB designer should choose between the two latter - algorithms based on the size of the table (and therefore the - efficiency of each algorithm). For tables in which a large - number of entries are expected, it is recommended that a MIB - object be defined that returns an acceptable index for - creation. For tables with small numbers of entries, it is - recommended that the latter pseudo-random index mechanism be - used. - - - Interaction 2: Creating the Conceptual Row - - Once an unused instance-identifier has been selected, the - management station determines if it wishes to create and - activate the conceptual row in one transaction or in a - negotiated set of interactions. - - Interaction 2a: Creating and Activating the Conceptual Row - - The management station must first determine the column - requirements, i.e., it must determine those columns for - which it must or must not provide values. Depending on the - complexity of the table and the management station's - knowledge of the agent's capabilities, this determination - can be made locally by the management station. Alternately, - the management station issues a management protocol get - operation to examine all columns in the conceptual row that - it wishes to create. In response, for each column, there - are three possible outcomes: - - - a value is returned, indicating that some other - management station has already created this conceptual - row. We return to interaction 1. - - - the exception `noSuchInstance' is returned, - indicating that the agent implements the object-type - associated with this column, and that this column in at - least one conceptual row would be accessible in the MIB - view used by the retrieval were it to exist. For those - columns to which the agent provides read-create access, - the `noSuchInstance' exception tells the management - station that it should supply a value for this column - when the conceptual row is to be created. - - - the exception `noSuchObject' is returned, indicating - that the agent does not implement the object-type - associated with this column or that there is no - conceptual row for which this column would be - accessible in the MIB view used by the retrieval. As - such, the management station can not issue any - management protocol set operations to create an - instance of this column. - - Once the column requirements have been determined, a - management protocol set operation is accordingly issued. - This operation also sets the new instance of the status - column to `createAndGo'. - - When the agent processes the set operation, it verifies that - it has sufficient information to make the conceptual row - available for use by the managed device. The information - available to the agent is provided by two sources: the - management protocol set operation which creates the - conceptual row, and, implementation-specific defaults - supplied by the agent (note that an agent must provide - implementation-specific defaults for at least those objects - which it implements as read-only). If there is sufficient - information available, then the conceptual row is created, a - `noError' response is returned, the status column is set to - `active', and no further interactions are necessary (i.e., - interactions 3 and 4 are skipped). If there is insufficient - information, then the conceptual row is not created, and the - set operation fails with an error of `inconsistentValue'. - On this error, the management station can issue a management - protocol retrieval operation to determine if this was - because it failed to specify a value for a required column, - or, because the selected instance of the status column - already existed. In the latter case, we return to - interaction 1. In the former case, the management station - can re-issue the set operation with the additional - information, or begin interaction 2 again using - `createAndWait' in order to negotiate creation of the - conceptual row. - - NOTE WELL - - Regardless of the method used to determine the column - requirements, it is possible that the management - station might deem a column necessary when, in fact, - the agent will not allow that particular columnar - instance to be created or written. In this case, the - management protocol set operation will fail with an - error such as `noCreation' or `notWritable'. In this - case, the management station decides whether it needs - to be able to set a value for that particular columnar - instance. If not, the management station re-issues the - management protocol set operation, but without setting - a value for that particular columnar instance; - otherwise, the management station aborts the row - creation algorithm. - - Interaction 2b: Negotiating the Creation of the Conceptual - Row - - The management station issues a management protocol set - operation which sets the desired instance of the status - column to `createAndWait'. If the agent is unwilling to - process a request of this sort, the set operation fails with - an error of `wrongValue'. (As a consequence, such an agent - must be prepared to accept a single management protocol set - operation, i.e., interaction 2a above, containing all of the - columns indicated by its column requirements.) Otherwise, - the conceptual row is created, a `noError' response is - returned, and the status column is immediately set to either - `notInService' or `notReady', depending on whether it has - sufficient information to make the conceptual row available - for use by the managed device. If there is sufficient - information available, then the status column is set to - `notInService'; otherwise, if there is insufficient - information, then the status column is set to `notReady'. - Regardless, we proceed to interaction 3. - - Interaction 3: Initializing non-defaulted Objects - - The management station must now determine the column - requirements. It issues a management protocol get operation - to examine all columns in the created conceptual row. In - the response, for each column, there are three possible - outcomes: - - - a value is returned, indicating that the agent - implements the object-type associated with this column - and had sufficient information to provide a value. For - those columns to which the agent provides read-create - access (and for which the agent allows their values to - be changed after their creation), a value return tells - the management station that it may issue additional - management protocol set operations, if it desires, in - order to change the value associated with this column. - - - the exception `noSuchInstance' is returned, - indicating that the agent implements the object-type - associated with this column, and that this column in at - least one conceptual row would be accessible in the MIB - view used by the retrieval were it to exist. However, - the agent does not have sufficient information to - provide a value, and until a value is provided, the - conceptual row may not be made available for use by the - managed device. For those columns to which the agent - provides read-create access, the `noSuchInstance' - exception tells the management station that it must - issue additional management protocol set operations, in - order to provide a value associated with this column. - - - the exception `noSuchObject' is returned, indicating - that the agent does not implement the object-type - associated with this column or that there is no - conceptual row for which this column would be - accessible in the MIB view used by the retrieval. As - such, the management station can not issue any - management protocol set operations to create an - instance of this column. - - If the value associated with the status column is - `notReady', then the management station must first deal with - all `noSuchInstance' columns, if any. Having done so, the - value of the status column becomes `notInService', and we - proceed to interaction 4. - - Interaction 4: Making the Conceptual Row Available - - Once the management station is satisfied with the values - associated with the columns of the conceptual row, it issues - a management protocol set operation to set the status column - to `active'. If the agent has sufficient information to - make the conceptual row available for use by the managed - device, the management protocol set operation succeeds (a - `noError' response is returned). Otherwise, the management - protocol set operation fails with an error of - `inconsistentValue'. - - - NOTE WELL - - A conceptual row having a status column with value - `notInService' or `notReady' is unavailable to the - managed device. As such, it is possible for the - managed device to create its own instances during the - time between the management protocol set operation - which sets the status column to `createAndWait' and the - management protocol set operation which sets the status - column to `active'. In this case, when the management - protocol set operation is issued to set the status - column to `active', the values held in the agent - supersede those used by the managed device. - - If the management station is prevented from setting the - status column to `active' (e.g., due to management station - or network failure) the conceptual row will be left in the - `notInService' or `notReady' state, consuming resources - indefinitely. The agent must detect conceptual rows that - have been in either state for an abnormally long period of - time and remove them. It is the responsibility of the - DESCRIPTION clause of the status column to indicate what an - abnormally long period of time would be. This period of - time should be long enough to allow for human response time - (including `think time') between the creation of the - conceptual row and the setting of the status to `active'. - In the absense of such information in the DESCRIPTION - clause, it is suggested that this period be approximately 5 - minutes in length. This removal action applies not only to - newly-created rows, but also to previously active rows which - are set to, and left in, the notInService state for a - prolonged period exceeding that which is considered normal - for such a conceptual row. - - - Conceptual Row Suspension - - When a conceptual row is `active', the management station - may issue a management protocol set operation which sets the - instance of the status column to `notInService'. If the - agent is unwilling to do so, the set operation fails with an - error of `wrongValue'. Otherwise, the conceptual row is - taken out of service, and a `noError' response is returned. - It is the responsibility of the DESCRIPTION clause of the - status column to indicate under what circumstances the - status column should be taken out of service (e.g., in order - for the value of some other column of the same conceptual - row to be modified). - - - Conceptual Row Deletion - - For deletion of conceptual rows, a management protocol set - operation is issued which sets the instance of the status - column to `destroy'. This request may be made regardless of - the current value of the status column (e.g., it is possible - to delete conceptual rows which are either `notReady', - `notInService' or `active'.) If the operation succeeds, - then all instances associated with the conceptual row are - immediately removed." - SYNTAX INTEGER - { - active(1), - notInService(2), - notReady(3), - createAndGo(4), - createAndWait(5), - destroy(6) - } - --- the following two values are states: --- these values may be read or written --- the following value is a state: --- this value may be read, but not written --- the following three values are --- actions: these values may be written, --- but are never read - TimeStamp ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The value of the sysUpTime object at which a specific - occurrence happened. The specific occurrence must be - defined in the description of any object defined using this - type." - SYNTAX TimeTicks - - --- --- Node definitions --- - - -- 1.3.6.1.4.1.1379 - cintelNS OBJECT IDENTIFIER ::= { enterprises 1379 } - - - - END - --- --- CINTEL-MIB.my --- diff --git a/sshsvc/mibs/CINTEL-MIB.smidb b/sshsvc/mibs/CINTEL-MIB.smidb deleted file mode 100644 index 7ff6e9b4..00000000 Binary files a/sshsvc/mibs/CINTEL-MIB.smidb and /dev/null differ diff --git a/sshsvc/mml/parse.go.bak b/sshsvc/mml/parse.go.bak deleted file mode 100644 index 4828e543..00000000 --- a/sshsvc/mml/parse.go.bak +++ /dev/null @@ -1,901 +0,0 @@ -package mml - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "math" - "net/http" - "regexp" - "strconv" - "strings" - - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "github.com/go-resty/resty/v2" - "golang.org/x/crypto/ssh" -) - -type Param struct { - Name string `json:"name"` - Value string `json:"value"` -} - -type MmlCommand struct { - Operation string `json:"operation"` - Object string `json:"object"` - Params []Param `json:"params"` - PaList []string `json:"paList"` - AaList []string `json:"aaList"` - AaMap map[string]interface{} `json:"aaMap"` - NaMap map[string]interface{} `json:"naMap"` - AaUri []string `json:"aaUri"` - AaLoc []string `json:"aaLoc"` // for loc parameter -} - -type MmlVar struct { - Version string `json:"version"` - Output string `json:"output"` - Limit int `json:"limit"` - User string `json:"user"` - Token string `josn:"token"` -} - -var OmcMmlVar *MmlVar - -func init() { - OmcMmlVar = &MmlVar{ - Version: "16.1.1", - Output: DefaultFormatType, - Limit: 50, - } -} - -func SetOmcMmlVarOutput(output string) { - OmcMmlVar.Output = output -} - -func SetOmcMmlVarLimit(limit int) { - OmcMmlVar.Limit = limit -} - -func splitByColon(str string) []string { - return splitBy(str, ':') -} - -func splitByComma(str string) []string { - return splitBy(str, ',') -} - -func splitBy(str string, sep rune) []string { - var result []string - var stack []string - var current []rune - var quotes, apoFlag bool = false, false - - for _, c := range str { - if c == '{' || c == '[' || (c == '\'' && apoFlag == false) || (c == '"' && quotes == false) { // "'" - apoFlag = true - quotes = true - stack = append(stack, string(c)) - } else if c == '}' || c == ']' || (c == '\'' && apoFlag == true) || (c == '"' && quotes == true) { - apoFlag = false - quotes = false - if len(stack) > 0 { - stack = stack[:len(stack)-1] - } - } - - if c == sep && len(stack) == 0 { - result = append(result, string(current)) - current = []rune{} - } else { - current = append(current, c) - } - } - - result = append(result, string(current)) - return result -} - -func ParseMMLCommand(mmlStr string, mmlComms *[]MmlCommand) error { - log.Info("ParseMMLCommand processing ...") - log.Debug("mmlStr: ", mmlStr) - - mc := new(MmlCommand) - reg := regexp.MustCompile(`\s*;\s*`) - mmls := reg.Split(mmlStr, -1) - for _, mml := range mmls { - log.Trace("mml:", mml) - if len(mml) == 0 { - continue - } - //reg := regexp.MustCompile(`\s*:\s*`) - //ms := reg.Split(mml, -1) - ms := splitByColon(mml) - if len(ms) < 1 || len(ms) > 2 { - err := global.ErrMmlInvalidCommandFormat - log.Error(err) - return err - } - if len(ms) == 2 { - cmd := strings.Trim(ms[0], " ") - reg = regexp.MustCompile(`\s+`) - cs := reg.Split(cmd, -1) - //cs := strings.Split(cmd, " ") - if len(cs) == 2 { - mc.Operation = cs[0] - mc.Object = cs[1] - } else { - err := global.ErrMmlInvalidCommandFormat - log.Error(err) - return err - } - //reg = regexp.MustCompile(`\s*,\s*`) - //reg = regexp.MustCompile(`(?U)(? 0 { - extUri := strings.Join(mml.AaUri, "/") - requestURI = requestURI + fmt.Sprintf(mmlMap.ExtUri, extUri) - } - if mmlMap.Params != "" { - params := strings.Join(mml.AaLoc, "+and+") - params = strings.ReplaceAll(params, " ", "+") // replace " " to "+" - log.Trace("params:", params) - if mmlMap.ParamTag == "SQL" && strings.TrimSpace(params) != "" { - params = "+where+" + params - } - requestURI = fmt.Sprintf("%s%s%s", requestURI, mmlMap.Params, params) - } - return requestURI -} - -func TransMml2HttpReq(sshConn *ssh.ServerConn, httpUri, uerAgent string, mml *MmlCommand) (*[]byte, error) { - log.Info("TransMml2HttpReq processing ...") - log.Debug("mml: ", mml) - - where := fmt.Sprintf("operation='%s' AND object='%s'", mml.Operation, mml.Object) - mmlMap, err := dborm.XormGetMmlHttpMap("mml_http_map", where) - if err != nil { - log.Error("Failed to XormGetMmlHttpMap: ", err) - return ParseErrorOutput(err), err - } - if mmlMap == nil { - err := errors.New("Not found mml map") - log.Error(err) - return ParseErrorOutput(err), err - } - log.Trace("mmlMap: ", mmlMap) - if mmlMap.Output == "" { - mmlMap.Output = "{}" - } - outputJson := new(dborm.MmlOutput) - err = json.Unmarshal([]byte(mmlMap.Output), outputJson) - if err != nil { - log.Error("Failed to Unmarshal:", err) - return ParseErrorOutput(err), err - } - log.Trace("outputJson: ", outputJson) - inputJson := new(dborm.MmlInput) - log.Trace("mmlMap.Input: ", mmlMap.Input) - if mmlMap.Input == "" { - mmlMap.Input = "{}" - } - err = json.Unmarshal([]byte(mmlMap.Input), inputJson) - if err != nil { - log.Error("Failed to Unmarshal:", err) - return ParseErrorOutput(err), err - } - log.Trace("inputJson: ", inputJson) - - var requestURI string - var output *[]byte - client := resty.New() - switch strings.ToLower(mmlMap.Method) { - case "get": - requestURI = parseRequestUri(httpUri, mmlMap, mml) - log.Debugf("method: Get requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"accessToken": fmt.Sprintf("%x", sshConn.SessionID())}). - SetHeaders(map[string]string{"User-Agent": uerAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Get(requestURI) - if err != nil { - log.Error("Failed to Get:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(outputJson, response) - } - case "post": - requestURI = parseRequestUri(httpUri, mmlMap, mml) - body := ParseInputBody(inputJson, mml) - log.Debugf("method: Post requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"accessToken": fmt.Sprintf("%x", sshConn.SessionID())}). - SetHeaders(map[string]string{"User-Agent": uerAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(*body). - Post(requestURI) - if err != nil { - log.Error("Failed to Post:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(outputJson, response) - } - case "put": - requestURI = parseRequestUri(httpUri, mmlMap, mml) - body := ParseInputBody(inputJson, mml) - log.Debugf("method: Put requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"accessToken": fmt.Sprintf("%x", sshConn.SessionID())}). - SetHeaders(map[string]string{"User-Agent": uerAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - SetBody(*body). - Put(requestURI) - if err != nil { - log.Error("Failed to Put:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(outputJson, response) - } - case "delete": - requestURI = parseRequestUri(httpUri, mmlMap, mml) - log.Debugf("method: Delete requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"accessToken": fmt.Sprintf("%x", sshConn.SessionID())}). - SetHeaders(map[string]string{"User-Agent": uerAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Delete(requestURI) - if err != nil { - log.Error("Failed to Delete:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(outputJson, response) - } - case "patch": - requestURI = parseRequestUri(httpUri, mmlMap, mml) - log.Debugf("method: patch requestURI: %s", requestURI) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"accessToken": fmt.Sprintf("%x", sshConn.SessionID())}). - SetHeaders(map[string]string{"User-Agent": uerAgent}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Patch(requestURI) - if err != nil { - log.Error("Failed to Patch:", err) - output = ParseErrorOutput(err) - } else { - output = ParseOutputResponse(outputJson, response) - } - default: - err := errors.New("not found mml command") - log.Error(err) - output = ParseErrorOutput(err) - } - return output, nil -} - -const ( - MaxMmlOutputBufferSize = 1000000 - FormatTypeJson = "json" - FormatTypeTable = "table" - DefaultFormatType = FormatTypeTable -) - -const ( - RetCodeSucceeded = 0 - RetCodeFailed = 0 -) - -func ParseInputBody(inputJson *dborm.MmlInput, mml *MmlCommand) *[]byte { - inputBody := make(map[string]interface{}) - log.Trace("mml.NaMap:", mml.NaMap) - log.Trace("mml.AaMap:", mml.AaMap) - if strings.ToLower(inputJson.BodyFmt) == "putdb" { - for _, icol := range inputJson.Cols { - log.Trace("icol:", icol) - mml.NaMap[icol.Name] = icol.Value - } - inputBody[inputJson.BodyKey] = mml.NaMap - } else { - inputParams := make([]map[string]interface{}, 0) - inputParams = append(inputParams, mml.NaMap) - inputBody[inputJson.BodyKey] = inputParams - } - - body, err := json.Marshal(inputBody) - if err != nil { - log.Error("Failed to marshal:", err) - } - - log.Trace("inputBody:", inputBody) - log.Trace("body:", string(body)) - return &body -} - -func ParseOutputResponse(outputJson *dborm.MmlOutput, response *resty.Response) *[]byte { - var output []byte - var str bytes.Buffer - - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - if OmcMmlVar.Output == FormatTypeJson { - code := fmt.Sprintf("StatusCode = %d status %s\n\n", response.StatusCode(), response.Status()) - title := formatTitle(outputJson.Title) - - json.Indent(&str, response.Body(), "", " ") - log.Trace(str.String()) - - output = global.BytesCombine1([]byte(code), []byte(title), str.Bytes(), []byte("\n")) - } else { - log.Trace("Body:", string(response.Body())) - mapDatas := make(map[string]interface{}, 0) - - err := json.Unmarshal(response.Body(), &mapDatas) - if err != nil { - log.Error("Failed to json.Unmarshal:", err) - //output = *ParseErrorOutput(err) - output = *ParseErrorOutput(string(response.Body())) - return &output - } - log.Trace("mapDatas:", mapDatas) - switch strings.ToLower(outputJson.RetFmt) { - case "getdb": - if len(mapDatas) > 0 { - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - if len(data.([]interface{})) > 0 { - table := (data.([]interface{}))[0] - log.Trace("table:", table) - - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - title := formatTitle(outputJson.Title) - fmtResults := ParseTableOutput(outputJson, table) - output = global.BytesCombine1([]byte(code), []byte(title), []byte(fmtResults)) - } - } - case "deletedb": - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - - if len(data.(map[string]interface{})) > 0 { - table := data.(map[string]interface{}) - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - fmtResults := ParseDBOperOutput(outputJson, table) - output = global.BytesCombine1([]byte(code), []byte(fmtResults)) - } - case "postdb": - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - - if len(data.(map[string]interface{})) > 0 { - table := data.(map[string]interface{}) - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - fmtResults := ParseDBOperOutput(outputJson, table) - output = global.BytesCombine1([]byte(code), []byte(fmtResults)) - } - case "putdb": - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - if len(data.(map[string]interface{})) > 0 { - table := data.(map[string]interface{}) - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - fmtResults := ParseDBOperOutput(outputJson, table) - output = global.BytesCombine1([]byte(code), []byte(fmtResults)) - } - case "getnf": - if len(mapDatas) > 0 { - var data interface{} - for _, data = range mapDatas { - log.Trace("data:", data) - break - } - if len(data.([]interface{})) > 0 { - //table := (data.([]interface{}))[0] - //log.Trace("table:", table) - - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - title := formatTitle(outputJson.Title) - fmtResults := ParseNFTableOutput(outputJson, data) - output = global.BytesCombine1([]byte(code), []byte(title), []byte(fmtResults)) - } - } - default: - code := fmt.Sprintf(outputJson.RetMsg, RetCodeSucceeded) - output = global.BytesCombine1([]byte(code)) - } - - } - default: - if OmcMmlVar.Output == FormatTypeJson { - code := fmt.Sprintf("StatusCode = %d status %s\n\n", response.StatusCode(), response.Status()) - //title := formatTitle("Network Element Information") - - json.Indent(&str, response.Body(), "", " ") - log.Trace(str.String()) - - output = global.BytesCombine1([]byte(code), str.Bytes(), []byte("\n")) - } else { - log.Trace("Body:", string(response.Body())) - mapResults := make(map[string]interface{}, 0) - - err := json.Unmarshal(response.Body(), &mapResults) - if err != nil { - log.Error("Failed to json.Unmarshal:", err) - output = *ParseErrorOutput(string(response.Body())) - } else { - log.Trace("mapResults:", mapResults) - errResult := mapResults["error"] - log.Trace("errResult:", errResult) - if len(errResult.(map[string]interface{})) > 0 { - errCode, _ := strconv.Atoi(fmt.Sprintf("%v", errResult.(map[string]interface{})["errorCode"])) - errorInfo := errResult.(map[string]interface{})["errorInfo"] - output = []byte(fmt.Sprintf(outputJson.ErrMsg, errCode, errorInfo)) - } - } - } - } - return &output -} - -func ParseDBOperOutput(outputJson *dborm.MmlOutput, cols any) string { - var colOutput []dborm.ColOutput = outputJson.Cols - var value, retFmtCols string - if len(cols.(map[string]interface{})) > 0 { - if len(colOutput) > 0 { - coln := colOutput[0].Name - value = fmt.Sprintf("%v", cols.(map[string]interface{})[coln]) - log.Tracef("coln:%s value:%s", coln, value) - retFmtCols = colOutput[0].Display + " = " + value + "\n\n" - } - } - - return retFmtCols -} - -func ParseNFTableOutput(outputJson *dborm.MmlOutput, cols any) string { - var colOutput []dborm.ColOutput - var fmtColName string - var colName []string - var spaceNum int = 1 - var alignmentM, alignmentSN, alignmentSV string = "Left", "Right", "Left" - - if outputJson.SepSpaceNum != 0 { - spaceNum = outputJson.SepSpaceNum - } - if outputJson.AlignmentM != "" { - alignmentM = outputJson.AlignmentM - } - if outputJson.AlignmentSN != "" { - alignmentSN = outputJson.AlignmentSN - } - if outputJson.AlignmentSV != "" { - alignmentSV = outputJson.AlignmentSV - } - - maxLength := math.MinInt64 - for _, coln := range outputJson.Cols { - log.Trace("coln:", coln) - - if len(coln.Display) > maxLength { - maxLength = len(coln.Display) - } - if coln.Length < len(coln.Display) { - coln.Length = len(coln.Display) - } - - colName = append(colName, ParseAlignmentOutput(coln.Length, alignmentM, coln.Display)) - colOutput = append(colOutput, coln) - } - fmtColName = formatLineBySpace(&colName, spaceNum) - log.Trace("fmtColName:", fmtColName) - - var retFmtCols string - var fmtColValues []string - var numberResult int - // for _, colnvs := range cols.([]interface{}) { - // log.Trace("colnvs:", colnvs) - // if colnvs == nil { - // break - // } - numberResult = len(cols.([]interface{})) - - if numberResult == 1 && outputJson.SingleList == true { - colnv := cols.([]interface{})[0] - log.Trace("colnv:", colnv) - - var fmtNV []string - for _, coln := range colOutput { - fmtName := ParseAlignmentOutput(maxLength, alignmentSN, coln.Display) - log.Tracef("alignmentSN:%s fmtName:%s", alignmentSN, fmtName) - value := fmt.Sprintf("%v", colnv.(map[string]interface{})[coln.Name]) - fmtValue := ParseAlignmentOutput(coln.Length, alignmentSV, value) - fmtNV = append(fmtNV, fmtName+": "+fmtValue) - } - - fmtResults := strings.Join(fmtNV, "\n") - log.Tracef("fmtResults:\n%s", fmtResults) - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtResults + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols - } else { - for i := 0; i < numberResult; i++ { - colnv := cols.([]interface{})[i] - log.Trace("colnv:", colnv) - var colValues []string - var newVal []string - for _, coln := range colOutput { - value := fmt.Sprintf("%v", colnv.(map[string]interface{})[coln.Name]) - if len(coln.Alias) != 0 { - enumVal, _ := strconv.Atoi(value) - value = parseEnumAlias(&(coln.Alias), enumVal) - } - newVal = append(newVal, ParseAlignmentOutput(coln.Length, alignmentM, value)) - } - colValues = append(colValues, formatLineBySpace(&newVal, spaceNum)) - log.Trace("colValues:", colValues) - fmtColValues = append(fmtColValues, strings.Join(colValues, "\n")) - log.Trace("fmtColValues:", fmtColValues) - } - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtColName + "\n\n" + strings.Join(fmtColValues, "\n") + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols - } -} - -func ParseTableOutput(outputJson *dborm.MmlOutput, cols any) string { - var colOutput []dborm.ColOutput - var fmtColName string - var colName []string - var spaceNum int = 1 - var alignmentM, alignmentSN, alignmentSV string = "Left", "Right", "Left" - - if outputJson.SepSpaceNum != 0 { - spaceNum = outputJson.SepSpaceNum - } - if outputJson.AlignmentM != "" { - alignmentM = outputJson.AlignmentM - } - if outputJson.AlignmentSN != "" { - alignmentSN = outputJson.AlignmentSN - } - if outputJson.AlignmentSV != "" { - alignmentSV = outputJson.AlignmentSV - } - - maxLength := math.MinInt64 - for _, coln := range outputJson.Cols { - log.Trace("coln:", coln) - - if len(coln.Display) > maxLength { - maxLength = len(coln.Display) - } - if coln.Length < len(coln.Display) { - coln.Length = len(coln.Display) - } - - colName = append(colName, ParseAlignmentOutput(coln.Length, alignmentM, coln.Display)) - colOutput = append(colOutput, coln) - } - fmtColName = formatLineBySpace(&colName, spaceNum) - log.Trace("fmtColName:", fmtColName) - - var retFmtCols string - var fmtColValues []string - var numberResult int - for _, colnvs := range cols.(map[string]interface{}) { - log.Trace("colnvs:", colnvs) - if colnvs == nil { - break - } - numberResult = len(colnvs.([]interface{})) - - if numberResult == 1 && outputJson.SingleList == true { - colnv := colnvs.([]interface{})[0] - log.Trace("colnv:", colnv) - - var fmtNV []string - for _, coln := range colOutput { - fmtName := ParseAlignmentOutput(maxLength, alignmentSN, coln.Display) - log.Tracef("alignmentSN:%s fmtName:%s", alignmentSN, fmtName) - value := fmt.Sprintf("%v", colnv.(map[string]interface{})[coln.Name]) - fmtValue := ParseAlignmentOutput(coln.Length, alignmentSV, value) - fmtNV = append(fmtNV, fmtName+": "+fmtValue) - } - - fmtResults := strings.Join(fmtNV, "\n") - log.Tracef("fmtResults:\n%s", fmtResults) - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtResults + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols - } else { - for i := 0; i < numberResult; i++ { - colnv := colnvs.([]interface{})[i] - log.Trace("colnv:", colnv) - var colValues []string - var newVal []string - for _, coln := range colOutput { - value := fmt.Sprintf("%v", colnv.(map[string]interface{})[coln.Name]) - if len(coln.Alias) != 0 { - enumVal, _ := strconv.Atoi(value) - value = parseEnumAlias(&(coln.Alias), enumVal) - } - newVal = append(newVal, ParseAlignmentOutput(coln.Length, alignmentM, value)) - } - colValues = append(colValues, formatLineBySpace(&newVal, spaceNum)) - log.Trace("colValues:", colValues) - fmtColValues = append(fmtColValues, strings.Join(colValues, "\n")) - log.Trace("fmtColValues:", fmtColValues) - } - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtColName + "\n\n" + strings.Join(fmtColValues, "\n") + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols - } - } - fmtEnd := fmt.Sprintf(outputJson.End, numberResult) - retFmtCols = fmtColName + "\n" + strings.Join(fmtColValues, "\n") + "\n\n" + fmtEnd - log.Tracef("retFmtCols:\n%s", retFmtCols) - return retFmtCols -} - -func parseEnumAlias(alias *[]string, enumVal int) string { - return (*alias)[enumVal] -} - -func formatLineBySpace(strArray *[]string, spaceNum int) string { - space := strings.Repeat(" ", spaceNum) - return strings.Join(*strArray, space) -} - -func ParseAlignmentOutput(length int, alignment string, str string) string { - spaceLen := length - len(str) - if spaceLen < 0 { - log.Warnf("len(str=%s)=%d more length=%d", str, len(str), length) - spaceLen = 0 - } - var retStr string - switch alignment { - case "Left": - suffix := strings.Repeat(" ", spaceLen) - retStr = str + suffix - case "Right": - prefix := strings.Repeat(" ", spaceLen) - retStr = prefix + str - log.Tracef("retStr:%s", retStr) - case "Middle": - prefix := strings.Repeat(" ", int(math.Ceil(float64(spaceLen)/2))) - suffix := strings.Repeat(" ", int(math.Floor(float64(spaceLen)/2))) - retStr = prefix + str + suffix - } - log.Tracef("length=%d, spaceLne=%d, alignment=%s, str=%s, retStr=%s", length, spaceLen, alignment, str, retStr) - return retStr -} - -func ParseErrorOutput(err any) *[]byte { - var output []byte - - var formatType string = DefaultFormatType - if formatType == FormatTypeJson { - output = []byte(fmt.Sprintf("ErrorCode = 1 Error message: %v\n\n", err)) - } else { - output = []byte(fmt.Sprintf("RetCode = -1 operation failed: %v\n\n", err)) - } - - return &output -} - -func formatTitle(title string) string { - var builder strings.Builder - builder.WriteString(title) - builder.WriteString("\n") - for i := 0; i < len(title); i++ { - builder.WriteString("-") - } - builder.WriteString("\n") - return builder.String() -} - -func formatTableOutput() { - -} diff --git a/sshsvc/setHLRServiceState b/sshsvc/setHLRServiceState deleted file mode 100644 index dee6e381..00000000 --- a/sshsvc/setHLRServiceState +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -TargetIP="[2001:db8::9166]" -PORT="34957" -OID=".1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0" - -case "$1" in - 1) - echo -n "Set HLR state link down ... " - snmpset -v3 -l noAuthNoPriv -u manager ${TargetIP}:${PORT} ${OID} i 1 >/dev/null - echo "done" - ;; - 2) - echo -n "Set HLR state link up ... " - snmpset -v3 -l noAuthNoPriv -u manager ${TargetIP}:${PORT} ${OID} i 2 >/dev/null - echo "done" - ;; - 3) - echo -n "Set HLR state authentication failure ... " - snmpset -v3 -l noAuthNoPriv -u manager ${TargetIP}:${PORT} ${OID} i 3 >/dev/null - echo "done" - ;; - *) - echo "Unknown state ($1)" - ;; -esac \ No newline at end of file diff --git a/sshsvc/snmp/snmp.go b/sshsvc/snmp/snmp.go deleted file mode 100644 index 613dcd8e..00000000 --- a/sshsvc/snmp/snmp.go +++ /dev/null @@ -1,553 +0,0 @@ -package snmp - -import ( - "flag" - "fmt" - "log" - "net" - "os" - "path/filepath" - "strings" - "time" - - g "github.com/gosnmp/gosnmp" - "github.com/slayercat/GoSNMPServer" - "github.com/slayercat/GoSNMPServer/mibImps" -) - -type SNMPService struct { - ListenAddr string - ListenPort uint16 - UserName string - AuthPass string - AuthProto string - PrivPass string - PrivProto string - EngineID string - TrapPort uint16 - TrapListen bool - TrapBool bool - TrapTick uint16 - TimeOut uint16 - TrapTarget string - - ListenHost string - TrapHost string - - SysName string - SysDescr string - SysLocation string - SysContact string - SysStatus string - SysService int -} - -func (s *SNMPService) getAuthProto() g.SnmpV3AuthProtocol { - switch s.AuthProto { - case "NoAuth": - return g.NoAuth - case "MD5": - return g.MD5 - case "SHA": - return g.SHA - default: - } - return g.MD5 -} - -func (s *SNMPService) getPrivProto() g.SnmpV3PrivProtocol { - switch s.PrivProto { - case "NoPriv": - return g.NoPriv - case "DES": - return g.DES - case "AES": - return g.AES - case "AES192": - return g.AES192 - case "AES256": - return g.AES256 - default: - } - return g.DES -} - -func (s *SNMPService) setSecParamsList() []g.UsmSecurityParameters { - var secParamsList = []g.UsmSecurityParameters{ - { - UserName: s.UserName, - AuthenticationProtocol: s.getAuthProto(), - AuthenticationPassphrase: s.AuthPass, - PrivacyProtocol: s.getPrivProto(), - PrivacyPassphrase: s.PrivPass, - AuthoritativeEngineID: s.EngineID, - }, - // { - // UserName: "myuser2", - // AuthenticationProtocol: g.SHA, - // AuthenticationPassphrase: "mypassword2", - // PrivacyProtocol: g.DES, - // PrivacyPassphrase: "myprivacy2", - // AuthoritativeEngineID: s.EngineID, - // }, - // { - // UserName: "myuser2", - // AuthenticationProtocol: g.MD5, - // AuthenticationPassphrase: "mypassword2", - // PrivacyProtocol: g.AES, - // PrivacyPassphrase: "myprivacy2", - // AuthoritativeEngineID: s.EngineID, - // }, - } - return secParamsList -} - -func (s *SNMPService) StartSNMPServer() { - // 设置引擎启动次数和引varvar - var engineBoots uint32 = 1 - //var engineTime uint32 = uint32(time.Now().Unix() % 2147483647) // 使用当前时间初始化 - //var engineTime uint32 = 3600 // 使用当前时间初始化 - master := GoSNMPServer.MasterAgent{ - Logger: GoSNMPServer.NewDefaultLogger(), - SecurityConfig: GoSNMPServer.SecurityConfig{ - NoSecurity: true, - AuthoritativeEngineBoots: engineBoots, - // OnGetAuthoritativeEngineTime: func() uint32 { - // return engineTime - // }, - //AuthoritativeEngineID: GoSNMPServer.SNMPEngineID{EngineIDData: "0x800007DB03360102101100"}, - - Users: s.setSecParamsList(), - }, - SubAgents: []*GoSNMPServer.SubAgent{ - { - UserErrorMarkPacket: false, - CommunityIDs: []string{"public", "private"}, // SNMPv1 and SNMPv2c community strings - OIDs: s.handleOIDs(), - //OIDs: mibImps.All(), - }, - }, - } - - server := GoSNMPServer.NewSNMPServer(master) - err := server.ListenUDP("udp", s.ListenHost) - if err != nil { - log.Fatalf("Error in listen: %+v", err) - } - server.ServeForever() -} - -func (s *SNMPService) handleOIDs() []*GoSNMPServer.PDUValueControlItem { - customOIDs := []*GoSNMPServer.PDUValueControlItem{ - { - OID: "1.3.6.1.4.1.1379.2.3.3.3.1.1.1.0", - Type: g.OctetString, - OnGet: func() (value interface{}, err error) { - return s.SysName, nil - }, - OnSet: func(value interface{}) error { - // 将[]uint8转换为string - if v, ok := value.([]uint8); ok { - s.SysName = string(v) - log.Printf("Set request for OID 1.3.6.1.4.1.1379.2.3.3.3.1.1.1.0 with value %v", s.SysName) - return nil - } - return nil - }, - }, - { - OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.2.0", - Type: g.OctetString, - OnGet: func() (value interface{}, err error) { - return s.SysStatus, nil - }, - OnSet: func(value interface{}) error { - // 将[]uint8转换为string - if v, ok := value.([]uint8); ok { - s.SysStatus = string(v) - log.Printf("Set request for OID 1.3.6.1.4.1.1379.2.3.3.3.1.1.2.0 with value %v", s.SysStatus) - return nil - } - return nil - }, - }, - { - OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.3.0", - Type: g.OctetString, - OnGet: func() (value interface{}, err error) { - return s.SysDescr, nil - }, - OnSet: func(value interface{}) error { - // 将[]uint8转换为string - if v, ok := value.([]uint8); ok { - s.SysDescr = string(v) - log.Printf("Set request for OID .1.3.6.1.4.1.1379.2.3.3.3.1.1.3.0 with value %v", s.SysDescr) - return nil - } - return nil - }, - }, - { - OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.4.0", - Type: g.OctetString, - OnGet: func() (value interface{}, err error) { - return s.SysLocation, nil - }, - OnSet: func(value interface{}) error { - // 将[]uint8转换为string - if v, ok := value.([]uint8); ok { - s.SysLocation = string(v) - log.Printf("Set request for OID .1.3.6.1.4.1.1379.2.3.3.3.1.1.4.0 with value %v", s.SysLocation) - return nil - } - return nil - }, - }, - { - OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.5.0", - Type: g.OctetString, - OnGet: func() (value interface{}, err error) { - return s.SysContact, nil - }, - OnSet: func(value interface{}) error { - // 将[]uint8转换为string - if v, ok := value.([]uint8); ok { - s.SysContact = string(v) - log.Printf("Set request for OID .1.3.6.1.4.1.1379.2.3.3.3.1.1.5.0 with value %v", s.SysContact) - return nil - } - return nil - }, - }, - { - OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.7.0", - Type: g.TimeTicks, - OnGet: func() (value interface{}, err error) { - return uint32(time.Now().Unix()), nil - }, - }, - { - OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0", - Type: g.Integer, - OnGet: func() (value interface{}, err error) { - return s.SysService, nil - }, - OnSet: func(value interface{}) error { - if v, ok := value.(int); ok { - s.SysService = v - log.Printf("Set request for OID .1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0 with value %v", s.SysService) - return nil - } - return nil - }, - }, - } - // 为 GETBULK 新增处理 OIDs - bulkOIDs := &GoSNMPServer.PDUValueControlItem{ - OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1", // 这里是您想要支持 GETBULK 的 OID 前缀 - Type: g.OctetString, - OnGet: func() (value interface{}, err error) { - // 假设我们返回一百度值,您可以根据您的实现进行调整 - values := []interface{}{s.SysName, s.SysStatus, s.SysDescr, s.SysLocation, s.SysContact, uint32(time.Now().Unix()), s.SysService} // 可以从其他结构中获取真实值 - return values, nil - }, - } - - customOIDs = append(customOIDs, bulkOIDs) - - // 获取mibImps.All()返回的OID列表 - mibOIDs := mibImps.All() - - // 使用Map来检测并移除重复的OID - oidMap := make(map[string]*GoSNMPServer.PDUValueControlItem) - for _, oid := range customOIDs { - oidMap[oid.OID] = oid - } - for _, oid := range mibOIDs { - if _, exists := oidMap[oid.OID]; !exists { - oidMap[oid.OID] = oid - } else { - log.Printf("Duplicate OID found: %s", oid.OID) - } - } - - // 将Map转换为Slice - allOIDs := make([]*GoSNMPServer.PDUValueControlItem, 0, len(oidMap)) - for _, oid := range oidMap { - allOIDs = append(allOIDs, oid) - } - - return allOIDs -} - -func (s *SNMPService) StartTrapServer() { - flag.Usage = func() { - fmt.Printf("Usage:\n") - fmt.Printf(" %s\n", filepath.Base(os.Args[0])) - flag.PrintDefaults() - } - - tl := g.NewTrapListener() - tl.OnNewTrap = s.MyTrapHandler - - usmTable := g.NewSnmpV3SecurityParametersTable(g.NewLogger(log.New(os.Stdout, "", 0))) - for i := range s.setSecParamsList() { - sp := &s.setSecParamsList()[i] // 使用指针 - err := usmTable.Add(sp.UserName, sp) - if err != nil { - usmTable.Logger.Print(err) - } - } - - // 设置引擎启动次数和引varvar - //var engineBoots uint32 = 1 - // var engineTime uint32 = uint32(time.Now().Unix() % 2147483647) // 使用当前时间初始化 - //var engineTime uint32 = 3600 // 使用当前时间初始化 - gs := &g.GoSNMP{ - Target: s.TrapTarget, - Port: s.TrapPort, - Transport: "udp", - Timeout: time.Duration(s.TimeOut) * time.Second, // 设置超时时间为x秒 - Version: g.Version3, // Always using version3 for traps, only option that works with all SNMP versions simultaneously - MsgFlags: g.NoAuthNoPriv, - SecurityModel: g.UserSecurityModel, - SecurityParameters: &g.UsmSecurityParameters{ - UserName: s.UserName, - AuthoritativeEngineID: s.EngineID, - AuthoritativeEngineBoots: 1, - //AuthoritativeEngineTime: 3600, - AuthenticationProtocol: s.getAuthProto(), - AuthenticationPassphrase: s.AuthPass, - PrivacyProtocol: s.getPrivProto(), - PrivacyPassphrase: s.PrivPass, - }, - //TrapSecurityParametersTable: usmTable, - ContextEngineID: s.EngineID, - ContextName: "v3test", - } - tl.Params = gs - tl.Params.Logger = g.NewLogger(log.New(os.Stdout, "", 0)) - - // 定时发送Trap - if s.TrapBool { - go s.SendPeriodicTraps(gs) - } - go s.monitorNetwork(gs) - - if s.TrapListen { - err := tl.Listen(s.TrapHost) - if err != nil { - log.Panicf("error in listen: %s", err) - } - } -} - -func (s *SNMPService) MyTrapHandler(packet *g.SnmpPacket, addr *net.UDPAddr) { - log.Printf("got trapdata from %s\n", addr.IP) - for _, v := range packet.Variables { - switch v.Type { - case g.OctetString: - b := v.Value.([]byte) - fmt.Printf("OID: %s, string: %x\n", v.Name, b) - - default: - log.Printf("trap: %+v\n", v) - } - } -} - -func (s *SNMPService) SendPeriodicTraps(gs *g.GoSNMP) { - err := gs.Connect() - if err != nil { - log.Fatalf("Connect() err: %v", err) - } - defer gs.Conn.Close() - - ticker := time.NewTicker(time.Duration(s.TrapTick) * time.Second) // 每10秒发送一次Trap - defer ticker.Stop() - - for range ticker.C { // 每x秒发送一次Trap - trap := g.SnmpTrap{ - Variables: []g.SnmpPDU{ - { - Name: ".1.3.6.1.2.1.1.3.0", - Type: g.TimeTicks, - Value: uint32(time.Now().Unix()), - }, - { - Name: ".1.3.6.1.6.3.1.1.4.1.0", - Type: g.ObjectIdentifier, - Value: ".1.3.6.1.6.3.1.1.5.1", - }, - }, - } - _, err = gs.SendTrap(trap) - if err != nil { - log.Printf("error sending trap: %s", err) - } else { - log.Printf("trap sent successfully") - } - } -} - -// 1. 设备链路连接失败时发送Trap (LinkDown) -func (s *SNMPService) sendLinkDownTrap(gs *g.GoSNMP, ifIndex int, ifDescr string) { - err := gs.Connect() - if err != nil { - log.Fatalf("Connect() err: %v", err) - } - defer gs.Conn.Close() - - trap := g.SnmpTrap{ - Variables: []g.SnmpPDU{ - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.1", // linkDown - Type: g.OctetString, - Value: ".1.3.6.1.4.1.1379.2.3.3.3.3.1", - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.1.1", // ifIndex - Type: g.Integer, - Value: ifIndex, - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.1.2", // ifDescr - Type: g.OctetString, - Value: ifDescr, - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.4", // severity OID - Type: g.Integer, - Value: 2, // event - }, - }, - } - - _, err = gs.SendTrap(trap) - if err != nil { - log.Printf("error sending LinkDown trap: %s", err) - } else { - log.Printf("LinkDown trap sent successfully") - } -} - -// 2. 设备链路恢复正常时发送Trap (LinkUp) -func (s *SNMPService) sendLinkUpTrap(gs *g.GoSNMP, ifIndex int, ifDescr string) { - err := gs.Connect() - if err != nil { - log.Fatalf("Connect() err: %v", err) - } - defer gs.Conn.Close() - - trap := g.SnmpTrap{ - Variables: []g.SnmpPDU{ - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.2", // linkUp - Type: g.OctetString, - Value: ".1.3.6.1.4.1.1379.2.3.3.3.3.2", - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.2.1", // ifIndex - Type: g.Integer, - Value: ifIndex, - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.2.2", // ifDescr - Type: g.OctetString, - Value: ifDescr, - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.4", // severity OID - Type: g.Integer, - Value: 5, // event - }, - }, - } - - _, err = gs.SendTrap(trap) - if err != nil { - log.Printf("error sending LinkUp trap: %s", err) - } else { - log.Printf("LinkUp trap sent successfully") - } -} - -// 3. 设备鉴权失败时发送Trap (AuthenticationFailure) -func (s *SNMPService) sendAuthFailureTrap(gs *g.GoSNMP, username, descr string) { - err := gs.Connect() - if err != nil { - log.Fatalf("Connect() err: %v", err) - } - defer gs.Conn.Close() - - trap := g.SnmpTrap{ - Variables: []g.SnmpPDU{ - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.3", // authenticationFailure - Type: g.OctetString, - Value: ".1.3.6.1.4.1.1379.2.3.3.3.3.3", - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.3.1", // 自定义OID,用于记录失败的用户名 - Type: g.OctetString, - Value: username, - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.3.2", // 自定义OID,用于记录描述 - Type: g.OctetString, - Value: descr, - }, - { - Name: ".1.3.6.1.4.1.1379.2.3.3.3.4", // severity OID - Type: g.Integer, - Value: 4, // event - }, - }, - } - - _, err = gs.SendTrap(trap) - if err != nil { - log.Printf("error sending AuthenticationFailure trap: %s", err) - } else { - log.Printf("AuthenticationFailure trap sent successfully") - } -} - -func (s *SNMPService) monitorNetwork(gs *g.GoSNMP) { - // 假设有一个函数 checkLinkStatus 返回链路状态 - for { - serviceStatus := s.checkServiceStatus() - switch strings.ToUpper(serviceStatus) { - case "LINK_DOWN": - index := 1 - ifDescr := fmt.Sprintf("Link(index=%d) DOWN", index) - s.sendLinkDownTrap(gs, index, ifDescr) // 假设接口索引为1 - s.SysService = 0 - case "LINK_UP": - index := 1 - ifDescr := fmt.Sprintf("Link(index=%d) UP", index) - s.sendLinkUpTrap(gs, index, ifDescr) // 假设接口索引为1 - s.SysService = 0 - case "AUTH_FAILURE": - descr := "Authentication Failure" - s.sendAuthFailureTrap(gs, s.UserName, descr) - s.SysService = 0 - default: - } - - time.Sleep(10 * time.Second) // 每10秒检查一次 - } -} - -func (s *SNMPService) checkServiceStatus() string { - switch s.SysService { - case 1: - return "LINK_DOWN" - case 2: - return "LINK_UP" - case 3: - return "AUTH_FAILURE" - default: - } - return "NORMAL" -} diff --git a/sshsvc/sshsvc.go b/sshsvc/sshsvc.go deleted file mode 100644 index d0526ff8..00000000 --- a/sshsvc/sshsvc.go +++ /dev/null @@ -1,575 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "io" - "net" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "sync" - "time" - - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/mmlp" - "be.ems/sshsvc/config" - "be.ems/sshsvc/dborm" - "be.ems/sshsvc/logmml" - "be.ems/sshsvc/snmp" - omctelnet "be.ems/sshsvc/telnet" - - //"github.com/gliderlabs/ssh" - "golang.org/x/crypto/ssh" - "golang.org/x/term" -) - -var conf *config.YamlConfig - -var ( - telnetCC int - sshCC int - telnetMu sync.Mutex - sshMu sync.Mutex -) - -func init() { - conf = config.GetYamlConfig() - log.InitLogger(conf.Logger.File, conf.Logger.Duration, conf.Logger.Count, "omc:sshsvc", config.GetLogLevel()) - fmt.Printf("OMC sshsvc version: %s\n", global.Version) - log.Infof("========================= OMC sshsvc startup =========================") - log.Infof("OMC sshsvc version: %s %s %s", global.Version, global.BuildTime, global.GoVer) - db := conf.Database - err := dborm.InitDbClient(db.Type, db.User, db.Password, db.Host, db.Port, db.Name, db.ConnParam) - if err != nil { - fmt.Println("dborm.initDbClient err:", err) - os.Exit(1) - } - logmml.InitMmlLogger(conf.Logmml.File, conf.Logmml.Duration, conf.Logmml.Count, "omc", config.GetLogMmlLevel()) -} - -// readPrivateKey 读取SSH私钥,如果不存在则生成新的密钥对 -func readPrivateKey() ssh.Signer { - // 检查私钥文件是否存在 - if _, err := os.Stat(conf.Sshd.PrivateKey); os.IsNotExist(err) { - // 如果文件不存在,创建目录并生成密钥 - dir := filepath.Dir(conf.Sshd.PrivateKey) - if err := os.MkdirAll(dir, 0700); err != nil { - log.Fatal("Failed to create .ssh directory:", err) - os.Exit(2) - } - - // 使用ssh-keygen命令生成密钥对 - cmd := exec.Command("ssh-keygen", "-t", "rsa", "-P", "", "-f", conf.Sshd.PrivateKey) - if err := cmd.Run(); err != nil { - log.Fatal("Failed to generate SSH key:", err) - os.Exit(2) - } - } - - // 读取SSH密钥对 - privateKeyBytes, err := os.ReadFile(conf.Sshd.PrivateKey) - if err != nil { - log.Fatal("Failed to ReadFile", err) - os.Exit(2) - } - - privateKey, err := ssh.ParsePrivateKey(privateKeyBytes) - if err != nil { - log.Fatal("Failed to ParsePrivateKey", err) - os.Exit(3) - } - return privateKey -} - -func main() { - // 配置SSH服务器 - serverConfig := &ssh.ServerConfig{ - PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) { - // 这里可以进行密码验证逻辑,例如检查用户名和密码是否匹配 - // validUser, _, err := dborm.XormCheckLoginUser(conn.User(), string(password), conf.OMC.UserCrypt) - // if err != nil { - // return nil, err - // } - // if validUser == true { - // sessionToken := fmt.Sprintf("%x", conn.SessionID()) // Generate new token to session ID - // sourceAddr := conn.RemoteAddr().String() - // timeOut := uint32(conf.Sshd.Timeout) - // sessionMode := conf.Sshd.Session - // log.Debugf("token:%s sourceAddr:%s", sessionToken, sourceAddr) - // affected, err := dborm.XormInsertSession(conn.User(), sourceAddr, sessionToken, timeOut, sessionMode) - // if err != nil { - // log.Error("Failed to insert Session table:", err) - // return nil, err - // } - // if affected == -1 { - // err := errors.New("Failed to get session") - // log.Error(err) - // return nil, err - // } - - // return nil, nil - // } - if handleAuth(conf.Sshd.AuthType, conn.User(), string(password)) { - return nil, nil - } - return nil, fmt.Errorf("invalid user or password") - }, - PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { - // 这里可以进行公钥验证逻辑,例如检查用户的公钥是否在允许的公钥列表中 - return nil, fmt.Errorf("public key authentication is failed") - }, - } - - privateKey := readPrivateKey() - serverConfig.AddHostKey(privateKey) - - // 启动SSH服务器 - hostUri := fmt.Sprintf("%s:%d", conf.Sshd.ListenAddr, conf.Sshd.ListenPort) - listener, err := net.Listen("tcp", hostUri) - if err != nil { - log.Fatal("Failed to Listen: ", err) - os.Exit(4) - } - //fmt.Printf("MML SSH server startup, listen port:%d\n", conf.Sshd.ListenPort) - // 启动telnet服务器 - //telnetUri := fmt.Sprintf("%s:%d", conf.TelnetServer.ListenAddr, conf.TelnetServer.ListenPort) - // telnetListener, err := net.Listen("tcp", telnetUri) - // if err != nil { - // log.Fatal("Failed to Listen: ", err) - // os.Exit(4) - // } - //fmt.Printf("MML Telnet server startup, listen port:%d\n", conf.TelnetServer.ListenPort) - // telnetconn, err := telnetListener.Accept() - // if err != nil { - // log.Fatal("Failed to accept telnet connection: ", err) - // os.Exit(6) - // } - - telnetSvc := omctelnet.TelnetHandler{ - ListenAddr: conf.TelnetServer.ListenAddr, - ListenPort: conf.TelnetServer.ListenPort, - UserName: conf.TelnetServer.UserName, - Password: conf.TelnetServer.Password, - AuthType: conf.TelnetServer.AuthType, - MaxConnNum: conf.TelnetServer.MaxConnNum, - TagNE: conf.TelnetServer.TagNE, - ListenHost: conf.TelnetServer.ListenAddr + ":" + strconv.Itoa(int(conf.TelnetServer.ListenPort)), - } - go telnetSvc.StartTelnetServer() - // go StartTelnetServer(telnetSvc.ListenHost) - - snmpSvc := snmp.SNMPService{ - ListenAddr: conf.SNMPServer.ListenAddr, - ListenPort: conf.SNMPServer.ListenPort, - UserName: conf.SNMPServer.UserName, - AuthPass: conf.SNMPServer.AuthPass, - AuthProto: conf.SNMPServer.AuthProto, - PrivPass: conf.SNMPServer.PrivPass, - PrivProto: conf.SNMPServer.PrivProto, - EngineID: conf.SNMPServer.EngineID, - TrapPort: conf.SNMPServer.TrapPort, - TrapListen: conf.SNMPServer.TrapListen, - TrapBool: conf.SNMPServer.TrapBool, - TrapTick: conf.SNMPServer.TrapTick, - TimeOut: conf.SNMPServer.TimeOut, - TrapTarget: conf.SNMPServer.TrapTarget, - - ListenHost: conf.SNMPServer.ListenAddr + ":" + strconv.Itoa(int(conf.SNMPServer.ListenPort)), - TrapHost: conf.SNMPServer.ListenAddr + ":" + strconv.Itoa(int(conf.SNMPServer.TrapPort)), - SysName: "HLR-0", - SysStatus: "Normal", - SysDescr: "HLR server(sysNO=0)", - SysLocation: "Shanghai", - SysContact: "", - SysService: 0, - } - - go snmpSvc.StartSNMPServer() - go snmpSvc.StartTrapServer() - - for { - conn, err := listener.Accept() - if err != nil { - log.Fatal("Failed to Accept: ", err) - os.Exit(5) - } - - go handleSSHConnection(conn, serverConfig) - } -} - -func handleAuth(authType, userName, password string) bool { - switch authType { - case "local": - if userName == conf.Sshd.UserName && password == conf.Sshd.Password { - return true - } - return false - case "radius": - exist, err := dborm.XEngDB().Table("OMC_PUB.sysUser").Where("userName=? AND password=md5(?)", userName, password).Exist() - if err != nil { - return false - } - return exist - case "omc": - - default: - } - - return false -} - -func StartTelnetServer(addr string) { - listener, err := net.Listen("tcp", addr) - if err != nil { - fmt.Println("Error starting Telnet server:", err) - return - } - defer listener.Close() - fmt.Println("Telnet server started on", addr) - - for { - conn, err := listener.Accept() - if err != nil { - fmt.Println("Error accepting Telnet connection:", err) - continue - } - - telnetMu.Lock() - if telnetCC >= int(conf.TelnetServer.MaxConnNum) { - telnetMu.Unlock() - io.WriteString(conn, "Connection limit reached. Try again later.\r\n") - conn.Close() - continue - } - telnetCC++ - telnetMu.Unlock() - - go handleTelnetConnection(conn) - } -} - -func handleTelnetConnection(conn net.Conn) { - defer func() { - telnetMu.Lock() - telnetCC-- - telnetMu.Unlock() - }() - defer conn.Close() - - reader := bufio.NewReader(conn) - writer := bufio.NewWriter(conn) - - // 发送欢迎信息 - writer.WriteString("Welcome to the Telnet server!\r\n") - writer.Flush() - - // 请求用户名 - writer.WriteString("Username: ") - writer.Flush() - user, _ := reader.ReadString('\n') - user = strings.TrimSpace(user) - - // 关闭回显模式 - writer.Write([]byte{255, 251, 1}) // IAC WILL ECHO - writer.Flush() - - // 请求密码 - writer.WriteString("Password: ") - writer.Flush() - - // 读取密码并清除控制序列 - var passBuilder strings.Builder - for { - b, err := reader.ReadByte() - if err != nil { - return - } - if b == '\n' || b == '\r' { - break - } - if b == 255 { // IAC - reader.ReadByte() // 忽略下一个字节 - reader.ReadByte() // 忽略下一个字节 - } else { - passBuilder.WriteByte(b) - } - } - pass := passBuilder.String() - - // 恢复回显模式 - writer.Write([]byte{255, 252, 1}) // IAC WONT ECHO - writer.Flush() - - if handleAuth(conf.TelnetServer.AuthType, user, pass) { - writer.WriteString("\r\nAuthentication successful!\r\n") - writer.Flush() - HandleCommands(user, conf.TelnetServer.TagNE, reader, writer) - } else { - writer.WriteString("\r\nAuthentication failed!\r\n") - writer.Flush() - } -} - -// 处理命令输 -func HandleCommands(user, tag string, reader *bufio.Reader, writer *bufio.Writer) { - header := fmt.Sprintf("[%s@%s]> ", user, tag) - clearLine := "\033[2K\r" // ANSI 转义序列,用于清除当前行 - for { - var commandBuilder strings.Builder - for { - b, err := reader.ReadByte() - if err != nil { - return - } - if b == '\n' || b == '\r' { - break - } - if b == '\xff' || b == '\xfe' || b == '\x01' { - continue - } - if b == 127 { // 处理退格键 - if commandBuilder.Len() > 0 { - // 手动截断字符串 - command := commandBuilder.String() - command = command[:len(command)-1] - commandBuilder.Reset() - commandBuilder.WriteString(command) - writer.WriteString("\b \b") // 回显退格 - writer.Flush() - } - } else { - // 回显用户输入的字符 - writer.WriteByte(b) - writer.Flush() - commandBuilder.WriteByte(b) - } - } - command := strings.TrimSpace(commandBuilder.String()) - - // 处理其他命令 - switch command { - case "hello": - writer.WriteString("\r\nHello, world!\r\n") - case "time": - writer.WriteString(fmt.Sprintf("\r\nCurrent time: %s\r\n", time.Now().Format(time.RFC1123))) - case "exit", "quit": - writer.WriteString("\r\nGoodbye!\r\n") - writer.Flush() - return - case "": - default: - writer.WriteString("\r\nUnknown command\r\n") - writer.Flush() - } - writer.WriteString(clearLine + header) - writer.Flush() - } -} - -func handleSSHConnection(conn net.Conn, serverConfig *ssh.ServerConfig) { - // SSH握手 - sshConn, chans, reqs, err := ssh.NewServerConn(conn, serverConfig) - if err != nil { - log.Error("Failed to NewServerConn: ", err) - return - } - - log.Infof("SSH connect accepted,client version:%s,user:%s", sshConn.ClientVersion(), sshConn.User()) - - // 处理SSH请求 - go ssh.DiscardRequests(reqs) - - // 处理SSH通道 - for newChannel := range chans { - if newChannel.ChannelType() != "session" { - newChannel.Reject(ssh.UnknownChannelType, "unsupported channel type") - continue - } - - channel, requests, err := newChannel.Accept() - if err != nil { - log.Error("Failed to NewServerConn: ", err) - continue - } - - sshMu.Lock() - sshCC++ - if sshCC > int(conf.Sshd.MaxConnNum) { - sshMu.Unlock() - log.Error("Maximum number of connections exceeded") - channel.Write([]byte(fmt.Sprintf("Connection limit reached (limit=%d). Try again later.\r\n", conf.Sshd.MaxConnNum))) - conn.Close() - continue - } - sshMu.Unlock() - - go handleSSHChannel(conn, sshConn, channel, requests) - } -} - -func handleSSHChannel(conn net.Conn, sshConn *ssh.ServerConn, channel ssh.Channel, requests <-chan *ssh.Request) { - for req := range requests { - switch req.Type { - case "exec": - // 执行远程命令 - command := strings.TrimSpace(string(req.Payload))[4:] - //cmd := exec.Command( - cmd := exec.Command("cmd", "/C", command) - cmd.Stdin = channel - cmd.Stdout = channel - cmd.Stderr = channel.Stderr() - log.Trace("command:", command) - - err := cmd.Run() - if err != nil { - log.Error("Failed to cmd.Run: ", err) - } - - channel.SendRequest("exit-status", false, []byte{0, 0, 0, 0}) - channel.Close() - closeConnection(conn) - // case "shell": - // // 处理交互式shell会话 - // // 在这里添加您的处理逻辑,例如启动一个shell进程并将其连接到channel - // // 请注意,处理交互式shell会话需要更复杂的逻辑,您可能需要使用类似于pty包来处理终端相关的操作 - // channel.Write([]byte("交互式shell会话已启动\n")) - // channel.Close() - // handleSSHShell(user, channel) - case "pty-req": - log.Info("A pty-req processing...") - req.Reply(true, nil) - handleSSHShell(sshConn, channel) - channel.SendRequest("exit-status", false, []byte{0, 0, 0, 0}) - channel.Close() - closeConnection(conn) - log.Info("Channel closed") - default: - req.Reply(false, nil) - } - } -} - -func closeConnection(conn net.Conn) { - sshMu.Lock() - conn.Close() - sshCC-- - sshMu.Unlock() -} - -func handleSSHShell(sshConn *ssh.ServerConn, channel ssh.Channel) { - //conf = config.GetYamlConfig() - // 检查通道是否支持终端 - - omcMmlVar := &mmlp.MmlVar{ - Version: global.Version, - Output: mmlp.DefaultFormatType, - MmlHome: conf.Sshd.MmlHome, - Limit: conf.Sshd.MaxConnNum, - User: sshConn.User(), - SessionToken: fmt.Sprintf("%x", sshConn.SessionID()), - HttpUri: conf.OMC.HttpUri, - UserAgent: config.GetDefaultUserAgent(), - TagNE: conf.Sshd.TagNE, - } - term := term.NewTerminal(channel, fmt.Sprintf("[%s@%s]> ", omcMmlVar.User, omcMmlVar.TagNE)) - msg := fmt.Sprintf("\r\nWelcome to the %s server!\r\n", strings.ToUpper(omcMmlVar.TagNE)) - term.Write([]byte(msg)) - msg = fmt.Sprintf("Last login: %s from %s \r\n\r\n", time.Now().Format(time.RFC1123), sshConn.RemoteAddr()) - term.Write([]byte(msg)) - - // 启动交互式shell会话 - for { - line, err := term.ReadLine() - if err != nil { - if err == io.EOF { - break - } - log.Error("Failed to read line: ", err) - break - } - - cmdline := strings.TrimSpace(line) - if cmdline != "" { - logmml.Cmd(cmdline) - } - var response string - switch cmdline { - case "hello": - term.Write([]byte("Hello, world!\r\n")) - goto continueLoop - case "time": - response = fmt.Sprintf("Current time: %s\r\n", time.Now().Format(time.RFC1123)) - term.Write([]byte(response)) - goto continueLoop - case "exit", "quit": - goto exitLoop - case "": - goto continueLoop - case "help": - response = fmt.Sprintf("Usage: %s\n", line) - term.Write([]byte(response)) - goto continueLoop - - case "dsp variables": - response = fmt.Sprintf("version: %s\n Output: %s\n", omcMmlVar.Version, omcMmlVar.Output) - term.Write([]byte(response)) - goto continueLoop - - case "set mml output=json": - // mmlp.SetOmcMmlVarOutput("json") - omcMmlVar.Output = "json" - response = fmt.Sprintf("set ok, mmlVar.output = %s\n", omcMmlVar.Output) - term.Write([]byte(response)) - goto continueLoop - - case "set mml output=table": - // mmlp.SetOmcMmlVarOutput("table") - omcMmlVar.Output = "table" - response = fmt.Sprintf("set ok, mmlVar.output = %s\n", omcMmlVar.Output) - term.Write([]byte(response)) - goto continueLoop - - default: - var mmlCmds []mmlp.MmlCommand - mmlLine := strings.TrimSpace(line) - if err = mmlp.ParseMMLCommand(mmlLine, &mmlCmds); err != nil { - response = fmt.Sprintf("parse command error: %v\n", err) - term.Write([]byte(response)) - goto continueLoop - } - // if err = mmlp.ParseMMLParams(&mmlCmds); err != nil { - // response := fmt.Sprintf("#2 parse command error: %v\n", err) - // term.Write([]byte(response)) - // } - - for _, mmlCmd := range mmlCmds { - output, err := mmlp.TransMml2HttpReq(omcMmlVar, &mmlCmd) - if err != nil { - response = fmt.Sprintf("translate MML command error: %v\n", err) - term.Write([]byte(response)) - goto continueLoop - } - response = string(*output) - term.Write(*output) - } - goto continueLoop - } - continueLoop: - if response != "" { - logmml.Ret(response) - } - continue - exitLoop: - token := fmt.Sprintf("%x", sshConn.SessionID()) - _, err = dborm.XormLogoutUpdateSession(token) - if err != nil { - log.Error("Failed to XormLogoutUpdateSession:", err) - } - break - } -} diff --git a/sshsvc/telnet/telnet.go b/sshsvc/telnet/telnet.go deleted file mode 100644 index 18e3ed9a..00000000 --- a/sshsvc/telnet/telnet.go +++ /dev/null @@ -1,198 +0,0 @@ -package omctelnet - -import ( - "bufio" - "fmt" - "io" - "net" - "strings" - "sync" - "time" - - "be.ems/sshsvc/dborm" -) - -type TelnetHandler struct { - ListenAddr string - ListenPort uint16 - UserName string - Password string - AuthType string - MaxConnNum int - TagNE string - ListenHost string - - connCount int - mu sync.Mutex -} - -func (t *TelnetHandler) handleTelnetAuth(authType, userName, password string) bool { - switch authType { - case "local": - if userName == t.UserName && password == t.Password { - return true - } - return false - case "radius", "omc": - exist, err := dborm.XEngDB().Table("OMC_PUB.sysUser").Where("userName=? AND password=md5(?)", userName, password).Exist() - if err != nil { - return false - } - return exist - - default: - } - - return false -} - -func (t *TelnetHandler) StartTelnetServer() { - listener, err := net.Listen("tcp", t.ListenHost) - if err != nil { - fmt.Println("Error starting Telnet server:", err) - return - } - defer listener.Close() - fmt.Println("Telnet server started on", t.ListenHost) - - for { - conn, err := listener.Accept() - if err != nil { - fmt.Println("Error accepting Telnet connection:", err) - continue - } - - t.mu.Lock() - if t.connCount >= int(t.MaxConnNum) { - t.mu.Unlock() - msg := fmt.Sprintf("Connection limit reached (limit=%d). Try again later.\r\n", t.MaxConnNum) - io.WriteString(conn, msg) - conn.Close() - continue - } - t.connCount++ - t.mu.Unlock() - - go t.handleTelnetConnection(conn) - } -} - -func (t *TelnetHandler) handleTelnetConnection(conn net.Conn) { - defer func() { - t.mu.Lock() - t.connCount-- - t.mu.Unlock() - }() - defer conn.Close() - - reader := bufio.NewReader(conn) - writer := bufio.NewWriter(conn) - - // 发送欢迎信息 - - writer.WriteString(fmt.Sprintf("\r\nWelcome to the %s server!\r\n", strings.ToUpper(t.TagNE))) - writer.Flush() - - // 请求用户名 - writer.WriteString("Username: ") - writer.Flush() - user, _ := reader.ReadString('\n') - user = strings.TrimSpace(user) - - // 关闭回显模式 - writer.Write([]byte{255, 251, 1}) // IAC WILL ECHO - writer.Flush() - - // 请求密码 - writer.WriteString("Password: ") - writer.Flush() - - // 读取密码并清除控制序列 - var passBuilder strings.Builder - for { - b, err := reader.ReadByte() - if err != nil { - return - } - if b == '\n' || b == '\r' { - break - } - if b == 255 { // IAC - reader.ReadByte() // 忽略下一个字节 - reader.ReadByte() // 忽略下一个字节 - } else { - passBuilder.WriteByte(b) - } - } - pass := passBuilder.String() - - // 恢复回显模式 - writer.Write([]byte{255, 252, 1}) // IAC WONT ECHO - writer.Flush() - - if t.handleTelnetAuth(t.AuthType, user, pass) { - msg := fmt.Sprintf("\r\n\r\nLast login: %s from %s \r\n\r\n", time.Now().Format(time.RFC1123), conn.RemoteAddr()) - writer.WriteString(msg) - writer.Flush() - t.HandleCommands(user, t.TagNE, reader, writer) - } else { - writer.WriteString("\r\nAuthentication failed!\r\n") - writer.Flush() - } -} - -// 处理命令输 -func (t *TelnetHandler) HandleCommands(user, tag string, reader *bufio.Reader, writer *bufio.Writer) { - header := fmt.Sprintf("[%s@%s]> ", user, tag) - clearLine := "\033[2K\r" // ANSI 转义序列,用于清除当前行 - for { - var commandBuilder strings.Builder - for { - b, err := reader.ReadByte() - if err != nil { - return - } - if b == '\n' || b == '\r' { - break - } - if b == '\xff' || b == '\xfe' || b == '\x01' { - continue - } - if b == 127 { // 处理退格键 - if commandBuilder.Len() > 0 { - // 手动截断字符串 - command := commandBuilder.String() - command = command[:len(command)-1] - commandBuilder.Reset() - commandBuilder.WriteString(command) - writer.WriteString("\b \b") // 回显退格 - writer.Flush() - } - } else { - // 回显用户输入的字符 - writer.WriteByte(b) - writer.Flush() - commandBuilder.WriteByte(b) - } - } - command := strings.TrimSpace(commandBuilder.String()) - - // 处理其他命令 - switch command { - case "hello": - writer.WriteString("\r\nHello, world!\r\n") - case "time": - writer.WriteString(fmt.Sprintf("\r\nCurrent time: %s\r\n", time.Now().Format(time.RFC1123))) - case "exit", "quit": - writer.WriteString("\r\n\r\nGoodbye!\r\n") - writer.Flush() - return - case "": - default: - writer.WriteString("\r\nUnknown command\r\n") - writer.Flush() - } - writer.WriteString(clearLine + header) - writer.Flush() - } -}