Merge branch 'main' into multi-tenant

This commit is contained in:
2024-10-12 10:24:44 +08:00
20 changed files with 1675 additions and 180 deletions

View File

@@ -32,7 +32,7 @@ sshd:
userName: manager
password: pass123
authType: local
tagNE: hlr
tagNE: omc
# authType: local/omc
telnetServer:
@@ -45,7 +45,7 @@ telnetServer:
userName: manager
password: pass123
authType: local
tagNE: hlr
tagNE: omc
# authproto: NoAuth/MD5/SHA
# privProto: NoPriv/DES/AES/AES192/AES256
@@ -63,7 +63,7 @@ snmpServer:
trapBool: false
trapTick: 60
timeOut: 5
trapTarget: "2001:db8::9219"
trapTarget: ""
database:
type: mysql

View File

@@ -41,20 +41,20 @@ CREATE TABLE `mml_http_map` (
-- Records of mml_http_map
-- ----------------------------
INSERT INTO `mml_http_map` VALUES (1, 'OMC', 'dsp', 'sysinfo', 'Get', '/api/rest/systemManagement/v1/sysInfo', '/%s', NULL, NULL, '{}', '{\r\n \"retFmt\": \"GetNF\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE System Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"neType\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"neId\",\r\n \"display\": \"NE ID\",\r\n \"length\": 28\r\n }, \r\n {\r\n \"name\": \"hostName\",\r\n \"display\": \"Host name\",\r\n \"length\": 16\r\n },\r\n {\r\n \"name\": \"osInfo\",\r\n \"display\": \"OS information\",\r\n \"length\": 128\r\n },\r\n {\r\n \"name\": \"dbInfo\",\r\n \"display\": \"Database information\",\r\n \"length\": 80\r\n },\r\n {\r\n \"name\": \"version\",\r\n \"display\": \"Software version\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"ipAddr\",\r\n \"display\": \"IP address\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"port\",\r\n \"display\": \"Port\",\r\n \"length\": 6\r\n },\r\n {\r\n \"name\": \"cpus\",\r\n \"display\": \"CPUs\",\r\n \"length\": 4\r\n },\r\n {\r\n \"name\": \"totalMem\",\r\n \"display\": \"Total memory(KB)\",\r\n \"length\": 11\r\n } \r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (2, 'OMC', 'lst', 'memap', 'Get', '/api/rest/dataManagement/v1/tenants_db/ne_info', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Managed Element Map\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"Resource management UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"ne_name\",\r\n \"display\": \"NE name\",\r\n \"length\": 28\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (3, 'OMC', 'lst', 'neinfo', 'Get', '/api/rest/dataManagement/v1/tenants_db/ne_info', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Network element information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 16\r\n },\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"Resource management UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"ne_name\",\r\n \"display\": \"NE name\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"pv_flag\",\r\n \"display\": \"PV flag\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ip\",\r\n \"display\": \"IP address\",\r\n \"length\": 32\r\n },\r\n {\r\n \"name\": \"port\",\r\n \"display\": \"Port\",\r\n \"length\": 6\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"display\": \"Status\",\r\n \"length\": 10,\r\n \"alias\": [\r\n \"online\",\r\n \"offline\",\r\n \"standby\",\r\n \"maintain\"\r\n ]\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}\r\n');
INSERT INTO `mml_http_map` VALUES (4, 'OMC', 'add', 'neinfo', 'Post', '/api/rest/dataManagement/v1/tenants_db/ne_info', NULL, NULL, '', '{\"bodyFmt\":\"PostDB\", \"bodyKey\":\"ne_info\"}', '{\r\n \"retFmt\": \"PostDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}\r\n');
INSERT INTO `mml_http_map` VALUES (5, 'OMC', 'del', 'neinfo', 'Delete', '/api/rest/dataManagement/v1/tenants_db/ne_info', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}');
INSERT INTO `mml_http_map` VALUES (6, 'OMC', 'mod', 'neinfo', 'Put', '/api/rest/dataManagement/v1/tenants_db/ne_info', NULL, NULL, '?loc=', '{\"bodyFmt\":\"PutDB\", \"bodyKey\":\"ne_info\"}', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}');
INSERT INTO `mml_http_map` VALUES (7, 'OMC', 'dsp', 'alarm', 'Get', '/api/rest/dataManagement/v1/tenants_db/alarm', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Alarm Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"ne_name\",\r\n \"display\": \"NE name\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"alarm_seq\",\r\n \"display\": \"Alarm sequence\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"alarm_title\",\r\n \"display\": \"Alarm title\",\r\n \"length\": 30\r\n }, \r\n {\r\n \"name\": \"orig_severity\",\r\n \"display\": \"Original severity\",\r\n \"length\": 11 \r\n },\r\n {\r\n \"name\": \"pv_flag\",\r\n \"display\": \"PV flag\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"event_time\",\r\n \"display\": \"Event time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (8, 'OMC', 'lst', 'measuretask', 'Get', '/api/rest/dataManagement/v1/tenants_db/measure_task', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Performance Task Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"id\",\r\n \"display\": \"Task ID\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_ids\",\r\n \"display\": \"NE ID Set\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"granul_option\",\r\n \"display\": \"Time granulity\",\r\n \"length\": 5\r\n },\r\n {\r\n \"name\": \"kpi_set\",\r\n \"display\": \"KPI set\",\r\n \"length\": 60\r\n },\r\n {\r\n \"name\": \"start_time\",\r\n \"display\": \"Start time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"end_time\",\r\n \"display\": \"End time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"display\": \"Status\",\r\n \"length\": 8\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (9, 'OMC', 'add', 'measuretask', 'Post', '/api/rest/dataManagement/v1/tenants_db/measure_task', NULL, NULL, '', '{\"bodyFmt\":\"PostDB\", \"bodyKey\":\"measure_task\"}', '{\r\n \"retFmt\": \"PostDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}\r\n');
INSERT INTO `mml_http_map` VALUES (10, 'OMC', 'del', 'measuretask', 'Delete', '/api/rest/dataManagement/v1/tenants_db/measure_task', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}');
INSERT INTO `mml_http_map` VALUES (11, 'OMC', 'mod', 'measuretask', 'Put', '/api/rest/dataManagement/v1/tenants_db/measure_task', NULL, NULL, '?loc=', '{\"bodyFmt\":\"PutDB\", \"bodyKey\":\"measure_task\"}', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}');
INSERT INTO `mml_http_map` VALUES (12, 'OMC', 'lst', 'measuredata', 'Get', '/api/rest/dataManagement/v1/tenants_db/measure_data', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Performance Measure Data\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"task_id\",\r\n \"display\": \"Task ID\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"Resource management UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"ne_name\",\r\n \"display\": \"NE name\",\r\n \"length\": 28\r\n }, \r\n {\r\n \"name\": \"granul_option\",\r\n \"display\": \"Time granulity\",\r\n \"length\": 5\r\n },\r\n {\r\n \"name\": \"kpi_id\",\r\n \"display\": \"KPI ID\",\r\n \"length\": 32\r\n },\r\n {\r\n \"name\": \"start_time\",\r\n \"display\": \"Start time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"end_time\",\r\n \"display\": \"End time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"value\",\r\n \"display\": \"value\",\r\n \"length\": 11\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (13, 'OMC', 'lst', 'operationlog', 'Get', '/api/rest/dataManagement/v1/tenants_db/operation_log', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Operation Log\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"account_name\",\r\n \"display\": \"Account ID\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"op_ip\",\r\n \"display\": \"Source IP address\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"op_type\",\r\n \"display\": \"Opration type\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"op_content\",\r\n \"display\": \"Operation content\",\r\n \"length\": 50\r\n },\r\n {\r\n \"name\": \"op_result\",\r\n \"display\": \"Operation result\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"log_time\",\r\n \"display\": \"Log time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (14, 'OMC', 'lst', 'securitylog', 'Get', '/api/rest/dataManagement/v1/tenants_db/security_log', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Security Log\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"account_name\",\r\n \"display\": \"Account ID\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"op_ip\",\r\n \"display\": \"Source IP address\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"op_type\",\r\n \"display\": \"Opration type\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"op_content\",\r\n \"display\": \"Operation content\",\r\n \"length\": 50\r\n },\r\n {\r\n \"name\": \"op_result\",\r\n \"display\": \"Operation result\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"op_time\",\r\n \"display\": \"Operation log time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (15, 'OMC', 'lst', 'alarmlog', 'Get', '/api/rest/dataManagement/v1/tenants_db/alarm_log', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Alarm Log\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 8\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"alarm_seq\",\r\n \"display\": \"Alarm sequence\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"alarm_id\",\r\n \"display\": \"Alarm ID\",\r\n \"length\": 20\r\n }, \r\n {\r\n \"name\": \"event_time\",\r\n \"display\": \"Alarm event time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"log_time\",\r\n \"display\": \"Log time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (2, 'OMC', 'lst', 'memap', 'Get', '/api/rest/dataManagement/v1/omc_db/ne_info', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Managed Element Map\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"Resource management UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"ne_name\",\r\n \"display\": \"NE name\",\r\n \"length\": 28\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (3, 'OMC', 'lst', 'neinfo', 'Get', '/api/rest/dataManagement/v1/omc_db/ne_info', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Network element information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 16\r\n },\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"Resource management UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"ne_name\",\r\n \"display\": \"NE name\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"pv_flag\",\r\n \"display\": \"PV flag\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ip\",\r\n \"display\": \"IP address\",\r\n \"length\": 32\r\n },\r\n {\r\n \"name\": \"port\",\r\n \"display\": \"Port\",\r\n \"length\": 6\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"display\": \"Status\",\r\n \"length\": 10,\r\n \"alias\": [\r\n \"offline\",\r\n \"online\",\r\n \"standby\",\r\n \"maintain\"\r\n ]\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}\r\n');
INSERT INTO `mml_http_map` VALUES (4, 'OMC', 'add', 'neinfo', 'Post', '/api/rest/dataManagement/v1/omc_db/ne_info', NULL, NULL, '', '{\"bodyFmt\":\"PostDB\", \"bodyKey\":\"ne_info\"}', '{\r\n \"retFmt\": \"PostDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}\r\n');
INSERT INTO `mml_http_map` VALUES (5, 'OMC', 'del', 'neinfo', 'Delete', '/api/rest/dataManagement/v1/omc_db/ne_info', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}');
INSERT INTO `mml_http_map` VALUES (6, 'OMC', 'mod', 'neinfo', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_info', NULL, NULL, '?loc=', '{\"bodyFmt\":\"PutDB\", \"bodyKey\":\"ne_info\"}', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}');
INSERT INTO `mml_http_map` VALUES (7, 'OMC', 'dsp', 'alarm', 'Get', '/api/rest/dataManagement/v1/omc_db/alarm', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Alarm Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"ne_name\",\r\n \"display\": \"NE name\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"alarm_seq\",\r\n \"display\": \"Alarm sequence\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"alarm_title\",\r\n \"display\": \"Alarm title\",\r\n \"length\": 30\r\n }, \r\n {\r\n \"name\": \"orig_severity\",\r\n \"display\": \"Original severity\",\r\n \"length\": 11 \r\n },\r\n {\r\n \"name\": \"pv_flag\",\r\n \"display\": \"PV flag\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"event_time\",\r\n \"display\": \"Event time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (8, 'OMC', 'lst', 'measuretask', 'Get', '/api/rest/dataManagement/v1/omc_db/measure_task', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Performance Task Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"id\",\r\n \"display\": \"Task ID\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_ids\",\r\n \"display\": \"NE ID Set\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"granul_option\",\r\n \"display\": \"Time granulity\",\r\n \"length\": 5\r\n },\r\n {\r\n \"name\": \"kpi_set\",\r\n \"display\": \"KPI set\",\r\n \"length\": 60\r\n },\r\n {\r\n \"name\": \"start_time\",\r\n \"display\": \"Start time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"end_time\",\r\n \"display\": \"End time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"display\": \"Status\",\r\n \"length\": 8\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (9, 'OMC', 'add', 'measuretask', 'Post', '/api/rest/dataManagement/v1/omc_db/measure_task', NULL, NULL, '', '{\"bodyFmt\":\"PostDB\", \"bodyKey\":\"measure_task\"}', '{\r\n \"retFmt\": \"PostDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}\r\n');
INSERT INTO `mml_http_map` VALUES (10, 'OMC', 'del', 'measuretask', 'Delete', '/api/rest/dataManagement/v1/omc_db/measure_task', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}');
INSERT INTO `mml_http_map` VALUES (11, 'OMC', 'mod', 'measuretask', 'Put', '/api/rest/dataManagement/v1/omc_db/measure_task', NULL, NULL, '?loc=', '{\"bodyFmt\":\"PutDB\", \"bodyKey\":\"measure_task\"}', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}');
INSERT INTO `mml_http_map` VALUES (12, 'OMC', 'lst', 'measuredata', 'Get', '/api/rest/dataManagement/v1/omc_db/measure_data', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Performance Measure Data\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"task_id\",\r\n \"display\": \"Task ID\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"Resource management UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"ne_name\",\r\n \"display\": \"NE name\",\r\n \"length\": 28\r\n }, \r\n {\r\n \"name\": \"granul_option\",\r\n \"display\": \"Time granulity\",\r\n \"length\": 5\r\n },\r\n {\r\n \"name\": \"kpi_id\",\r\n \"display\": \"KPI ID\",\r\n \"length\": 32\r\n },\r\n {\r\n \"name\": \"start_time\",\r\n \"display\": \"Start time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"end_time\",\r\n \"display\": \"End time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"value\",\r\n \"display\": \"value\",\r\n \"length\": 11\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (13, 'OMC', 'lst', 'operationlog', 'Get', '/api/rest/dataManagement/v1/omc_db/operation_log', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Operation Log\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"account_name\",\r\n \"display\": \"Account ID\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"op_ip\",\r\n \"display\": \"Source IP address\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"op_type\",\r\n \"display\": \"Opration type\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"op_content\",\r\n \"display\": \"Operation content\",\r\n \"length\": 50\r\n },\r\n {\r\n \"name\": \"op_result\",\r\n \"display\": \"Operation result\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"log_time\",\r\n \"display\": \"Log time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (14, 'OMC', 'lst', 'securitylog', 'Get', '/api/rest/dataManagement/v1/omc_db/security_log', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Security Log\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"account_name\",\r\n \"display\": \"Account ID\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"op_ip\",\r\n \"display\": \"Source IP address\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"op_type\",\r\n \"display\": \"Opration type\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"op_content\",\r\n \"display\": \"Operation content\",\r\n \"length\": 50\r\n },\r\n {\r\n \"name\": \"op_result\",\r\n \"display\": \"Operation result\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"op_time\",\r\n \"display\": \"Operation log time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (15, 'OMC', 'lst', 'alarmlog', 'Get', '/api/rest/dataManagement/v1/omc_db/alarm_log', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Alarm Log\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 8\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE UID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"alarm_seq\",\r\n \"display\": \"Alarm sequence\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"alarm_id\",\r\n \"display\": \"Alarm ID\",\r\n \"length\": 20\r\n }, \r\n {\r\n \"name\": \"event_time\",\r\n \"display\": \"Alarm event time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"log_time\",\r\n \"display\": \"Log time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (16, 'OMC', 'dsp', 'licenseinfo', 'Get', '/api/rest/systemManagement/v1/licenseInfo', '/%s', NULL, NULL, '{}', '{\r\n \"retFmt\": \"GetNF\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE License Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"neType\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"neId\",\r\n \"display\": \"NE ID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"serialNum\",\r\n \"display\": \"Serial No\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"capability\",\r\n \"display\": \"License capability\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"capUsed\",\r\n \"display\": \"License used\",\r\n \"length\": 11\r\n }, \r\n {\r\n \"name\": \"featureEnabled\",\r\n \"display\": \"Feature enabled\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"expiryDate\",\r\n \"display\": \"License expiry date\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (17, 'OMC', 'lst', 'systemlog', 'Get', '/api/rest/dataManagement/v1/tenants_db/system_log', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"System Log\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"process_type\",\r\n \"display\": \"Process type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"process_name\",\r\n \"display\": \"Process name\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"user_name\",\r\n \"display\": \"User name\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"process_id\",\r\n \"display\": \"Process ID\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"event\",\r\n \"display\": \"Event\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"start_time\",\r\n \"display\": \"Start time\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"end_time\",\r\n \"display\": \"End time\",\r\n \"length\": 20\r\n }, \r\n {\r\n \"name\": \"log_time\",\r\n \"display\": \"Log time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');
INSERT INTO `mml_http_map` VALUES (18, 'OMC', 'lst', 'eventlog', 'Get', '/api/rest/dataManagement/v1/tenants_db/event_log', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"Event Log\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"event\",\r\n \"display\": \"Event\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"event time\",\r\n \"display\": \"Event\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"log_time\",\r\n \"display\": \"Log time\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}');

View File

@@ -689,6 +689,8 @@ INSERT INTO `sys_dict_data` VALUES (2178, 2178, 'dictData.cdr_cause_code.41', '
INSERT INTO `sys_dict_data` VALUES (2179, 2179, 'dictData.cdr_cause_code.42', '拥塞', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (2180, 2180, 'dictData.cdr_cause_code.47', '资源不可用', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (2181, 2181, 'dictData.cdr_cause_code.50', '请求的设施未订阅', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (2182, 2182, 'job.exportSMSCCDR', '定期从短信话单表导出文件至指定目录', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (2183, 2183, 'job.removeExportedFiles', '定期删除指定目录过期文件', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
-- 多租户
INSERT INTO `sys_dict_data` VALUES (11000, 11000, 'menu.security.tenant', '租户管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);

View File

@@ -689,6 +689,8 @@ INSERT INTO `sys_dict_data` VALUES (4178, 4178, 'dictData.cdr_cause_code.41', 'T
INSERT INTO `sys_dict_data` VALUES (4179, 4179, 'dictData.cdr_cause_code.42', 'Congestion', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (4180, 4180, 'dictData.cdr_cause_code.47', 'Resources Unavailable Unspec', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (4181, 4181, 'dictData.cdr_cause_code.50', 'Requested Facility Not Subscribed', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (4182, 4182, 'job.exportSMSCCDR', 'Export regularly from SMSC CDR table', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
INSERT INTO `sys_dict_data` VALUES (4183, 4183, 'job.removeExportedFiles', 'Regularly delete expired files in the specified directory', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
-- 多租户
INSERT INTO `sys_dict_data` VALUES (14000, 14000, 'menu.security.tenant', 'Tenant Management', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');

View File

@@ -40,5 +40,7 @@ INSERT INTO `sys_job` VALUES (10, 'job.genNeStateAlarm', 'SYSTEM', 'genNeStateAl
INSERT INTO `sys_job` VALUES (11, 'job.exportOperateLog', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"sys_log_operate\",\"timeCol\":\"oper_time\",\"timeUnit\":\"milli\",\"columns\":\"oper_id,omc_get_dict_value(title, \\\"i18n_en\\\") as title,business_type,method,request_method,operator_type,oper_name,dept_name,oper_url,oper_ip,oper_location,oper_param,oper_msg,status,oper_time,cost_time,tenant_id\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/operate_log\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1724833786290, 'job.exportOperateLog');
INSERT INTO `sys_job` VALUES (12, 'job.exportIMSCDR', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"cdr_event_ims\",\"columns\":\"id,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.recordType\')) as record_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.callType\')) as call_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.callerParty\')) as caller_party,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.calledParty\')) as called_party,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.callDuration\')) as call_duration,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.serviceResult\')) as service_result,DATE_FORMAT(FROM_UNIXTIME(timestamp), \'%Y-%m-%d %H:%i:%s\') AS timestamp\",\"timeCol\":\"timestamp\",\"timeUnit\":\"second\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/ims_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1722224659251, '');
INSERT INTO `sys_job` VALUES (13, 'job.exportSMFCDR', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"cdr_event_smf\",\"columns\":\"id,ne_type,ne_name,rm_uid,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.recordType\')) AS record_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.chargingID\')) AS charging_id,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.subscriberIdentifier.subscriptionIDType\')) AS subscriber_id_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.subscriberIdentifier.subscriptionIDData\')) AS subscriber_id_data,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.duration\')) AS duration,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.invocationTimestamp\')) as invocationTimestamp,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataVolumeUplink\')) AS data_volume_uplink,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataVolumeDownlink\')) AS data_volume_downlink,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataTotalVolume\')) AS data_total_volume,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.pDUSessionChargingInformation.pDUAddress.pDUIPv4Address\')) AS pdu_ipv4_address,timestamp\",\"timeCol\":\"timestamp\",\"timeUnit\":\"second\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/smf_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1724309047797, '');
INSERT INTO `sys_job` VALUES (14, 'job.exportSMSCCDR', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"cdr_event_smsc\",\"columns\":\"id,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.recordType\')) as record_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.serviceType\')) as service_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.callerParty\')) as caller_party,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.calledParty\')) as called_party,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.result\')) as result,DATE_FORMAT(FROM_UNIXTIME(JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.updateTime\'))), \'%Y-%m-%d %H:%i:%s\') as update_time\",\"timeCol\":\"timestamp\",\"timeUnit\":\"second\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/smsc_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1724309047797, '');
INSERT INTO `sys_job` VALUES (15, 'job.removeExportedFiles', 'SYSTEM', 'removeFile', '[{\"filePath\":\"/usr/local/omc/backup/operate_log\",\"maxDays\":30},{\"filePath\":\"/usr/local/omc/backup/ims_cdr\",\"maxDays\":30},{\"filePath\":\"/usr/local/omc/backup/smf_cdr\",\"maxDays\":30},{\"filePath\":\"/usr/local/omc/backup/smsc_cdr\",\"maxDays\":30}]', '0 10 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1728634085631, '');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -696,6 +696,8 @@ REPLACE INTO `sys_dict_data` VALUES (2178, 2178, 'dictData.cdr_cause_code.41', '
REPLACE INTO `sys_dict_data` VALUES (2179, 2179, 'dictData.cdr_cause_code.42', '拥塞', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (2180, 2180, 'dictData.cdr_cause_code.47', '资源不可用', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (2181, 2181, 'dictData.cdr_cause_code.50', '请求的设施未订阅', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (2182, 2182, 'job.exportSMSCCDR', '定期从短信话单表导出文件至指定目录', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (2183, 2183, 'job.removeExportedFiles', '定期删除指定目录过期文件', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
-- multi-tenancy
REPLACE INTO `sys_dict_data` VALUES (11000, 11000, 'menu.security.tenant', '租户管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);

View File

@@ -691,6 +691,8 @@ REPLACE INTO `sys_dict_data` VALUES (4178, 4178, 'dictData.cdr_cause_code.41', '
REPLACE INTO `sys_dict_data` VALUES (4179, 4179, 'dictData.cdr_cause_code.42', 'Congestion', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (4180, 4180, 'dictData.cdr_cause_code.47', 'Resources Unavailable Unspec', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (4181, 4181, 'dictData.cdr_cause_code.50', 'Requested Facility Not Subscribed', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (4182, 4182, 'job.exportSMSCCDR', 'Export regularly from SMSC CDR table', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
REPLACE INTO `sys_dict_data` VALUES (4183, 4183, 'job.removeExportedFiles', 'Regularly delete expired files in the specified directory', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
-- 多租户
REPLACE INTO `sys_dict_data` VALUES (14000, 14000, 'menu.security.tenant', 'Tenant Management', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');

View File

@@ -43,6 +43,8 @@ REPLACE INTO `sys_job` VALUES (9, 'job.getStateFromNE', 'SYSTEM', 'getStateFromN
REPLACE INTO `sys_job` VALUES (10, 'job.genNeStateAlarm', 'SYSTEM', 'genNeStateAlarm', '{\"alarmID\":\"HXEMSSM10000\",\"alarmCode\":10000,\"alarmTitle\":\"The system state is abnormal\",\"neType\":\"OMC\",\"alarmType\":\"EquipmentAlarm\",\"origSeverity\": \"Major\",\"objectName\":\"EMS;SystemManagement;Heartbeat\",\"objectType\":\"SystemState\",\"specificProblem\":\"Alarm cause: the system state of target NE has not been received for {threshold} seconds\", \"specificProblemID\":\"AC10000\",\"threshold\":30}', '0/5 * * * * ?', '3', '0', '0', '0', 'supervisor', 1698478134842, 'admin', 1713781643031, 'job.genNeStateAlarmRemark');
REPLACE INTO `sys_job` VALUES (11, 'job.exportOperateLog', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"sys_log_operate\",\"timeCol\":\"oper_time\",\"timeUnit\":\"milli\",\"columns\":\"oper_id,omc_get_dict_value(title, \\\"i18n_en\\\") as title,business_type,method,request_method,operator_type,oper_name,dept_name,oper_url,oper_ip,oper_location,oper_param,oper_msg,status,oper_time,cost_time,tenant_id\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/operate_log\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1724833786290, 'job.exportOperateLog');
REPLACE INTO `sys_job` VALUES (12, 'job.exportIMSCDR', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"cdr_event_ims\",\"columns\":\"id,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.recordType\')) as record_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.callType\')) as call_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.callerParty\')) as caller_party,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.calledParty\')) as called_party,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.callDuration\')) as call_duration,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.serviceResult\')) as service_result,DATE_FORMAT(FROM_UNIXTIME(timestamp), \'%Y-%m-%d %H:%i:%s\') AS timestamp\",\"timeCol\":\"timestamp\",\"timeUnit\":\"second\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/ims_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1722224659251, '');
REPLACE INTO `sys_job` VALUES (13, 'job.exportSMFCDR', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"cdr_event_smf\",\"columns\":\"id,ne_type,ne_name,rm_uid,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.recordType\')) AS record_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.chargingID\')) AS charging_id,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.subscriberIdentifier.subscriptionIDType\')) AS subscriber_id_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.subscriberIdentifier.subscriptionIDData\')) AS subscriber_id_data,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.duration\')) AS duration,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.invocationTimestamp\')) as invocationTimestamp,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataVolumeUplink\')) AS data_volume_uplink,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataVolumeDownlink\')) AS data_volume_downlink,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataTotalVolume\')) AS data_total_volume,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.pDUSessionChargingInformation.pDUAddress.pDUIPv4Address\')) AS pdu_ipv4_address,timestamp\",\"timeCol\":\"timestamp\",\"timeUnit\":\"second\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/smf_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1724309047797, '');
REPLACE INTO `sys_job` VALUES (13, 'job.exportSMFCDR', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"cdr_event_smf\",\"columns\":\"id,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.recordType\')) AS record_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.chargingID\')) AS charging_id,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.subscriberIdentifier.subscriptionIDType\')) AS subscriber_id_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.subscriberIdentifier.subscriptionIDData\')) AS subscriber_id_data,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.duration\')) AS duration,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.invocationTimestamp\')) as invocationTimestamp,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataVolumeUplink\')) AS data_volume_uplink,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataVolumeDownlink\')) AS data_volume_downlink,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataTotalVolume\')) AS data_total_volume,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.pDUSessionChargingInformation.pDUAddress.pDUIPv4Address\')) AS pdu_ipv4_address,timestamp\",\"timeCol\":\"timestamp\",\"timeUnit\":\"second\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/smf_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1724309047797, '');
REPLACE INTO `sys_job` VALUES (14, 'job.exportSMSCCDR', 'SYSTEM', 'exportTable', '{\"duration\":1,\"tableName\":\"cdr_event_smsc\",\"columns\":\"id,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.recordType\')) as record_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.serviceType\')) as service_type,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.callerParty\')) as caller_party,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.calledParty\')) as called_party,JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.result\')) as result,DATE_FORMAT(FROM_UNIXTIME(JSON_UNQUOTE(JSON_EXTRACT(cdr_json,\'$.updateTime\'))), \'%Y-%m-%d %H:%i:%s\') as update_time\",\"timeCol\":\"timestamp\",\"timeUnit\":\"second\",\"extras\":\"\",\"filePath\":\"/usr/local/omc/backup/smsc_cdr\"}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1724309047797, '');
REPLACE INTO `sys_job` VALUES (15, 'job.removeExportedFiles', 'SYSTEM', 'removeFile', '[{\"filePath\":\"/usr/local/omc/backup/operate_log\",\"maxDays\":30},{\"filePath\":\"/usr/local/omc/backup/ims_cdr\",\"maxDays\":30},{\"filePath\":\"/usr/local/omc/backup/smf_cdr\",\"maxDays\":30},{\"filePath\":\"/usr/local/omc/backup/smsc_cdr\",\"maxDays\":30}]', '0 10 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1728634085631, '');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -44,7 +44,7 @@ type KpiReport struct {
NeType string `json:"NeType"`
KPIs []struct {
KPIID string `json:"KPIID"`
Value int `json:"Value"`
Value int64 `json:"Value"`
Err string `json:"Err"`
} `json:"KPIs"`
} `json:"NE"`
@@ -62,7 +62,7 @@ type GoldKpi struct {
RmUid string `json:"rmUid" xorm:"rm_uid"`
NEType string `json:"neType" xorm:"ne_type"`
KpiId string `json:"kpiId" xorm:"kpi_id"`
Value int `json:"value"`
Value int64 `json:"value"`
Error string `json:"error"`
Timestamp string `json:"timestamp"`
}

View File

@@ -10,6 +10,7 @@ import (
"be.ems/src/modules/crontask/processor/getStateFromNE"
processorMonitorSysResource "be.ems/src/modules/crontask/processor/monitor_sys_resource"
processorNeConfigBackup "be.ems/src/modules/crontask/processor/ne_config_backup"
"be.ems/src/modules/crontask/processor/removeFile"
)
// InitCronQueue 初始定时任务队列
@@ -25,4 +26,5 @@ func InitCronQueue() {
cron.CreateQueue("getStateFromNE", getStateFromNE.NewProcessor)
cron.CreateQueue("genNeStateAlarm", genNeStateAlarm.NewProcessor)
cron.CreateQueue("exportTable", exportTable.NewProcessor)
cron.CreateQueue("removeFile", removeFile.NewProcessor)
}

View File

@@ -0,0 +1,159 @@
package removeFile
import (
"encoding/json"
"os"
"path/filepath"
"sort"
"time"
"be.ems/lib/log"
"be.ems/src/framework/cron"
)
var NewProcessor = &BarProcessor{
progress: 0,
count: 0,
}
// bar 队列任务处理
type BarProcessor struct {
// 任务进度
progress int
// 执行次数
count int
}
type BarParams struct {
FilePath string `json:"filePath"` // file path
MaxDays int `json:"maxDays"`
MaxFiles *int `json:"maxFiles"` // keep max files
MaxSize *int64 `json:"maxSize"`
Extras string `json:"extras"` // extras condition for where
}
type FileInfo struct {
Path string
Info os.FileInfo
}
func (s *BarProcessor) Execute(data any) (any, error) {
s.count++
options := data.(cron.JobData)
sysJob := options.SysJob
var params []BarParams
err := json.Unmarshal([]byte(sysJob.TargetParams), &params)
if err != nil {
return nil, err
}
result := []map[string]any{}
for _, param := range params {
res, _ := s.ExecuteOne(param)
result = append(result, res)
}
// 返回结果,用于记录执行结果
return map[string]any{
"result": result,
}, nil
}
func (s *BarProcessor) ExecuteOne(params BarParams) (map[string]any, error) {
var maxFiles int = 0
var maxSize int64 = 0
if params.MaxFiles != nil {
maxFiles = *params.MaxFiles
}
if params.MaxSize != nil {
maxSize = int64(*params.MaxSize * 1024 * 1024)
}
files, err := getFiles(params.FilePath)
if err != nil {
return map[string]any{
"msg": "failed",
"err": err.Error(),
}, err
}
// 获取本地时区
loc, err := time.LoadLocation("Local")
if err != nil {
return map[string]any{
"msg": "failed",
"err": err.Error(),
}, err
}
cutoff := time.Now().In(loc).AddDate(0, 0, -params.MaxDays)
var oldFiles []FileInfo
for _, file := range files {
if file.Info.ModTime().Before(cutoff) {
oldFiles = append(oldFiles, file)
}
}
// 按修改时间排序文件(最旧的在前)
sort.Slice(oldFiles, func(i, j int) bool {
return oldFiles[i].Info.ModTime().Before(oldFiles[j].Info.ModTime())
})
deleted, errorDel := 0, 0
// 删除文件直到满足文件总数不超过maxFiles个且总大小不超过maxSize的条件
var totalSize int64
for i, file := range oldFiles {
if (maxFiles > 0 && i >= maxFiles) || (maxSize > 0 && totalSize+file.Info.Size() > maxSize) {
break
}
err := os.Remove(file.Path)
if err != nil {
log.Error("Error deleting file:", file.Path, err)
errorDel++
continue
}
totalSize += file.Info.Size()
deleted++
}
// 如果仍然有超过maxFiles个文件或总大小超过maxSize继续删除最旧的文件
remainingFiles := files
sort.Slice(remainingFiles, func(i, j int) bool {
return remainingFiles[i].Info.ModTime().Before(remainingFiles[j].Info.ModTime())
})
for (maxFiles > 0 && len(remainingFiles) > maxFiles) || (maxSize > 0 && totalSize > maxSize) {
file := remainingFiles[0]
err := os.Remove(file.Path)
if err != nil {
log.Error("Error deleting file:", file.Path, err)
remainingFiles = remainingFiles[1:]
continue
}
totalSize -= file.Info.Size()
remainingFiles = remainingFiles[1:]
}
// 返回结果,用于记录执行结果
return map[string]any{
"msg": "successed",
"filePath": params.FilePath,
"deleted": deleted,
"errorDel": errorDel,
}, nil
}
func getFiles(dir 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 !info.IsDir() {
files = append(files, FileInfo{Path: path, Info: info})
}
return nil
})
return files, err
}

View File

@@ -21,7 +21,7 @@ type PacketController struct {
packetService *traceService.Packet // 信令跟踪服务
}
// 网元跟踪网卡设备列表
// 信令跟踪网卡设备列表
//
// GET /devices
func (s *PacketController) Devices(c *gin.Context) {
@@ -29,22 +29,23 @@ func (s *PacketController) Devices(c *gin.Context) {
c.JSON(200, result.OkData(data))
}
// 网元跟踪开始
// 信令跟踪开始
//
// POST /start
func (s *PacketController) Start(c *gin.Context) {
language := ctx.AcceptLanguage(c)
var body struct {
Device string `json:"device" binding:"required"` // 网卡设备
TaskNo string `json:"taskNo" binding:"required"` // 任务编号
Output string `json:"output" ` // 输出PCAP文件路径为空则不输出
TaskNo string `json:"taskNo" binding:"required"` // 任务编号
Device string `json:"device" binding:"required"` // 网卡设备
Filter string `json:"filter" ` // 过滤表达式port 33030 or 33040
OutputPCAP bool `json:"outputPCAP" ` // 输出PCAP文件 默认false
}
if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
msg, err := s.packetService.LiveStart(body.TaskNo, body.Device, body.Output)
msg, err := s.packetService.LiveStart(body.TaskNo, body.Device, body.Filter, body.OutputPCAP)
if err != nil {
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
return
@@ -52,7 +53,7 @@ func (s *PacketController) Start(c *gin.Context) {
c.JSON(200, result.OkData(msg))
}
// 网元跟踪结束
// 信令跟踪结束
//
// POST /stop
func (s *PacketController) Stop(c *gin.Context) {
@@ -72,14 +73,14 @@ func (s *PacketController) Stop(c *gin.Context) {
c.JSON(200, result.Ok(nil))
}
// 网元跟踪过滤
// 信令跟踪过滤
//
// PUT /filter
func (s *PacketController) Filter(c *gin.Context) {
language := ctx.AcceptLanguage(c)
var body struct {
TaskNo string `json:"taskNo" binding:"required"` // 任务编号
Expr string `json:"expr" binding:"required"` // 过滤表达式port 33030 or 33040
Expr string `json:"expr" ` // 过滤表达式port 33030 or 33040
}
if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
@@ -93,19 +94,28 @@ func (s *PacketController) Filter(c *gin.Context) {
c.JSON(200, result.Ok(nil))
}
// 网元跟踪续期保活
// 信令跟踪续期保活
//
// PUT /keep-alive
func (s *PacketController) KeepAlive(c *gin.Context) {
language := ctx.AcceptLanguage(c)
var body struct {
IntervalIn int `json:"intervalIn" ` // 服务续约的频率默认设置为60秒
Duration int `json:"duration" ` // 服务失效的时间默认设置为120秒
TaskNo string `json:"taskNo" binding:"required"` // 任务编号
Duration int `json:"duration" ` // 服务失效的时间默认设置为120秒
}
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil {
if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
// 默认设置为120秒
if body.Duration <= 1 {
body.Duration = 120
}
if err := s.packetService.LiveTimeout(body.TaskNo, body.Duration); err != nil {
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
return
}
c.JSON(200, result.Ok(nil))
}

View File

@@ -0,0 +1,245 @@
package packet_task
import (
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
"sync"
"time"
"be.ems/src/framework/logger"
wsService "be.ems/src/modules/ws/service"
"github.com/gopacket/gopacket"
"github.com/gopacket/gopacket/layers"
"github.com/gopacket/gopacket/pcap"
"github.com/gopacket/gopacket/pcapgo"
)
// 捕获任务
var taskMap sync.Map
// task 任务信息
type task struct {
TaskNo string // 任务编号
Handle *pcap.Handle // 捕获句柄
File *os.File // 捕获信息输出文件句柄
Writer *pcapgo.Writer // 捕获信息输出句柄
Filter string // 过滤表达式
Ticker *time.Ticker // 任务失效定时器
}
// NetworkDevices 获取网卡设备信息
func NetworkDevices() ([]pcap.Interface, error) {
devices, err := pcap.FindAllDevs()
if err != nil {
logger.Errorf("interfaces find all devices err: %s", err.Error())
return nil, err
}
return devices, nil
}
// verifyDevice 检查网卡设备是否存在
func verifyDevice(str string) (string, bool) {
devices, err := pcap.FindAllDevs()
if err != nil {
logger.Errorf("interfaces find all devices err: %s", err.Error())
return "", false
}
for _, device := range devices {
if len(device.Addresses) == 0 {
continue
}
if device.Name == str {
return device.Name, true
}
for _, address := range device.Addresses {
if address.IP.String() == str {
return device.Name, true
}
}
}
return "", false
}
// outputPCAP 输出 pcap 文件
// 新文件时需要 snaplen 最大长度 linktype 链路类型
func outputPCAP(snaplen uint32, linktype layers.LinkType, outputFile string) (*os.File, *pcapgo.Writer, error) {
var err error
var f *os.File
if err := os.MkdirAll(filepath.Dir(outputFile), 0775); err != nil {
return nil, nil, err
}
// 检查文件是否存在
if _, err = os.Stat(outputFile); os.IsNotExist(err) {
f, err = os.Create(outputFile)
if err != nil {
return nil, nil, err
}
w := pcapgo.NewWriter(f)
w.WriteFileHeader(snaplen, linktype) // new file, must do this.
return f, w, nil
}
f, err = os.OpenFile(outputFile, os.O_APPEND, 0700)
if err != nil {
return nil, nil, err
}
w := pcapgo.NewWriter(f)
return f, w, nil
}
// capturePacketSource 捕获数据
func capturePacketSource(taskInfo *task) {
// capture packets
packetSource := gopacket.NewPacketSource(taskInfo.Handle, taskInfo.Handle.LinkType())
packetSource.Lazy = false
packetSource.NoCopy = true
packetSource.DecodeStreamsAsDatagrams = true
// 协程停止后关闭句柄并移除任务信息
defer func() {
taskInfo.Ticker.Stop()
taskInfo.Handle.Close()
if taskInfo.File != nil {
taskInfo.File.Close()
}
taskMap.Delete(taskInfo.TaskNo)
}()
frameNumber := 0 // 帧编号
frameTime := 0.000000 // 时间
var startTimestamp time.Time // 开始时间
for {
select {
case <-taskInfo.Ticker.C:
return
case packet := <-packetSource.Packets():
if packet == nil {
continue
}
// if packet.Metadata().Timestamp.Before(time.Now()) {
// continue
// }
if taskInfo.Writer != nil {
taskInfo.Writer.WritePacket(packet.Metadata().CaptureInfo, packet.Data())
}
fmt.Println("---------- packet.Layers() ", len(packet.Layers()))
frameNumber++ // 帧编号
currentTimestamp := packet.Metadata().Timestamp
if !startTimestamp.IsZero() {
// 计算时间差转换为秒
frameTime = currentTimestamp.Sub(startTimestamp).Seconds()
} else {
startTimestamp = currentTimestamp
}
// 数据
frameMeta := parsePacketFrame(frameNumber, frameTime, packet)
// 推送到ws订阅组
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s", wsService.GROUP_TRACE_PACKET, taskInfo.TaskNo), frameMeta)
}
}
}
// LiveStart 开始捕获数据
func LiveStart(taskNo, deviceName, filterBPF string, outputFile bool) (string, error) {
if _, ok := taskMap.Load(taskNo); ok {
return "", fmt.Errorf("task no. %s already exist", taskNo)
}
// Verify the specified network interface exists
device, deviceOk := verifyDevice(deviceName)
if !deviceOk {
return "", fmt.Errorf("network device not exist: %s", deviceName)
}
snapshotLength := 262144
// open device
handle, err := pcap.OpenLive(device, int32(snapshotLength), true, pcap.BlockForever)
if err != nil {
logger.Errorf("open live err: %s", err.Error())
if strings.Contains(err.Error(), "operation not permitted") {
return "", fmt.Errorf("you don't have permission to capture on that/these device(s)")
}
return "", err
}
// write a new file
var w *pcapgo.Writer
var f *os.File
if outputFile {
// 网管本地路径
localFilePath := fmt.Sprintf("/tmp/omc/packet/%s.pcap", taskNo)
if runtime.GOOS == "windows" {
localFilePath = fmt.Sprintf("C:%s", localFilePath)
}
f, w, err = outputPCAP(uint32(snapshotLength), handle.LinkType(), localFilePath)
if err != nil {
return "", err
}
}
// set filter
if filterBPF != "" {
if err = handle.SetBPFFilter(filterBPF); err != nil {
logger.Errorf("packet BPF Filter %s => %s", filterBPF, err.Error())
filterBPF = ""
}
}
// save tasks
taskInfo := &task{
TaskNo: taskNo,
Handle: handle,
File: f,
Writer: w,
Filter: filterBPF,
Ticker: time.NewTicker(time.Second * 120),
}
go capturePacketSource(taskInfo)
taskMap.Store(taskNo, taskInfo)
return fmt.Sprintf("task no. %s initiated", taskNo), nil
}
// LiveFilter 捕获过滤
func LiveFilter(taskNo, expr string) error {
info, ok := taskMap.Load(taskNo)
if !ok {
return fmt.Errorf("task no. %s not exist", taskNo)
}
task := info.(*task)
task.Filter = expr
err := task.Handle.SetBPFFilter(expr)
if err != nil {
logger.Errorf("packet BPF Filter %s => %s", expr, err.Error())
return fmt.Errorf("can't parse filter expression")
}
return nil
}
// LiveTimeout 更新捕获失效时间
func LiveTimeout(taskNo string, seconds int) error {
info, ok := taskMap.Load(taskNo)
if !ok {
return fmt.Errorf("task no. %s not exist", taskNo)
}
info.(*task).Ticker.Reset(time.Duration(seconds) * time.Second)
return nil
}
// LiveStop 停止捕获数据
func LiveStop(taskNo string) error {
info, ok := taskMap.Load(taskNo)
if !ok {
return fmt.Errorf("task no. %s not exist", taskNo)
}
info.(*task).Ticker.Reset(time.Millisecond)
return nil
}

View File

@@ -0,0 +1,843 @@
package packet_task
import (
"encoding/base64"
"fmt"
"strings"
"be.ems/src/framework/logger"
"github.com/gopacket/gopacket"
"github.com/gopacket/gopacket/layers"
)
// FrameMeta 数据帧元信息
type FrameMeta struct {
Number int `json:"number"`
Comments bool `json:"comments"`
Ignored bool `json:"ignored"`
Marked bool `json:"marked"`
Bg int `json:"bg"` // 背景色 数值转字符串16进制 15007687->e4ffc7
Fg int `json:"fg"` // 前景色 文字
Columns [7]string `json:"columns"` // 长度对应字段 ['No.', 'Time', 'Source', 'Destination', 'Protocol', 'Length', 'Info']
Frame Frame `json:"frame"`
}
// Frame 数据帧信息
type Frame struct {
Number int `json:"number"`
Comments []string `json:"comments"`
DataSource []map[string]string `json:"data_sources"`
Tree []ProtoTree `json:"tree"`
Follow [][]string `json:"follow"`
}
// ProtoTree 数据帧协议树
type ProtoTree struct {
Label string `json:"label"` // 显示的文本
Filter string `json:"filter"` // 过滤条件
Severity string `json:"severity"`
Type string `json:"type"`
URL string `json:"url"`
Fnum int `json:"fnum"`
Start int `json:"start"` // 开始位置
Length int `json:"length"` // 长度
DataSourceIdx int `json:"data_source_idx"`
Tree []ProtoTree `json:"tree"` // 子节点
}
// parsePacketFrame 解析数据包帧信息
// frameNumber 帧编号 i++
// frameTime 时间秒 0.000000
func parsePacketFrame(frameNumber int, frameTime float64, packet gopacket.Packet) FrameMeta {
frameSrcHost := "" // 源主机IP
frameDstHost := "" // 目的主机IP
frameProtocol := "" // 协议
frameLength := fmt.Sprintf("%d", packet.Metadata().Length) // 长度
frameInfo := "" // 信息
fg, bg := colorRuleFB(packet) // 背景色 数值转字符串16进制 15007687->e4ffc7
frame := Frame{
Number: frameNumber,
Comments: []string{},
DataSource: []map[string]string{
{
"name": fmt.Sprintf("Frame (%d bytes)", packet.Metadata().Length),
"data": base64.StdEncoding.EncodeToString(packet.Data()),
},
},
Tree: []ProtoTree{}, // 各层的数据
Follow: [][]string{}, // {"TCP", "tcp.stream eq 0"}
}
// 连接层
// fmt.Println(packet.LinkLayer())
if linkLayer := packet.LinkLayer(); linkLayer != nil {
linkTree := linkLayerTree(linkLayer)
frame.Tree = append(frame.Tree, linkTree)
}
// 网络层
// fmt.Println(packet.NetworkLayer())
if networkLayer := packet.NetworkLayer(); networkLayer != nil {
networkTree := networkLayerTree(networkLayer)
frame.Tree = append(frame.Tree, networkTree)
src, dst := networkLayer.NetworkFlow().Endpoints()
frameSrcHost = src.String()
frameDstHost = dst.String()
if frameDstHost == "ff:ff:ff:ff" {
frameDstHost = "Broadcast"
}
}
// 传输层
// fmt.Println(packet.TransportLayer())
if transportLayer := packet.TransportLayer(); transportLayer != nil {
info, transportTree := transportLayerTree(transportLayer)
frame.Tree = append(frame.Tree, transportTree)
frameProtocol = transportLayer.LayerType().String()
frameInfo += info
frame.Follow = append(frame.Follow, []string{
frameProtocol,
fmt.Sprintf("%s.stream eq 0", strings.ToLower(frameProtocol)),
})
}
// 应用层
// fmt.Println(packet.ApplicationLayer())
if applicationLayer := packet.ApplicationLayer(); applicationLayer != nil {
applicationTree := applicationLayerTree(applicationLayer)
frame.Tree = append(frame.Tree, applicationTree)
}
return FrameMeta{
Number: frameNumber,
Comments: false,
Ignored: false,
Marked: false,
Bg: fg,
Fg: bg,
Columns: [7]string{
fmt.Sprintf("%d", frameNumber),
fmt.Sprintf("%.6f", frameTime), // 格式化为 0.000000
frameSrcHost,
frameDstHost,
frameProtocol,
frameLength,
frameInfo,
},
Frame: frame,
}
}
// linkLayerTree 连接层
func linkLayerTree(linkLayer gopacket.LinkLayer) ProtoTree {
var protoTree ProtoTree
switch layer := linkLayer.(type) {
case *layers.Ethernet: // 最常见的链路层协议用于局域网LAN中。
srcMAC := layer.SrcMAC
dstMAC := layer.DstMAC
ethernetLayerLen := len(layer.Contents)
protoTree = ProtoTree{
Label: fmt.Sprintf("%s II, Src: %s, Dst: %s", layer.LayerType(), srcMAC, dstMAC),
Filter: "eth",
Start: 0,
Length: ethernetLayerLen,
DataSourceIdx: 0,
Tree: []ProtoTree{
{
Label: fmt.Sprintf("Destination: %s", dstMAC.String()),
Filter: fmt.Sprintf("eth.dst == %s", dstMAC.String()),
Start: 0,
Length: ethernetLayerLen,
DataSourceIdx: 0,
Tree: []ProtoTree{
{
Label: fmt.Sprintf("Address: %s", dstMAC.String()),
Filter: fmt.Sprintf("eth.addr == %s", dstMAC.String()),
Start: 0,
Length: 6,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
{
Label: ".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)",
Filter: "eth.dst.lg == 0",
Start: 0,
Length: 3,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
{
Label: ".... ...0 .... .... .... .... = IG bit: Individual address (unicast)",
Filter: "eth.dst.ig == 0",
Start: 0,
Length: 3,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Source: %s", srcMAC.String()),
Filter: fmt.Sprintf("eth.src == %s", srcMAC.String()),
Start: ethernetLayerLen,
Length: ethernetLayerLen,
DataSourceIdx: 0,
Tree: []ProtoTree{
{
Label: fmt.Sprintf("Address: %s", srcMAC.String()),
Filter: fmt.Sprintf("eth.addr == %s", dstMAC.String()),
Start: ethernetLayerLen,
Length: ethernetLayerLen,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
{
Label: ".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)",
Filter: "eth.src.lg == 0",
Start: len(srcMAC),
Length: len(srcMAC) / 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
{
Label: ".... ...0 .... .... .... .... = IG bit: Individual address (unicast)",
Filter: "eth.src.ig == 0",
Start: len(srcMAC),
Length: len(srcMAC) / 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: "Type: IPv4 (0x0800)",
Filter: "eth.type == 0x0800",
Start: len(dstMAC) + len(srcMAC),
Length: len(layer.LayerContents()) - (len(dstMAC) + len(srcMAC)),
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
},
Severity: "",
Type: "proto",
Fnum: 1052,
URL: "",
}
case *layers.PPP: // 点对点协议,通常用于拨号连接。
protoTree = ProtoTree{
Label: fmt.Sprintf("%s ", layer.LayerType()),
Filter: "ppp",
Start: 0,
Length: len(layer.LayerContents()),
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "proto",
Fnum: 1052,
URL: "",
}
}
return protoTree
}
// networkLayerTree 网络层
func networkLayerTree(networkLayer gopacket.NetworkLayer) ProtoTree {
var protoTree ProtoTree
switch layer := networkLayer.(type) {
case *layers.IPv4: // 第四版因特网协议,广泛使用。
// 偏移量取连接层的长度Length
linkLayerLen := 14
networkLayerLen := len(layer.Contents)
version := layer.Version
length := layer.Length
srcIP := layer.SrcIP
dstIP := layer.DstIP
ihl := layer.IHL
headerLength := ihl * 4 // 提取头部长度
tos := layer.TOS
dscp, ecn := networkDSCPAndECN(tos)
identification := layer.Id
flags := layer.Flags // 提取标志位
// 生成标志描述
flagsDesc := networkFlagsDesc(flags)
rb, rbDesc := networkFlagsEvil(flags)
df, dfDesc := networkFlagsDF(flags)
mf, mfDesc := networkFlagsMF(flags)
fragOffset := layer.FragOffset
fragOffsetDesc := networkOffset(fragOffset)
ttl := layer.TTL
proto := layer.Protocol
checksum := layer.Checksum
protoTree = ProtoTree{
Label: fmt.Sprintf("Internet Protocol Version %d, Src: %s, Dst: %s", version, srcIP, dstIP),
Filter: "ip",
Start: linkLayerLen,
Length: networkLayerLen,
DataSourceIdx: 0,
Tree: []ProtoTree{
{
Label: fmt.Sprintf("%04b .... = Version: %d", version, version),
Filter: fmt.Sprintf("ip.version == %d", version),
Start: linkLayerLen,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf(".... 0101 = Header Length: %d bytes (%d)", headerLength, ihl),
Filter: fmt.Sprintf("ip.hdr_len == %d", headerLength),
Start: linkLayerLen,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Differentiated Services Field: 0x%02x (DSCP: %s, ECN: %s)", tos, dscp, ecn),
Filter: fmt.Sprintf("ip.dsfield == 0x%02x", tos),
Start: linkLayerLen + 1,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{
{
Label: fmt.Sprintf("0000 00.. = Differentiated Services Codepoint: %s (%d)", dscp, tos),
Filter: fmt.Sprintf("ip.dsfield.dscp == %d", tos>>2),
Start: linkLayerLen + 1,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
{
Label: fmt.Sprintf(".... ..00 = Explicit Congestion Notification: %s Capable Transport (%d)", ecn, tos),
Filter: fmt.Sprintf("ip.dsfield.ecn == %d", tos&0x03),
Start: linkLayerLen + 1,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Total Length: %d", length),
Filter: fmt.Sprintf("ip.len == %d", length),
Start: linkLayerLen + 2,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Identification: 0x%X (%d)", identification, identification),
Filter: fmt.Sprintf("ip.id == 0x%X", identification),
Start: linkLayerLen + 4,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("%03b. .... = Flags: %s", flags, flagsDesc),
Filter: fmt.Sprintf("ip.flags == 0x%X", flags),
Start: linkLayerLen + 6,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{
{
Label: fmt.Sprintf("0... .... = Reserved bit: %s", rbDesc),
Filter: fmt.Sprintf("ip.flags.rb == %d", rb),
Start: linkLayerLen + 6,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
{
Label: fmt.Sprintf(".1.. .... = Don't fragment: %s", dfDesc),
Filter: fmt.Sprintf("ip.flags.df == %d", df),
Start: linkLayerLen + 6,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
{
Label: fmt.Sprintf("..0. .... = More fragments: %s", mfDesc),
Filter: fmt.Sprintf("ip.flags.mf == %d", mf),
Start: linkLayerLen + 6,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("%s = Fragment Offset: %d", fragOffsetDesc, fragOffset),
Filter: fmt.Sprintf("ip.frag_offset == %d", fragOffset),
Start: linkLayerLen + 6,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Time to Live: %d", ttl),
Filter: fmt.Sprintf("ip.ttl == %d", ttl),
Start: linkLayerLen + 8,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Protocol: TCP (%d)", proto),
Filter: fmt.Sprintf("ip.proto == %d", proto),
Start: linkLayerLen + 9,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Header Checksum: 0x%x [validation disabled]", checksum),
Filter: fmt.Sprintf("ip.checksum == 0x%x", checksum),
Start: linkLayerLen + 10,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: "Header checksum status: Unverified",
Filter: "ip.checksum.status == \"Unverified\"",
Start: 0,
Length: 0,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Source Address: %s", srcIP),
Filter: fmt.Sprintf("ip.src == %s", srcIP),
Start: linkLayerLen + 12,
Length: 4,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Destination Address: %s", dstIP),
Filter: fmt.Sprintf("ip.dst == %s", dstIP),
Start: linkLayerLen + 16,
Length: 4,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
},
Severity: "",
Type: "proto",
Fnum: 1052,
URL: "",
}
logger.Infof("-> (tos 0x%x, ttl %d, id %d, offset %d, flags [%s], proto %s (%d), length %d)\n", tos, ttl, identification, fragOffset, flags, proto, proto, len(layer.Contents)+len(layer.Payload))
case *layers.IPv6: // 第六版因特网协议,逐渐取代 IPv4。
logger.Infof("-> (flowlabel 0x%x, hlim %d, next-header %s (%d), payload length: %d)\n", layer.FlowLabel, layer.HopLimit, layer.NextHeader, layer.NextHeader, len(layer.Payload))
}
return protoTree
}
// transportLayerTree 传输层
func transportLayerTree(transportLayer gopacket.TransportLayer) (string, ProtoTree) {
var info string
var tree ProtoTree
switch layer := transportLayer.(type) {
case *layers.TCP: // 传输控制协议,提供可靠的数据传输。
// 偏移量取连接层加网络层的长度Length
linkLayerAndNetworkLayerLen := 14 + 20
transportLayerLen := len(layer.Contents)
payloadrLen := len(layer.Payload)
seq := layer.Seq
ack := layer.Ack
srcPort := layer.SrcPort
dstPort := layer.DstPort
dataOffset := layer.DataOffset
hdrLen := dataOffset * 4
flags, flagsDesc := transportFlagsDesc(layer)
flagsACK, flagsACKDesc := transportFlagsStatus(layer.ACK)
flagsPSH, flagsPSHDesc := transportFlagsStatus(layer.PSH)
window := layer.Window
checksum := layer.Checksum
urgent := layer.Urgent
optionsLen, optionsDesc := transportOptions(layer.Options)
payloadStr := bytesToHexString(layer.Payload)
tree = ProtoTree{
Label: fmt.Sprintf("Transmission Control Protocol, Src Port: %s, Dst Port: %s, Seq: %d, Ack: %d, Len: %d", srcPort, dstPort, seq, ack, payloadrLen),
Filter: "tcp",
Start: linkLayerAndNetworkLayerLen,
Length: transportLayerLen,
DataSourceIdx: 0,
Tree: []ProtoTree{
{
Label: fmt.Sprintf("Source Port: %s", srcPort),
Filter: fmt.Sprintf("tcp.srcport == %d", srcPort),
Start: linkLayerAndNetworkLayerLen,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Destination Port: %s", dstPort),
Filter: fmt.Sprintf("tcp.dstport == %d", dstPort),
Start: linkLayerAndNetworkLayerLen + 2,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("TCP Segment Len: %d", payloadrLen),
Filter: fmt.Sprintf("tcp.len == %d", payloadrLen),
Start: linkLayerAndNetworkLayerLen + 12,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Sequence Number: %d (relative sequence number)", seq),
Filter: fmt.Sprintf("tcp.seq == %d", seq),
Start: linkLayerAndNetworkLayerLen + 4,
Length: 4,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Acknowledgment Number: %d (relative ack number)", ack),
Filter: fmt.Sprintf("tcp.ack == %d", ack),
Start: linkLayerAndNetworkLayerLen + 8,
Length: 4,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("%04b .... = Header Length: %d bytes (%d)", dataOffset, hdrLen, dataOffset),
Filter: fmt.Sprintf("tcp.hdr_len == %d", hdrLen),
Start: linkLayerAndNetworkLayerLen + 12,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Flags: 0x%03X (%s)", flags, flagsDesc),
Filter: fmt.Sprintf("ip.frag_offset == 0x%03X", flags),
Start: linkLayerAndNetworkLayerLen + 12,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{
{
Label: fmt.Sprintf(".... ...%d .... = Acknowledgment: %s", flagsACK, flagsACKDesc),
Filter: fmt.Sprintf("tcp.flags.ack == %d", flagsACK),
Start: linkLayerAndNetworkLayerLen + 13,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
{
Label: fmt.Sprintf(".... .... %d... = Push: %s", flagsPSH, flagsPSHDesc),
Filter: fmt.Sprintf("tcp.flags.push == %d", flagsPSH),
Start: linkLayerAndNetworkLayerLen + 13,
Length: 1,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 926233912,
URL: "",
},
},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Window: %d", window),
Filter: fmt.Sprintf("tcp.window_size_value == %d", window),
Start: linkLayerAndNetworkLayerLen + 14,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Calculated window size: %d", window),
Filter: fmt.Sprintf("tcp.window_size == %d", window),
Start: linkLayerAndNetworkLayerLen + 14,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Checksum: 0x%04x [unverified]", checksum),
Filter: fmt.Sprintf("tcp.checksum == 0x%04x", checksum),
Start: linkLayerAndNetworkLayerLen + 16,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: "Checksum Status: Unverified",
Filter: "tcp.checksum.status == \"Unverified\"",
Start: 0,
Length: 0,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Urgent Pointer: %d", urgent),
Filter: fmt.Sprintf("tcp.urgent_pointer == %d", urgent),
Start: linkLayerAndNetworkLayerLen + 18,
Length: 2,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("Options: (%d bytes), %s", optionsLen, optionsDesc),
Filter: fmt.Sprintf("tcp.options == %d", optionsLen),
Start: linkLayerAndNetworkLayerLen + 20,
Length: int(optionsLen),
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
{
Label: fmt.Sprintf("TCP payload (%d bytes)", payloadrLen),
Filter: fmt.Sprintf("tcp.payload == %s", payloadStr),
Start: linkLayerAndNetworkLayerLen + 32,
Length: payloadrLen,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "",
Fnum: 0,
URL: "",
},
},
Severity: "",
Type: "proto",
Fnum: 1052,
URL: "",
}
info = fmt.Sprintf("%v -> %v [%s], Seq=%d Ack=%d Win=%d Len=1%d ", srcPort, dstPort, flagsDesc, seq, ack, window, payloadrLen)
logger.Infof("-> TCP, %s", info)
case *layers.UDP: // 用户数据报协议,提供无连接的快速数据传输。
logger.Infof("-> UDP, length %d", len(layer.Payload))
case *layers.UDPLite:
logger.Infof("-> UDPLite, length %d", len(layer.Payload))
case *layers.SCTP: // 流控制传输协议,支持多流和多宿主机。
logger.Infof("-> SCTP, length %d", len(layer.Payload))
}
return info, tree
}
// applicationLayerTree 应用层
func applicationLayerTree(applicationLayer gopacket.ApplicationLayer) ProtoTree {
var protoTree ProtoTree
switch layer := applicationLayer.(type) {
case *layers.DNS:
logger.Infof("-> DNS, %d", layer.ID)
case *layers.SIP:
logger.Infof("-> SIP, %s", layer.RequestURI)
default:
logger.Infof("-> %s, length %d", layer.LayerType(), layer.Payload())
if applicationHTTP(layer.LayerContents()) {
logger.Infof("-> HTTP, %s", layer.LayerContents())
// 偏移量取连接层加网络层加协议层的长度Length
linkLayerAndNetworkLayerAndTransportLayerLen := 14 + 20 + 32
length := len(layer.LayerContents())
protoTree = ProtoTree{
Label: "Hypertext Transfer Protocol",
Filter: "http",
Start: linkLayerAndNetworkLayerAndTransportLayerLen,
Length: length,
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "Chat",
Fnum: 1052,
URL: "",
}
result := applicationHTTPProcess(string(layer.LayerContents()))
for _, v := range result {
protoTree.Tree = append(protoTree.Tree, ProtoTree{
Label: v["label"].(string),
Filter: fmt.Sprintf("http.%s == %s", v["key"].(string), v["value"].(string)),
Start: linkLayerAndNetworkLayerAndTransportLayerLen + v["length"].(int),
Length: v["length"].(int),
DataSourceIdx: 0,
Tree: []ProtoTree{},
Severity: "",
Type: "Chat",
Fnum: 1052,
URL: "",
})
}
}
}
return protoTree
}

View File

@@ -0,0 +1,346 @@
package packet_task
import (
"encoding/binary"
"fmt"
"net"
"strings"
"github.com/gopacket/gopacket"
"github.com/gopacket/gopacket/layers"
)
// networkDSCPAndECN 提取 TOS 字段并获取 DSCP 和 ECN
func networkDSCPAndECN(tos uint8) (string, string) {
// 提取 DSCP 和 ECN
dscp := tos >> 2 // 高 6 位
ecn := tos & 0x03 // 低 2 位
// 定义 DSCP 映射
dscpMapping := map[uint8]string{
0: "Default CS0", // Default Forwarding (DF)
8: "CS1", // Class Selector 1
16: "CS2", // Class Selector 2
24: "CS3", // Class Selector 3
32: "CS4", // Class Selector 4
40: "CS5", // Class Selector 5
48: "CS6", // Class Selector 6
56: "CS7", // Class Selector 7
}
// 定义 ECN 映射
ecnMapping := map[uint8]string{
0: "Not-ECT", // Not ECN-Capable Transport
1: "ECT(1)", // ECN-Capable Transport
2: "ECT(0)", // ECN-Capable Transport
3: "CE", // Congestion Experienced
}
// 返回可读的 DSCP 和 ECN 字符串
return dscpMapping[dscp], ecnMapping[ecn]
}
// networkFlagsDesc 生成标志描述
func networkFlagsDesc(flags layers.IPv4Flag) string {
f := fmt.Sprintf("Flags: 0x%X", flags)
if flags&layers.IPv4DontFragment != 0 {
f += ", Don't fragment"
}
if flags&layers.IPv4MoreFragments != 0 {
f += ", More fragments"
}
return f
}
// networkFlagsEvil 生成标志描述 Evil
func networkFlagsEvil(flags layers.IPv4Flag) (int, string) {
if flags&layers.IPv4EvilBit != 0 {
return 1, "Set"
}
return 0, "Not set"
}
// networkFlagsDF 生成标志描述 DF
func networkFlagsDF(flags layers.IPv4Flag) (int, string) {
if flags&layers.IPv4DontFragment != 0 {
return 1, " Set"
}
return 0, "Not set"
}
// networkFlagsMF 生成标志描述 MF
func networkFlagsMF(flags layers.IPv4Flag) (int, string) {
if flags&layers.IPv4MoreFragments != 0 {
return 1, " Set"
}
return 0, "Not set"
}
// networkOffset 二进制Fragment Offset表示 ...0 0000 0000 0000
func networkOffset(offset uint16) string {
return fmt.Sprintf("...0 %04b %04b %04b %04b",
(offset>>12)&0xF, // 高四位
(offset>>8)&0xF, // 次四位
(offset>>4)&0xF, // 再次四位
offset&0xF, // 低四位
)
}
// transportFlagsDesc 生成标志描述
func transportFlagsDesc(layer *layers.TCP) (byte, string) {
var flags byte
var flagsDesc []string
if layer.FIN {
flags |= 1 << 0 // 0b00000001
flagsDesc = append(flagsDesc, "FIN")
}
if layer.SYN {
flags |= 1 << 1 // 0b00000010
flagsDesc = append(flagsDesc, "SYN")
}
if layer.RST {
flags |= 1 << 2 // 0b00000100
flagsDesc = append(flagsDesc, "RST")
}
if layer.PSH {
flags |= 1 << 3 // 0b00001000
flagsDesc = append(flagsDesc, "PSH")
}
if layer.ACK {
flags |= 1 << 4 // 0b00010000
flagsDesc = append(flagsDesc, "ACK")
}
if layer.URG {
flags |= 1 << 5 // 0b00100000
flagsDesc = append(flagsDesc, "URG")
}
if layer.ECE {
flags |= 1 << 6 // 0b01000000
flagsDesc = append(flagsDesc, "ECE")
}
if layer.CWR {
flags |= 1 << 7 // 0b10000000
flagsDesc = append(flagsDesc, "CWR")
}
if layer.NS {
flagsDesc = append(flagsDesc, "NS")
}
return flags, strings.Join(flagsDesc, ", ")
}
// transportFlagsStatus 生成标志描述状态
func transportFlagsStatus(flag bool) (int, string) {
if flag {
return 1, " Set"
}
return 0, "Not set"
}
// bytesToHexString 转换为十六进制字符串格式
func bytesToHexString(data []byte) string {
var sb strings.Builder
for i, b := range data {
if i > 0 {
sb.WriteString(":")
}
sb.WriteString(fmt.Sprintf("%02x", b))
}
return sb.String()
}
// transportOptions 生成头部选项描述
func transportOptions(options []layers.TCPOption) (uint8, string) {
var opts []string
var optLen uint8
for _, opt := range options {
if opt.OptionType == layers.TCPOptionKindMSS && len(opt.OptionData) == 2 {
optLen += opt.OptionLength
opts = append(opts, fmt.Sprintf("%s val %v",
opt.OptionType.String(),
binary.BigEndian.Uint16(opt.OptionData),
))
} else if opt.OptionType == layers.TCPOptionKindTimestamps && len(opt.OptionData) == 8 {
optLen += opt.OptionLength
opts = append(opts, fmt.Sprintf("%s val %v echo %v",
opt.OptionType.String(),
binary.BigEndian.Uint32(opt.OptionData[:4]),
binary.BigEndian.Uint32(opt.OptionData[4:8]),
))
} else {
optLen += opt.OptionLength
opts = append(opts, opt.OptionType.String())
}
}
return optLen, strings.Join(opts, ", ")
}
// applicationHTTP 辨别 HTTP 数据
func applicationHTTP(data []byte) bool {
if len(data) == 0 {
return false
}
prefixStr := string(data)
return strings.HasPrefix(prefixStr, "GET ") || strings.HasPrefix(prefixStr, "POST ") ||
strings.HasPrefix(prefixStr, "PUT ") || strings.HasPrefix(prefixStr, "DELETE ") ||
strings.HasPrefix(prefixStr, "HEAD ") || strings.HasPrefix(prefixStr, "OPTIONS ") ||
strings.HasPrefix(prefixStr, "HTTP/")
}
// applicationHTTP 处理 HTTP 请求
func applicationHTTPProcess(data string) map[string]map[string]any {
p := make(map[string]map[string]any, 0)
// 按行分割
lines := strings.Split(data, "\r\n")
for i, line := range lines {
if i == 0 {
label := line + "\r\n"
p[label] = map[string]any{
"label": label,
"length": len([]byte(label)),
"key": "",
"value": "",
}
continue
}
// 空行表示头部结束Body开始
if line == "" {
break
}
label := line + "\r\n"
p[label] = map[string]any{
"label": label,
"length": len([]byte(label)),
"key": "",
"value": "",
}
// 分割键值对
parts := strings.SplitN(line, ":", 2)
if len(parts) == 2 {
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
p[label]["key"] = key
p[label]["value"] = value
}
}
return p
}
// colorRuleFB 着色规则-F前景,B背景
//
// This file was created by Wireshark. Edit with care.
func colorRuleFB(packet gopacket.Packet) (int, int) {
// Ethernet
if ethernetLayer := packet.Layer(layers.LayerTypeEthernet); ethernetLayer != nil {
eth := ethernetLayer.(*layers.Ethernet)
ethData := eth.Contents
// Broadcast 检查第一个字节的最低位
// #babdb6, #ffffff
if len(ethData) > 0 && (ethData[0]&1) == 1 {
return 12238262, 16777215
}
// Routing CDP (Cisco Discovery Protocol) 检查前三个字节
// #12272e, #fff3d6
if ethernetLayer.LayerPayload()[0] == 0x01 && ethernetLayer.LayerPayload()[1] == 0x00 && ethernetLayer.LayerPayload()[2] == 0x0c {
return 1189678, 16774102
}
// Routing CARP (Common Address Redundancy Protocol) uses a specific Ethernet type (0x0800)
// #12272e, #fff3d6
if ethernetLayer.LayerType() == 0x0800 {
return 1189678, 16774102
}
}
// ARP
if arpLayer := packet.Layer(layers.LayerTypeARP); arpLayer != nil {
// #12272e, #faf0d7
return 1189678, 16445655
}
// ICMP
if icmpLayer := packet.Layer(layers.LayerTypeICMPv4); icmpLayer != nil {
// #12272e, #fce0ff
return 1189678, 16572671
}
if icmpLayer := packet.Layer(layers.LayerTypeICMPv6); icmpLayer != nil {
// #12272e, #fce0ff
return 1189678, 16572671
}
// SCTP
if sctpLayer := packet.Layer(layers.LayerTypeSCTP); sctpLayer != nil {
sctp := sctpLayer.(*layers.SCTP)
// SCTP ABORT
// #fffc9c, #a40000
if sctp.Checksum == 6 {
return 16776348, 10747904
}
}
// TCP
if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil {
tcp := tcpLayer.(*layers.TCP)
// TCP SYN/FIN
// #12272e, #a0a0a0
if tcp.SYN && tcp.FIN {
return 1189678, 10526880
}
// TCP RST
// #fffc9c, #a40000
if tcp.RST {
return 16776348, 10747904
}
// HTTP
// #12272e, #e4ffc7
if tcp.SrcPort == 80 || tcp.DstPort == 80 || tcp.SrcPort == 443 || tcp.DstPort == 443 {
return 1189678, 15007687
}
// 检查 SMB - 通常基于 TCP 445 或 139
// #12272e, #feffd0
if tcp.SrcPort == 445 || tcp.DstPort == 445 || tcp.SrcPort == 139 || tcp.DstPort == 139 {
return 1189678, 16711632
}
// Routing BGP usually runs on TCP port 179
// #12272e, #fff3d6
if tcp.DstPort == 179 || tcp.SrcPort == 179 {
return 1189678, 16774102
}
}
// UDP
if udpLayer := packet.Layer(layers.LayerTypeUDP); udpLayer != nil {
udp := udpLayer.(*layers.UDP)
// 检查 SMB NetBIOS 名称服务 (NBNS) - 端口 53
// 检查 SMB NetBIOS 数据报服务 (NBDS) - 端口 138
if udp.SrcPort == 53 || udp.DstPort == 53 || udp.SrcPort == 138 || udp.DstPort == 138 {
return 1189678, 16711632
}
}
// IPv4
if ipv4Layer := packet.Layer(layers.LayerTypeIPv4); ipv4Layer != nil {
ipv4 := ipv4Layer.(*layers.IPv4)
// TCP(6)
// #12272e, #e7e6ff
if ipv4.Protocol == layers.IPProtocolTCP {
return 1189678, 15197951
}
// UDP(17)
// #12272e, #daeeff
if ipv4.Protocol == layers.IPProtocolUDP || ipv4.Protocol == layers.IPProtocolUDPLite {
return 1189678, 14348031
}
// Routing EIGRP(0x2f) OSPF(89)
// #12272e, #fff3d6
if ipv4.Protocol == 0x2f || ipv4.Protocol == layers.IPProtocolOSPF {
return 1189678, 16774102
}
// Routing
// GVRP (GARP VLAN Registration Protocol)
// GVRP typically utilizes the same multicast address as GARP
// HSRP (Hot Standby Router Protocol) uses multicast IP 224.0.0.2
// VRRP (Virtual Router Redundancy Protocol) uses multicast IP 224.0.0.18
// #12272e, #fff3d6
if ipv4.DstIP.Equal(net.IPv4(224, 0, 0, 2)) || ipv4.DstIP.Equal(net.IPv4(224, 0, 0, 100)) {
return 1189678, 16774102
}
}
return 16222087, 1189678 // 默认颜色值 #f78787, #12272e
}

View File

@@ -1,46 +1,21 @@
package service
import (
"context"
"fmt"
"os"
"strings"
"sync"
"time"
"be.ems/src/framework/logger"
"be.ems/src/framework/vo"
"github.com/gopacket/gopacket"
"github.com/gopacket/gopacket/pcap"
"github.com/gopacket/gopacket/pcapgo"
packetTask "be.ems/src/modules/trace/packet_task"
)
// 实例化服务层 Packet 结构体
var NewPacket = &Packet{
taskMap: sync.Map{},
}
var NewPacket = &Packet{}
// 信令跟踪 服务层处理
type Packet struct {
taskMap sync.Map // 捕获任务
}
// task 任务信息
type task struct {
TaskNo string // 任务编号
Handle *pcap.Handle // 捕获句柄
File *os.File // 捕获信息输出文件句柄
Writer *pcapgo.Writer // 捕获信息输出句柄
Expire time.Time // 过期时间
context context.Context // 上下文 控制完成结束
}
type Packet struct{}
// NetworkDevices 获取网卡设备信息
func (s *Packet) NetworkDevices() []vo.TreeSelect {
arr := make([]vo.TreeSelect, 0)
devices, err := pcap.FindAllDevs()
devices, err := packetTask.NetworkDevices()
if err != nil {
logger.Errorf("interfaces find all devices err: %s", err.Error())
return arr
}
@@ -71,121 +46,22 @@ func (s *Packet) NetworkDevices() []vo.TreeSelect {
return arr
}
// verifyDevice 检查网卡设备是否存在
func (s *Packet) verifyDevice(str string) (string, bool) {
devices, err := pcap.FindAllDevs()
if err != nil {
logger.Errorf("interfaces find all devices err: %s", err.Error())
return "", false
}
for _, device := range devices {
if len(device.Addresses) == 0 {
continue
}
if device.Name == str {
return device.Name, true
}
for _, address := range device.Addresses {
if address.IP.String() == str {
return device.Name, true
}
}
}
return "", false
}
// LiveStart 开始捕获数据
func (s *Packet) LiveStart(taskNo, deviceName, outputFile string) (string, error) {
if _, ok := s.taskMap.Load(taskNo); ok {
return "", fmt.Errorf("task no. %s already exist", taskNo)
}
// Verify the specified network interface exists
device, deviceOk := s.verifyDevice(deviceName)
if !deviceOk {
return "", fmt.Errorf("network device not exist: %s", deviceName)
}
snapshotLength := 262144
// open device
handle, err := pcap.OpenLive(device, int32(snapshotLength), true, pcap.BlockForever)
if err != nil {
logger.Errorf("open live err: %s", err.Error())
if strings.Contains(err.Error(), "operation not permitted") {
return "", fmt.Errorf("you don't have permission to capture on that/these device(s)")
}
return "", err
}
// write a new file
var w *pcapgo.Writer
var f *os.File
if outputFile != "" {
f, err = os.Create(outputFile)
if err != nil {
return "", err
}
w = pcapgo.NewWriter(f)
w.WriteFileHeader(uint32(snapshotLength), handle.LinkType())
}
// capture packets
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
packetSource.Lazy = false
packetSource.NoCopy = true
packetSource.DecodeStreamsAsDatagrams = true
// save tasks
ctx := context.Background()
task := &task{
TaskNo: taskNo,
Handle: handle,
File: f,
Writer: w,
Expire: time.Now().Add(time.Second * 120),
context: ctx,
}
s.taskMap.Store(taskNo, task)
// start capture
go func() {
for packet := range packetSource.PacketsCtx(ctx) {
if packet == nil {
continue
}
if packet.Metadata().Timestamp.Before(time.Now()) {
continue
}
if w != nil {
w.WritePacket(packet.Metadata().CaptureInfo, packet.Data())
}
fmt.Println(packet.Dump())
}
}()
return "task initiated", nil
func (s *Packet) LiveStart(taskNo, deviceName, filterBPF string, outputPCAP bool) (string, error) {
return packetTask.LiveStart(taskNo, deviceName, filterBPF, outputPCAP)
}
// LiveFilter 捕获过滤
func (s *Packet) LiveFilter(taskNo, expr string) error {
info, ok := s.taskMap.Load(taskNo)
if !ok {
return fmt.Errorf("task no. %s not exist", taskNo)
}
return info.(*task).Handle.SetBPFFilter(expr)
return packetTask.LiveFilter(taskNo, expr)
}
// LiveTimeout 更新捕获失效时间
func (s *Packet) LiveTimeout(taskNo string, seconds int) error {
return packetTask.LiveTimeout(taskNo, seconds)
}
// LiveStop 停止捕获数据
func (s *Packet) LiveStop(taskNo string) error {
info, ok := s.taskMap.Load(taskNo)
if !ok {
return fmt.Errorf("task no. %s not exist", taskNo)
}
info.(*task).context.Done()
info.(*task).Handle.Close()
if info.(task).File != nil {
info.(task).File.Close()
}
s.taskMap.Delete(taskNo)
return nil
return packetTask.LiveStop(taskNo)
}

View File

@@ -96,7 +96,7 @@ func (r *TraceTask) CreateUDP() error {
// 推送文件
if v, ok := mData["pcapFile"]; ok && v != "" {
logger.Infof("pcapFile: %s", v)
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE, taskId), taskId)
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE_NE, taskId), taskId)
}
})
@@ -145,7 +145,7 @@ func (r *TraceTask) CreateUDP() error {
// 推送文件
if v, ok := mData["pcapFile"]; ok && v != "" {
logger.Infof("pcapFile: %s", v)
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE, taskId), taskId)
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE_NE, taskId), taskId)
}
})
return nil

View File

@@ -65,7 +65,6 @@ func Setup(router *gin.Engine) {
)
packetGroup.PUT("/keep-alive",
middleware.PreAuthorize(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.packet", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewPacket.KeepAlive,
)
}

View File

@@ -12,13 +12,15 @@ import (
const (
// 组号-其他
GROUP_OTHER = "0"
// 组号-跟踪任务数据变更 2_traceId
GROUP_TRACE = "2_"
// 组号-跟踪任务网元数据变更 2_traceId
GROUP_TRACE_NE = "2_"
// 组号-信令跟踪Packet 4_taskNo
GROUP_TRACE_PACKET = "4_"
// 组号-指标通用 10_neType_neId
GROUP_KPI = "10_"
// 组号-指标UPF 12_neId
GROUP_KPI_UPF = "12_"
// 组号-自定义KPI指标20_neType_neId
// 组号-自定义KPI指标 20_neType_neId
GROUP_KPI_C = "20_"
// 组号-IMS_CDR会话事件 1005_neId
GROUP_IMS_CDR = "1005_"

View File

@@ -2,21 +2,22 @@
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} .1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0 i 1 >/dev/null
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} .1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0 i 2 >/dev/null
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} .1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0 i 3 >/dev/null
snmpset -v3 -l noAuthNoPriv -u manager ${TargetIP}:${PORT} ${OID} i 3 >/dev/null
echo "done"
;;
*)