diff --git a/.vscode/launch.json b/.vscode/launch.json index 278a4b8..2ef23b7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "type": "go", "request": "launch", "mode": "debug", - "program": "./omc/omc.go", + "program": "./restagent/restagent.go", "console": "integratedTerminal", "args": ["--env", "local"] // 走开发配置 } diff --git a/build.sh b/build.sh index 10810f4..fddec7c 100644 --- a/build.sh +++ b/build.sh @@ -28,7 +28,7 @@ fi # Use a new parameter list set -- "${new_args[@]}" -VERSION=2.2408.1 +VERSION=2.2411.3 RelDate=`date +%Y%m%d` RelVer=${VERSION}-${RelDate} diff --git a/build/debbuild/DEBIAN/control b/build/debbuild/DEBIAN/control index 0211eac..d7498d5 100644 --- a/build/debbuild/DEBIAN/control +++ b/build/debbuild/DEBIAN/control @@ -1,5 +1,5 @@ Package: OMC -Version: 2.2408.1-YYYYMMDD +Version: 2.2411.3-YYYYMMDD Section: AGrandTech Prioritt: optional Architecture: amd64 diff --git a/build/debbuild/usr/local/bin/.gitkeep b/build/debbuild/usr/local/bin/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/build/debbuild/usr/local/bin/unzip b/build/debbuild/usr/local/bin/unzip deleted file mode 100644 index cda83f9..0000000 Binary files a/build/debbuild/usr/local/bin/unzip and /dev/null differ diff --git a/build/debbuild/usr/local/bin/xsltproc b/build/debbuild/usr/local/bin/xsltproc deleted file mode 100644 index 428a6d1..0000000 Binary files a/build/debbuild/usr/local/bin/xsltproc and /dev/null differ diff --git a/build/debbuild/usr/local/bin/zip b/build/debbuild/usr/local/bin/zip deleted file mode 100644 index 1bbc48e..0000000 Binary files a/build/debbuild/usr/local/bin/zip and /dev/null differ diff --git a/build/rpmbuild/SPECS/omc.spec b/build/rpmbuild/SPECS/omc.spec index f56f61d..d3d8e0f 100644 --- a/build/rpmbuild/SPECS/omc.spec +++ b/build/rpmbuild/SPECS/omc.spec @@ -6,7 +6,7 @@ Name: omc Summary: AGrandTech 5GC OMC -Version: 2.2408.1 +Version: 2.2411.3 Release: %{release_date} Vendor: AGrandTech URL: https://www.agrandtech.com/ diff --git a/build/system/usr/local/omc/bin/actpkg.sh b/build/system/usr/local/omc/bin/actpkg.sh index 58a326f..1a5fb2c 100644 --- a/build/system/usr/local/omc/bin/actpkg.sh +++ b/build/system/usr/local/omc/bin/actpkg.sh @@ -16,7 +16,7 @@ fi case "${extension}" in deb) if [ ${neType} == "OMC" ]; then - systemctl stop omc.service + systemctl stop restagent.service fi expect < ${logFile} spawn dpkg -i --force-all "$filename" @@ -32,7 +32,7 @@ EOF ;; rpm) if [ ${neType} == "OMC" ]; then - systemctl stop omc.service + systemctl stop restagent.service fi expect < ${logFile} spawn rpm -Uvh "$filename" diff --git a/build/system/usr/local/omc/bin/checkproc.sh b/build/system/usr/local/omc/bin/checkproc.sh index 41585b1..7050999 100644 --- a/build/system/usr/local/omc/bin/checkproc.sh +++ b/build/system/usr/local/omc/bin/checkproc.sh @@ -1,6 +1,6 @@ #!/bin/bash -process_name="omc" +process_name="restagent" if ! pgrep -x "$process_name" >/dev/null; then echo "$process_name is not running. Restarting..." diff --git a/build/system/usr/local/omc/bin/importdb.sh b/build/system/usr/local/omc/bin/importdb.sh index d3c08a7..6a74cd9 100644 --- a/build/system/usr/local/omc/bin/importdb.sh +++ b/build/system/usr/local/omc/bin/importdb.sh @@ -119,17 +119,31 @@ esac # create kpi_report table with ne_type, exp: kpi_report_amf ne_types=$(mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -se "SELECT DISTINCT LOWER(ne_type) FROM kpi_title") for ne_type in ${ne_types}; do - TABLE_NAME="kpi_report_${ne_type}" - SQL="CREATE TABLE IF NOT EXISTS ${TABLE_NAME} AS SELECT * FROM kpi_report WHERE 1=0;ALTER TABLE ${TABLE_NAME} MODIFY COLUMN \`id\` int(11) NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY IF NOT EXISTS (\`id\`);" - echo -n "Create table: ${TABLE_NAME} ..." - mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}" - if [ $? = 0 ]; then - echo "done" - fi - SQL="ALTER TABLE ${TABLE_NAME} ADD INDEX IF NOT EXISTS \`idx_timestamp\`(\`created_at\`) USING BTREE, ADD INDEX IF NOT EXISTS \`idx_uid_datetime\`(\`rm_uid\`, \`date\`, \`start_time\`) USING BTREE;" - echo -n "Create index of ${TABLE_NAME} ..." - mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}" - if [ $? = 0 ]; then - echo "done" - fi + TABLE_NAME="kpi_report_${ne_type}" + SQL="CREATE TABLE IF NOT EXISTS ${TABLE_NAME} LIKE \`kpi_report\`;" + echo -n "Create table: ${TABLE_NAME} ..." + mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}" + if [ $? = 0 ]; then + echo "done" + fi + SQL="ALTER TABLE ${TABLE_NAME} ADD INDEX IF NOT EXISTS \`idx_timestamp\`(\`created_at\`) USING BTREE, ADD INDEX IF NOT EXISTS \`idx_uid_datetime\`(\`rm_uid\`, \`date\`, \`start_time\`) USING BTREE;" + echo -n "Create index of ${TABLE_NAME} ..." + mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}" + if [ $? = 0 ]; then + echo "done" + fi + SQL="ALTER TABLE ${TABLE_NAME} ADD INDEX IF NOT EXISTS \`idx_timestamp\`(\`created_at\`) USING BTREE,ADD INDEX IF NOT EXISTS \`idx_uid_datetime\`(\`rm_uid\`, \`date\`, \`start_time\`) USING BTREE;" + echo -n "Create index of ${TABLE_NAME} ..." + mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} -e "${SQL}" + if [ $? = 0 ]; then + echo "done" + fi + + TABLE_NAME="kpi_c_report_${ne_type}" + SQL="CREATE TABLE IF NOT EXISTS ${TABLE_NAME} LIKE \`kpi_c_report\`;" + echo -n "Create table: ${TABLE_NAME} ..." + mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}" + if [ $? = 0 ]; then + echo "done" + fi done \ No newline at end of file diff --git a/build/system/usr/local/omc/bin/omcsvc.sh b/build/system/usr/local/omc/bin/omcsvc.sh index 2a7d918..8e88b2f 100644 --- a/build/system/usr/local/omc/bin/omcsvc.sh +++ b/build/system/usr/local/omc/bin/omcsvc.sh @@ -1,15 +1,18 @@ #!/bin/bash -ProcList="omc kvdb" -ProcListDesc="kvdb omc" +ProcList="restagent crontask sshsvc captrace" +ProcListDesc="crontask sshsvc captrace restagent" BinDir=/usr/local/omc/bin case "$1" in start) for procName in $ProcListDesc;do - echo "Starting $procName process ..." + echo -n "Starting $procName process ... " systemctl start $procName + if [ $? = 0 ]; then + echo "done" + fi sleep 1 done ;; @@ -20,8 +23,11 @@ case "$1" in ;; stop) for procName in $ProcList;do - echo "Stoping $procName process ..." - systemctl stop $procName + echo -n "Stopping $procName process ... " + systemctl stop $procName + if [ $? = 0 ]; then + echo "done" + fi done ;; restart) @@ -31,12 +37,11 @@ case "$1" in ;; version) for procName in $ProcList;do - $BinDir/$procName -v + $BinDir/$procName --version done ;; *) echo "OMC service" echo "Usage: $0 start|status|stop|restart|version" ;; -esac - +esac diff --git a/build/system/usr/local/omc/bin/rbkpkg.sh b/build/system/usr/local/omc/bin/rbkpkg.sh index efd9fa4..ef9b455 100644 --- a/build/system/usr/local/omc/bin/rbkpkg.sh +++ b/build/system/usr/local/omc/bin/rbkpkg.sh @@ -16,7 +16,7 @@ fi case "${extension}" in deb) if [ ${neType} == "OMC" ]; then - systemctl stop omc.service + systemctl stop restagent.service fi expect < ${logFile} spawn dpkg -i --force-all "$filename" @@ -32,7 +32,7 @@ EOF ;; rpm) if [ ${neType} == "OMC" ]; then - systemctl stop omc.service + systemctl stop restagent.service fi expect < ${logFile} spawn rpm -Uvh "$filename" diff --git a/build/system/usr/local/omc/bin/setomc.sh b/build/system/usr/local/omc/bin/setomc.sh index 656855c..619d320 100644 --- a/build/system/usr/local/omc/bin/setomc.sh +++ b/build/system/usr/local/omc/bin/setomc.sh @@ -3,8 +3,8 @@ # Read the value of the variable from file source /usr/local/omc/etc/omc.conf -C_ARG_LOWER="agt" -C_ARG_UPPER="AGT" +C_ARG_LOWER="omc" +C_ARG_UPPER="OMC" M_ARG_LOWER="*" check_args() { @@ -17,6 +17,9 @@ check_args() { if [ "${C_ARG_LOWER}" == "ba" ]; then C_ARG_UPPER="BA" sed -i 's/VENDORS=.*/VENDORS=BA/' /usr/local/omc/etc/omc.conf + elif [ "${C_ARG_LOWER}" == "omc" ]; then + C_ARG_UPPER="OMC" + sed -i 's/VENDORS=.*/VENDORS=OMC/' /usr/local/omc/etc/omc.conf elif [ "${C_ARG_LOWER}" == "agt" ]; then C_ARG_UPPER="AGT" sed -i 's/VENDORS=.*/VENDORS=AGT/' /usr/local/omc/etc/omc.conf @@ -25,14 +28,14 @@ check_args() { m) M_ARG=$(echo $OPTARG | tr '[:upper:]' '[:lower:]') if [ "${VENDORS}" == "BA" ]; then - C_ARG_LOWER="ba" - C_ARG_UPPER="BA" + C_ARG_LOWER="ba" + C_ARG_UPPER="BA" fi ;; \?) echo "Invalid option: -$OPTARG" >&2 ;; - esac + esac done } @@ -54,19 +57,26 @@ case "${M_ARG}" in ${OMCBinDir}/importdb.sh ${M_ARG} if [ "${C_ARG_LOWER}" != "" ]; then - CustomizedDir=${OMCStaticDir}/${C_ARG_LOWER}.d - if [ ! -d "${CustomizedDir}" ]; then - echo "Not found ${C_ARG_UPPER} customized directory, nothing to be done" - exit 1 - fi - echo "Setting ${C_ARG_UPPER} customized OMC ..." - for SQL in ${CustomizedDir}/db/*.sql; do - mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} < ${SQL}; - done - cp -rf ${CustomizedDir}/logo/* ${OMCStaticDir}/logo - cp -rf ${CustomizedDir}/doc/* ${OMCStaticDir}/helpDoc - #perl -0777 -i -pe 's/omcuser/bluearcus/g' ${OMCRootDir}/etc/default/restconf.yaml - #perl -0777 -i -pe 's/omcuser/bluearcus/g' ${OMCBinDir}/nehosts + CustomizedDir=${OMCStaticDir}/${C_ARG_LOWER}.d + if [ ! -d "${CustomizedDir}" ]; then + echo "Not found ${C_ARG_UPPER} customized directory, nothing to be done" + exit 1 + fi + echo -n "Setting ${C_ARG_UPPER} customized OMC ..." + for SQL in ${CustomizedDir}/db/*.sql; do + mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} < ${SQL}; + done + cp -rf ${CustomizedDir}/logo/* ${OMCStaticDir}/logo + cp -rf ${CustomizedDir}/doc/* ${OMCStaticDir}/helpDoc + if [ "${C_ARG_LOWER}" == "ba" ]; then + rm -rf ${OMCStaticDir}/logo/zh_* + rm -rf ${OMCStaticDir}/helpDoc/zh_* + fi + #perl -0777 -i -pe 's/omcuser/bluearcus/g' ${OMCRootDir}/etc/default/restconf.yaml + #perl -0777 -i -pe 's/omcuser/bluearcus/g' ${OMCBinDir}/nehosts + if [ $? = 0 ]; then + echo "done" + fi fi ;; upgrade | upgvue3) @@ -74,17 +84,24 @@ case "${M_ARG}" in ;; skip) if [ "${C_ARG_LOWER}" != "" ]; then - CustomizedDir=${OMCStaticDir}/${C_ARG_LOWER}.d - if [ ! -d "${CustomizedDir}" ]; then - echo "Not found ${C_ARG_UPPER} customized directory, nothing to be done" - exit 1 - fi - echo "Setting ${C_ARG_UPPER} customized OMC ..." - for SQL in ${CustomizedDir}/db/*.sql; do - mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} < ${SQL}; - done - cp -rf ${CustomizedDir}/logo/* ${OMCStaticDir}/logo - cp -rf ${CustomizedDir}/doc/* ${OMCStaticDir}/helpDoc + CustomizedDir=${OMCStaticDir}/${C_ARG_LOWER}.d + if [ ! -d "${CustomizedDir}" ]; then + echo "Not found ${C_ARG_UPPER} customized directory, nothing to be done" + exit 1 + fi + echo -n "Setting ${C_ARG_UPPER} customized OMC ..." + for SQL in ${CustomizedDir}/db/*.sql; do + mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} < ${SQL}; + done + cp -rf ${CustomizedDir}/logo/* ${OMCStaticDir}/logo + cp -rf ${CustomizedDir}/doc/* ${OMCStaticDir}/helpDoc + if [ "${C_ARG_LOWER}" == "ba" ]; then + rm -rf ${OMCStaticDir}/logo/zh_* + rm -rf ${OMCStaticDir}/helpDoc/zh_* + fi + if [ $? = 0 ]; then + echo "done" + fi fi ;; *) diff --git a/build/system/usr/local/omc/bin/upgconf.sh b/build/system/usr/local/omc/bin/upgconf.sh new file mode 100644 index 0000000..4383c72 --- /dev/null +++ b/build/system/usr/local/omc/bin/upgconf.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +config_file="/usr/local/omc/etc/restconf.yaml" +temp_file="/tmp/temp.yaml" + +declare -A insert_lines=( + [156]=" dataCoding: 0" + [157]=" serviceNumber: \"OMC\"" +) + +declare -A update_lines=( + ["deadLine: 10"]="deadLine: 600" +) + +# check if exist file +if [[ ! -f $config_file ]]; then + echo "NOT FOUND config file: $config_file" + exit 1 +fi + +insert_if_missing() { + local line_number="$1" + local line_content="$2" + local current_content=$(sed -n "${line_number}p" "$config_file") + + if [[ "$current_content" != "$line_content" ]]; then + # insert line to config file + echo -n "Inserting '$line_content' into line ${line_number} ... " + awk -v n="$line_number" -v line="$line_content" 'NR==n {print line} {print}' "$config_file" >"$temp_file" && mv "$temp_file" "$config_file" + if [ $? = 0 ]; then + echo "done" + fi + else + echo "Exist '$line_content' at line ${line_number}" + fi +} + +# function:update line content +update_lines_content() { + local old_line="$1" + local new_line="$2" + echo -n "Updating '$old_line' to line '$new_line' ..." + sed -i "s/$old_line/$new_line/" "$config_file" + if [ $? = 0 ]; then + echo "done" + fi +} + +#line_numbers=(156 157) +line_numbers=$(for key in "${!insert_lines[@]}"; do echo "$key"; done | sort -n) + +# insert process +#for line_number in "${line_numbers[@]}"; do +#for line_number in "${!insert_lines[@]}"; do +for line_number in $line_numbers; do + insert_if_missing "$line_number" "${insert_lines[$line_number]}" +done + +# update process +for old_line in "${!update_lines[@]}"; do + update_lines_content "$old_line" "${update_lines[$old_line]}" +done diff --git a/build/system/usr/local/omc/etc/db/common/chart_graph.sql b/build/system/usr/local/omc/etc/db/common/chart_graph.sql index b0e29b3..41a7f56 100644 --- a/build/system/usr/local/omc/etc/db/common/chart_graph.sql +++ b/build/system/usr/local/omc/etc/db/common/chart_graph.sql @@ -1,11 +1,8 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) -- -- Table structure for table `chart_graph` -- DROP TABLE IF EXISTS `chart_graph`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; CREATE TABLE `chart_graph` ( `row_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', `row_type` enum('node','edge','combo') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '记录类型', @@ -31,8 +28,7 @@ CREATE TABLE `chart_graph` ( `label_cfg` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签文本-JSON配置', PRIMARY KEY (`row_id`) USING BTREE, KEY `idx_group` (`row_group`) USING BTREE COMMENT '组' -) ENGINE=InnoDB AUTO_INCREMENT=4321 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='图表-G6关系图数据'; -/*!40101 SET character_set_client = @saved_cs_client */; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='图表-G6关系图数据'; -- -- Dumping data for table `chart_graph` @@ -135,49 +131,51 @@ INSERT INTO `chart_graph` VALUES (2338, 'edge', '5GC System Architecture3', 'N3I INSERT INTO `chart_graph` VALUES (2339, 'edge', '5GC System Architecture3', 'LMF~1706173845506~lan', 'line', 0, 0, 0, '', '', '', '', '', 'LMF', 'lan', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); INSERT INTO `chart_graph` VALUES (2340, 'edge', '5GC System Architecture3', 'Base~1706176128676~MME', 'cubic-animate-circle-move', 0, 0, 0, '', '', '', '', '', 'Base', 'MME', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'S1-MME', '{\"autoRotate\":false,\"position\":\"end\",\"refX\":-15,\"refY\":-35,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); INSERT INTO `chart_graph` VALUES (2341, 'combo', '5GC System Architecture3', '5GC', 'rect', 10, 4.47597, -155.893, '[40,40]', '', '', '', '', '', '', '', '[40,40,40,40]', '', '[{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"IMS\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"NSSF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"UPF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"PCF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"SMF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"AMF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"UDM\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"AUSF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"NRF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"LMF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"NEF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"MME\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"N3IWF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"lan\",\"itemType\":\"node\"}]', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"grab\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"fill\":\"#318c7d\",\"fillOpacity\":0.1,\"height\":325.169599,\"highlight\":{\"fill\":\"rgb(253, 253, 253)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(253, 253, 253)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"lineWidth\":1,\"r\":203.94142,\"radius\":2,\"selected\":{\"fill\":\"rgb(253, 253, 253)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\",\"width\":407.88284}', 'Core Network', '{\"position\":\"top\",\"refX\":10,\"refY\":10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4278, 'node', '5GC System Architecture', 'Base', 'image-animate-state', 0, -110, -30, '[60,50]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/base.svg', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', '(R)AN', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4279, 'node', '5GC System Architecture', 'DN', 'image-animate-state', 0, 240, -30, '[60,60]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/earth3d-1.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'DN', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4280, 'node', '5GC System Architecture', 'OMC', 'image-animate-state', 0, 240, -330, '[60,60]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/omc62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#783636\"}', 'OMC', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4281, 'node', '5GC System Architecture', 'NR', 'image', 0, -153, -27, '[30,30]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lightning1.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', '', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#000000\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4282, 'node', '5GC System Architecture', 'IMS', 'image-animate-state', 11, 170, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/ims62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f1212c\"}', 'IMS', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4283, 'node', '5GC System Architecture', 'NSSF', 'image-animate-state', 12, -110, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nssf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NSSF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4284, 'node', '5GC System Architecture', 'UPF', 'image-animate-state', 13, 30, -30, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/upf6.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'UPF', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4285, 'node', '5GC System Architecture', 'PCF', 'image-animate-state', 14, 100, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/pcf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'PCF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4286, 'node', '5GC System Architecture', 'UE', 'image', 14, -201.589, -29.622, '[64,64]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/mobile.svg', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'UE', '{\"offset\":-10,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4287, 'node', '5GC System Architecture', 'SMF', 'image-animate-state', 15, 30, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/smf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f0212c\"}', 'SMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4288, 'node', '5GC System Architecture', 'AMF', 'image-animate-state', 16, -110, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/amf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'AMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4289, 'node', '5GC System Architecture', 'AUSF', 'image-animate-state', 16, -180, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/ausf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'AUSF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4290, 'node', '5GC System Architecture', 'UDM', 'image-animate-state', 17, -40, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/udm62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'UDM', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4291, 'node', '5GC System Architecture', 'NRF', 'image-animate-state', 19, 100, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nrf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NRF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4292, 'node', '5GC System Architecture', 'LMF', 'image-animate-state', 20, 170, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lmf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'LMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4293, 'node', '5GC System Architecture', 'NEF', 'image-animate-state', 21, 30, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nef62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NEF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4294, 'node', '5GC System Architecture', 'MME', 'image-animate-state', 22, -180, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/mme62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'MME', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4295, 'node', '5GC System Architecture', 'N3IWF', 'image-animate-state', 23, -40, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/n3iwf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'N3IWF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4296, 'node', '5GC System Architecture', 'lan1', 'image', 24, -180, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#f6f4f4\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4297, 'node', '5GC System Architecture', 'lan2', 'image', 24, -110, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#f8f7f7\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4298, 'node', '5GC System Architecture', 'lan3', 'image', 24, -40, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4299, 'node', '5GC System Architecture', 'lan4', 'image', 24, 30, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4300, 'node', '5GC System Architecture', 'lan5', 'image', 24, 100, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4301, 'node', '5GC System Architecture', 'lan6', 'image', 24, 170, -195, '[70,10]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4302, 'node', '5GC System Architecture', 'lan7', 'image', 24, 240, -195, '[70,10]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4303, 'node', '5GC System Architecture', 'LAN', 'rect', 30, 30, -195, '[500,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '', '', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"#87cefa\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#87cefa\"}', '', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#000000\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4304, 'edge', '5GC System Architecture', 'NEF~1706494552592~lan5', 'line', 0, 0, 0, '', '', '', '', '', 'NEF', 'lan4', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4305, 'edge', '5GC System Architecture', 'LMF~1706495015507~lan6', 'polyline', 0, 0, 0, '', '', '', '', '', 'LMF', 'lan6', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4306, 'edge', '5GC System Architecture', 'OMC~1706495150020~lan7', 'polyline', 0, 0, 0, '', '', '', '', '', 'OMC', 'lan7', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4307, 'edge', '5GC System Architecture', 'AUSF~1706495243932~lan1', 'polyline', 0, 0, 0, '', '', '', '', '', 'AUSF', 'lan1', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4308, 'edge', '5GC System Architecture', 'AMF~1706495271064~lan2', 'polyline', 0, 0, 0, '', '', '', '', '', 'AMF', 'lan2', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4309, 'edge', '5GC System Architecture', 'NRF~1706495715971~lan3', 'polyline', 0, 0, 0, '', '', '', '', '', 'NRF', 'lan5', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4310, 'edge', '5GC System Architecture', 'SMF~1706495739277~lan4', 'polyline', 0, 0, 0, '', '', '', '', '', 'SMF', 'lan4', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4311, 'edge', '5GC System Architecture', 'IMS~1706496047466~lan5', 'polyline', 0, 0, 0, '', '', '', '', '', 'IMS', 'lan6', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4312, 'edge', '5GC System Architecture', 'N3IWF~1706496082968~lan6', 'polyline', 0, 0, 0, '', '', '', '', '', 'N3IWF', 'lan3', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4313, 'edge', '5GC System Architecture', 'RAN~1704534829539~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'Base', 'UPF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":5,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#7b68ee\"}', 'N3', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":-10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4314, 'edge', '5GC System Architecture', 'DN~1704534869360~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'UPF', 'DN', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":5,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#7b68ee\"}', 'N6', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":-10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4315, 'edge', '5GC System Architecture', 'SMF~1704765447548~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'SMF', 'UPF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'N4', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":3,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4316, 'edge', '5GC System Architecture', '5GC~1704764825481~Base', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'Base', 'AMF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'N2', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":-5,\"refY\":-2,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4317, 'edge', '5GC System Architecture', 'MME~1706492758830~lan1', 'polyline', 0, 0, 0, '', '', '', '', '', 'MME', 'lan1', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4318, 'edge', '5GC System Architecture', 'UDM~1706493787944~lan2', 'line', 0, 0, 0, '', '', '', '', '', 'UDM', 'lan3', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4319, 'edge', '5GC System Architecture', 'PCF~1706494120334~lan3', 'line', 0, 0, 0, '', '', '', '', '', 'PCF', 'lan5', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4320, 'edge', '5GC System Architecture', 'NSSF~1706494145341~lan4', 'polyline', 0, 0, 0, '', '', '', '', '', 'NSSF', 'lan2', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4366, 'node', '5GC System Architecture', 'Base', 'image-animate-state', 0, -110, -30, '[60,50]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/base.svg', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', '(R)AN', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4367, 'node', '5GC System Architecture', 'DN', 'image-animate-state', 0, 240, -30, '[60,60]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/earth3d-1.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'DN', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4368, 'node', '5GC System Architecture', 'OMC', 'image-animate-state', 0, 238.846, -329.519, '[60,60]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/omc62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#783636\"}', 'OMC', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4369, 'node', '5GC System Architecture', 'NR', 'image', 0, -153, -27, '[30,30]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lightning1.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', '', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#000000\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4370, 'node', '5GC System Architecture', 'IMS', 'image-animate-state', 11, 170, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/ims62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f1212c\"}', 'IMS', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4371, 'node', '5GC System Architecture', 'SMSC', 'image-animate-state', 11, 238.918, -139.149, '[50,40]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/smsc.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'SMSC', '{\"offset\":0,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4372, 'node', '5GC System Architecture', 'NSSF', 'image-animate-state', 12, -110, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nssf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NSSF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4373, 'node', '5GC System Architecture', 'UPF', 'image-animate-state', 13, 30, -30, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/upf6.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'UPF', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4374, 'node', '5GC System Architecture', 'PCF', 'image-animate-state', 14, 100, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/pcf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'PCF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4375, 'node', '5GC System Architecture', 'UE', 'image', 14, -201.589, -29.622, '[64,64]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/mobile.svg', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'UE', '{\"offset\":-10,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4376, 'node', '5GC System Architecture', 'SMF', 'image-animate-state', 15, 30, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/smf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f0212c\"}', 'SMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4377, 'node', '5GC System Architecture', 'AMF', 'image-animate-state', 16, -110, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/amf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'AMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4378, 'node', '5GC System Architecture', 'AUSF', 'image-animate-state', 16, -180, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/ausf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'AUSF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4379, 'node', '5GC System Architecture', 'UDM', 'image-animate-state', 17, -40, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/udm62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'UDM', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4380, 'node', '5GC System Architecture', 'NRF', 'image-animate-state', 19, 100, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nrf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NRF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4381, 'node', '5GC System Architecture', 'LMF', 'image-animate-state', 20, 170, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lmf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'LMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4382, 'node', '5GC System Architecture', 'NEF', 'image-animate-state', 21, 30, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nef62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NEF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4383, 'node', '5GC System Architecture', 'MME', 'image-animate-state', 22, -180, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/mme62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'MME', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4384, 'node', '5GC System Architecture', 'N3IWF', 'image-animate-state', 23, -40, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/n3iwf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'N3IWF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4385, 'node', '5GC System Architecture', 'lan7', 'image', 24, 238.892, -195.039, '[70,10]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN7', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4386, 'node', '5GC System Architecture', 'lan1', 'image', 24, -180, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN1', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#f6f4f4\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4387, 'node', '5GC System Architecture', 'lan2', 'image', 24, -110, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'LAN2', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#f8f7f7\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4388, 'node', '5GC System Architecture', 'lan3', 'image', 24, -40, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN3', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4389, 'node', '5GC System Architecture', 'lan4', 'image', 24, 30, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN4', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4390, 'node', '5GC System Architecture', 'lan5', 'image', 24, 100, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN5', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4391, 'node', '5GC System Architecture', 'lan6', 'image', 24, 170, -195, '[70,10]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN6', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4392, 'node', '5GC System Architecture', 'LAN', 'rect', 30, 30.0301, -195.517, '[500,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '', '', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"#87cefa\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#87cefa\"}', '', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#000000\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4393, 'edge', '5GC System Architecture', 'RAN~1704534829539~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'Base', 'UPF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":5,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#7b68ee\"}', 'N3', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":-10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4394, 'edge', '5GC System Architecture', 'N3IWF~1706496082968~lan6', 'polyline', 0, 0, 0, '', '', '', '', '', 'N3IWF', 'lan3', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4395, 'edge', '5GC System Architecture', 'NEF~1706494552592~lan5', 'line', 0, 0, 0, '', '', '', '', '', 'NEF', 'lan4', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4396, 'edge', '5GC System Architecture', 'LMF~1706495015507~lan6', 'polyline', 0, 0, 0, '', '', '', '', '', 'LMF', 'lan6', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4397, 'edge', '5GC System Architecture', 'OMC~1706495150020~lan7', 'polyline', 0, 0, 0, '', '', '', '', '', 'OMC', 'lan7', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4398, 'edge', '5GC System Architecture', 'AUSF~1706495243932~lan1', 'polyline', 0, 0, 0, '', '', '', '', '', 'AUSF', 'lan1', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4399, 'edge', '5GC System Architecture', 'AMF~1706495271064~lan2', 'polyline', 0, 0, 0, '', '', '', '', '', 'AMF', 'lan2', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4400, 'edge', '5GC System Architecture', 'NRF~1706495715971~lan3', 'polyline', 0, 0, 0, '', '', '', '', '', 'NRF', 'lan5', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4401, 'edge', '5GC System Architecture', 'SMF~1706495739277~lan4', 'polyline', 0, 0, 0, '', '', '', '', '', 'SMF', 'lan4', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4402, 'edge', '5GC System Architecture', 'IMS~1706496047466~lan5', 'polyline', 0, 0, 0, '', '', '', '', '', 'IMS', 'lan6', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4403, 'edge', '5GC System Architecture', 'DN~1704534869360~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'UPF', 'DN', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":5,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#7b68ee\"}', 'N6', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":-10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4404, 'edge', '5GC System Architecture', 'SMF~1704765447548~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'SMF', 'UPF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'N4', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":3,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4405, 'edge', '5GC System Architecture', '5GC~1704764825481~Base', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'Base', 'AMF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'N2', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":-5,\"refY\":-2,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4406, 'edge', '5GC System Architecture', 'MME~1706492758830~lan1', 'polyline', 0, 0, 0, '', '', '', '', '', 'MME', 'lan1', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4407, 'edge', '5GC System Architecture', 'UDM~1706493787944~lan2', 'line', 0, 0, 0, '', '', '', '', '', 'UDM', 'lan3', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4408, 'edge', '5GC System Architecture', 'PCF~1706494120334~lan3', 'line', 0, 0, 0, '', '', '', '', '', 'PCF', 'lan5', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4409, 'edge', '5GC System Architecture', 'NSSF~1706494145341~lan4', 'polyline', 0, 0, 0, '', '', '', '', '', 'NSSF', 'lan2', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4410, 'edge', '5GC System Architecture', 'SMSC~1728441658350~LAN', 'polyline', 0, 0, 0, '', '', '', '', '', 'SMSC', 'lan7', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); UNLOCK TABLES; diff --git a/build/system/usr/local/omc/etc/db/common/mml_command.sql b/build/system/usr/local/omc/etc/db/common/mml_command.sql index 302d0ed..43d1e48 100644 --- a/build/system/usr/local/omc/etc/db/common/mml_command.sql +++ b/build/system/usr/local/omc/etc/db/common/mml_command.sql @@ -43,7 +43,7 @@ INSERT INTO `mml_command` VALUES (1594, 'OMC', 'neManagement', 'Network Element INSERT INTO `mml_command` VALUES (1595, 'OMC', 'neManagement', 'Network Element Management', 'add', 'neinfo', 'Add Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"rm_uid\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Resource management UID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"rmuid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ip\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"port\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"nename\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"pv_flag\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"pvflag\",\"optional\":\"false\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1596, 'OMC', 'neManagement', 'Network Element Management', 'mod', 'neinfo', 'Modify Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"rm_uid\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Resource management UID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"rmuid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ip\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"ip\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"port\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"port\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"nename\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"pv_flag\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"pvflag\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1597, 'OMC', 'neManagement', 'Network Element Management', 'del', 'neinfo', 'Delete Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"}]', 'Active'); -INSERT INTO `mml_command` VALUES (1598, 'OMC', 'neConfigManagement', 'NE Config Parameter Management', 'dsp', 'neconfig', 'Display NE Config Parameter', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"top_tag\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Parameter tag\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"tag\",\"optional\":\"true\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_command` VALUES (1598, 'OMC', 'neConfigManagement', 'NE Config Parameter Management', 'dsp', 'neconfig', 'Display NE Config Parameter', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE Type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"param_display\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Parameters Display\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"paramDisplay\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1599, 'OMC', 'faultManagement', 'Fault Management', 'dsp', 'alarm', 'Display Alarm Information', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE UID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"name\":\"nename\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"alarm_code\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm code\",\"filter\":\"\",\"name\":\"alarmcode\",\"optional\":\"true\",\"type\":\"int\"},{\"alias\":\"orig_severity\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Original severity\",\"filter\":\"{\\\"Critical\\\":\\\"Critical\\\",\\\"Major\\\":\\\"Major\\\",\\\"Minor\\\":\\\"Minor\\\",\\\"Warning\\\":\\\"Warning\\\",\\\"Event\\\":\\\"Event\\\"}\",\"name\":\"origseverity\",\"optional\":\"true\",\"type\":\"enum\"},{\"alias\":\"pv_flag\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"name\":\"pvflag\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"event_time\\u003e\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm event start time\",\"filter\":\"\",\"name\":\"starttime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"event_time\\u003c\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm event end time\",\"filter\":\"\",\"name\":\"endtime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"alarm_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm type\",\"filter\":\"{\\\"CommunicationAlarm\\\":\\\"CommunicationAlarm\\\",\\\"EquipmentAlarm\\\":\\\"EquipmentAlarm\\\",\\\"ProcessingFailure\\\":\\\"ProcessingFailure\\\",\\\"EnvironmentalAlarm\\\":\\\"EnvironmentalAlarm\\\",\\\"QualityOfServiceAlarm\\\":\\\"QualityOfServiceAlarm\\\"}\",\"name\":\"alarmtype\",\"optional\":\"true\",\"type\":\"enum\"},{\"alias\":\"alarm_status\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm status\",\"filter\":\"\",\"name\":\"alarmstatus\",\"optional\":\"true\",\"type\":\"int\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1600, 'OMC', 'systemCommand', 'Linux System Command', 'run', 'shell', 'Run Shell Command', '[{\"alias\":\"cmd\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Shell command\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); INSERT INTO `mml_command` VALUES (1601, 'OMC', 'licenseManagement', 'License Management', 'dsp', 'licenseinfo', 'Display NE License Information', '[{\"alias\":\"neType\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"neId\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"}]', 'Inactive'); diff --git a/build/system/usr/local/omc/etc/db/common/mml_http_map.sql b/build/system/usr/local/omc/etc/db/common/mml_http_map.sql index ea729c9..b058e48 100644 --- a/build/system/usr/local/omc/etc/db/common/mml_http_map.sql +++ b/build/system/usr/local/omc/etc/db/common/mml_http_map.sql @@ -42,7 +42,7 @@ CREATE TABLE `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/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 \"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 (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}'); @@ -65,7 +65,7 @@ INSERT INTO `mml_http_map` VALUES (22, 'OMC', 'act', 'measuretask', 'Put', '/api INSERT INTO `mml_http_map` VALUES (23, 'OMC', 'dea', 'measuretask', 'Put', '/api/rest/dataManagement/v1/omc_db/measure_task', NULL, NULL, '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"measure_task\",\r\n \"cols\": [\r\n {\r\n \"name\": \"status\",\r\n \"alias\": \"status\",\r\n \"type\": \"int\",\r\n \"length\": 11,\r\n \"value\": \"Inactive\"\r\n }\r\n ]\r\n}\r\n', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); INSERT INTO `mml_http_map` VALUES (24, 'OMC', 'dsp', 'nbicm', 'Get', '/api/rest/dataManagement/v1/omc_db/nbi_cm', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NBI Resources Management\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"RM UID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"user_label\",\r\n \"display\": \"User label\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"object_type\",\r\n \"display\": \"Object type\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"pv_flag\",\r\n \"display\": \"PV flag\",\r\n \"length\": 8\r\n },\r\n {\r\n \"name\": \"value_json\",\r\n \"display\": \"NBI resource management\",\r\n \"length\": 200\r\n } \r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}\r\n'); INSERT INTO `mml_http_map` VALUES (25, 'OMC', 'upg', 'neversion', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_version', NULL, NULL, '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_version\",\r\n \"cols\": [\r\n {\r\n \"name\": \"status\",\r\n \"alias\": \"status\",\r\n \"type\": \"string\",\r\n \"length\": 8,\r\n \"value\": \"Active\"\r\n }\r\n ]\r\n}', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); -INSERT INTO `mml_http_map` VALUES (26, 'OMC', 'dsp', 'neconfig', 'Get', '/api/rest/dataManagement/v1/omc_db/param_config', NULL, 'SQL', '?SQL=select+ne_type,ne_id,top_tag,json_extract(param_json,\'$.*[*].name\')+AS+param_name,JSON_EXTRACT(param_json,\'$.*[*].value\')+as+param_value+from+param_config', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE Config Parameters\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"top_tag\",\r\n \"display\": \"Parameters tag\",\r\n \"length\": 128\r\n },\r\n {\r\n \"name\": \"param_name\",\r\n \"display\": \"Parameter name list\",\r\n \"length\": 256\r\n },\r\n {\r\n \"name\": \"param_value\",\r\n \"display\": \"Parameter value list\",\r\n \"length\": 256\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); +INSERT INTO `mml_http_map` VALUES (26, 'OMC', 'dsp', 'neconfig', 'Get', '/api/rest/dataManagement/v1/omc_db/ne_config', NULL, 'SQL', '?SQL=select+ne_type,param_display,JSON_UNQUOTE(json_extract(param_json,\'$[0].name\'))+as+param_name,JSON_UNQUOTE(json_extract(param_json,\'$[0].value\'))+as+param_value+from+ne_config', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE Config Parameters\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE Type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"param_display\",\r\n \"display\": \"Parameter Display\",\r\n \"length\": 128\r\n },\r\n {\r\n \"name\": \"param_name\",\r\n \"display\": \"Parameter Name\",\r\n \"length\": 256\r\n },\r\n {\r\n \"name\": \"param_value\",\r\n \"display\": \"Parameter Value\",\r\n \"length\": 256\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); INSERT INTO `mml_http_map` VALUES (27, 'OMC', 'lst', 'license', 'Get', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE License Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"serial_no\",\r\n \"display\": \"Serial no\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"capcity\",\r\n \"display\": \"License capcity\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"used\",\r\n \"display\": \"License used\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"feature_enabled\",\r\n \"display\": \"Feature enabled\",\r\n \"length\": 30\r\n },\r\n {\r\n \"name\": \"expiration_date\",\r\n \"display\": \"License expiration date\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); INSERT INTO `mml_http_map` VALUES (28, 'OMC', 'dep', 'license', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_license\",\r\n \"callFunc\": \"DeploymentLicense\"\r\n}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); INSERT INTO `mml_http_map` VALUES (29, 'OMC', 'rel', 'license', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_license\",\r\n \"callFunc\": \"InstallLicense\"\r\n}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); diff --git a/build/system/usr/local/omc/etc/db/common/ne_config.sql b/build/system/usr/local/omc/etc/db/common/ne_config.sql index 298b49d..3d0def6 100644 --- a/build/system/usr/local/omc/etc/db/common/ne_config.sql +++ b/build/system/usr/local/omc/etc/db/common/ne_config.sql @@ -5,16 +5,14 @@ SET FOREIGN_KEY_CHECKS = 0; -- Table structure for table `ne_config` -- - DROP TABLE IF EXISTS `ne_config`; - CREATE TABLE `ne_config` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `param_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '参数名', `param_display` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数显示名', `param_type` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数类型 list列表单层 array数组多层', - `param_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'accesss属性控制:只读read-only/read/ro 读写read-write', + `param_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'accesss属性控制: 只读read-only/read/ro 读写read-write', `param_sort` int DEFAULT '0' COMMENT '参数排序', `param_perms` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作权限 get只读 put可编辑 delete可删除 post可新增', `update_time` bigint DEFAULT NULL COMMENT '更新时间', @@ -23,92 +21,114 @@ CREATE TABLE `ne_config` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_参数配置可用属性值'; -- 初始数据对应网元 -INSERT INTO `ne_config` VALUES (1, 'AMF', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]', 1, '', 1721705806656); -INSERT INTO `ne_config` VALUES (2, 'AMF', 'association', 'TNL Association List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]', 3, '', 1721705807645); -INSERT INTO `ne_config` VALUES (3, 'AMF', 'guami', 'GUAMI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1721705807721); -INSERT INTO `ne_config` VALUES (4, 'AMF', 'tai', 'TAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1721705807738); -INSERT INTO `ne_config` VALUES (5, 'AMF', 'slice', 'Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]', 9, '', 1721705807763); -INSERT INTO `ne_config` VALUES (6, 'AUSF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"}]', 1, '', 1719831209173); + +-- 更新 AMF 配置 202401031 +INSERT INTO `ne_config` VALUES (1, 'AMF', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup AUSF URI\",\"filter\":\"0~64\",\"name\":\"backupAusfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.131:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup UDM URI\",\"filter\":\"0~64\",\"name\":\"backupUdmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.141:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup SMF URI\",\"filter\":\"0~64\",\"name\":\"backupSmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.151:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup PCF URI\",\"filter\":\"0~64\",\"name\":\"backupPcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.161:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]', 1, '', 1730342662153); +INSERT INTO `ne_config` VALUES (2, 'AMF', 'association', 'TNL Association List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]', 3, '', 1730342662166); +INSERT INTO `ne_config` VALUES (3, 'AMF', 'guami', 'GUAMI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1730342662172); +INSERT INTO `ne_config` VALUES (4, 'AMF', 'tai', 'TAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1730342662177); +INSERT INTO `ne_config` VALUES (5, 'AMF', 'slice', 'Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]', 9, '', 1730342662182); +INSERT INTO `ne_config` VALUES (6, 'AMF', 'systemFeatOpt', 'System FeatOpt', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dnnCorrectionEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"gutiReallocationInPRUEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"gutiReallocationInPRUEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ueRadioCapabilityMatchEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"ueRadioCapabilityMatchEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportFollowOnRequestIndication\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportFollowOnRequestIndication\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"triggerInitCtxSetupForAllNASProc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"triggerInitCtxSetupForAllNASProc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportAllAllowedNssai\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportAllAllowedNssai\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"implicitUnsubscribeEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"implicitUnsubscribeEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportRRCInactiveReport\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportRRCInactiveReport\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportMappedSecurityContext\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportMappedSecurityContext\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"optimizeSignalingProcedure\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"optimizeSignalingProcedure\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"reAuthInServiceRequestProc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"reAuthInServiceRequestProc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"skipGetSubscribedNssai\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"skipGetSubscribedNssai\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"forceIdentityRequest\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"forceIdentityRequest\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"cagEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cagEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"imeiRestrictionEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"checkSliceInTaEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"checkSliceInTaEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"uePolicyEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"uePolicyEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"smsOverNasEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"smsOverNasEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"statusReportToOmc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"statusReportToOmc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"statusReportEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"statusReportEnabled\",\"type\":\"bool\",\"value\":\"0\"}]', 11, '', 1730342662187); + +INSERT INTO `ne_config` VALUES (20, 'AUSF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"}]', 1, '', 1719831209173); -- 更新 IMS 配置 20240815 -INSERT INTO `ne_config` VALUES (7, 'IMS', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"ims-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MCC\",\"filter\":\"\",\"name\":\"hplmnMCC\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MNC\",\"filter\":\"\",\"name\":\"hplmnMNC\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Network IPv4\",\"filter\":\"\",\"name\":\"LocalNetworkIPv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv6\",\"filter\":\"\",\"name\":\"serviceIPv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 1\",\"filter\":\"\",\"name\":\"domainName1\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 2\",\"filter\":\"\",\"name\":\"domainName2\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 3\",\"filter\":\"\",\"name\":\"domainName3\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 4\",\"filter\":\"\",\"name\":\"domainName4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MultiIPStack Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"multiIPStackInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register Timer\",\"filter\":\"120~1000000\",\"name\":\"registerTimer\",\"type\":\"int\",\"value\":\"7200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Call Duration\",\"filter\":\"1800~1000000\",\"name\":\"maxCallDuration\",\"type\":\"int\",\"value\":\"43200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal SMS Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalSMSInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal CDR Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalCDRInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal KPI Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalKPIInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF IP Address\",\"filter\":\"\",\"name\":\"pcfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"}]', 1, '', 1723716862092); -INSERT INTO `ne_config` VALUES (8, 'IMS', 'plmn', 'PLMN List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~3\",\"display\":\"Index\",\"filter\":\"0~3\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"^[0-9]{3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^[0-9]{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"01\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain\",\"filter\":\"0~128\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 3, '', 1723716862107); -INSERT INTO `ne_config` VALUES (9, 'IMS', 'mmtel_dialplan', 'MMTEL Dialplan', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NaName\",\"filter\":\"0~128\",\"name\":\"naName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Title\",\"filter\":\"0~128\",\"name\":\"title\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"0-2\",\"name\":\"method\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~128\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start\",\"filter\":\"0~128\",\"name\":\"start\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End\",\"filter\":\"0~128\",\"name\":\"end\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Attrib\",\"filter\":\"0~128\",\"name\":\"attrib\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Len\",\"filter\":\"0~128\",\"name\":\"numberLen\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rsc\",\"filter\":\"0~128\",\"name\":\"rsc\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Nai\",\"filter\":\"0~128\",\"name\":\"e164Nai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Delete\",\"filter\":\"0~128\",\"name\":\"e164Delete\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Insert\",\"filter\":\"0~128\",\"name\":\"e164Insert\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"Enable: Close/Open\",\"display\":\"Admin State\",\"filter\":\"{\\\"0\\\":\\\"Close\\\", \\\"1\\\":\\\"Open\\\"}\",\"name\":\"adminState\",\"type\":\"enum\",\"value\":\"0\"}]', 5, '', 1723716862110); -INSERT INTO `ne_config` VALUES (10, 'IMS', 'ds_system', 'DS System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"dispatchSystemInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Transcode Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"transcodeInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System IPv4\",\"filter\":\"\",\"name\":\"dispatchSystemIP\",\"type\":\"ipv4\",\"value\":\"1.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Port\",\"filter\":\"\",\"name\":\"dispatchSystemPort\",\"type\":\"int\",\"value\":\"5060\"}]', 7, '', 1723716862113); +INSERT INTO `ne_config` VALUES (40, 'IMS', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"ims-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MCC\",\"filter\":\"\",\"name\":\"hplmnMCC\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MNC\",\"filter\":\"\",\"name\":\"hplmnMNC\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Network IPv4\",\"filter\":\"\",\"name\":\"LocalNetworkIPv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv6\",\"filter\":\"\",\"name\":\"serviceIPv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 1\",\"filter\":\"\",\"name\":\"domainName1\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 2\",\"filter\":\"\",\"name\":\"domainName2\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 3\",\"filter\":\"\",\"name\":\"domainName3\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 4\",\"filter\":\"\",\"name\":\"domainName4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MultiIPStack Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"multiIPStackInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register Timer\",\"filter\":\"120~1000000\",\"name\":\"registerTimer\",\"type\":\"int\",\"value\":\"7200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Call Duration\",\"filter\":\"1800~1000000\",\"name\":\"maxCallDuration\",\"type\":\"int\",\"value\":\"43200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal SMS Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalSMSInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal CDR Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalCDRInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal KPI Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalKPIInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF IP Address\",\"filter\":\"\",\"name\":\"pcfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"}]', 1, '', 1723716862092); +INSERT INTO `ne_config` VALUES (41, 'IMS', 'plmn', 'PLMN List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~3\",\"display\":\"Index\",\"filter\":\"0~3\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"^[0-9]{3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^[0-9]{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"01\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain\",\"filter\":\"0~128\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 3, '', 1723716862107); +INSERT INTO `ne_config` VALUES (42, 'IMS', 'mmtel_dialplan', 'MMTEL Dialplan', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NaName\",\"filter\":\"0~128\",\"name\":\"naName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Title\",\"filter\":\"0~128\",\"name\":\"title\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"0-2\",\"name\":\"method\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~128\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start\",\"filter\":\"0~128\",\"name\":\"start\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End\",\"filter\":\"0~128\",\"name\":\"end\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Attrib\",\"filter\":\"0~128\",\"name\":\"attrib\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Len\",\"filter\":\"0~128\",\"name\":\"numberLen\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rsc\",\"filter\":\"0~128\",\"name\":\"rsc\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Nai\",\"filter\":\"0~128\",\"name\":\"e164Nai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Delete\",\"filter\":\"0~128\",\"name\":\"e164Delete\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Insert\",\"filter\":\"0~128\",\"name\":\"e164Insert\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"Enable: Close/Open\",\"display\":\"Admin State\",\"filter\":\"{\\\"0\\\":\\\"Close\\\", \\\"1\\\":\\\"Open\\\"}\",\"name\":\"adminState\",\"type\":\"enum\",\"value\":\"0\"}]', 5, '', 1723716862110); +INSERT INTO `ne_config` VALUES (43, 'IMS', 'ds_system', 'DS System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"dispatchSystemInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Transcode Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"transcodeInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System IPv4\",\"filter\":\"\",\"name\":\"dispatchSystemIP\",\"type\":\"ipv4\",\"value\":\"1.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Port\",\"filter\":\"\",\"name\":\"dispatchSystemPort\",\"type\":\"int\",\"value\":\"5060\"}]', 7, '', 1723716862113); -INSERT INTO `ne_config` VALUES (11, 'MME', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"CSFB Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"VoLTE Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"volteEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S1 MME IP\",\"filter\":\"0~64\",\"name\":\"s1MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"S1 MME Port\",\"filter\":\"0~65535\",\"name\":\"s1MmePort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S11 MME IP\",\"filter\":\"0~64\",\"name\":\"s11MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S11 MME Port\",\"filter\":\"0~65535\",\"name\":\"s11MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S10 MME IP\",\"filter\":\"0~64\",\"name\":\"s10MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.178\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S10 MME Port\",\"filter\":\"0~65535\",\"name\":\"s10MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGs MME IP\",\"filter\":\"0~64\",\"name\":\"sgsMmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"SGs MME Port\",\"filter\":\"0~65535\",\"name\":\"sgsMmePort\",\"type\":\"int\",\"value\":\"29118\"},{\"access\":\"read-write\",\"comment\":\"0~100\",\"display\":\"S6A MME Identity\",\"filter\":\"0~100\",\"name\":\"s6aIdentity\",\"type\":\"string\",\"value\":\"mme.epc.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~20\",\"display\":\"S6A MME IP\",\"filter\":\"0~20\",\"name\":\"localIp\",\"type\":\"string\",\"value\":\"172.16.5.220\"}]', 1, '', 1719831209702); -INSERT INTO `ne_config` VALUES (12, 'MME', 'gummei', 'Gummei List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Group ID\",\"filter\":\"0~65535\",\"name\":\"groupId\",\"type\":\"int\",\"value\":\"4\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Code\",\"filter\":\"0~255\",\"name\":\"code\",\"type\":\"int\",\"value\":\"1\"}]', 3, '', 1719831209759); -INSERT INTO `ne_config` VALUES (13, 'MME', 'tai', 'TAI List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1719831209792); -INSERT INTO `ne_config` VALUES (14, 'MME', 'hss', 'HSS List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{1,15}$\",\"display\":\"IMSI Prefix\",\"filter\":\"^[0-9]{1,15}$\",\"name\":\"imsiPre\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Hostname\",\"filter\":\"0~128\",\"name\":\"hssHostname\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"SCTP|TCP\",\"display\":\"Protocol\",\"filter\":\"0~8\",\"name\":\"protocol\",\"type\":\"string\",\"value\":\"SCTP\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"HSS Port\",\"filter\":\"0~65535\",\"name\":\"hssPort\",\"type\":\"int\",\"value\":\"3868\"}]', 7, '', 1719831209841); -INSERT INTO `ne_config` VALUES (15, 'MME', 'sgw', 'SGW List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGW IP\",\"filter\":\"0~64\",\"name\":\"sgwIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"}]', 9, '', 1719831209876); -INSERT INTO `ne_config` VALUES (16, 'MME', 'pgw', 'PGW List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"APN\",\"filter\":\"0~128\",\"name\":\"apn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"PGW IP\",\"filter\":\"0~64\",\"name\":\"pgwIp\",\"type\":\"string\",\"value\":\"192.168.1.181\"}]', 11, '', 1719831209927); -INSERT INTO `ne_config` VALUES (17, 'MME', 'amf', 'AMF List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~16777215\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"AMF IP\",\"filter\":\"0~64\",\"name\":\"amfIp\",\"type\":\"string\",\"value\":\"172.16.5.120\"}]', 13, '', 1719831209992); -INSERT INTO `ne_config` VALUES (18, 'MOCNGW', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP South Address\",\"filter\":\"0~64\",\"name\":\"s1apSouthAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP North Address\",\"filter\":\"0~64\",\"name\":\"s1apNorthAddr\",\"type\":\"string\",\"value\":\"192.168.8.163\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1048575\",\"display\":\"ENB ID\",\"filter\":\"0~1048575\",\"name\":\"enbId\",\"type\":\"int\",\"value\":\"24\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"userPlaneEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"}]', 1, '', 1719831210071); -INSERT INTO `ne_config` VALUES (19, 'MOCNGW', 'mme', 'MME List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP Address\",\"filter\":\"0~64\",\"name\":\"s1apAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S1AP Port\",\"filter\":\"0~65535\",\"name\":\"s1apPort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"}]', 3, '', 1719831210273); -INSERT INTO `ne_config` VALUES (20, 'MOCNGW', 'upgw', 'UPGW Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.1.159\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"PFCP Port\",\"filter\":\"0~65535\",\"name\":\"pfcpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U South Address\",\"filter\":\"0~64\",\"name\":\"gtpuSouthAddr\",\"type\":\"string\",\"value\":\"10.10.1.2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U North Address\",\"filter\":\"0~64\",\"name\":\"gtpuNorthAddr\",\"type\":\"string\",\"value\":\"192.168.7.123\"}]', 5, '', 1719831210320); -INSERT INTO `ne_config` VALUES (21, 'N3IWF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IKEBindAddress\",\"filter\":\"\",\"name\":\"ikeBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPBindAddress\",\"filter\":\"\",\"name\":\"gtpBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.161\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"n3iwf.5gc.mnc00.mcc460.pub.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"InternalIP\",\"filter\":\"\",\"name\":\"internalIP\",\"type\":\"string\",\"value\":\"172.16.1.190\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UdmIPAddrPort\",\"filter\":\"\",\"name\":\"udmAddr\",\"type\":\"string\",\"value\":\"172.16.1.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SmfIPAddress\",\"filter\":\"\",\"name\":\"smfIPAddr\",\"type\":\"string\",\"value\":\"172.16.1.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3IPAddress\",\"filter\":\"\",\"name\":\"n3IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6IPAddress\",\"filter\":\"\",\"name\":\"n6IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"}]', 1, '', 1719831210358); -INSERT INTO `ne_config` VALUES (22, 'NRF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.180\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, 'put', 1719831210397); -INSERT INTO `ne_config` VALUES (23, 'NRF', 'registeredNFs', 'Registered NFs', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF Type\",\"filter\":\"^.{1,128}$\",\"name\":\"nfType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Status\",\"filter\":\"^.{1,128}$\",\"name\":\"status\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"^.{1,128}$\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"^.{1,128}$\",\"name\":\"ipAddress\",\"type\":\"string\",\"value\":\"\"}]', 3, 'get', 1719831210443); -INSERT INTO `ne_config` VALUES (24, 'NSSF', 'general', 'General', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSSF Name\",\"filter\":\"\",\"name\":\"nssfName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"0\"}]', 1, '', 1719831210478); -INSERT INTO `ne_config` VALUES (25, 'NSSF', 'sbi', 'SBI', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"\",\"name\":\"scheme\",\"type\":\"string\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv4\",\"filter\":\"\",\"name\":\"registerIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv4\",\"filter\":\"\",\"name\":\"bindingIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv6\",\"filter\":\"\",\"name\":\"registerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv6\",\"filter\":\"\",\"name\":\"bindingIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"name\":\"port\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv4\",\"filter\":\"\",\"name\":\"telnetIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv6\",\"filter\":\"\",\"name\":\"telnetIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet Port\",\"filter\":\"\",\"name\":\"telnetPort\",\"type\":\"int\",\"value\":\"4100\"}]', 3, '', 1719831210567); -INSERT INTO `ne_config` VALUES (26, 'NSSF', 'supportedNetworkSliceList', 'Supported Network Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TAC\",\"filter\":\"\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SST\",\"filter\":\"\",\"name\":\"supportedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SD\",\"filter\":\"\",\"name\":\"supportedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SST\",\"filter\":\"\",\"name\":\"restrictedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SD\",\"filter\":\"\",\"name\":\"restrictedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF ID\",\"filter\":\"\",\"name\":\"nrfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSI ID\",\"filter\":\"\",\"name\":\"nsiId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Access Type\",\"filter\":\"\",\"name\":\"accessType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Set ID\",\"filter\":\"\",\"name\":\"amfSetId\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1719831210617); -INSERT INTO `ne_config` VALUES (27, 'NSSF', 'plmnMappingList', 'PLMN Mapping List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Operator Name\",\"filter\":\"\",\"name\":\"operatorName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"02\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SST\",\"filter\":\"\",\"name\":\"servingSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SD\",\"filter\":\"\",\"name\":\"servingSnssaiSd\",\"type\":\"string\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SST\",\"filter\":\"\",\"name\":\"homeSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SD\",\"filter\":\"\",\"name\":\"homeSnssaiSd\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1719831210699); -INSERT INTO `ne_config` VALUES (28, 'PCF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"}]', 1, '', 1719831210756); -INSERT INTO `ne_config` VALUES (29, 'PCF', 'serviceAreaRestriction', 'Service Area Restriction', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]', 3, '', 1719831210789); -INSERT INTO `ne_config` VALUES (30, 'PCF', 'pccRules', 'PCC Rules', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"0~255\",\"name\":\"precedence\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP ID\",\"filter\":\"^.{1,63}$\",\"name\":\"appId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Template\",\"filter\":\"^.{1,255}$\",\"name\":\"flowTemplate\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"trafficControlId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1719831210834); -INSERT INTO `ne_config` VALUES (31, 'PCF', 'sessionRules', 'Session Rules', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrDl\",\"type\":\"string\",\"value\":\"200Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrUl\",\"type\":\"string\",\"value\":\"100Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Averaging Window\",\"filter\":\"0~4095\",\"name\":\"averagingWindow\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Data Burst Volume\",\"filter\":\"0~4095\",\"name\":\"maxDataBurstVolume\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"}]', 7, '', 1719831210893); -INSERT INTO `ne_config` VALUES (32, 'PCF', 'gxServer', 'Gx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 9, '', 1719831210965); -INSERT INTO `ne_config` VALUES (33, 'PCF', 'rxServer', 'Rx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 11, '', 1719831211004); -INSERT INTO `ne_config` VALUES (34, 'PCF', 'flowTemplate', 'Flow Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"^.{1,127}$\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"permit out ip from any to assigned\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Direction\",\"filter\":\"{\\\"0\\\":\\\"Unspecified\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectional\\\"}\",\"name\":\"flowDirection\",\"type\":\"enum\",\"value\":\"0\"}]', 13, '', 1719831211185); -INSERT INTO `ne_config` VALUES (35, 'PCF', 'qosTemplate', 'QoS Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default QoS Flow Indication\",\"filter\":\"false;true;\",\"name\":\"defQosFlowIndication\",\"type\":\"bool\",\"value\":\"false\"}]', 15, '', 1719831211267); -INSERT INTO `ne_config` VALUES (36, 'PCF', 'usageMonitoringTemplate', 'Usage Monitoring Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"umId\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold(KB)\",\"filter\":\"\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"5242880\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Uplink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdUplink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Downlink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdDownlink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time Threshold\",\"filter\":\"\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Time\",\"filter\":\"\",\"name\":\"inactivityTime\",\"type\":\"int\",\"value\":\"0\"}]', 17, '', 1719831211321); -INSERT INTO `ne_config` VALUES (37, 'PCF', 'trafficControlTemplate', 'Traffic Control Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"tcId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Status\",\"filter\":\"{\\\"0\\\":\\\"Disable\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Enable\\\", \\\"4\\\":\\\"Remove\\\"}\",\"name\":\"flowStatus\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mute Notify\",\"filter\":\"false;true;\",\"name\":\"muteNotif\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Route to Location DNAI\",\"filter\":\"^.{1,63}$\",\"name\":\"dnai\",\"type\":\"string\",\"value\":\"\"}]', 19, '', 1719831211361); -INSERT INTO `ne_config` VALUES (38, 'PCF', 'headerEnrichTemplate', 'Header Enrich Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Type\",\"filter\":\"{\\\"0\\\":\\\"GPSI\\\", \\\"1\\\":\\\"SUPI\\\", \\\"2\\\":\\\"UE IP\\\", \\\"3\\\":\\\"User Location\\\", \\\"4\\\":\\\"DNN\\\"}\",\"name\":\"headerType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Name\",\"filter\":\"^.{1,63}$\",\"name\":\"headerName\",\"type\":\"string\",\"value\":\"\"}]', 21, '', 1719831211407); -INSERT INTO `ne_config` VALUES (39, 'SMF', 'smfSystem', 'SMF System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI IP\",\"filter\":\"\",\"name\":\"sbiIpAddr\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv4\",\"filter\":\"\",\"name\":\"n4Ipv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv6\",\"filter\":\"\",\"name\":\"n4Ipv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv4\",\"filter\":\"\",\"name\":\"n4UIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv6\",\"filter\":\"\",\"name\":\"n4UIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"\",\"name\":\"amfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.120:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF Enable\",\"filter\":\"\",\"name\":\"pcfEnable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"display\":\"5G Charging Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"chfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Primary URI\",\"filter\":\"\",\"name\":\"chfPrimaryUri\",\"type\":\"string\",\"value\":\"http://172.16.5.240:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Secondary URI\",\"filter\":\"\",\"name\":\"chfSecondaryUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv4\",\"filter\":\"\",\"name\":\"primaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"114.114.114.114\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv4\",\"filter\":\"\",\"name\":\"secondaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv6\",\"filter\":\"\",\"name\":\"primaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv6\",\"filter\":\"\",\"name\":\"secondaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv4\",\"filter\":\"\",\"name\":\"primaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv4\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv6\",\"filter\":\"\",\"name\":\"primaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv6\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE MTU\",\"filter\":\"0~65535\",\"name\":\"ueMtu\",\"type\":\"int\",\"value\":\"\"}]', 1, '', 1719831211449); -INSERT INTO `ne_config` VALUES (40, 'SMF', 'spgwSystem', 'SPGW Sytem Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local S11 IP\",\"filter\":\"\",\"name\":\"s11Ip\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter IP\",\"filter\":\"\",\"name\":\"localDiameterIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Host Name\",\"filter\":\"\",\"name\":\"localDiameterHostName\",\"type\":\"string\",\"value\":\"smf.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Realm Name\",\"filter\":\"\",\"name\":\"localDiameterRealmName\",\"type\":\"string\",\"value\":\"mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gy Enable\",\"filter\":\"false;true;\",\"name\":\"peerGyEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gy IP\",\"filter\":\"\",\"name\":\"primaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gy IP\",\"filter\":\"\",\"name\":\"secondaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Enable\",\"filter\":\"false;true;\",\"name\":\"peerGxEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Charging Enable\",\"filter\":\"false;true;\",\"name\":\"gxChargingEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gx IP\",\"filter\":\"\",\"name\":\"primaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gx IP\",\"filter\":\"\",\"name\":\"secondaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"}]', 3, '', 1719831211498); -INSERT INTO `ne_config` VALUES (41, 'SMF', 'upfConfig', 'UPF Config', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"id\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"e.g. ip:port\",\"display\":\"Address\",\"filter\":\"7~45\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"},{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"}],\"display\":\"UE DNN IP Pool\",\"name\":\"ueDnnIpPool\"}]', 5, '', 1719831211547); -INSERT INTO `ne_config` VALUES (42, 'SMF', 'dnnSelectUpf', 'DNN Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"\"}]', 7, '', 1719831211647); -INSERT INTO `ne_config` VALUES (43, 'SMF', 'dnnTaiSelectUpf', 'DNN TAI Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"MCC+MNC+TAC\",\"display\":\"TAI\",\"filter\":\"1~64\",\"name\":\"tai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf2-Id\"}]', 9, '', 1719831211733); -INSERT INTO `ne_config` VALUES (44, 'SMF', 'snssaiSelectUpf', 'SNSSAI Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"sst1-sd1;sst2-sd2;sst3-sd3\",\"display\":\"SNSSAI\",\"filter\":\"1~64\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"upf1-id;upf2-id;upf3-id\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf1-Id\"}]', 11, '', 1719831211854); -INSERT INTO `ne_config` VALUES (45, 'SMF', 'offlineChargingConfig', 'Offline Charging Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Name\",\"filter\":\"1~64\",\"name\":\"cdrFileName\",\"type\":\"string\",\"value\":\"smf.cdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Path\",\"filter\":\"1~256\",\"name\":\"cdrFilePath\",\"type\":\"string\",\"value\":\"/var/log/smfCdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Num\",\"filter\":\"1~999999999\",\"name\":\"cdrFileNum\",\"type\":\"int\",\"value\":\"50\"},{\"access\":\"read-write\",\"comment\":\"Megabytes\",\"display\":\"CDR File Size\",\"filter\":\"1~999999\",\"name\":\"cdrFileSize\",\"type\":\"int\",\"value\":\"300\"},{\"access\":\"read-write\",\"comment\":\"Days\",\"display\":\"CDR File Max Age\",\"filter\":\"0~9999\",\"name\":\"cdrFileMaxAge\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Free Subscribers CDR Enable\",\"filter\":\"\",\"name\":\"freeSubsCdrEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"Seconds\",\"display\":\"Time Threshold\",\"filter\":\"0~999999999\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"600\"},{\"access\":\"read-write\",\"comment\":\"Bytes\",\"display\":\"Volume Threshold\",\"filter\":\"0~999999999999999\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"0\"}]', 13, '', 1719831211901); -INSERT INTO `ne_config` VALUES (46, 'SMSC', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"}]', 1, '', 1719831212029); -INSERT INTO `ne_config` VALUES (47, 'SMSC', 'msisdnsegment', 'MSISDN Segment List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]', 3, 'put', 1719831212149); -INSERT INTO `ne_config` VALUES (48, 'SMSC', 'smpplink', 'SMPP Link List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]', 5, '', 1719831212227); -INSERT INTO `ne_config` VALUES (49, 'UDM', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.140\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF IP\",\"filter\":\"\",\"name\":\"ausfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"omc.com\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"0~4095\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Capacity\",\"filter\":\"0~65535\",\"name\":\"capacity\",\"type\":\"int\",\"value\":\"4096\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SUPI Ranges\",\"filter\":\"^imsi-\\\\d{15}~imsi-\\\\d{15}$\",\"name\":\"supiRanges\",\"type\":\"regex\",\"value\":\"imsi-001010100080000~imsi-001010100080099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GPSI Ranges\",\"filter\":\"^msisdn-\\\\d{2,15}~msisdn-\\\\d{2,15}$\",\"name\":\"gpsiRanges\",\"type\":\"regex\",\"value\":\"msisdn-69072000~msisdn-69072099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Link\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"redisLink\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Address\",\"filter\":\"\",\"name\":\"redisAddr\",\"type\":\"string\",\"value\":\"172.16.5.140:6379\"}]', 1, '', 1719831212399); -INSERT INTO `ne_config` VALUES (50, 'UDM', 'subsUEAmbr', 'Subs UE AMBR', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"uplink\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"downlink\",\"type\":\"regex\",\"value\":\"2 Gbps\"}]', 3, '', 1719831212494); -INSERT INTO `ne_config` VALUES (51, 'UDM', 'subsNssais', 'Subs NSSAIs', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Features\",\"filter\":\"^[0-9a-fA-F]{8}$\",\"name\":\"supportedFeatures\",\"type\":\"regex\",\"value\":\"00000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Single NSSAIs\",\"filter\":\"\",\"name\":\"defaultSingleNSSAIs\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Single NSSAIs\",\"filter\":\"\",\"name\":\"singleNssais\",\"type\":\"string\",\"value\":\"1-000002\"}]', 5, '', 1719831212590); -INSERT INTO `ne_config` VALUES (52, 'UDM', 'forbiddenAreas', 'Forbidden Areas', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"}]', 7, '', 1719831212718); -INSERT INTO `ne_config` VALUES (53, 'UDM', 'serviceAreaRestriction', 'Service Area Restriction', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]', 9, '', 1719831212824); -INSERT INTO `ne_config` VALUES (54, 'UDM', 'smfSelection', 'Subs SMF Selection', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SNSSAI\",\"filter\":\"^\\\\d{1,3}[A-Fa-f0-9]{6}$\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{1,32}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN Indicator\",\"filter\":\"false;true;\",\"name\":\"defaultDnnInd\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LBO Roaming Allowed\",\"filter\":\"false;true;\",\"name\":\"lboRoamingAllowed\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"false;true;\",\"name\":\"iwkEpsInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"false;true;\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"false\"}],\"comment\":\"\",\"display\":\"DNN List\",\"filter\":\"1~4\",\"name\":\"dnnList\",\"type\":\"int\",\"value\":\"1\"}]', 11, '', 1719831212979); -INSERT INTO `ne_config` VALUES (55, 'UDM', 'dnn', 'DNN Conf', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default PDU Session Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\"}\",\"name\":\"defaultPDUSessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed PDU Session Types\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\",\\\"5\\\":\\\"IPv4 \\u0026 IPv6\\\",\\\"6\\\":\\\"IPv4 \\u0026 IPv4v6\\\",\\\"7\\\":\\\"IPv6 \\u0026 IPv4v6\\\",\\\"8\\\":\\\"IPv4 \\u0026 IPv6 \\u0026 IPv4v6\\\"}\",\"name\":\"allowedPDUSessionTypes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"5qi\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"1~127\",\"name\":\"priorityLevel\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default SSC Mode\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\"}\",\"name\":\"defaultSSCmode\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed SSC Modes\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\",\\\"3\\\":\\\"SSC Mode1 \\u0026 SSC Mode2\\\",\\\"4\\\":\\\"SSC Mode1 \\u0026 SSC Mode3\\\",\\\"5\\\":\\\"SSC Mode2 \\u0026 SSC Mode3\\\",\\\"6\\\":\\\"SSC Mode1 \\u0026 SSC Mode2 \\u0026 SSC Mode3\\\"}\",\"name\":\"allowedSSCmodes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"\",\"name\":\"interworkingEPSIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristics\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristics\",\"type\":\"string\",\"value\":\"0001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrUL\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrDL\",\"type\":\"regex\",\"value\":\"2 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IP Address\",\"filter\":\"\",\"name\":\"staticIPAddress\",\"type\":\"ipv4\",\"value\":\"192.168.1.100\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Integrity\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneIntegrity\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Confidentiality\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneConfidentiality\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"0~255\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"}]', 13, '', 1719831213074); -INSERT INTO `ne_config` VALUES (56, 'UDM', 'epsTemplate', 'EPS User Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{0,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_eps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APN OI Replacement\",\"filter\":\"^.{0,31}$\",\"name\":\"apnOIReplacement\",\"type\":\"string\",\"value\":\"money\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RFSP\",\"filter\":\"\",\"name\":\"rfsp\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RAU TAU Timer\",\"filter\":\"\",\"name\":\"rauTauTimer\",\"type\":\"int\",\"value\":\"120\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]', 15, '', 1719831213203); -INSERT INTO `ne_config` VALUES (57, 'UDM', 'epsApn', 'EPS APN', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{0,127}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"IPv4 or IPv6\\\"}\",\"name\":\"pdnType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QCI\",\"filter\":\"1~255\",\"name\":\"qci\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority\",\"filter\":\"1~127\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"8\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Context Identifier\",\"filter\":\"\",\"name\":\"contextIdentifier\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"VPLMN Dynamic Address Allowed\",\"filter\":\"false;true;\",\"name\":\"vplmnDynamicAddressAllowed\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN GW Allocation Type\",\"filter\":\"{\\\"0\\\":\\\"Static\\\",\\\"1\\\":\\\"Dynamic\\\"}\",\"name\":\"pdnGWAllocationType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]', 17, '', 1719831213410); -INSERT INTO `ne_config` VALUES (58, 'UDM', 'applicationServer', 'Application Server', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AS Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Handling\",\"filter\":\"{\\\"0\\\":\\\"Session Continued\\\",\\\"1\\\":\\\"Session Terminated\\\"}\",\"name\":\"defaultHandling\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:192.168.8.26:7060\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Diameter Address\",\"filter\":\"^.{1,127}$\",\"name\":\"diameterAddress\",\"type\":\"string\",\"value\":\"mmtel.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rep Data Size Limit\",\"filter\":\"0~65535\",\"name\":\"repDataSizeLimit\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Request\",\"filter\":\"false;true;\",\"name\":\"includeRegisterRequest\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Response\",\"filter\":\"false;true;\",\"name\":\"includeRegisterResponse\",\"type\":\"bool\",\"value\":\"false\"}]', 19, '', 1719831213536); -INSERT INTO `ne_config` VALUES (59, 'UDM', 'scscfSet', 'SCSCF Set', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:scscf.ims.mnc001.mcc001.3gppnetwork.org:6060\"}]', 21, '', 1719831213732); -INSERT INTO `ne_config` VALUES (60, 'UDM', 'triggerPoint', 'Trigger Point', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Type CNF\",\"filter\":\"0~1\",\"name\":\"conditionTypeCNF\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Negated\",\"filter\":\"0~1\",\"name\":\"conditionNegated\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group\",\"filter\":\"0~4096\",\"name\":\"group\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"^.{0,32}$\",\"name\":\"method\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Header\",\"filter\":\"^.{0,64}$\",\"name\":\"sipHeader\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Content\",\"filter\":\"^.{0,64}$\",\"name\":\"sipContent\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"SPT List\",\"filter\":\"1~4\",\"name\":\"sptList\",\"type\":\"int\",\"value\":\"1\"}]', 23, '', 1719831213924); -INSERT INTO `ne_config` VALUES (61, 'UDM', 's6aServer', 'S6a Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 25, '', 1719831214313); -INSERT INTO `ne_config` VALUES (62, 'UDM', 'cxServer', 'Cx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 27, '', 1719831214393); -INSERT INTO `ne_config` VALUES (63, 'UPF', 'general', 'General', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Config File Directory\",\"filter\":\"\",\"name\":\"configFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/etc/upf/\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EXE File Directory\",\"filter\":\"\",\"name\":\"exeFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/bin/\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~8\",\"display\":\"Data Forwarder Number\",\"filter\":\"1~8\",\"name\":\"dataForwarderNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Common Statistic Interval\",\"filter\":\"\",\"name\":\"commonStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Statistic Interval\",\"filter\":\"\",\"name\":\"userStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N3 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN3OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N6 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN6OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Checksum Offload\",\"filter\":\"0~255\",\"name\":\"checksumOffload\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Downlink Buffer Num\",\"filter\":\"\",\"name\":\"maxDownlinkBufferNum\",\"type\":\"int\",\"value\":\"50\"}]', 1, '', 1721705770725); -INSERT INTO `ne_config` VALUES (64, 'UPF', 'logger', 'Logger', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log File Full Path\",\"filter\":\"\",\"name\":\"logFileFullPath\",\"type\":\"string\",\"value\":\"/var/log/upf.log\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Upfd Log Level\",\"filter\":\"\",\"name\":\"upfdLogLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Upfd Log Transfer\",\"filter\":\"\",\"name\":\"upfdLogTransfer\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Report Caller\",\"filter\":\"\",\"name\":\"reportCaller\",\"type\":\"bool\",\"value\":\"false\"}]', 3, '', 1721705772689); -INSERT INTO `ne_config` VALUES (65, 'UPF', 'pfcp', 'PFCP', 'list', '[{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local UDP Port\",\"filter\":\"1~65535\",\"name\":\"localUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv4\",\"filter\":\"\",\"name\":\"smfIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv6\",\"filter\":\"\",\"name\":\"smfIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"SMF UDP Port\",\"filter\":\"1~65535\",\"name\":\"smfUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Retry Interval\",\"filter\":\"1~255\",\"name\":\"retryInterval\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Max Retry\",\"filter\":\"0~255\",\"name\":\"maxRetry\",\"type\":\"int\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Heartbeat Interval\",\"filter\":\"1~255\",\"name\":\"heartbeatInterval\",\"type\":\"int\",\"value\":\"15\"}]', 5, '', 1721705772791); -INSERT INTO `ne_config` VALUES (66, 'UPF', 'telnet', 'Telnet', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local Port\",\"filter\":\"1~65535\",\"name\":\"localPort\",\"type\":\"int\",\"value\":\"4100\"}]', 7, '', 1721705772939); -INSERT INTO `ne_config` VALUES (67, 'UPF', 'redisDb', 'Redis DB', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"tcp|udp\",\"display\":\"Net Type\",\"filter\":\"\",\"name\":\"netType\",\"type\":\"string\",\"value\":\"tcp\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Address\",\"filter\":\"\",\"name\":\"serverAddr\",\"type\":\"string\",\"value\":\"0.0.0.0:0\"}]', 9, '', 1721705773069); -INSERT INTO `ne_config` VALUES (68, 'UPF', 'dataForwarderCommon', 'Data Forwarder Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"upfd|tun\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"string\",\"value\":\"upfd\"},{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Instance ID\",\"filter\":\"1~8\",\"name\":\"instanceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Main CPU\",\"filter\":\"1~255\",\"name\":\"mainCpu\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"2,3,4,5 or 2-5\",\"display\":\"CPU Workers\",\"filter\":\"\",\"name\":\"cpuWorkers\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"data forwarder already run or not\",\"display\":\"Is Run\",\"filter\":\"0~1\",\"name\":\"isRun\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Hot Standby work or not\",\"display\":\"Is Hot Standby\",\"filter\":\"0~1\",\"name\":\"isHotStandby\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The value from which TEID is allocated\",\"display\":\"TEID Start\",\"filter\":\"\",\"name\":\"teidStart\",\"type\":\"int\",\"value\":\"16777216\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Heartbeat Interval\",\"filter\":\"\",\"name\":\"n3HeartbeatInterval\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX TX Queue Num\",\"filter\":\"\",\"name\":\"rxTxQueueNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"data rx\\u0026tx use C socket\",\"display\":\"Use Socket\",\"filter\":\"0~1\",\"name\":\"useSocket\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable 5G ethernet LAN\",\"display\":\"Enable Tap\",\"filter\":\"0~1\",\"name\":\"enableTap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable PFCP Qer Control\",\"display\":\"Enable Qer\",\"filter\":\"0~1\",\"name\":\"enableQer\",\"type\":\"int\",\"value\":\"0\"}]', 11, '', 1721705773160); -INSERT INTO `ne_config` VALUES (69, 'UPF', 'dataForwarderUpfd', 'Data Forwarder Upfd', 'list', '[{\"access\":\"read-write\",\"comment\":\"Currently only support vfio-pci\",\"display\":\"UIO Driver\",\"filter\":\"\",\"name\":\"uioDriver\",\"type\":\"string\",\"value\":\"vfio-pci\"},{\"access\":\"read-write\",\"comment\":\"The format must be IP:Port\",\"display\":\"Telnet Address IP:Port\",\"filter\":\"\",\"name\":\"commandlineListen\",\"type\":\"string\",\"value\":\"localhost:5002\"},{\"access\":\"read-write\",\"comment\":\"the unit is GB\",\"display\":\"Heap Size GB\",\"filter\":\"1~8\",\"name\":\"heapSizeGB\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"the unit is MB\",\"display\":\"State Seg Size MB\",\"filter\":\"64~512\",\"name\":\"stateSegSizeMB\",\"type\":\"int\",\"value\":\"256\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK No PCI\",\"filter\":\"0~1\",\"name\":\"dpdkNoPci\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mem Channel Num\",\"filter\":\"0~128\",\"name\":\"memChannelNum\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Base Va\",\"filter\":\"\",\"name\":\"sessionBaseVa\",\"type\":\"string\",\"value\":\"0x2000000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Buffers Per Numa\",\"filter\":\"\",\"name\":\"buffersPerNuma\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 RSS Hash\",\"filter\":\"\",\"name\":\"n3RssHash\",\"type\":\"string\",\"value\":\"\"}]', 13, '', 1721705774027); -INSERT INTO `ne_config` VALUES (70, 'UPF', 'dataInterfaceList', 'Data Interface List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"N3|N6|N9|N19\",\"display\":\"Interface Type\",\"filter\":\"\",\"name\":\"interfaceType\",\"type\":\"string\",\"value\":\"N3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface ID\",\"filter\":\"1~32\",\"name\":\"interfaceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"host|vmxnet3|dpdk|socket|uds\",\"display\":\"Driver Type\",\"filter\":\"\",\"name\":\"driverType\",\"type\":\"string\",\"value\":\"host\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"IPv4\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"IPv4 Address List\",\"filter\":\"0~8\",\"name\":\"ipv4AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"IPv6 Address List\",\"filter\":\"0~8\",\"name\":\"ipv6AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MAC Address\",\"filter\":\"\",\"name\":\"macAddr\",\"type\":\"string\",\"value\":\"00:00:00:00:00:00\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface PCI\",\"filter\":\"\",\"name\":\"interfacePCI\",\"type\":\"string\",\"value\":\"0000:00:00.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Network Card Name\",\"filter\":\"\",\"name\":\"systemNetworkCardName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"null|bak|sub|xor|round|lacp\",\"display\":\"Bond Type\",\"filter\":\"\",\"name\":\"bondType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Bond ID\",\"filter\":\"0~32\",\"name\":\"bondId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD TX Interval Ms\",\"filter\":\"\",\"name\":\"bfdTxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD RX Interval Ms\",\"filter\":\"\",\"name\":\"bfdRxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"default\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv4\",\"filter\":\"\",\"name\":\"bfdGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv6\",\"filter\":\"\",\"name\":\"bfdGatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MTU\",\"filter\":\"0~65535\",\"name\":\"mtu\",\"type\":\"int\",\"value\":\"1500\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Src Port\",\"filter\":\"1~65535\",\"name\":\"udpSrcPort\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Listen Port\",\"filter\":\"0~65536\",\"name\":\"udpListenPort\",\"type\":\"int\",\"value\":\"2152\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Local File Full Path\",\"filter\":\"\",\"name\":\"udsLocalFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Remote File Full Path\",\"filter\":\"\",\"name\":\"udsRemoteFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Detection Type\",\"filter\":\"0~1\",\"name\":\"linkDetectionType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NAT Interface ID\",\"filter\":\"0~1\",\"name\":\"natInterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv4 Pool List\",\"filter\":\"1~32\",\"name\":\"gtpuRemoteIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"gtpuRemoteIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPU Signaling Handle\",\"filter\":\"0~1\",\"name\":\"gtpuSignalingHandle\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMS Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"imsDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"dataDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inner DSCP Value Map\",\"filter\":\"0~1\",\"name\":\"innerDSCPValueMap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Support Speed Mbps\",\"filter\":\"0~65536\",\"name\":\"maxSupportSpeedMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkRxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkTxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkRxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkTxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK Workers\",\"filter\":\"\",\"name\":\"dpdkworkers\",\"type\":\"string\",\"value\":\"\"}]', 15, '', 1721705774222); -INSERT INTO `ne_config` VALUES (71, 'UPF', 'networkControlCommon', 'Network Control Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Disabled\",\"filter\":\"0~1\",\"name\":\"localSwitchDisabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TCP Sync Per Second\",\"filter\":\"\",\"name\":\"maxTCPSyncPerSecond\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF Max Support Mbps\",\"filter\":\"\",\"name\":\"upfMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dscp Inner Mapping\",\"filter\":\"\",\"name\":\"dscpInnerMapping\",\"type\":\"int\",\"value\":\"0\"}]', 17, '', 1721705774271); -INSERT INTO `ne_config` VALUES (72, 'UPF', 'networkControlDnnList', 'Network Control DNN List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Header Enrich Info List\",\"filter\":\"0~32\",\"name\":\"headerEnrichInfoList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Check\",\"filter\":\"0~1\",\"name\":\"localSwitchCheck\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"UE IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"UE IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"Dst Server IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"Dst Server IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"Gateway IP Type\",\"filter\":\"\",\"name\":\"gatewayIpType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv4\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv6\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv6\",\"type\":\"string\",\"value\":\"\"}]', 19, '', 1721705774430); -INSERT INTO `ne_config` VALUES (73, 'UPF', 'networkControlSnssaiList', 'Network Control SNSSAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"0\"}]', 21, '', 1721705774453); -INSERT INTO `ne_config` VALUES (74, 'UPF', 'networkControlAclWhiteList', 'Network Control ACL White List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]', 23, '', 1721705774471); -INSERT INTO `ne_config` VALUES (75, 'UPF', 'networkControlAclBlackList', 'Network Control ACL Black List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]', 25, '', 1721705774488); -INSERT INTO `ne_config` VALUES (76, 'UPF', 'networkControlDnsServerList', 'Network Control DNS Server List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1\",\"display\":\"Enabled\",\"filter\":\"0~1\",\"name\":\"enabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNS Name\",\"filter\":\"\",\"name\":\"dnsName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv4\",\"filter\":\"\",\"name\":\"serverIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6\",\"filter\":\"\",\"name\":\"serverIpv6\",\"type\":\"string\",\"value\":\"\"}]', 27, '', 1721705774492); -INSERT INTO `ne_config` VALUES (77, 'UPF', 'dpiCommon', 'DPI Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Detect Packet Num\",\"filter\":\"\",\"name\":\"maxDetectPacketNum\",\"type\":\"int\",\"value\":\"20\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"}]', 29, '', 1721705774496); -INSERT INTO `ne_config` VALUES (78, 'UPF', 'dpiHeaderEnrichInfoList', 'DPI Header Enrich Info List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}]', 31, '', 1721705774501); -INSERT INTO `ne_config` VALUES (79, 'UPF', 'dpiAppList', 'DPI APP List', 'array', '[{\"access\":\"read-write\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP Name\",\"filter\":\"\",\"name\":\"appName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Proxy Enabled\",\"filter\":\"0~1\",\"name\":\"proxyEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Force Check Type\",\"filter\":\"0~1\",\"name\":\"forceCheckType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"\",\"name\":\"ruleId\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"REGEX Match\",\"filter\":\"\",\"name\":\"regexMatch\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Custom Name\",\"filter\":\"\",\"name\":\"customName\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Rule List\",\"filter\":\"0~32\",\"name\":\"ruleList\",\"type\":\"int\",\"value\":\"1\"}]', 33, '', 1721705774505); +-- 更新 MME 配置 20240906 +INSERT INTO `ne_config` VALUES (60, 'MME', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"CSFB Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"VoLTE Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"volteEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S1 MME IP\",\"filter\":\"0~64\",\"name\":\"s1MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"S1 MME Port\",\"filter\":\"0~65535\",\"name\":\"s1MmePort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S11 MME IP\",\"filter\":\"0~64\",\"name\":\"s11MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S11 MME Port\",\"filter\":\"0~65535\",\"name\":\"s11MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S10 MME IP\",\"filter\":\"0~64\",\"name\":\"s10MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.178\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S10 MME Port\",\"filter\":\"0~65535\",\"name\":\"s10MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGs MME IP\",\"filter\":\"0~64\",\"name\":\"sgsMmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"SGs MME Port\",\"filter\":\"0~65535\",\"name\":\"sgsMmePort\",\"type\":\"int\",\"value\":\"29118\"},{\"access\":\"read-write\",\"comment\":\"0~100\",\"display\":\"S6A MME Identity\",\"filter\":\"0~100\",\"name\":\"s6aIdentity\",\"type\":\"string\",\"value\":\"mme.epc.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~20\",\"display\":\"S6A MME IP\",\"filter\":\"0~20\",\"name\":\"localIp\",\"type\":\"string\",\"value\":\"172.16.5.220\"}]', 1, '', 1725610815287); +INSERT INTO `ne_config` VALUES (61, 'MME', 'gummei', 'Gummei List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Group ID\",\"filter\":\"0~65535\",\"name\":\"groupId\",\"type\":\"int\",\"value\":\"4\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Code\",\"filter\":\"0~255\",\"name\":\"code\",\"type\":\"int\",\"value\":\"1\"}]', 3, '', 1725610815301); +INSERT INTO `ne_config` VALUES (62, 'MME', 'tai', 'TAI List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1725610815306); +INSERT INTO `ne_config` VALUES (63, 'MME', 'hss', 'HSS List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{1,15}$\",\"display\":\"IMSI Prefix\",\"filter\":\"^[0-9]{1,15}$\",\"name\":\"imsiPre\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Hostname\",\"filter\":\"0~128\",\"name\":\"hssHostname\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Realm\",\"filter\":\"0~128\",\"name\":\"hssRealm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"SCTP|TCP\",\"display\":\"Protocol\",\"filter\":\"0~8\",\"name\":\"protocol\",\"type\":\"string\",\"value\":\"SCTP\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"HSS Port\",\"filter\":\"0~65535\",\"name\":\"hssPort\",\"type\":\"int\",\"value\":\"3868\"}]', 7, '', 1725610815311); +INSERT INTO `ne_config` VALUES (64, 'MME', 'sgw', 'SGW List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGW IP\",\"filter\":\"0~64\",\"name\":\"sgwIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"}]', 9, '', 1725610815316); +INSERT INTO `ne_config` VALUES (65, 'MME', 'pgw', 'PGW List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"APN\",\"filter\":\"0~128\",\"name\":\"apn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"PGW IP\",\"filter\":\"0~64\",\"name\":\"pgwIp\",\"type\":\"string\",\"value\":\"192.168.1.181\"}]', 11, '', 1725610815320); +INSERT INTO `ne_config` VALUES (66, 'MME', 'amf', 'AMF List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~16777215\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"AMF IP\",\"filter\":\"0~64\",\"name\":\"amfIp\",\"type\":\"string\",\"value\":\"172.16.5.120\"}]', 13, '', 1725610815323); + +INSERT INTO `ne_config` VALUES (80, 'MOCNGW', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP South Address\",\"filter\":\"0~64\",\"name\":\"s1apSouthAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP North Address\",\"filter\":\"0~64\",\"name\":\"s1apNorthAddr\",\"type\":\"string\",\"value\":\"192.168.8.163\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1048575\",\"display\":\"ENB ID\",\"filter\":\"0~1048575\",\"name\":\"enbId\",\"type\":\"int\",\"value\":\"24\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"userPlaneEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"}]', 1, '', 1719831210071); +INSERT INTO `ne_config` VALUES (81, 'MOCNGW', 'mme', 'MME List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP Address\",\"filter\":\"0~64\",\"name\":\"s1apAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S1AP Port\",\"filter\":\"0~65535\",\"name\":\"s1apPort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"}]', 3, '', 1719831210273); +INSERT INTO `ne_config` VALUES (82, 'MOCNGW', 'upgw', 'UPGW Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.1.159\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"PFCP Port\",\"filter\":\"0~65535\",\"name\":\"pfcpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U South Address\",\"filter\":\"0~64\",\"name\":\"gtpuSouthAddr\",\"type\":\"string\",\"value\":\"10.10.1.2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U North Address\",\"filter\":\"0~64\",\"name\":\"gtpuNorthAddr\",\"type\":\"string\",\"value\":\"192.168.7.123\"}]', 5, '', 1719831210320); + +INSERT INTO `ne_config` VALUES (100, 'N3IWF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IKEBindAddress\",\"filter\":\"\",\"name\":\"ikeBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPBindAddress\",\"filter\":\"\",\"name\":\"gtpBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.161\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"n3iwf.5gc.mnc00.mcc460.pub.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"InternalIP\",\"filter\":\"\",\"name\":\"internalIP\",\"type\":\"string\",\"value\":\"172.16.1.190\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UdmIPAddrPort\",\"filter\":\"\",\"name\":\"udmAddr\",\"type\":\"string\",\"value\":\"172.16.1.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SmfIPAddress\",\"filter\":\"\",\"name\":\"smfIPAddr\",\"type\":\"string\",\"value\":\"172.16.1.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3IPAddress\",\"filter\":\"\",\"name\":\"n3IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6IPAddress\",\"filter\":\"\",\"name\":\"n6IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"}]', 1, '', 1719831210358); + +INSERT INTO `ne_config` VALUES (120, 'NRF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.180\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, 'put', 1719831210397); +INSERT INTO `ne_config` VALUES (121, 'NRF', 'registeredNFs', 'Registered NFs', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF Type\",\"filter\":\"^.{1,128}$\",\"name\":\"nfType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Status\",\"filter\":\"^.{1,128}$\",\"name\":\"status\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"^.{1,128}$\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"^.{1,128}$\",\"name\":\"ipAddress\",\"type\":\"string\",\"value\":\"\"}]', 3, 'get', 1719831210443); + +INSERT INTO `ne_config` VALUES (140, 'NSSF', 'general', 'General', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSSF Name\",\"filter\":\"\",\"name\":\"nssfName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"0\"}]', 1, '', 1719831210478); +INSERT INTO `ne_config` VALUES (141, 'NSSF', 'sbi', 'SBI', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"\",\"name\":\"scheme\",\"type\":\"string\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv4\",\"filter\":\"\",\"name\":\"registerIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv4\",\"filter\":\"\",\"name\":\"bindingIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv6\",\"filter\":\"\",\"name\":\"registerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv6\",\"filter\":\"\",\"name\":\"bindingIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"name\":\"port\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv4\",\"filter\":\"\",\"name\":\"telnetIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv6\",\"filter\":\"\",\"name\":\"telnetIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet Port\",\"filter\":\"\",\"name\":\"telnetPort\",\"type\":\"int\",\"value\":\"4100\"}]', 3, '', 1719831210567); +INSERT INTO `ne_config` VALUES (142, 'NSSF', 'supportedNetworkSliceList', 'Supported Network Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TAC\",\"filter\":\"\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SST\",\"filter\":\"\",\"name\":\"supportedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SD\",\"filter\":\"\",\"name\":\"supportedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SST\",\"filter\":\"\",\"name\":\"restrictedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SD\",\"filter\":\"\",\"name\":\"restrictedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF ID\",\"filter\":\"\",\"name\":\"nrfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSI ID\",\"filter\":\"\",\"name\":\"nsiId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Access Type\",\"filter\":\"\",\"name\":\"accessType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Set ID\",\"filter\":\"\",\"name\":\"amfSetId\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1719831210617); +INSERT INTO `ne_config` VALUES (143, 'NSSF', 'plmnMappingList', 'PLMN Mapping List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Operator Name\",\"filter\":\"\",\"name\":\"operatorName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"02\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SST\",\"filter\":\"\",\"name\":\"servingSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SD\",\"filter\":\"\",\"name\":\"servingSnssaiSd\",\"type\":\"string\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SST\",\"filter\":\"\",\"name\":\"homeSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SD\",\"filter\":\"\",\"name\":\"homeSnssaiSd\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1719831210699); + +INSERT INTO `ne_config` VALUES (160, 'PCF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"}]', 1, '', 1719831210756); +INSERT INTO `ne_config` VALUES (161, 'PCF', 'serviceAreaRestriction', 'Service Area Restriction', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]', 3, '', 1719831210789); +INSERT INTO `ne_config` VALUES (162, 'PCF', 'pccRules', 'PCC Rules', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"0~255\",\"name\":\"precedence\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP ID\",\"filter\":\"^.{1,63}$\",\"name\":\"appId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Template\",\"filter\":\"^.{1,255}$\",\"name\":\"flowTemplate\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"trafficControlId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1719831210834); +INSERT INTO `ne_config` VALUES (163, 'PCF', 'sessionRules', 'Session Rules', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrDl\",\"type\":\"string\",\"value\":\"200Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrUl\",\"type\":\"string\",\"value\":\"100Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Averaging Window\",\"filter\":\"0~4095\",\"name\":\"averagingWindow\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Data Burst Volume\",\"filter\":\"0~4095\",\"name\":\"maxDataBurstVolume\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"}]', 7, '', 1719831210893); +INSERT INTO `ne_config` VALUES (164, 'PCF', 'gxServer', 'Gx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 9, '', 1719831210965); +INSERT INTO `ne_config` VALUES (165, 'PCF', 'rxServer', 'Rx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 11, '', 1719831211004); +INSERT INTO `ne_config` VALUES (166, 'PCF', 'flowTemplate', 'Flow Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"^.{1,127}$\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"permit out ip from any to assigned\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Direction\",\"filter\":\"{\\\"0\\\":\\\"Unspecified\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectional\\\"}\",\"name\":\"flowDirection\",\"type\":\"enum\",\"value\":\"0\"}]', 13, '', 1719831211185); +INSERT INTO `ne_config` VALUES (167, 'PCF', 'qosTemplate', 'QoS Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default QoS Flow Indication\",\"filter\":\"false;true;\",\"name\":\"defQosFlowIndication\",\"type\":\"bool\",\"value\":\"false\"}]', 15, '', 1719831211267); +INSERT INTO `ne_config` VALUES (168, 'PCF', 'usageMonitoringTemplate', 'Usage Monitoring Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"umId\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold(KB)\",\"filter\":\"\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"5242880\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Uplink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdUplink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Downlink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdDownlink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time Threshold\",\"filter\":\"\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Time\",\"filter\":\"\",\"name\":\"inactivityTime\",\"type\":\"int\",\"value\":\"0\"}]', 17, '', 1719831211321); +INSERT INTO `ne_config` VALUES (169, 'PCF', 'trafficControlTemplate', 'Traffic Control Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"tcId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Status\",\"filter\":\"{\\\"0\\\":\\\"Disable\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Enable\\\", \\\"4\\\":\\\"Remove\\\"}\",\"name\":\"flowStatus\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mute Notify\",\"filter\":\"false;true;\",\"name\":\"muteNotif\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Route to Location DNAI\",\"filter\":\"^.{1,63}$\",\"name\":\"dnai\",\"type\":\"string\",\"value\":\"\"}]', 19, '', 1719831211361); +INSERT INTO `ne_config` VALUES (170, 'PCF', 'headerEnrichTemplate', 'Header Enrich Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Type\",\"filter\":\"{\\\"0\\\":\\\"GPSI\\\", \\\"1\\\":\\\"SUPI\\\", \\\"2\\\":\\\"UE IP\\\", \\\"3\\\":\\\"User Location\\\", \\\"4\\\":\\\"DNN\\\"}\",\"name\":\"headerType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Name\",\"filter\":\"^.{1,63}$\",\"name\":\"headerName\",\"type\":\"string\",\"value\":\"\"}]', 21, '', 1719831211407); + +-- 更新 SMF 配置 20241031 +INSERT INTO `ne_config` VALUES (180, 'SMF', 'smfSystem', 'SMF System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI IP\",\"filter\":\"\",\"name\":\"sbiIpAddr\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv4\",\"filter\":\"\",\"name\":\"n4Ipv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv6\",\"filter\":\"\",\"name\":\"n4Ipv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv4\",\"filter\":\"\",\"name\":\"n4UIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv6\",\"filter\":\"\",\"name\":\"n4UIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"\",\"name\":\"amfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.120:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF Enable\",\"filter\":\"\",\"name\":\"pcfEnable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"URI1;URI2\",\"display\":\"PCF URI\",\"filter\":\"\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"URI1;URI2\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"display\":\"5G Charging Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"chfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Primary URI\",\"filter\":\"\",\"name\":\"chfPrimaryUri\",\"type\":\"string\",\"value\":\"http://172.16.5.240:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Secondary URI\",\"filter\":\"\",\"name\":\"chfSecondaryUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv4\",\"filter\":\"\",\"name\":\"primaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"114.114.114.114\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv4\",\"filter\":\"\",\"name\":\"secondaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv6\",\"filter\":\"\",\"name\":\"primaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv6\",\"filter\":\"\",\"name\":\"secondaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv4\",\"filter\":\"\",\"name\":\"primaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv4\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv6\",\"filter\":\"\",\"name\":\"primaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv6\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE MTU\",\"filter\":\"0~65535\",\"name\":\"ueMtu\",\"type\":\"int\",\"value\":\"\"}]', 1, '', 1730342812514); +INSERT INTO `ne_config` VALUES (181, 'SMF', 'spgwSystem', 'SPGW Sytem Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local S11 IP\",\"filter\":\"\",\"name\":\"s11Ip\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter IP\",\"filter\":\"\",\"name\":\"localDiameterIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Host Name\",\"filter\":\"\",\"name\":\"localDiameterHostName\",\"type\":\"string\",\"value\":\"smf.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Realm Name\",\"filter\":\"\",\"name\":\"localDiameterRealmName\",\"type\":\"string\",\"value\":\"mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gy Enable\",\"filter\":\"false;true;\",\"name\":\"peerGyEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gy IP\",\"filter\":\"\",\"name\":\"primaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gy IP\",\"filter\":\"\",\"name\":\"secondaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Enable\",\"filter\":\"false;true;\",\"name\":\"peerGxEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Charging Enable\",\"filter\":\"false;true;\",\"name\":\"gxChargingEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gx IP\",\"filter\":\"\",\"name\":\"primaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gx IP\",\"filter\":\"\",\"name\":\"secondaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"}]', 3, '', 1730342812526); +INSERT INTO `ne_config` VALUES (182, 'SMF', 'upfConfig', 'UPF Config', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"id\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"e.g. ip:port\",\"display\":\"Address\",\"filter\":\"7~45\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"},{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"}],\"display\":\"UE DNN IP Pool\",\"name\":\"ueDnnIpPool\"}]', 5, '', 1730342812529); +INSERT INTO `ne_config` VALUES (183, 'SMF', 'dnnSelectUpf', 'DNN Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"\"}]', 7, '', 1730342812533); +INSERT INTO `ne_config` VALUES (184, 'SMF', 'dnnTaiSelectUpf', 'DNN TAI Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"MCC+MNC+TAC\",\"display\":\"TAI\",\"filter\":\"1~64\",\"name\":\"tai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf2-Id\"}]', 9, '', 1730342812536); +INSERT INTO `ne_config` VALUES (185, 'SMF', 'snssaiSelectUpf', 'SNSSAI Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"sst1-sd1;sst2-sd2;sst3-sd3\",\"display\":\"SNSSAI\",\"filter\":\"1~64\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"upf1-id;upf2-id;upf3-id\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf1-Id\"}]', 11, '', 1730342812539); +INSERT INTO `ne_config` VALUES (186, 'SMF', 'offlineChargingConfig', 'Offline Charging Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Name\",\"filter\":\"1~64\",\"name\":\"cdrFileName\",\"type\":\"string\",\"value\":\"smf.cdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Path\",\"filter\":\"1~256\",\"name\":\"cdrFilePath\",\"type\":\"string\",\"value\":\"/var/log/smfCdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Num\",\"filter\":\"1~999999999\",\"name\":\"cdrFileNum\",\"type\":\"int\",\"value\":\"50\"},{\"access\":\"read-write\",\"comment\":\"Megabytes\",\"display\":\"CDR File Size\",\"filter\":\"1~999999\",\"name\":\"cdrFileSize\",\"type\":\"int\",\"value\":\"300\"},{\"access\":\"read-write\",\"comment\":\"Days\",\"display\":\"CDR File Max Age\",\"filter\":\"0~9999\",\"name\":\"cdrFileMaxAge\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Free Subscribers CDR Enable\",\"filter\":\"\",\"name\":\"freeSubsCdrEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"Seconds\",\"display\":\"Time Threshold\",\"filter\":\"0~999999999\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"600\"},{\"access\":\"read-write\",\"comment\":\"Bytes\",\"display\":\"Volume Threshold\",\"filter\":\"0~999999999999999\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"0\"}]', 13, '', 1730342812542); + +INSERT INTO `ne_config` VALUES (200, 'UDM', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.140\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF IP\",\"filter\":\"\",\"name\":\"ausfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"omc.com\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"0~4095\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Capacity\",\"filter\":\"0~65535\",\"name\":\"capacity\",\"type\":\"int\",\"value\":\"4096\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SUPI Ranges\",\"filter\":\"^imsi-\\\\d{15}~imsi-\\\\d{15}$\",\"name\":\"supiRanges\",\"type\":\"regex\",\"value\":\"imsi-001010100080000~imsi-001010100080099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GPSI Ranges\",\"filter\":\"^msisdn-\\\\d{2,15}~msisdn-\\\\d{2,15}$\",\"name\":\"gpsiRanges\",\"type\":\"regex\",\"value\":\"msisdn-69072000~msisdn-69072099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Link\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"redisLink\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Address\",\"filter\":\"\",\"name\":\"redisAddr\",\"type\":\"string\",\"value\":\"172.16.5.140:6379\"}]', 1, '', 1719831212399); +INSERT INTO `ne_config` VALUES (201, 'UDM', 'subsUEAmbr', 'Subs UE AMBR', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"uplink\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"downlink\",\"type\":\"regex\",\"value\":\"2 Gbps\"}]', 3, '', 1719831212494); +INSERT INTO `ne_config` VALUES (202, 'UDM', 'subsNssais', 'Subs NSSAIs', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Features\",\"filter\":\"^[0-9a-fA-F]{8}$\",\"name\":\"supportedFeatures\",\"type\":\"regex\",\"value\":\"00000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Single NSSAIs\",\"filter\":\"\",\"name\":\"defaultSingleNSSAIs\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Single NSSAIs\",\"filter\":\"\",\"name\":\"singleNssais\",\"type\":\"string\",\"value\":\"1-000002\"}]', 5, '', 1719831212590); +INSERT INTO `ne_config` VALUES (203, 'UDM', 'forbiddenAreas', 'Forbidden Areas', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"}]', 7, '', 1719831212718); +INSERT INTO `ne_config` VALUES (204, 'UDM', 'serviceAreaRestriction', 'Service Area Restriction', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]', 9, '', 1719831212824); +INSERT INTO `ne_config` VALUES (205, 'UDM', 'smfSelection', 'Subs SMF Selection', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SNSSAI\",\"filter\":\"^\\\\d{1,3}[A-Fa-f0-9]{6}$\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{1,32}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN Indicator\",\"filter\":\"false;true;\",\"name\":\"defaultDnnInd\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LBO Roaming Allowed\",\"filter\":\"false;true;\",\"name\":\"lboRoamingAllowed\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"false;true;\",\"name\":\"iwkEpsInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"false;true;\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"false\"}],\"comment\":\"\",\"display\":\"DNN List\",\"filter\":\"1~4\",\"name\":\"dnnList\",\"type\":\"int\",\"value\":\"1\"}]', 11, '', 1719831212979); +INSERT INTO `ne_config` VALUES (206, 'UDM', 'dnn', 'DNN Conf', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default PDU Session Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\"}\",\"name\":\"defaultPDUSessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed PDU Session Types\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\",\\\"5\\\":\\\"IPv4 \\u0026 IPv6\\\",\\\"6\\\":\\\"IPv4 \\u0026 IPv4v6\\\",\\\"7\\\":\\\"IPv6 \\u0026 IPv4v6\\\",\\\"8\\\":\\\"IPv4 \\u0026 IPv6 \\u0026 IPv4v6\\\"}\",\"name\":\"allowedPDUSessionTypes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"5qi\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"1~127\",\"name\":\"priorityLevel\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default SSC Mode\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\"}\",\"name\":\"defaultSSCmode\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed SSC Modes\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\",\\\"3\\\":\\\"SSC Mode1 \\u0026 SSC Mode2\\\",\\\"4\\\":\\\"SSC Mode1 \\u0026 SSC Mode3\\\",\\\"5\\\":\\\"SSC Mode2 \\u0026 SSC Mode3\\\",\\\"6\\\":\\\"SSC Mode1 \\u0026 SSC Mode2 \\u0026 SSC Mode3\\\"}\",\"name\":\"allowedSSCmodes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"\",\"name\":\"interworkingEPSIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristics\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristics\",\"type\":\"string\",\"value\":\"0001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrUL\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrDL\",\"type\":\"regex\",\"value\":\"2 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IP Address\",\"filter\":\"\",\"name\":\"staticIPAddress\",\"type\":\"ipv4\",\"value\":\"192.168.1.100\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Integrity\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneIntegrity\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Confidentiality\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneConfidentiality\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"0~255\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"}]', 13, '', 1719831213074); +INSERT INTO `ne_config` VALUES (207, 'UDM', 'epsTemplate', 'EPS User Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{0,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_eps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APN OI Replacement\",\"filter\":\"^.{0,31}$\",\"name\":\"apnOIReplacement\",\"type\":\"string\",\"value\":\"money\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RFSP\",\"filter\":\"\",\"name\":\"rfsp\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RAU TAU Timer\",\"filter\":\"\",\"name\":\"rauTauTimer\",\"type\":\"int\",\"value\":\"120\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]', 15, '', 1719831213203); +INSERT INTO `ne_config` VALUES (208, 'UDM', 'epsApn', 'EPS APN', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{0,127}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"IPv4 or IPv6\\\"}\",\"name\":\"pdnType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QCI\",\"filter\":\"1~255\",\"name\":\"qci\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority\",\"filter\":\"1~127\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"8\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Context Identifier\",\"filter\":\"\",\"name\":\"contextIdentifier\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"VPLMN Dynamic Address Allowed\",\"filter\":\"false;true;\",\"name\":\"vplmnDynamicAddressAllowed\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN GW Allocation Type\",\"filter\":\"{\\\"0\\\":\\\"Static\\\",\\\"1\\\":\\\"Dynamic\\\"}\",\"name\":\"pdnGWAllocationType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]', 17, '', 1719831213410); +INSERT INTO `ne_config` VALUES (209, 'UDM', 'applicationServer', 'Application Server', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AS Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Handling\",\"filter\":\"{\\\"0\\\":\\\"Session Continued\\\",\\\"1\\\":\\\"Session Terminated\\\"}\",\"name\":\"defaultHandling\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:192.168.8.26:7060\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Diameter Address\",\"filter\":\"^.{1,127}$\",\"name\":\"diameterAddress\",\"type\":\"string\",\"value\":\"mmtel.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rep Data Size Limit\",\"filter\":\"0~65535\",\"name\":\"repDataSizeLimit\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Request\",\"filter\":\"false;true;\",\"name\":\"includeRegisterRequest\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Response\",\"filter\":\"false;true;\",\"name\":\"includeRegisterResponse\",\"type\":\"bool\",\"value\":\"false\"}]', 19, '', 1719831213536); +INSERT INTO `ne_config` VALUES (210, 'UDM', 'scscfSet', 'SCSCF Set', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:scscf.ims.mnc001.mcc001.3gppnetwork.org:6060\"}]', 21, '', 1719831213732); +INSERT INTO `ne_config` VALUES (211, 'UDM', 'triggerPoint', 'Trigger Point', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Type CNF\",\"filter\":\"0~1\",\"name\":\"conditionTypeCNF\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Negated\",\"filter\":\"0~1\",\"name\":\"conditionNegated\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group\",\"filter\":\"0~4096\",\"name\":\"group\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"^.{0,32}$\",\"name\":\"method\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Header\",\"filter\":\"^.{0,64}$\",\"name\":\"sipHeader\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Content\",\"filter\":\"^.{0,64}$\",\"name\":\"sipContent\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"SPT List\",\"filter\":\"1~4\",\"name\":\"sptList\",\"type\":\"int\",\"value\":\"1\"}]', 23, '', 1719831213924); +INSERT INTO `ne_config` VALUES (212, 'UDM', 's6aServer', 'S6a Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 25, '', 1719831214313); +INSERT INTO `ne_config` VALUES (213, 'UDM', 'cxServer', 'Cx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 27, '', 1719831214393); + +INSERT INTO `ne_config` VALUES (220, 'UPF', 'general', 'General', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Config File Directory\",\"filter\":\"\",\"name\":\"configFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/etc/upf/\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EXE File Directory\",\"filter\":\"\",\"name\":\"exeFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/bin/\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~8\",\"display\":\"Data Forwarder Number\",\"filter\":\"1~8\",\"name\":\"dataForwarderNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Common Statistic Interval\",\"filter\":\"\",\"name\":\"commonStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Statistic Interval\",\"filter\":\"\",\"name\":\"userStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N3 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN3OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N6 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN6OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Checksum Offload\",\"filter\":\"0~255\",\"name\":\"checksumOffload\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Downlink Buffer Num\",\"filter\":\"\",\"name\":\"maxDownlinkBufferNum\",\"type\":\"int\",\"value\":\"50\"}]', 1, '', 1721705770725); +INSERT INTO `ne_config` VALUES (221, 'UPF', 'logger', 'Logger', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log File Full Path\",\"filter\":\"\",\"name\":\"logFileFullPath\",\"type\":\"string\",\"value\":\"/var/log/upf.log\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Upfd Log Level\",\"filter\":\"\",\"name\":\"upfdLogLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Upfd Log Transfer\",\"filter\":\"\",\"name\":\"upfdLogTransfer\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Report Caller\",\"filter\":\"\",\"name\":\"reportCaller\",\"type\":\"bool\",\"value\":\"false\"}]', 3, '', 1721705772689); +INSERT INTO `ne_config` VALUES (222, 'UPF', 'pfcp', 'PFCP', 'list', '[{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local UDP Port\",\"filter\":\"1~65535\",\"name\":\"localUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv4\",\"filter\":\"\",\"name\":\"smfIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv6\",\"filter\":\"\",\"name\":\"smfIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"SMF UDP Port\",\"filter\":\"1~65535\",\"name\":\"smfUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Retry Interval\",\"filter\":\"1~255\",\"name\":\"retryInterval\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Max Retry\",\"filter\":\"0~255\",\"name\":\"maxRetry\",\"type\":\"int\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Heartbeat Interval\",\"filter\":\"1~255\",\"name\":\"heartbeatInterval\",\"type\":\"int\",\"value\":\"15\"}]', 5, '', 1721705772791); +INSERT INTO `ne_config` VALUES (223, 'UPF', 'telnet', 'Telnet', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local Port\",\"filter\":\"1~65535\",\"name\":\"localPort\",\"type\":\"int\",\"value\":\"4100\"}]', 7, '', 1721705772939); +INSERT INTO `ne_config` VALUES (224, 'UPF', 'redisDb', 'Redis DB', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"tcp|udp\",\"display\":\"Net Type\",\"filter\":\"\",\"name\":\"netType\",\"type\":\"string\",\"value\":\"tcp\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Address\",\"filter\":\"\",\"name\":\"serverAddr\",\"type\":\"string\",\"value\":\"0.0.0.0:0\"}]', 9, '', 1721705773069); +INSERT INTO `ne_config` VALUES (225, 'UPF', 'dataForwarderCommon', 'Data Forwarder Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"upfd|tun\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"string\",\"value\":\"upfd\"},{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Instance ID\",\"filter\":\"1~8\",\"name\":\"instanceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Main CPU\",\"filter\":\"1~255\",\"name\":\"mainCpu\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"2,3,4,5 or 2-5\",\"display\":\"CPU Workers\",\"filter\":\"\",\"name\":\"cpuWorkers\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"data forwarder already run or not\",\"display\":\"Is Run\",\"filter\":\"0~1\",\"name\":\"isRun\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Hot Standby work or not\",\"display\":\"Is Hot Standby\",\"filter\":\"0~1\",\"name\":\"isHotStandby\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The value from which TEID is allocated\",\"display\":\"TEID Start\",\"filter\":\"\",\"name\":\"teidStart\",\"type\":\"int\",\"value\":\"16777216\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Heartbeat Interval\",\"filter\":\"\",\"name\":\"n3HeartbeatInterval\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX TX Queue Num\",\"filter\":\"\",\"name\":\"rxTxQueueNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"data rx\\u0026tx use C socket\",\"display\":\"Use Socket\",\"filter\":\"0~1\",\"name\":\"useSocket\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable 5G ethernet LAN\",\"display\":\"Enable Tap\",\"filter\":\"0~1\",\"name\":\"enableTap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable PFCP Qer Control\",\"display\":\"Enable Qer\",\"filter\":\"0~1\",\"name\":\"enableQer\",\"type\":\"int\",\"value\":\"0\"}]', 11, '', 1721705773160); +INSERT INTO `ne_config` VALUES (226, 'UPF', 'dataForwarderUpfd', 'Data Forwarder Upfd', 'list', '[{\"access\":\"read-write\",\"comment\":\"Currently only support vfio-pci\",\"display\":\"UIO Driver\",\"filter\":\"\",\"name\":\"uioDriver\",\"type\":\"string\",\"value\":\"vfio-pci\"},{\"access\":\"read-write\",\"comment\":\"The format must be IP:Port\",\"display\":\"Telnet Address IP:Port\",\"filter\":\"\",\"name\":\"commandlineListen\",\"type\":\"string\",\"value\":\"localhost:5002\"},{\"access\":\"read-write\",\"comment\":\"the unit is GB\",\"display\":\"Heap Size GB\",\"filter\":\"1~8\",\"name\":\"heapSizeGB\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"the unit is MB\",\"display\":\"State Seg Size MB\",\"filter\":\"64~512\",\"name\":\"stateSegSizeMB\",\"type\":\"int\",\"value\":\"256\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK No PCI\",\"filter\":\"0~1\",\"name\":\"dpdkNoPci\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mem Channel Num\",\"filter\":\"0~128\",\"name\":\"memChannelNum\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Base Va\",\"filter\":\"\",\"name\":\"sessionBaseVa\",\"type\":\"string\",\"value\":\"0x2000000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Buffers Per Numa\",\"filter\":\"\",\"name\":\"buffersPerNuma\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 RSS Hash\",\"filter\":\"\",\"name\":\"n3RssHash\",\"type\":\"string\",\"value\":\"\"}]', 13, '', 1721705774027); +INSERT INTO `ne_config` VALUES (227, 'UPF', 'dataInterfaceList', 'Data Interface List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"N3|N6|N9|N19\",\"display\":\"Interface Type\",\"filter\":\"\",\"name\":\"interfaceType\",\"type\":\"string\",\"value\":\"N3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface ID\",\"filter\":\"1~32\",\"name\":\"interfaceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"host|vmxnet3|dpdk|socket|uds\",\"display\":\"Driver Type\",\"filter\":\"\",\"name\":\"driverType\",\"type\":\"string\",\"value\":\"host\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"IPv4\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"IPv4 Address List\",\"filter\":\"0~8\",\"name\":\"ipv4AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"IPv6 Address List\",\"filter\":\"0~8\",\"name\":\"ipv6AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MAC Address\",\"filter\":\"\",\"name\":\"macAddr\",\"type\":\"string\",\"value\":\"00:00:00:00:00:00\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface PCI\",\"filter\":\"\",\"name\":\"interfacePCI\",\"type\":\"string\",\"value\":\"0000:00:00.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Network Card Name\",\"filter\":\"\",\"name\":\"systemNetworkCardName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"null|bak|sub|xor|round|lacp\",\"display\":\"Bond Type\",\"filter\":\"\",\"name\":\"bondType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Bond ID\",\"filter\":\"0~32\",\"name\":\"bondId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD TX Interval Ms\",\"filter\":\"\",\"name\":\"bfdTxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD RX Interval Ms\",\"filter\":\"\",\"name\":\"bfdRxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"default\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv4\",\"filter\":\"\",\"name\":\"bfdGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv6\",\"filter\":\"\",\"name\":\"bfdGatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MTU\",\"filter\":\"0~65535\",\"name\":\"mtu\",\"type\":\"int\",\"value\":\"1500\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Src Port\",\"filter\":\"1~65535\",\"name\":\"udpSrcPort\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Listen Port\",\"filter\":\"0~65536\",\"name\":\"udpListenPort\",\"type\":\"int\",\"value\":\"2152\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Local File Full Path\",\"filter\":\"\",\"name\":\"udsLocalFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Remote File Full Path\",\"filter\":\"\",\"name\":\"udsRemoteFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Detection Type\",\"filter\":\"0~1\",\"name\":\"linkDetectionType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NAT Interface ID\",\"filter\":\"0~1\",\"name\":\"natInterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv4 Pool List\",\"filter\":\"1~32\",\"name\":\"gtpuRemoteIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"gtpuRemoteIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPU Signaling Handle\",\"filter\":\"0~1\",\"name\":\"gtpuSignalingHandle\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMS Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"imsDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"dataDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inner DSCP Value Map\",\"filter\":\"0~1\",\"name\":\"innerDSCPValueMap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Support Speed Mbps\",\"filter\":\"0~65536\",\"name\":\"maxSupportSpeedMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkRxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkTxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkRxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkTxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK Workers\",\"filter\":\"\",\"name\":\"dpdkworkers\",\"type\":\"string\",\"value\":\"\"}]', 15, '', 1721705774222); +INSERT INTO `ne_config` VALUES (228, 'UPF', 'networkControlCommon', 'Network Control Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Disabled\",\"filter\":\"0~1\",\"name\":\"localSwitchDisabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TCP Sync Per Second\",\"filter\":\"\",\"name\":\"maxTCPSyncPerSecond\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF Max Support Mbps\",\"filter\":\"\",\"name\":\"upfMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dscp Inner Mapping\",\"filter\":\"\",\"name\":\"dscpInnerMapping\",\"type\":\"int\",\"value\":\"0\"}]', 17, '', 1721705774271); +INSERT INTO `ne_config` VALUES (229, 'UPF', 'networkControlDnnList', 'Network Control DNN List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Header Enrich Info List\",\"filter\":\"0~32\",\"name\":\"headerEnrichInfoList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Check\",\"filter\":\"0~1\",\"name\":\"localSwitchCheck\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"UE IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"UE IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"Dst Server IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"Dst Server IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"Gateway IP Type\",\"filter\":\"\",\"name\":\"gatewayIpType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv4\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv6\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv6\",\"type\":\"string\",\"value\":\"\"}]', 19, '', 1721705774430); +INSERT INTO `ne_config` VALUES (230, 'UPF', 'networkControlSnssaiList', 'Network Control SNSSAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"0\"}]', 21, '', 1721705774453); +INSERT INTO `ne_config` VALUES (231, 'UPF', 'networkControlAclWhiteList', 'Network Control ACL White List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]', 23, '', 1721705774471); +INSERT INTO `ne_config` VALUES (232, 'UPF', 'networkControlAclBlackList', 'Network Control ACL Black List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]', 25, '', 1721705774488); +INSERT INTO `ne_config` VALUES (233, 'UPF', 'networkControlDnsServerList', 'Network Control DNS Server List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1\",\"display\":\"Enabled\",\"filter\":\"0~1\",\"name\":\"enabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNS Name\",\"filter\":\"\",\"name\":\"dnsName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv4\",\"filter\":\"\",\"name\":\"serverIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6\",\"filter\":\"\",\"name\":\"serverIpv6\",\"type\":\"string\",\"value\":\"\"}]', 27, '', 1721705774492); +INSERT INTO `ne_config` VALUES (234, 'UPF', 'dpiCommon', 'DPI Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Detect Packet Num\",\"filter\":\"\",\"name\":\"maxDetectPacketNum\",\"type\":\"int\",\"value\":\"20\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"}]', 29, '', 1721705774496); +INSERT INTO `ne_config` VALUES (235, 'UPF', 'dpiHeaderEnrichInfoList', 'DPI Header Enrich Info List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}]', 31, '', 1721705774501); +INSERT INTO `ne_config` VALUES (236, 'UPF', 'dpiAppList', 'DPI APP List', 'array', '[{\"access\":\"read-write\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP Name\",\"filter\":\"\",\"name\":\"appName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Proxy Enabled\",\"filter\":\"0~1\",\"name\":\"proxyEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Force Check Type\",\"filter\":\"0~1\",\"name\":\"forceCheckType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"\",\"name\":\"ruleId\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"REGEX Match\",\"filter\":\"\",\"name\":\"regexMatch\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Custom Name\",\"filter\":\"\",\"name\":\"customName\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Rule List\",\"filter\":\"0~32\",\"name\":\"ruleList\",\"type\":\"int\",\"value\":\"1\"}]', 33, '', 1721705774505); -- 更新 CBC 配置 20240823 -INSERT INTO `ne_config` VALUES (80, 'CBC', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CBC Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"CBC\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Instance\",\"filter\":\"0~64\",\"name\":\"instance\",\"type\":\"string\",\"value\":\"CBC-001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiIp\",\"type\":\"string\",\"value\":\"127.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"9090\"},{\"access\":\"read-write\",\"comment\":\"http or https\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, '', 1724327154483); -INSERT INTO `ne_config` VALUES (81, 'CBC', 'amfProfile', 'AMF Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 3, '', 1724327154499); -INSERT INTO `ne_config` VALUES (82, 'CBC', 'mmeProfile', 'MME Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"MME\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MME URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"sctp://192.168.1.1:9090\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 5, '', 1724327154504); +INSERT INTO `ne_config` VALUES (240, 'CBC', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CBC Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"CBC\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Instance\",\"filter\":\"0~64\",\"name\":\"instance\",\"type\":\"string\",\"value\":\"CBC-001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiIp\",\"type\":\"string\",\"value\":\"127.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"9090\"},{\"access\":\"read-write\",\"comment\":\"http or https\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, '', 1724327154483); +INSERT INTO `ne_config` VALUES (241, 'CBC', 'amfProfile', 'AMF Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 3, '', 1724327154499); +INSERT INTO `ne_config` VALUES (242, 'CBC', 'mmeProfile', 'MME Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"MME\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MME URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"sctp://192.168.1.1:9090\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 5, '', 1724327154504); + +-- OMC parameter config +INSERT INTO `ne_config` VALUES (260, 'OMC', 'alarmEmailForward', 'Alarm Email Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with Email interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Email List\",\"filter\":\"\",\"name\":\"emailList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Server\",\"filter\":\"\",\"name\":\"smtp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"User\",\"filter\":\"\",\"name\":\"user\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"}]', 3, '', 1725505025649); +INSERT INTO `ne_config` VALUES (261, 'OMC', 'alarmSMSForward', 'Alarm SMS Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with SMS interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Multiple mobile separated by commas\",\"display\":\"Mobile List\",\"filter\":\"\",\"name\":\"mobileList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"The SMSC SMPP Address\",\"display\":\"SMSC Address\",\"filter\":\"\",\"name\":\"smscAddr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Short message coding type\",\"display\":\"Data Coding\",\"filter\":\"{\\\"0\\\":\\\"GSM7BIT\\\",\\\"1\\\":\\\"ASCII\\\",\\\"2\\\":\\\"BINARY8BIT1\\\",\\\"3\\\":\\\"LATIN1\\\",\\\"4\\\":\\\"BINARY8BIT2\\\",\\\"6\\\":\\\"CYRILLIC\\\",\\\"7\\\":\\\"HEBREW\\\",\\\"8\\\":\\\"UCS2\\\"}\",\"name\":\"dataCoding\",\"type\":\"enum\",\"value\":\"GSM7BIT\"},{\"access\":\"rw\",\"comment\":\"It is the source address, the length is between 3 and 20\",\"display\":\"Service Number\",\"filter\":\"3~20\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"OMC\"}]', 4, '', 1727664057261); + +-- 更新 SMSC 配置 20241010 +INSERT INTO `ne_config` VALUES (280, 'SMSC', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"If add plus then set false\",\"display\":\"MT Id Format Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mtIdFormatFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"enable mcast sms\",\"display\":\"Mcast Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mcastFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"{\\\"0\\\":\\\"none\\\",\\\"1\\\":\\\"error\\\",\\\"2\\\":\\\"debug\\\"}\",\"name\":\"logLevel\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The MB sizeof log file\",\"display\":\"Log Size\",\"filter\":\"1-1000\",\"name\":\"logSize\",\"type\":\"int\",\"value\":\"200\"},{\"access\":\"read-write\",\"comment\":\"The number of log file\",\"display\":\"Log Number\",\"filter\":\"1-20\",\"name\":\"logNum\",\"type\":\"int\",\"value\":\"10\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Directory\",\"filter\":\"0~128\",\"name\":\"logDir\",\"type\":\"string\",\"value\":\"/var/log/\"}]', 1, '', 1728528805723); +INSERT INTO `ne_config` VALUES (281, 'SMSC', 'msisdnsegment', 'MSISDN Segment List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]', 3, 'put', 1728528805736); +INSERT INTO `ne_config` VALUES (282, 'SMSC', 'smpplink', 'SMPP Link List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]', 5, 'post,put,delete', 1728528805740); +INSERT INTO `ne_config` VALUES (283, 'SMSC', 'convprefix', 'Conv Prefix List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~127\",\"display\":\"Index\",\"filter\":\"0~127\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~16\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Delete Length\",\"filter\":\"0-16\",\"name\":\"deleteLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Length\",\"filter\":\"0-16\",\"name\":\"addLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Digits\",\"filter\":\"0~16\",\"name\":\"addDigits\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Length\",\"filter\":\"0-32\",\"name\":\"numberLength\",\"type\":\"int\",\"value\":\"0\"}]', 7, 'post,put,delete', 1728528805745); +INSERT INTO `ne_config` VALUES (284, 'SMSC', 'smppparam', 'SMPP Param List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~31\",\"display\":\"Index\",\"filter\":\"0~31\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0-8\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"udp\\\",\\\"1\\\":\\\"tcp\\\"}\",\"name\":\"linkType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Type\",\"filter\":\"{\\\"0\\\":\\\"client\\\",\\\"1\\\":\\\"server\\\"}\",\"name\":\"serverType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"0-16\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"0-8\",\"name\":\"password\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"0-12\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local GTT\",\"filter\":\"0-16\",\"name\":\"localGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote GTT\",\"filter\":\"0-16\",\"name\":\"remoteGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IP\",\"filter\":\"0-32\",\"name\":\"localIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote IP\",\"filter\":\"0-32\",\"name\":\"remoteIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Init Timer\",\"filter\":\"0-65535\",\"name\":\"sessionInitTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enquire Link Timer\",\"filter\":\"0-65535\",\"name\":\"enquireLinkTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Timer\",\"filter\":\"0-65535\",\"name\":\"inactivityTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Response Timer\",\"filter\":\"0-65535\",\"name\":\"responseTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local SSN\",\"filter\":\"0-255\",\"name\":\"localSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote SSN\",\"filter\":\"0-255\",\"name\":\"remoteSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"1\"}]', 9, 'put', 1728528805748); SET FOREIGN_KEY_CHECKS=1; diff --git a/build/system/usr/local/omc/etc/db/common/param_config.sql b/build/system/usr/local/omc/etc/db/common/param_config.sql deleted file mode 100644 index be2e722..0000000 --- a/build/system/usr/local/omc/etc/db/common/param_config.sql +++ /dev/null @@ -1,114 +0,0 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for param_config --- ---------------------------- -DROP TABLE IF EXISTS `param_config`; -CREATE TABLE `param_config` ( - `id` int NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', - `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', - `top_tag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `top_display` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `method` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作属性 get只读强制不可编辑删除 put可编辑 delete可删除 post可新增', - `param_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'accesss属性控制:只读read-only/read/ro 读写read-write', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_type_name` (`ne_type`,`top_tag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元参数配置可用属性值'; - --- ---------------------------- --- Records of param_config --- ---------------------------- -INSERT INTO `param_config` VALUES (595, 'N3IWF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IKEBindAddress\",\"filter\":\"\",\"name\":\"ikeBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPBindAddress\",\"filter\":\"\",\"name\":\"gtpBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.161\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"n3iwf.5gc.mnc00.mcc460.pub.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"InternalIP\",\"filter\":\"\",\"name\":\"internalIP\",\"type\":\"string\",\"value\":\"172.16.1.190\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UdmIPAddrPort\",\"filter\":\"\",\"name\":\"udmAddr\",\"type\":\"string\",\"value\":\"172.16.1.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SmfIPAddress\",\"filter\":\"\",\"name\":\"smfIPAddr\",\"type\":\"string\",\"value\":\"172.16.1.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3IPAddress\",\"filter\":\"\",\"name\":\"n3IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6IPAddress\",\"filter\":\"\",\"name\":\"n6IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"}]}'); -INSERT INTO `param_config` VALUES (1106, 'AUSF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1107, 'NRF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.180\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1108, 'NRF', '', 'registeredNFs', 'Registered NFs', 'get', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF Type\",\"filter\":\"^.{1,128}$\",\"name\":\"nfType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Status\",\"filter\":\"^.{1,128}$\",\"name\":\"status\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"^.{1,128}$\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"^.{1,128}$\",\"name\":\"ipAddress\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1243, 'NSSF', '', 'general', 'General', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSSF Name\",\"filter\":\"\",\"name\":\"nssfName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1244, 'NSSF', '', 'sbi', 'SBI', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"\",\"name\":\"scheme\",\"type\":\"string\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv4\",\"filter\":\"\",\"name\":\"registerIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv4\",\"filter\":\"\",\"name\":\"bindingIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv6\",\"filter\":\"\",\"name\":\"registerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv6\",\"filter\":\"\",\"name\":\"bindingIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"name\":\"port\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv4\",\"filter\":\"\",\"name\":\"telnetIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv6\",\"filter\":\"\",\"name\":\"telnetIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet Port\",\"filter\":\"\",\"name\":\"telnetPort\",\"type\":\"int\",\"value\":\"4100\"}]}'); -INSERT INTO `param_config` VALUES (1245, 'NSSF', '', 'supportedNetworkSliceList', 'Supported Network Slice List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TAC\",\"filter\":\"\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SST\",\"filter\":\"\",\"name\":\"supportedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SD\",\"filter\":\"\",\"name\":\"supportedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SST\",\"filter\":\"\",\"name\":\"restrictedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SD\",\"filter\":\"\",\"name\":\"restrictedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF ID\",\"filter\":\"\",\"name\":\"nrfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSI ID\",\"filter\":\"\",\"name\":\"nsiId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Access Type\",\"filter\":\"\",\"name\":\"accessType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Set ID\",\"filter\":\"\",\"name\":\"amfSetId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1246, 'NSSF', '', 'plmnMappingList', 'PLMN Mapping List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Operator Name\",\"filter\":\"\",\"name\":\"operatorName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"02\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SST\",\"filter\":\"\",\"name\":\"servingSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SD\",\"filter\":\"\",\"name\":\"servingSnssaiSd\",\"type\":\"string\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SST\",\"filter\":\"\",\"name\":\"homeSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SD\",\"filter\":\"\",\"name\":\"homeSnssaiSd\",\"type\":\"string\",\"value\":\"1\"}]}'); - --- AMF 更新时间2024/07/16 15:00 -INSERT INTO `param_config` VALUES (1473, 'AMF', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]}'); -INSERT INTO `param_config` VALUES (1474, 'AMF', '', 'association', 'TNL Association List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]}'); -INSERT INTO `param_config` VALUES (1475, 'AMF', '', 'guami', 'GUAMI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1476, 'AMF', '', 'tai', 'TAI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1477, 'AMF', '', 'slice', 'Slice List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]}'); - -INSERT INTO `param_config` VALUES (1480, 'MOCNGW', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP South Address\",\"filter\":\"0~64\",\"name\":\"s1apSouthAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP North Address\",\"filter\":\"0~64\",\"name\":\"s1apNorthAddr\",\"type\":\"string\",\"value\":\"192.168.8.163\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1048575\",\"display\":\"ENB ID\",\"filter\":\"0~1048575\",\"name\":\"enbId\",\"type\":\"int\",\"value\":\"24\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"userPlaneEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"}]}'); -INSERT INTO `param_config` VALUES (1481, 'MOCNGW', '', 'mme', 'MME List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP Address\",\"filter\":\"0~64\",\"name\":\"s1apAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S1AP Port\",\"filter\":\"0~65535\",\"name\":\"s1apPort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"}]}'); -INSERT INTO `param_config` VALUES (1482, 'MOCNGW', '', 'upgw', 'UPGW Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.1.159\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"PFCP Port\",\"filter\":\"0~65535\",\"name\":\"pfcpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U South Address\",\"filter\":\"0~64\",\"name\":\"gtpuSouthAddr\",\"type\":\"string\",\"value\":\"10.10.1.2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U North Address\",\"filter\":\"0~64\",\"name\":\"gtpuNorthAddr\",\"type\":\"string\",\"value\":\"192.168.7.123\"}]}'); -INSERT INTO `param_config` VALUES (1525, 'PCF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"}]}'); -INSERT INTO `param_config` VALUES (1526, 'PCF', '', 'serviceAreaRestriction', 'Service Area Restriction', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1527, 'PCF', '', 'pccRules', 'PCC Rules', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"0~255\",\"name\":\"precedence\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP ID\",\"filter\":\"^.{1,63}$\",\"name\":\"appId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Template\",\"filter\":\"^.{1,255}$\",\"name\":\"flowTemplate\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"trafficControlId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1528, 'PCF', '', 'sessionRules', 'Session Rules', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrDl\",\"type\":\"string\",\"value\":\"200Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrUl\",\"type\":\"string\",\"value\":\"100Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Averaging Window\",\"filter\":\"0~4095\",\"name\":\"averagingWindow\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Data Burst Volume\",\"filter\":\"0~4095\",\"name\":\"maxDataBurstVolume\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1529, 'PCF', '', 'gxServer', 'Gx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1530, 'PCF', '', 'rxServer', 'Rx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1531, 'PCF', '', 'flowTemplate', 'Flow Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"^.{1,127}$\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"permit out ip from any to assigned\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Direction\",\"filter\":\"{\\\"0\\\":\\\"Unspecified\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectional\\\"}\",\"name\":\"flowDirection\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1532, 'PCF', '', 'qosTemplate', 'QoS Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default QoS Flow Indication\",\"filter\":\"false;true;\",\"name\":\"defQosFlowIndication\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1533, 'PCF', '', 'usageMonitoringTemplate', 'Usage Monitoring Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"umId\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold(KB)\",\"filter\":\"\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"5242880\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Uplink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdUplink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Downlink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdDownlink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time Threshold\",\"filter\":\"\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Time\",\"filter\":\"\",\"name\":\"inactivityTime\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1534, 'PCF', '', 'trafficControlTemplate', 'Traffic Control Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"tcId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Status\",\"filter\":\"{\\\"0\\\":\\\"Disable\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Enable\\\", \\\"4\\\":\\\"Remove\\\"}\",\"name\":\"flowStatus\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mute Notify\",\"filter\":\"false;true;\",\"name\":\"muteNotif\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Route to Location DNAI\",\"filter\":\"^.{1,63}$\",\"name\":\"dnai\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1535, 'PCF', '', 'headerEnrichTemplate', 'Header Enrich Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Type\",\"filter\":\"{\\\"0\\\":\\\"GPSI\\\", \\\"1\\\":\\\"SUPI\\\", \\\"2\\\":\\\"UE IP\\\", \\\"3\\\":\\\"User Location\\\", \\\"4\\\":\\\"DNN\\\"}\",\"name\":\"headerType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Name\",\"filter\":\"^.{1,63}$\",\"name\":\"headerName\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1591, 'SMSC', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"}]}'); -INSERT INTO `param_config` VALUES (1592, 'SMSC', '', 'msisdnsegment', 'MSISDN Segment List', 'put', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1593, 'SMSC', '', 'smpplink', 'SMPP Link List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1628, 'UDM', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.140\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF IP\",\"filter\":\"\",\"name\":\"ausfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"omc.com\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"0~4095\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Capacity\",\"filter\":\"0~65535\",\"name\":\"capacity\",\"type\":\"int\",\"value\":\"4096\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SUPI Ranges\",\"filter\":\"^imsi-\\\\d{15}~imsi-\\\\d{15}$\",\"name\":\"supiRanges\",\"type\":\"regex\",\"value\":\"imsi-001010100080000~imsi-001010100080099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GPSI Ranges\",\"filter\":\"^msisdn-\\\\d{2,15}~msisdn-\\\\d{2,15}$\",\"name\":\"gpsiRanges\",\"type\":\"regex\",\"value\":\"msisdn-69072000~msisdn-69072099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Link\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"redisLink\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Address\",\"filter\":\"\",\"name\":\"redisAddr\",\"type\":\"string\",\"value\":\"172.16.5.140:6379\"}]}'); -INSERT INTO `param_config` VALUES (1629, 'UDM', '', 'subsUEAmbr', 'Subs UE AMBR', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"uplink\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"downlink\",\"type\":\"regex\",\"value\":\"2 Gbps\"}]}'); -INSERT INTO `param_config` VALUES (1630, 'UDM', '', 'subsNssais', 'Subs NSSAIs', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Features\",\"filter\":\"^[0-9a-fA-F]{8}$\",\"name\":\"supportedFeatures\",\"type\":\"regex\",\"value\":\"00000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Single NSSAIs\",\"filter\":\"\",\"name\":\"defaultSingleNSSAIs\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Single NSSAIs\",\"filter\":\"\",\"name\":\"singleNssais\",\"type\":\"string\",\"value\":\"1-000002\"}]}'); -INSERT INTO `param_config` VALUES (1631, 'UDM', '', 'forbiddenAreas', 'Forbidden Areas', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"}]}'); -INSERT INTO `param_config` VALUES (1632, 'UDM', '', 'serviceAreaRestriction', 'Service Area Restriction', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1633, 'UDM', '', 'smfSelection', 'Subs SMF Selection', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SNSSAI\",\"filter\":\"^\\\\d{1,3}[A-Fa-f0-9]{6}$\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{1,32}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN Indicator\",\"filter\":\"false;true;\",\"name\":\"defaultDnnInd\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LBO Roaming Allowed\",\"filter\":\"false;true;\",\"name\":\"lboRoamingAllowed\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"false;true;\",\"name\":\"iwkEpsInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"false;true;\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"false\"}],\"comment\":\"\",\"display\":\"DNN List\",\"filter\":\"1~4\",\"name\":\"dnnList\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1634, 'UDM', '', 'dnn', 'DNN Conf', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default PDU Session Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\"}\",\"name\":\"defaultPDUSessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed PDU Session Types\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\",\\\"5\\\":\\\"IPv4 \\u0026 IPv6\\\",\\\"6\\\":\\\"IPv4 \\u0026 IPv4v6\\\",\\\"7\\\":\\\"IPv6 \\u0026 IPv4v6\\\",\\\"8\\\":\\\"IPv4 \\u0026 IPv6 \\u0026 IPv4v6\\\"}\",\"name\":\"allowedPDUSessionTypes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"5qi\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"1~127\",\"name\":\"priorityLevel\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default SSC Mode\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\"}\",\"name\":\"defaultSSCmode\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed SSC Modes\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\",\\\"3\\\":\\\"SSC Mode1 \\u0026 SSC Mode2\\\",\\\"4\\\":\\\"SSC Mode1 \\u0026 SSC Mode3\\\",\\\"5\\\":\\\"SSC Mode2 \\u0026 SSC Mode3\\\",\\\"6\\\":\\\"SSC Mode1 \\u0026 SSC Mode2 \\u0026 SSC Mode3\\\"}\",\"name\":\"allowedSSCmodes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"\",\"name\":\"interworkingEPSIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristics\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristics\",\"type\":\"string\",\"value\":\"0001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrUL\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrDL\",\"type\":\"regex\",\"value\":\"2 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IP Address\",\"filter\":\"\",\"name\":\"staticIPAddress\",\"type\":\"ipv4\",\"value\":\"192.168.1.100\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Integrity\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneIntegrity\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Confidentiality\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneConfidentiality\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"0~255\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1635, 'UDM', '', 'epsTemplate', 'EPS User Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{0,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_eps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APN OI Replacement\",\"filter\":\"^.{0,31}$\",\"name\":\"apnOIReplacement\",\"type\":\"string\",\"value\":\"money\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RFSP\",\"filter\":\"\",\"name\":\"rfsp\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RAU TAU Timer\",\"filter\":\"\",\"name\":\"rauTauTimer\",\"type\":\"int\",\"value\":\"120\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]}'); -INSERT INTO `param_config` VALUES (1636, 'UDM', '', 'epsApn', 'EPS APN', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{0,127}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"IPv4 or IPv6\\\"}\",\"name\":\"pdnType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QCI\",\"filter\":\"1~255\",\"name\":\"qci\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority\",\"filter\":\"1~127\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"8\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Context Identifier\",\"filter\":\"\",\"name\":\"contextIdentifier\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"VPLMN Dynamic Address Allowed\",\"filter\":\"false;true;\",\"name\":\"vplmnDynamicAddressAllowed\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN GW Allocation Type\",\"filter\":\"{\\\"0\\\":\\\"Static\\\",\\\"1\\\":\\\"Dynamic\\\"}\",\"name\":\"pdnGWAllocationType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]}'); -INSERT INTO `param_config` VALUES (1637, 'UDM', '', 'applicationServer', 'Application Server', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AS Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Handling\",\"filter\":\"{\\\"0\\\":\\\"Session Continued\\\",\\\"1\\\":\\\"Session Terminated\\\"}\",\"name\":\"defaultHandling\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:192.168.8.26:7060\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Diameter Address\",\"filter\":\"^.{1,127}$\",\"name\":\"diameterAddress\",\"type\":\"string\",\"value\":\"mmtel.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rep Data Size Limit\",\"filter\":\"0~65535\",\"name\":\"repDataSizeLimit\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Request\",\"filter\":\"false;true;\",\"name\":\"includeRegisterRequest\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Response\",\"filter\":\"false;true;\",\"name\":\"includeRegisterResponse\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1638, 'UDM', '', 'scscfSet', 'SCSCF Set', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:scscf.ims.mnc001.mcc001.3gppnetwork.org:6060\"}]}'); -INSERT INTO `param_config` VALUES (1639, 'UDM', '', 'triggerPoint', 'Trigger Point', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Type CNF\",\"filter\":\"0~1\",\"name\":\"conditionTypeCNF\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Negated\",\"filter\":\"0~1\",\"name\":\"conditionNegated\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group\",\"filter\":\"0~4096\",\"name\":\"group\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"^.{0,32}$\",\"name\":\"method\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Header\",\"filter\":\"^.{0,64}$\",\"name\":\"sipHeader\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Content\",\"filter\":\"^.{0,64}$\",\"name\":\"sipContent\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"SPT List\",\"filter\":\"1~4\",\"name\":\"sptList\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1640, 'UDM', '', 's6aServer', 'S6a Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1641, 'UDM', '', 'cxServer', 'Cx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); - --- SMF 更新时间2024/06/17 17:50 -INSERT INTO `param_config` VALUES (1645, 'SMF', '', 'smfSystem', 'SMF System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI IP\",\"filter\":\"\",\"name\":\"sbiIpAddr\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv4\",\"filter\":\"\",\"name\":\"n4Ipv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv6\",\"filter\":\"\",\"name\":\"n4Ipv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv4\",\"filter\":\"\",\"name\":\"n4UIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv6\",\"filter\":\"\",\"name\":\"n4UIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"\",\"name\":\"amfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.120:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF Enable\",\"filter\":\"\",\"name\":\"pcfEnable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"display\":\"5G Charging Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"chfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Primary URI\",\"filter\":\"\",\"name\":\"chfPrimaryUri\",\"type\":\"string\",\"value\":\"http://172.16.5.240:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Secondary URI\",\"filter\":\"\",\"name\":\"chfSecondaryUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv4\",\"filter\":\"\",\"name\":\"primaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"114.114.114.114\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv4\",\"filter\":\"\",\"name\":\"secondaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv6\",\"filter\":\"\",\"name\":\"primaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv6\",\"filter\":\"\",\"name\":\"secondaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv4\",\"filter\":\"\",\"name\":\"primaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv4\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv6\",\"filter\":\"\",\"name\":\"primaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv6\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE MTU\",\"filter\":\"0~65535\",\"name\":\"ueMtu\",\"type\":\"int\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1646, 'SMF', '', 'spgwSystem', 'SPGW Sytem Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local S11 IP\",\"filter\":\"\",\"name\":\"s11Ip\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter IP\",\"filter\":\"\",\"name\":\"localDiameterIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Host Name\",\"filter\":\"\",\"name\":\"localDiameterHostName\",\"type\":\"string\",\"value\":\"smf.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Realm Name\",\"filter\":\"\",\"name\":\"localDiameterRealmName\",\"type\":\"string\",\"value\":\"mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gy Enable\",\"filter\":\"false;true;\",\"name\":\"peerGyEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gy IP\",\"filter\":\"\",\"name\":\"primaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gy IP\",\"filter\":\"\",\"name\":\"secondaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Enable\",\"filter\":\"false;true;\",\"name\":\"peerGxEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Charging Enable\",\"filter\":\"false;true;\",\"name\":\"gxChargingEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gx IP\",\"filter\":\"\",\"name\":\"primaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gx IP\",\"filter\":\"\",\"name\":\"secondaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"}]}'); -INSERT INTO `param_config` VALUES (1647, 'SMF', '', 'upfConfig', 'UPF Config', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"id\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"e.g. ip:port\",\"display\":\"Address\",\"filter\":\"7~45\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"},{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"}],\"display\":\"UE DNN IP Pool\",\"name\":\"ueDnnIpPool\"}]}'); -INSERT INTO `param_config` VALUES (1648, 'SMF', '', 'dnnSelectUpf', 'DNN Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1649, 'SMF', '', 'dnnTaiSelectUpf', 'DNN TAI Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"MCC+MNC+TAC\",\"display\":\"TAI\",\"filter\":\"1~64\",\"name\":\"tai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf2-Id\"}]}'); -INSERT INTO `param_config` VALUES (1650, 'SMF', '', 'snssaiSelectUpf', 'SNSSAI Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"sst1-sd1;sst2-sd2;sst3-sd3\",\"display\":\"SNSSAI\",\"filter\":\"1~64\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"upf1-id;upf2-id;upf3-id\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf1-Id\"}]}'); -INSERT INTO `param_config` VALUES (1651, 'SMF', '', 'offlineChargingConfig', 'Offline Charging Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Name\",\"filter\":\"\",\"name\":\"cdrFileName\",\"type\":\"string\",\"value\":\"smf.cdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Path\",\"filter\":\"\",\"name\":\"cdrFilePath\",\"type\":\"string\",\"value\":\"/var/log/smfCdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Num\",\"filter\":\"1~999999999\",\"name\":\"cdrFileNum\",\"type\":\"int\",\"value\":\"50\"},{\"access\":\"read-write\",\"comment\":\"Megabytes\",\"display\":\"CDR File Size\",\"filter\":\"1~999999\",\"name\":\"cdrFileSize\",\"type\":\"int\",\"value\":\"300\"},{\"access\":\"read-write\",\"comment\":\"Days\",\"display\":\"CDR File Max Age\",\"filter\":\"0~9999\",\"name\":\"cdrFileMaxAge\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Free Subscribers CDR Enable\",\"filter\":\"\",\"name\":\"freeSubsCdrEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"Seconds\",\"display\":\"Time Threshold\",\"filter\":\"0~999999999\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"600\"},{\"access\":\"read-write\",\"comment\":\"Bytes\",\"display\":\"Volume Threshold\",\"filter\":\"0~999999999999999\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"0\"}]}'); - --- MME 更新时间2024/06/27 15:13 -INSERT INTO `param_config` VALUES (1657, 'MME', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"CSFB Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"VoLTE Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"volteEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S1 MME IP\",\"filter\":\"0~64\",\"name\":\"s1MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"S1 MME Port\",\"filter\":\"0~65535\",\"name\":\"s1MmePort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S11 MME IP\",\"filter\":\"0~64\",\"name\":\"s11MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S11 MME Port\",\"filter\":\"0~65535\",\"name\":\"s11MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S10 MME IP\",\"filter\":\"0~64\",\"name\":\"s10MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.178\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S10 MME Port\",\"filter\":\"0~65535\",\"name\":\"s10MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGs MME IP\",\"filter\":\"0~64\",\"name\":\"sgsMmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"SGs MME Port\",\"filter\":\"0~65535\",\"name\":\"sgsMmePort\",\"type\":\"int\",\"value\":\"29118\"},{\"access\":\"read-write\",\"comment\":\"0~100\",\"display\":\"S6A MME Identity\",\"filter\":\"0~100\",\"name\":\"s6aIdentity\",\"type\":\"string\",\"value\":\"mme.epc.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~20\",\"display\":\"S6A MME IP\",\"filter\":\"0~20\",\"name\":\"localIp\",\"type\":\"string\",\"value\":\"172.16.5.220\"}]}'); -INSERT INTO `param_config` VALUES (1658, 'MME', '', 'gummei', 'Gummei List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Group ID\",\"filter\":\"0~65535\",\"name\":\"groupId\",\"type\":\"int\",\"value\":\"4\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Code\",\"filter\":\"0~255\",\"name\":\"code\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1659, 'MME', '', 'tai', 'TAI List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1660, 'MME', '', 'hss', 'HSS List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{1,15}$\",\"display\":\"IMSI Prefix\",\"filter\":\"^[0-9]{1,15}$\",\"name\":\"imsiPre\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Hostname\",\"filter\":\"0~128\",\"name\":\"hssHostname\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"SCTP|TCP\",\"display\":\"Protocol\",\"filter\":\"0~8\",\"name\":\"protocol\",\"type\":\"string\",\"value\":\"SCTP\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"HSS Port\",\"filter\":\"0~65535\",\"name\":\"hssPort\",\"type\":\"int\",\"value\":\"3868\"}]}'); -INSERT INTO `param_config` VALUES (1661, 'MME', '', 'sgw', 'SGW List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGW IP\",\"filter\":\"0~64\",\"name\":\"sgwIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"}]}'); -INSERT INTO `param_config` VALUES (1662, 'MME', '', 'pgw', 'PGW List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"APN\",\"filter\":\"0~128\",\"name\":\"apn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"PGW IP\",\"filter\":\"0~64\",\"name\":\"pgwIp\",\"type\":\"string\",\"value\":\"192.168.1.181\"}]}'); -INSERT INTO `param_config` VALUES (1663, 'MME', '', 'amf', 'AMF List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~16777215\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"AMF IP\",\"filter\":\"0~64\",\"name\":\"amfIp\",\"type\":\"string\",\"value\":\"172.16.5.120\"}]}'); - --- UPF 更新时间2024/07/15 14:30 -INSERT INTO `param_config` VALUES (1681, 'UPF', '', 'general', 'General', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Config File Directory\",\"filter\":\"\",\"name\":\"configFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/etc/upf/\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EXE File Directory\",\"filter\":\"\",\"name\":\"exeFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/bin/\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~8\",\"display\":\"Data Forwarder Number\",\"filter\":\"1~8\",\"name\":\"dataForwarderNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Common Statistic Interval\",\"filter\":\"\",\"name\":\"commonStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Statistic Interval\",\"filter\":\"\",\"name\":\"userStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N3 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN3OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N6 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN6OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Checksum Offload\",\"filter\":\"0~255\",\"name\":\"checksumOffload\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Downlink Buffer Num\",\"filter\":\"\",\"name\":\"maxDownlinkBufferNum\",\"type\":\"int\",\"value\":\"50\"}]}'); -INSERT INTO `param_config` VALUES (1682, 'UPF', '', 'logger', 'Logger', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log File Full Path\",\"filter\":\"\",\"name\":\"logFileFullPath\",\"type\":\"string\",\"value\":\"/var/log/upf.log\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Upfd Log Level\",\"filter\":\"\",\"name\":\"upfdLogLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Upfd Log Transfer\",\"filter\":\"\",\"name\":\"upfdLogTransfer\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Report Caller\",\"filter\":\"\",\"name\":\"reportCaller\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1683, 'UPF', '', 'pfcp', 'PFCP', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local UDP Port\",\"filter\":\"1~65535\",\"name\":\"localUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv4\",\"filter\":\"\",\"name\":\"smfIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv6\",\"filter\":\"\",\"name\":\"smfIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"SMF UDP Port\",\"filter\":\"1~65535\",\"name\":\"smfUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Retry Interval\",\"filter\":\"1~255\",\"name\":\"retryInterval\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Max Retry\",\"filter\":\"0~255\",\"name\":\"maxRetry\",\"type\":\"int\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Heartbeat Interval\",\"filter\":\"1~255\",\"name\":\"heartbeatInterval\",\"type\":\"int\",\"value\":\"15\"}]}'); -INSERT INTO `param_config` VALUES (1684, 'UPF', '', 'telnet', 'Telnet', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local Port\",\"filter\":\"1~65535\",\"name\":\"localPort\",\"type\":\"int\",\"value\":\"4100\"}]}'); -INSERT INTO `param_config` VALUES (1685, 'UPF', '', 'redisDb', 'Redis DB', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"tcp|udp\",\"display\":\"Net Type\",\"filter\":\"\",\"name\":\"netType\",\"type\":\"string\",\"value\":\"tcp\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Address\",\"filter\":\"\",\"name\":\"serverAddr\",\"type\":\"string\",\"value\":\"0.0.0.0:0\"}]}'); -INSERT INTO `param_config` VALUES (1686, 'UPF', '', 'dataForwarderCommon', 'Data Forwarder Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"upfd|tun\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"string\",\"value\":\"upfd\"},{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Instance ID\",\"filter\":\"1~8\",\"name\":\"instanceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Main CPU\",\"filter\":\"1~255\",\"name\":\"mainCpu\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"2,3,4,5 or 2-5\",\"display\":\"CPU Workers\",\"filter\":\"\",\"name\":\"cpuWorkers\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"data forwarder already run or not\",\"display\":\"Is Run\",\"filter\":\"0~1\",\"name\":\"isRun\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Hot Standby work or not\",\"display\":\"Is Hot Standby\",\"filter\":\"0~1\",\"name\":\"isHotStandby\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The value from which TEID is allocated\",\"display\":\"TEID Start\",\"filter\":\"\",\"name\":\"teidStart\",\"type\":\"int\",\"value\":\"16777216\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Heartbeat Interval\",\"filter\":\"\",\"name\":\"n3HeartbeatInterval\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX TX Queue Num\",\"filter\":\"\",\"name\":\"rxTxQueueNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"data rx\\u0026tx use C socket\",\"display\":\"Use Socket\",\"filter\":\"0~1\",\"name\":\"useSocket\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable 5G ethernet LAN\",\"display\":\"Enable Tap\",\"filter\":\"0~1\",\"name\":\"enableTap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable PFCP Qer Control\",\"display\":\"Enable Qer\",\"filter\":\"0~1\",\"name\":\"enableQer\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1687, 'UPF', '', 'dataForwarderUpfd', 'Data Forwarder Upfd', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"Currently only support vfio-pci\",\"display\":\"UIO Driver\",\"filter\":\"\",\"name\":\"uioDriver\",\"type\":\"string\",\"value\":\"vfio-pci\"},{\"access\":\"read-write\",\"comment\":\"The format must be IP:Port\",\"display\":\"Telnet Address IP:Port\",\"filter\":\"\",\"name\":\"commandlineListen\",\"type\":\"string\",\"value\":\"localhost:5002\"},{\"access\":\"read-write\",\"comment\":\"the unit is GB\",\"display\":\"Heap Size GB\",\"filter\":\"1~8\",\"name\":\"heapSizeGB\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"the unit is MB\",\"display\":\"State Seg Size MB\",\"filter\":\"64~512\",\"name\":\"stateSegSizeMB\",\"type\":\"int\",\"value\":\"256\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK No PCI\",\"filter\":\"0~1\",\"name\":\"dpdkNoPci\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mem Channel Num\",\"filter\":\"0~128\",\"name\":\"memChannelNum\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Base Va\",\"filter\":\"\",\"name\":\"sessionBaseVa\",\"type\":\"string\",\"value\":\"0x2000000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Buffers Per Numa\",\"filter\":\"\",\"name\":\"buffersPerNuma\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 RSS Hash\",\"filter\":\"\",\"name\":\"n3RssHash\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1688, 'UPF', '', 'dataInterfaceList', 'Data Interface List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"N3|N6|N9|N19\",\"display\":\"Interface Type\",\"filter\":\"\",\"name\":\"interfaceType\",\"type\":\"string\",\"value\":\"N3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface ID\",\"filter\":\"1~32\",\"name\":\"interfaceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"host|vmxnet3|dpdk|socket|uds\",\"display\":\"Driver Type\",\"filter\":\"\",\"name\":\"driverType\",\"type\":\"string\",\"value\":\"host\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"IPv4\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"IPv4 Address List\",\"filter\":\"0~8\",\"name\":\"ipv4AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"IPv6 Address List\",\"filter\":\"0~8\",\"name\":\"ipv6AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MAC Address\",\"filter\":\"\",\"name\":\"macAddr\",\"type\":\"string\",\"value\":\"00:00:00:00:00:00\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface PCI\",\"filter\":\"\",\"name\":\"interfacePCI\",\"type\":\"string\",\"value\":\"0000:00:00.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Network Card Name\",\"filter\":\"\",\"name\":\"systemNetworkCardName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"null|bak|sub|xor|round|lacp\",\"display\":\"Bond Type\",\"filter\":\"\",\"name\":\"bondType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Bond ID\",\"filter\":\"0~32\",\"name\":\"bondId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD TX Interval Ms\",\"filter\":\"\",\"name\":\"bfdTxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD RX Interval Ms\",\"filter\":\"\",\"name\":\"bfdRxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"default\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv4\",\"filter\":\"\",\"name\":\"bfdGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv6\",\"filter\":\"\",\"name\":\"bfdGatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MTU\",\"filter\":\"0~65535\",\"name\":\"mtu\",\"type\":\"int\",\"value\":\"1500\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Src Port\",\"filter\":\"1~65535\",\"name\":\"udpSrcPort\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Listen Port\",\"filter\":\"0~65536\",\"name\":\"udpListenPort\",\"type\":\"int\",\"value\":\"2152\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Local File Full Path\",\"filter\":\"\",\"name\":\"udsLocalFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Remote File Full Path\",\"filter\":\"\",\"name\":\"udsRemoteFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Detection Type\",\"filter\":\"0~1\",\"name\":\"linkDetectionType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NAT Interface ID\",\"filter\":\"0~1\",\"name\":\"natInterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv4 Pool List\",\"filter\":\"1~32\",\"name\":\"gtpuRemoteIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"gtpuRemoteIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPU Signaling Handle\",\"filter\":\"0~1\",\"name\":\"gtpuSignalingHandle\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMS Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"imsDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"dataDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inner DSCP Value Map\",\"filter\":\"0~1\",\"name\":\"innerDSCPValueMap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Support Speed Mbps\",\"filter\":\"0~65536\",\"name\":\"maxSupportSpeedMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkRxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkTxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkRxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkTxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK Workers\",\"filter\":\"\",\"name\":\"dpdkworkers\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1689, 'UPF', '', 'networkControlCommon', 'Network Control Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Disabled\",\"filter\":\"0~1\",\"name\":\"localSwitchDisabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TCP Sync Per Second\",\"filter\":\"\",\"name\":\"maxTCPSyncPerSecond\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF Max Support Mbps\",\"filter\":\"\",\"name\":\"upfMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dscp Inner Mapping\",\"filter\":\"\",\"name\":\"dscpInnerMapping\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1690, 'UPF', '', 'networkControlDnnList', 'Network Control DNN List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Header Enrich Info List\",\"filter\":\"0~32\",\"name\":\"headerEnrichInfoList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Check\",\"filter\":\"0~1\",\"name\":\"localSwitchCheck\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"UE IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"UE IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"Dst Server IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"Dst Server IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"Gateway IP Type\",\"filter\":\"\",\"name\":\"gatewayIpType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv4\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv6\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv6\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1691, 'UPF', '', 'networkControlSnssaiList', 'Network Control SNSSAI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1692, 'UPF', '', 'networkControlAclWhiteList', 'Network Control ACL White List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]}'); -INSERT INTO `param_config` VALUES (1693, 'UPF', '', 'networkControlAclBlackList', 'Network Control ACL Black List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]}'); -INSERT INTO `param_config` VALUES (1694, 'UPF', '', 'networkControlDnsServerList', 'Network Control DNS Server List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1\",\"display\":\"Enabled\",\"filter\":\"0~1\",\"name\":\"enabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNS Name\",\"filter\":\"\",\"name\":\"dnsName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv4\",\"filter\":\"\",\"name\":\"serverIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6\",\"filter\":\"\",\"name\":\"serverIpv6\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1695, 'UPF', '', 'dpiCommon', 'DPI Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Detect Packet Num\",\"filter\":\"\",\"name\":\"maxDetectPacketNum\",\"type\":\"int\",\"value\":\"20\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1696, 'UPF', '', 'dpiHeaderEnrichInfoList', 'DPI Header Enrich Info List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1697, 'UPF', '', 'dpiAppList', 'DPI APP List', '', '{\"array\":[{\"access\":\"read-write\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP Name\",\"filter\":\"\",\"name\":\"appName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Proxy Enabled\",\"filter\":\"0~1\",\"name\":\"proxyEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Force Check Type\",\"filter\":\"0~1\",\"name\":\"forceCheckType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"\",\"name\":\"ruleId\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"REGEX Match\",\"filter\":\"\",\"name\":\"regexMatch\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Custom Name\",\"filter\":\"\",\"name\":\"customName\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Rule List\",\"filter\":\"0~32\",\"name\":\"ruleList\",\"type\":\"int\",\"value\":\"1\"}]}'); - --- IMS 更新时间2024/06/26 14.41 -INSERT INTO `param_config` VALUES (1700, 'IMS', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"ims-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MCC\",\"filter\":\"\",\"name\":\"hplmnMCC\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MNC\",\"filter\":\"\",\"name\":\"hplmnMNC\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Network IPv4\",\"filter\":\"\",\"name\":\"LocalNetworkIPv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv6\",\"filter\":\"\",\"name\":\"serviceIPv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 1\",\"filter\":\"\",\"name\":\"domainName1\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 2\",\"filter\":\"\",\"name\":\"domainName2\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 3\",\"filter\":\"\",\"name\":\"domainName3\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 4\",\"filter\":\"\",\"name\":\"domainName4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MultiIPStack Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"multiIPStackInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register Timer\",\"filter\":\"120~1000000\",\"name\":\"registerTimer\",\"type\":\"int\",\"value\":\"7200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Call Duration\",\"filter\":\"1800~1000000\",\"name\":\"maxCallDuration\",\"type\":\"int\",\"value\":\"43200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal SMS Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalSMSInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal CDR Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalCDRInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal KPI Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalKPIInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF IP Address\",\"filter\":\"\",\"name\":\"pcfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"}]}'); -INSERT INTO `param_config` VALUES (1701, 'IMS', '', 'plmn', 'PLMN List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"^[0-9]{3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^[0-9]{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"01\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain\",\"filter\":\"0~128\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1702, 'IMS', '', 'mmtel_dialplan', 'MMTEL Dialplan', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NaName\",\"filter\":\"0~128\",\"name\":\"naName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Title\",\"filter\":\"0~128\",\"name\":\"title\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"0-2\",\"name\":\"method\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~128\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start\",\"filter\":\"0~128\",\"name\":\"start\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End\",\"filter\":\"0~128\",\"name\":\"end\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Attrib\",\"filter\":\"0~128\",\"name\":\"attrib\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Len\",\"filter\":\"0~128\",\"name\":\"numberLen\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rsc\",\"filter\":\"0~128\",\"name\":\"rsc\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Nai\",\"filter\":\"0~128\",\"name\":\"e164Nai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Delete\",\"filter\":\"0~128\",\"name\":\"e164Delete\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Insert\",\"filter\":\"0~128\",\"name\":\"e164Insert\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"Enable: Close/Open\",\"display\":\"Admin State\",\"filter\":\"{\\\"0\\\":\\\"Close\\\", \\\"1\\\":\\\"Open\\\"}\",\"name\":\"adminState\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1703, 'IMS', '', 'ds_system', 'DS System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"dispatchSystemInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Transcode Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"transcodeInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System IPv4\",\"filter\":\"\",\"name\":\"dispatchSystemIP\",\"type\":\"ipv4\",\"value\":\"1.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Port\",\"filter\":\"\",\"name\":\"dispatchSystemPort\",\"type\":\"int\",\"value\":\"5060\"}]}'); - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/install/alarm_event.sql b/build/system/usr/local/omc/etc/db/install/alarm_event.sql index 53e499b..fff3294 100644 --- a/build/system/usr/local/omc/etc/db/install/alarm_event.sql +++ b/build/system/usr/local/omc/etc/db/install/alarm_event.sql @@ -21,43 +21,43 @@ SET FOREIGN_KEY_CHECKS = 0; -- Table structure for alarm_event -- ---------------------------- DROP TABLE IF EXISTS `alarm_event`; -CREATE TABLE `alarm_event` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `alarm_seq` int(11) NULL DEFAULT NULL, +CREATE TABLE `alarm_event` ( + `id` int NOT NULL AUTO_INCREMENT, + `alarm_seq` int DEFAULT NULL, `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `ne_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `alarm_code` int(11) NULL DEFAULT NULL, - `event_time` datetime NULL DEFAULT NULL, - `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `orig_severity` enum('Critical','Major','Minor','Warning','Event') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Minor' COMMENT '1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', - `perceived_severity` enum('Critical','Major','Minor','Warning','Event') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', - `pv_flag` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `ne_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `object_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `object_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0', - `object_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `location_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `alarm_status` int(11) NOT NULL DEFAULT 1 COMMENT '0:clear, 1:active', - `specific_problem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `specific_problem_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `add_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `counter` int(11) NULL DEFAULT 0, - `latest_event_time` datetime NULL DEFAULT NULL, - `ack_state` tinyint(4) NULL DEFAULT 0 COMMENT '0: Unacked, 1: Acked', - `ack_time` datetime NULL DEFAULT NULL, - `ack_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `clear_type` tinyint(4) NULL DEFAULT 0 COMMENT '0: Unclear, 1: AutoClear, 2: ManualClear', - `clear_time` datetime NULL DEFAULT NULL, - `clear_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `timestamp` datetime NULL DEFAULT current_timestamp() ON UPDATE CURRENT_TIMESTAMP, + `alarm_code` int DEFAULT NULL, + `event_time` datetime DEFAULT NULL, + `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `orig_severity` enum('Critical','Major','Minor','Warning','Event') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', + `perceived_severity` enum('Critical','Major','Minor','Warning','Event') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)', + `pv_flag` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ne_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `object_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `object_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0', + `object_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `location_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `alarm_status` int NOT NULL DEFAULT '1' COMMENT '0:clear, 1:active', + `specific_problem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `specific_problem_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `add_info` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `counter` int DEFAULT '0', + `latest_event_time` datetime DEFAULT NULL, + `ack_state` tinyint DEFAULT '0' COMMENT '0: Unacked, 1: Acked', + `ack_time` datetime DEFAULT NULL, + `ack_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `clear_type` tinyint DEFAULT '0' COMMENT '0: Unclear, 1: AutoClear, 2: ManualClear', + `clear_time` datetime DEFAULT NULL, + `clear_user` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `timestamp` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `idx_pk_id`(`id`) USING BTREE, - UNIQUE INDEX `idx_uni_aid_ne_aseq`(`ne_type`, `ne_id`, `alarm_id`, `alarm_seq`) USING BTREE, - INDEX `idx_event_time`(`event_time`) USING BTREE, - INDEX `idx_severity_status`(`alarm_status`, `orig_severity`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 228788 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + UNIQUE KEY `idx_pk_id` (`id`) USING BTREE, + UNIQUE KEY `idx_uni_aid_ne_aseq` (`ne_type`,`ne_id`,`alarm_id`,`alarm_seq`) USING BTREE, + KEY `idx_event_time` (`event_time`) USING BTREE, + KEY `idx_severity_status` (`alarm_status`,`orig_severity`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/install/function.sql b/build/system/usr/local/omc/etc/db/install/function.sql index 4dbffac..36ee47d 100644 --- a/build/system/usr/local/omc/etc/db/install/function.sql +++ b/build/system/usr/local/omc/etc/db/install/function.sql @@ -1,16 +1,17 @@ DELIMITER // CREATE FUNCTION IF NOT EXISTS omc_get_dict_value(field_value VARCHAR(255), type VARCHAR(255)) -RETURNS VARCHAR(255) +RETURNS VARCHAR(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci DETERMINISTIC BEGIN DECLARE result VARCHAR(255); SELECT `dict_value` INTO result -FROM `sys_dict_data` -WHERE `dict_label` = field_value AND `dict_type` = type limit 1; +FROM `sys_dict_data` +WHERE `dict_label` = field_value AND `dict_type` = type +LIMIT 1; RETURN result; END // -DELIMITER; \ No newline at end of file +DELIMITER ; \ No newline at end of file diff --git a/build/system/usr/local/omc/etc/db/install/ne_host.sql b/build/system/usr/local/omc/etc/db/install/ne_host.sql index 5f3b28c..59bae62 100644 --- a/build/system/usr/local/omc/etc/db/install/ne_host.sql +++ b/build/system/usr/local/omc/etc/db/install/ne_host.sql @@ -7,57 +7,58 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ne_host`; - -CREATE TABLE `ne_host` ( +CREATE TABLE `ne_host` ( `host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键', - `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机类型 ssh telnet', - `group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '分组(0默认 1网元 2系统)', - `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '标题名称', - `addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址', - `port` int NULL DEFAULT 22 COMMENT 'SSH端口', - `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机用户名', - `auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '认证模式(0密码 1主机私钥 2已免密)', - `password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证密码', - `private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证私钥', - `pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证私钥密码', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '连接类型 ssh telnet redis', + `group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '分组(0默认 1网元 2系统)', + `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '标题名称', + `addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址', + `port` int DEFAULT '22' COMMENT '端口 22 4100 6379', + `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证用户名', + `auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '认证模式(0密码 1主机私钥 2已免密)', + `password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证密码', + `private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥', + `pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥密码', + `db_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '数据库名称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`host_id`) USING BTREE, - UNIQUE INDEX `uk_type_group_title`(`host_type` ASC, `group_id` ASC, `title` ASC) USING BTREE COMMENT '同组内名称唯一' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元主机表' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_group_title` (`host_type`,`group_id`,`title`) USING BTREE COMMENT '同组内名称唯一' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元主机表'; -- 初始数据对应网元 -INSERT INTO `ne_host` VALUES (1, 'ssh', '1', 'OMC_001_22', '127.0.0.1', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (2, 'telnet', '1', 'OMC_001_4100', '127.0.0.1', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (3, 'ssh', '1', 'IMS_001_22', '172.16.5.110', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708314682742, NULL, 0); -INSERT INTO `ne_host` VALUES (4, 'telnet', '1', 'IMS_001_4100', '172.16.5.110', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (5, 'ssh', '1', 'AMF_001_22', '172.16.5.120', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708314682742, NULL, 0); -INSERT INTO `ne_host` VALUES (6, 'telnet', '1', 'AMF_001_4100', '172.16.5.120', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (7, 'ssh', '1', 'AUSF_001_22', '172.16.5.130', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (8, 'telnet', '1', 'AUSF_001_4100', '172.16.5.130', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (9, 'ssh', '1', 'UDM_001_22', '172.16.5.140', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (10, 'telnet', '1', 'UDM_001_4100', '172.16.5.140', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (11, 'ssh', '1', 'SMF_001_22', '172.16.5.150', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (12, 'telnet', '1', 'SMF_001_4100', '172.16.5.150', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (13, 'ssh', '1', 'PCF_001_22', '172.16.5.160', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (14, 'telnet', '1', 'PCF_001_4100', '172.16.5.160', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (15, 'ssh', '1', 'NSSF_001_22', '172.16.5.170', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (16, 'telnet', '1', 'NSSF_001_4100', '172.16.5.170', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (17, 'ssh', '1', 'NRF_001_22', '172.16.5.180', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (18, 'telnet', '1', 'NRF_001_4100', '172.16.5.180', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (19, 'ssh', '1', 'UPF_001_22', '172.16.5.190', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (20, 'telnet', '1', 'UPF_001_4100', '172.16.5.190', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (21, 'telnet', '1', 'UPF_001_5002', '172.16.5.190', 5002, 'admin', '0', '', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (22, 'ssh', '1', 'LMF_001_22', '172.16.5.200', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (23, 'telnet', '1', 'LMF_001_4100', '172.16.5.200', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (24, 'ssh', '1', 'NEF_001_22', '172.16.5.210', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (25, 'telnet', '1', 'NEF_001_4100', '172.16.5.210', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (26, 'ssh', '1', 'MME_001_22', '172.16.5.220', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (27, 'telnet', '1', 'MME_001_4100', '172.16.5.220', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (28, 'ssh', '1', 'N3IWF_001_22', '172.16.5.230', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (29, 'telnet', '1', 'N3IWF_001_4100', '172.16.5.230', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); +INSERT INTO `ne_host` VALUES (1, 'ssh', '1', 'OMC_001_22', '127.0.0.1', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (2, 'telnet', '1', 'OMC_001_4100', '127.0.0.1', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (3, 'ssh', '1', 'IMS_001_22', '172.16.5.110', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (4, 'telnet', '1', 'IMS_001_4100', '172.16.5.110', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (5, 'ssh', '1', 'AMF_001_22', '172.16.5.120', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (6, 'telnet', '1', 'AMF_001_4100', '172.16.5.120', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (7, 'ssh', '1', 'AUSF_001_22', '172.16.5.130', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (8, 'telnet', '1', 'AUSF_001_4100', '172.16.5.130', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (9, 'ssh', '1', 'UDM_001_22', '172.16.5.140', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (10, 'telnet', '1', 'UDM_001_4100', '172.16.5.140', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (11, 'redis', '1', 'UDM_001_6379', '172.16.5.140', 6379, 'udmdb', '0', 'nO3fEhtuKuBkQE5ozsUhNfzn02vhnyxYTEiPn2CIlr4=', '', '', '0', '', 'supervisor', 1728989383529, 'supervisor', 1729065073516); +INSERT INTO `ne_host` VALUES (12, 'ssh', '1', 'SMF_001_22', '172.16.5.150', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (13, 'telnet', '1', 'SMF_001_4100', '172.16.5.150', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (14, 'ssh', '1', 'PCF_001_22', '172.16.5.160', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (15, 'telnet', '1', 'PCF_001_4100', '172.16.5.160', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (16, 'ssh', '1', 'NSSF_001_22', '172.16.5.170', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (17, 'telnet', '1', 'NSSF_001_4100', '172.16.5.170', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (18, 'ssh', '1', 'NRF_001_22', '172.16.5.180', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (19, 'telnet', '1', 'NRF_001_4100', '172.16.5.180', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (20, 'ssh', '1', 'UPF_001_22', '172.16.5.190', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (21, 'telnet', '1', 'UPF_001_4100', '172.16.5.190', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (22, 'telnet', '1', 'UPF_001_5002', '172.16.5.190', 5002, 'admin', '0', '', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (23, 'ssh', '1', 'LMF_001_22', '172.16.5.200', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (24, 'telnet', '1', 'LMF_001_4100', '172.16.5.200', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (25, 'ssh', '1', 'NEF_001_22', '172.16.5.210', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (26, 'telnet', '1', 'NEF_001_4100', '172.16.5.210', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (27, 'ssh', '1', 'MME_001_22', '172.16.5.220', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (28, 'telnet', '1', 'MME_001_4100', '172.16.5.220', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (29, 'ssh', '1', 'N3IWF_001_22', '172.16.5.230', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (30, 'telnet', '1', 'N3IWF_001_4100', '172.16.5.230', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); SET FOREIGN_KEY_CHECKS=1; diff --git a/build/system/usr/local/omc/etc/db/install/ne_info.sql b/build/system/usr/local/omc/etc/db/install/ne_info.sql index 797dfb0..9c99e09 100644 --- a/build/system/usr/local/omc/etc/db/install/ne_info.sql +++ b/build/system/usr/local/omc/etc/db/install/ne_info.sql @@ -7,47 +7,44 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ne_info`; - CREATE TABLE `ne_info` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `rm_uid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `port` int NULL DEFAULT 0 COMMENT '端口', - `pv_flag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'PNF' COMMENT '\'PNF\',\'VNF\'', - `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '省份地域', - `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-', - `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ne_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'MAC地址', - `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet,telnet)', - `status` int NULL DEFAULT 0 COMMENT '0离线 1在线 2配置待下发', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `rm_uid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `port` int DEFAULT '0' COMMENT '端口', + `pv_flag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'PNF' COMMENT '''PNF'',''VNF''', + `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '省份地域', + `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-', + `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'MAC地址', + `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet)-来自ne_host表', + `status` int DEFAULT '0' COMMENT '0离线 1在线 2配置待下发', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `ux_netype_neid`(`ne_type` ASC, `ne_id` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元信息表 对应一个网元版本、网元授权、网元主机' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `ux_netype_neid` (`ne_type`,`ne_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元信息表 对应一个网元版本、网元授权、网元主机'; -- 初始网元数据 INSERT INTO `ne_info` VALUES (1, 'OMC', '001', '4400HXOMC001', 'OMC_001', '172.16.5.100', 33030, 'PNF', '-', '-', '-', '-', '1,2', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (2, 'IMS', '001', '4400HXIMS001', 'IMS_001', '172.16.5.110', 33030, 'PNF', '-', '-', '-', '-', '3,4', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (3, 'AMF', '001', '4400HXAMF001', 'AMF_001', '172.16.5.120', 33030, 'PNF', '-', '-', '-', '', '5,6', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (4, 'AUSF', '001', '4400HXAUSF001', 'AUSF_001', '172.16.5.130', 33030, 'PNF', '-', '-', '-', '', '7,8', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (5, 'UDM', '001', '4400HXUDM001', 'UDM_001', '172.16.5.140', 33030, 'PNF', '-', '-', '-', '-', '9,10', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (6, 'SMF', '001', '4400HXSMF001', 'SMF_001', '172.16.5.150', 33030, 'PNF', '-', '-', '-', '-', '11,12', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (7, 'PCF', '001', '4400HXPCF001', 'PCF_001', '172.16.5.160', 33030, 'PNF', '-', '-', '-', '-', '13,14', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (8, 'NSSF', '001', '4400HXNSF001', 'NSSF_001', '172.16.5.170', 33030, 'PNF', '-', '-', '-', '-', '15,16', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (9, 'NRF', '001', '4400HXNRF001', 'NRF_001', '172.16.5.180', 33030, 'PNF', '-', '-', '-', '-', '17,18', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (10, 'UPF', '001', '4400HXUPF001', 'UPF_001', '172.16.5.190', 33030, 'PNF', '-', '-', '-', '', '19,20,21', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (11, 'LMF', '001', '4400HXLMF001', 'LMF_001', '172.16.5.200', 33030, 'PNF', '-', '-', '-', '-', '22,23', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (12, 'NEF', '001', '4400HXNEF001', 'NEF_001', '172.16.5.210', 33030, 'PNF', '-', '-', '-', '-', '24,25', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (13, 'MME', '001', '4400HXMME001', 'MME_001', '172.16.5.220', 33030, 'PNF', '-', '-', '-', '', '26,27', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (14, 'N3IWF', '001', '4400HXN3IWF001', 'N3IWF_001', '172.16.5.230', 33030, 'PNF', '-', '-', '-', '', '28,29', 0, '', '', 0, '', 0); - - +INSERT INTO `ne_info` VALUES (5, 'UDM', '001', '4400HXUDM001', 'UDM_001', '172.16.5.140', 33030, 'PNF', '-', '-', '-', '-', '9,10,11', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (6, 'SMF', '001', '4400HXSMF001', 'SMF_001', '172.16.5.150', 33030, 'PNF', '-', '-', '-', '-', '12,13', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (7, 'PCF', '001', '4400HXPCF001', 'PCF_001', '172.16.5.160', 33030, 'PNF', '-', '-', '-', '-', '14,15', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (8, 'NSSF', '001', '4400HXNSSF001', 'NSSF_001', '172.16.5.170', 33030, 'PNF', '-', '-', '-', '-', '16,17', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (9, 'NRF', '001', '4400HXNRF001', 'NRF_001', '172.16.5.180', 33030, 'PNF', '-', '-', '-', '-', '18,19', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (10, 'UPF', '001', '4400HXUPF001', 'UPF_001', '172.16.5.190', 33030, 'PNF', '-', '-', '-', '', '20,21,22', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (11, 'LMF', '001', '4400HXLMF001', 'LMF_001', '172.16.5.200', 33030, 'PNF', '-', '-', '-', '-', '23,24', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (12, 'NEF', '001', '4400HXNEF001', 'NEF_001', '172.16.5.210', 33030, 'PNF', '-', '-', '-', '-', '25,26', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (13, 'MME', '001', '4400HXMME001', 'MME_001', '172.16.5.220', 33030, 'PNF', '-', '-', '-', '', '27,28', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (14, 'N3IWF', '001', '4400HXN3IWF001', 'N3IWF_001', '172.16.5.230', 33030, 'PNF', '-', '-', '-', '', '29,30', 0, '', '', 0, '', 0); SET FOREIGN_KEY_CHECKS=1; diff --git a/build/system/usr/local/omc/etc/db/install/ne_license.sql b/build/system/usr/local/omc/etc/db/install/ne_license.sql index 058d3a5..9df0c78 100644 --- a/build/system/usr/local/omc/etc/db/install/ne_license.sql +++ b/build/system/usr/local/omc/etc/db/install/ne_license.sql @@ -7,24 +7,23 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ne_license`; - -CREATE TABLE `ne_license` ( +CREATE TABLE `ne_license` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', `activation_request_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '激活申请代码', - `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '激活授权文件', - `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '序列号', - `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '许可证到期日期', - `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态 0无效 1有效', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '激活授权文件', + `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '序列号', + `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '许可证到期日期', + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态 0无效 1有效', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE COMMENT '唯一网元类型和网元ID' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元授权激活信息' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_id` (`ne_type`,`ne_id`) USING BTREE COMMENT '唯一网元类型和网元ID' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元授权激活信息'; -- 初始数据对应网元 INSERT INTO `ne_license` VALUES (1, 'OMC', '001', '', '', '', '', '0', '', 'supervisor', 1713928436971, '', 0); diff --git a/build/system/usr/local/omc/etc/db/install/ne_version.sql b/build/system/usr/local/omc/etc/db/install/ne_version.sql index d389566..a85a48d 100644 --- a/build/system/usr/local/omc/etc/db/install/ne_version.sql +++ b/build/system/usr/local/omc/etc/db/install/ne_version.sql @@ -7,28 +7,27 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ne_version`; - -CREATE TABLE `ne_version` ( +CREATE TABLE `ne_version` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', - `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '当前包名', - `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '当前版本', - `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '当前软件包', - `pre_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '上一版本包名', - `pre_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '上一版本', - `pre_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '上一版本软件包', - `new_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '新版本报名', - `new_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '新版本', - `new_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '新版软件包', - `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '当前状态 0无 1当前版本 2上一版本 3有新版本', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前包名', + `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前版本', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '当前软件包', + `pre_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '上一版本包名', + `pre_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '上一版本', + `pre_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '上一版本软件包', + `new_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '新版本报名', + `new_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '新版本', + `new_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '新版软件包', + `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '当前状态 0无 1当前版本 2上一版本 3有新版本', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE COMMENT '唯一网元类型和ID' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元版本信息' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_id` (`ne_type`,`ne_id`) USING BTREE COMMENT '唯一网元类型和ID' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元版本信息'; -- 初始数据对应网元 INSERT INTO `ne_version` VALUES (1, 'OMC', '001', '', '', '', '', '', '', '', '', '', '0', 'supervisor', 1713928436957, '', 0); diff --git a/build/system/usr/local/omc/etc/db/install/sys_config.sql b/build/system/usr/local/omc/etc/db/install/sys_config.sql index 2221855..c6c43b5 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_config.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_config.sql @@ -41,6 +41,7 @@ INSERT INTO `sys_config` VALUES (107, 'config.sys.copyright', 'sys.copyright', ' INSERT INTO `sys_config` VALUES (108, 'config.sys.i18nOpen', 'sys.i18n.open', 'true', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nOpenRemark'); INSERT INTO `sys_config` VALUES (109, 'config.sys.i18nDefault', 'sys.i18n.default', 'en_US', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nDefaultRemark'); INSERT INTO `sys_config` VALUES (110, 'config.sys.lockTime', 'sys.lockTime', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.lockTimeRemark'); +INSERT INTO `sys_config` VALUES (111, 'config.sys.homePage', 'sys.homePage', 'configManage/neOverview/index', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.homePageRemark'); UNLOCK TABLES; diff --git a/build/system/usr/local/omc/etc/db/install/sys_dict_data0.sql b/build/system/usr/local/omc/etc/db/install/sys_dict_data0.sql index 5cb1e9d..4382e14 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_dict_data0.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_dict_data0.sql @@ -49,36 +49,36 @@ INSERT INTO `sys_dict_data` VALUES (21, 6, 'dictData.operType.export', '5', 'sys INSERT INTO `sys_dict_data` VALUES (22, 7, 'dictData.operType.import', '6', 'sys_oper_type', NULL, 'orange', '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (23, 8, 'dictData.operType.forced quit', '7', 'sys_oper_type', NULL, 'default', '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (24, 9, 'dictData.operType.clear', '8', 'sys_oper_type', NULL, '#f50', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (25, 1, 'dictData.trace.interface', 'Interface', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (26, 2, 'dictData.trace.device', 'Device', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (27, 3, 'dictData.trace.user', 'UE', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (28, 1, 'dictData.logType.download', 'DOWNLOAD', 'operation_log_type', NULL, 'pink', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (29, 2, 'dictData.logType.activation', 'Activation', 'operation_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (30, 3, 'dictData.logType.add', 'ADD', 'operation_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (31, 4, 'dictData.logType.other', 'AUTO', 'operation_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (32, 5, 'dictData.logType.back', 'BACK', 'operation_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (33, 6, 'dictData.logType.delete', 'DELETE', 'operation_log_type', NULL, 'red', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (34, 7, 'dictData.logType.distribute', 'Distribute', 'operation_log_type', NULL, 'yellow', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (35, 8, 'dictData.logType.export', 'EXPORT', 'operation_log_type', NULL, 'green', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (36, 9, 'dictData.logType.query', 'SELECT', 'operation_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (37, 10, 'dictData.logType.setup', 'SET', 'operation_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (38, 11, 'dictData.logType.update', 'UPDATE', 'operation_log_type', NULL, 'magenta', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (39, 12, 'dictData.logType.upload', 'UPLOAD', 'operation_log_type', NULL, 'yellow', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (40, 13, 'dictData.logType.view', 'View', 'operation_log_type', NULL, 'purple', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (41, 14, 'dictData.logType.login', '0', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (42, 15, 'dictData.logType.logout', '1', 'security_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (43, 1, 'dictData.securityLogType.add', '2', 'security_log_type', NULL, 'green', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (44, 2, 'dictData.securityLogType.update', '3', 'security_log_type', NULL, 'lime', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (45, 3, 'dictData.securityLogType.delete', '4', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (46, 4, 'dictData.securityLogType.lock', '5', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (47, 5, 'dictData.securityLogType.unlock', '6', 'security_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (48, 6, 'dictData.securityLogType.reset', '7', 'security_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (49, 7, 'dictData.securityLogType.deactivate', '8', 'security_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (25, 1, 'dictData.trace.interface', '1', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (26, 2, 'dictData.trace.device', '2', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (27, 3, 'dictData.trace.user', '3', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (28, 1, 'dictData.logType.download', 'DOWNLOAD', 'operation_log_type', NULL, 'pink', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (29, 2, 'dictData.logType.activation', 'Activation', 'operation_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (30, 3, 'dictData.logType.add', 'ADD', 'operation_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (31, 4, 'dictData.logType.other', 'AUTO', 'operation_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (32, 5, 'dictData.logType.back', 'BACK', 'operation_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (33, 6, 'dictData.logType.delete', 'DELETE', 'operation_log_type', NULL, 'red', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (34, 7, 'dictData.logType.distribute', 'Distribute', 'operation_log_type', NULL, 'yellow', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (35, 8, 'dictData.logType.export', 'EXPORT', 'operation_log_type', NULL, 'green', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (36, 9, 'dictData.logType.query', 'SELECT', 'operation_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (37, 10, 'dictData.logType.setup', 'SET', 'operation_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (38, 11, 'dictData.logType.update', 'UPDATE', 'operation_log_type', NULL, 'magenta', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (39, 12, 'dictData.logType.upload', 'UPLOAD', 'operation_log_type', NULL, 'yellow', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (40, 13, 'dictData.logType.view', 'View', 'operation_log_type', NULL, 'purple', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (41, 14, 'dictData.logType.login', '0', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (42, 15, 'dictData.logType.logout', '1', 'security_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (43, 1, 'dictData.securityLogType.add', '2', 'security_log_type', NULL, 'green', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (44, 2, 'dictData.securityLogType.update', '3', 'security_log_type', NULL, 'lime', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (45, 3, 'dictData.securityLogType.delete', '4', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (46, 4, 'dictData.securityLogType.lock', '5', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (47, 5, 'dictData.securityLogType.unlock', '6', 'security_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (48, 6, 'dictData.securityLogType.reset', '7', 'security_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (49, 7, 'dictData.securityLogType.deactivate', '8', 'security_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (50, 8, 'dictData.jobSaveLog.no', '0', 'sys_job_save_log', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (51, 9, 'dictData.jobSaveLog.yes', '1', 'sys_job_save_log', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (52, 1, 'dictData.neVersionStatus.upload', 'Uploaded', 'ne_version_status', NULL, 'processing', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (53, 2, 'dictData.neVersionStatus.inactive', 'Inactive', 'ne_version_status', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (54, 3, 'dictData.neVersionStatus.active', 'Active', 'ne_version_status', NULL, 'success', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (52, 1, 'dictData.neVersionStatus.upload', 'Uploaded', 'ne_version_status', NULL, 'processing', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (53, 2, 'dictData.neVersionStatus.inactive', 'Inactive', 'ne_version_status', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (54, 2, 'dictData.ne_host_type.redis', 'redis', 'ne_host_type', '', 'magenta', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (55, 1, 'dictData.alarmStatus.history', '0', 'alarm_status', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (56, 2, 'dictData.alarmStatus.active', '1', 'alarm_status', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (57, 1, 'dictData.datascope.all', '1', 'sys_role_datascope', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); @@ -133,8 +133,8 @@ INSERT INTO `sys_dict_data` VALUES (105, 17, 'dictData.cdr_sip_code.202', '202', INSERT INTO `sys_dict_data` VALUES (106, 3, 'dictData.cdr_call_type.sms', 'sms', 'cdr_call_type', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (107, 9, 'dictData.cdr_sip_code.488', '488', 'cdr_sip_code', '', '', '1', 'supervisor', 1706610000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (108, 0, 'dictData.cdr_sip_code.0', '0', 'cdr_sip_code', '', '', '1', 'supervisor', 1706610000000, '', 0, ''); -INSERT INTO `sys_dict_data` VALUES (109, 0, 'dictData.ne_host_type.ssh', 'ssh', 'ne_host_type', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); -INSERT INTO `sys_dict_data` VALUES (110, 1, 'dictData.ne_host_type.telnet', 'telnet', 'ne_host_type', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (109, 0, 'dictData.ne_host_type.ssh', 'ssh', 'ne_host_type', '', 'blue', '1', 'supervisor', 1706620000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (110, 1, 'dictData.ne_host_type.telnet', 'telnet', 'ne_host_type', '', 'purple', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (111, 0, 'dictData.ne_host_groupId.0', '0', 'ne_host_groupId', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (112, 1, 'dictData.ne_host_groupId.1', '1', 'ne_host_groupId', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (113, 2, 'dictData.ne_host_groupId.2', '2', 'ne_host_groupId', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); @@ -153,9 +153,20 @@ INSERT INTO `sys_dict_data` VALUES (125, 0, 'dictData.ne_version_status.0', '0', INSERT INTO `sys_dict_data` VALUES (126, 1, 'dictData.ne_version_status.1', '1', 'ne_version_status', '', 'success', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, ''); INSERT INTO `sys_dict_data` VALUES (127, 1, 'dictData.ne_version_status.2', '2', 'ne_version_status', '', 'purple', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, ''); INSERT INTO `sys_dict_data` VALUES (128, 1, 'dictData.ne_version_status.3', '3', 'ne_version_status', '', 'processing', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, ''); --- INSERT INTO `sys_dict_data` VALUES (129, 0, 'dictData.udm_sub_cn_type.0', '0', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); --- INSERT INTO `sys_dict_data` VALUES (130, 1, 'dictData.udm_sub_cn_type.1', '1', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); --- INSERT INTO `sys_dict_data` VALUES (131, 2, 'dictData.udm_sub_cn_type.2', '2', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); --- INSERT INTO `sys_dict_data` VALUES (132, 3, 'dictData.udm_sub_cn_type.3', '3', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (129, 0, 'dictData.cdr_cause_code.0', '0', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (130, 1, 'dictData.cdr_cause_code.8', '8', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (131, 2, 'dictData.cdr_cause_code.10', '10', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (132, 10, 'dictData.cdr_cause_code.21', '21', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (133, 11, 'dictData.cdr_cause_code.22', '22', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (134, 12, 'dictData.cdr_cause_code.27', '27', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (135, 13, 'dictData.cdr_cause_code.28', '28', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (136, 14, 'dictData.cdr_cause_code.29', '29', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (137, 15, 'dictData.cdr_cause_code.30', '30', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (138, 16, 'dictData.cdr_cause_code.38', '38', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (139, 20, 'dictData.cdr_cause_code.41', '41', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (140, 21, 'dictData.cdr_cause_code.41', '41', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (141, 22, 'dictData.cdr_cause_code.42', '42', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (142, 23, 'dictData.cdr_cause_code.47', '47', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (143, 30, 'dictData.cdr_cause_code.50', '50', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/install/sys_dict_data1_i18n_zh.sql b/build/system/usr/local/omc/etc/db/install/sys_dict_data1_i18n_zh.sql index e1d49f1..e6c8388 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_dict_data1_i18n_zh.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_dict_data1_i18n_zh.sql @@ -78,8 +78,8 @@ INSERT INTO `sys_dict_data` VALUES (1070, 1070, 'menu.ueUser.onlineIMS', 'IMS在 INSERT INTO `sys_dict_data` VALUES (1071, 1071, 'menu.ueUser.onlineUE', 'UE在线信息', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1072, 1072, 'menu.ueUser.base5G', '基站信息', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1073, 1073, 'menu.trace', '跟踪', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1074, 1074, 'menu.trace.task', '跟踪任务', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1075, 1075, 'menu.trace.analysis', '信令分析', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1074, 1074, 'menu.trace.task', '网元跟踪任务', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1075, 1075, 'menu.trace.analysis', '网元跟踪数据', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1076, 1076, 'menu.trace.pcap', '信令抓包', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1077, 1077, 'menu.fault', '监控', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1078, 1078, 'menu.config.backupManageRemark', '备份管理菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -118,11 +118,11 @@ INSERT INTO `sys_dict_data` VALUES (1110, 1110, 'menu.fault.setRemark', '故障 INSERT INTO `sys_dict_data` VALUES (1111, 1111, 'menu.perfRemark', '性能目录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1112, 1112, 'menu.perf.task', '任务管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1113, 1113, 'menu.perf.data', '性能数据', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.report', '性能报表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.kpiOverView', '关键指标概览', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1115, 1115, 'menu.perf.threshold', '性能门限', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '黄金指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '关键指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1117, 1117, 'menu.perf.customTarget', '自定义指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1118, 1118, 'menu.perf.set', '性能通用设置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1118, 1118, 'menu.perf.kpiKeyTarget', '关键指标报表', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1119, 1119, 'menu.mml', 'MML', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1120, 1120, 'menu.mml.ne', '网元操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1121, 1121, 'menu.mml.udm', 'UDM操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -130,11 +130,11 @@ INSERT INTO `sys_dict_data` VALUES (1122, 1122, 'menu.mml.set', 'MML设置', 'i1 INSERT INTO `sys_dict_data` VALUES (1123, 1123, 'menu.mml.omc', 'OMC操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1124, 1124, 'menu.perf.taskRemark', '任务管理菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1125, 1125, 'menu.perf.dataRemark', '性能数据菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.reportRemark', '性能报表菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.kpiOverViewRemark', '性能报表菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1127, 1127, 'menu.perf.thresholdRemark', '性能门限菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1128, 1128, 'menu.perf.kpiRemark', '黄金指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1129, 1129, 'menu.perf.customTargetRemark', '自定义指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1130, 1130, 'menu.perf.setRemark', '性能通用设置菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1130, 1130, 'menu.perf.setRemark', '性能通用设置菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1131, 1131, 'menu.mmlRemark', 'MML管理目录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1132, 1132, 'menu.mml.neRemark', '网元操作菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1133, 1133, 'menu.mml.udmRemark', '网元UDM用户数据菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -188,28 +188,28 @@ INSERT INTO `sys_dict_data` VALUES (1423, 1423, 'dictData.operType.clear', '清 INSERT INTO `sys_dict_data` VALUES (1424, 1424, 'dictData.trace.interface', '接口跟踪', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1425, 1425, 'dictData.trace.device', '设备跟踪', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1426, 1426, 'dictData.trace.user', '用户跟踪', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1427, 1427, 'dictData.logType.download', '下载', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1428, 1428, 'dictData.logType.activation', '激活', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1429, 1429, 'dictData.logType.add', '新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1430, 1430, 'dictData.logType.other', '其他', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1431, 1431, 'dictData.logType.back', '回退', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1432, 1432, 'dictData.logType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1433, 1433, 'dictData.logType.distribute', '分配', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1434, 1434, 'dictData.logType.export', '导出', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1435, 1435, 'dictData.logType.query', '查询', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1436, 1436, 'dictData.logType.setup', '设置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1437, 1437, 'dictData.logType.update', '更新', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1438, 1438, 'dictData.logType.upload', '上传', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1439, 1439, 'dictData.logType.view', '查看', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1440, 1440, 'dictData.logType.login', '登录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1441, 1441, 'dictData.logType.logout', '登出', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1442, 1442, 'dictData.securityLogType.add', '新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1443, 1443, 'dictData.securityLogType.update', '更新', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1444, 1444, 'dictData.securityLogType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1445, 1445, 'dictData.securityLogType.lock', '锁定', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1446, 1446, 'dictData.securityLogType.unlock', '解锁', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1447, 1447, 'dictData.securityLogType.reset', '重置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1448, 1448, 'dictData.securityLogType.deactivate', '停用', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1427, 1427, 'dictData.logType.download', '下载', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1428, 1428, 'dictData.logType.activation', '激活', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1429, 1429, 'dictData.logType.add', '新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1430, 1430, 'dictData.logType.other', '其他', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1431, 1431, 'dictData.logType.back', '回退', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1432, 1432, 'dictData.logType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1433, 1433, 'dictData.logType.distribute', '分配', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1434, 1434, 'dictData.logType.export', '导出', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1435, 1435, 'dictData.logType.query', '查询', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1436, 1436, 'dictData.logType.setup', '设置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1437, 1437, 'dictData.logType.update', '更新', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1438, 1438, 'dictData.logType.upload', '上传', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1439, 1439, 'dictData.logType.view', '查看', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1440, 1440, 'dictData.logType.login', '登录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1441, 1441, 'dictData.logType.logout', '登出', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1442, 1442, 'dictData.securityLogType.add', '新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1443, 1443, 'dictData.securityLogType.update', '更新', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1444, 1444, 'dictData.securityLogType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1445, 1445, 'neHost.banNE', '禁止操作网元', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (1446, 1446, 'dictData.ne_host_type.redis', 'Redis', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (1447, 1447, 'menu.tools.ping', '网络探测测试', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (1448, 1448, 'menu.tools.iperf', '网络性能测试', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1449, 1449, 'dictData.jobSaveLog.no', '不记录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1450, 1450, 'dictData.jobSaveLog.yes', '记录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1451, 1451, 'dictData.neVersionStatus.upload', '已上传', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -239,9 +239,9 @@ INSERT INTO `sys_dict_data` VALUES (1505, 1505, 'dictType.sys_yes_no', '系统 INSERT INTO `sys_dict_data` VALUES (1506, 1506, 'dictType.sys_oper_type', '操作类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1507, 1507, 'dictType.sys_common_status', '系统状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1508, 1508, 'dictType.trace_type', '跟踪类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1509, 1509, 'dictType.operation_log_type', '操作日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1509, 1509, 'menu.tools.ps', '进程运行程序', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1510, 1510, 'dictType.alarm_status', '告警日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1511, 1511, 'dictType.security_log_type', '安全日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1511, 1511, 'menu.tools.net', '进程网络连接', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1512, 1512, 'dictType.ne_version_status', '网元软件版本状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1513, 1513, 'dictType.i18n_en', '多语言-英文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1514, 1514, 'dictType.i18n_zh', '多语言-中文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -254,9 +254,9 @@ INSERT INTO `sys_dict_data` VALUES (1520, 1520, 'dictType.sys_yes_no_remark', ' INSERT INTO `sys_dict_data` VALUES (1521, 1521, 'dictType.sys_oper_type_remark', '操作类型列表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1522, 1522, 'dictType.sys_common_status_remark', '登录状态列表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1523, 1523, 'dictType.trace_type_remark', '跟踪类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1524, 1524, 'dictType.operation_log_type_remark', '操作日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1525, 1525, 'dictType.alarm_status_remark', '告警日志状态类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1526, 1526, 'dictType.security_log_type_remark', '安全日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1524, 1524, 'dictType.alarm_status_remark', '告警日志状态类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1525, 1525, 'menu.trace.tshark', '信令分析', 'i18n_zh', '', '', '1', 'supervisor', 1727085393370, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (1526, 1526, 'menu.trace.wireshark', '信令跟踪', 'i18n_zh', '', '', '1', 'supervisor', 1727085393370, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1527, 1527, 'dictType.ne_version_status_remark', '网元软件版本状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1528, 1528, 'dictType.i18n_en_remark', 'Internationalization - English', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1529, 1529, 'dictType.i18n_zh_remark', 'Internationalization - Chinese', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -309,7 +309,7 @@ INSERT INTO `sys_dict_data` VALUES (1657, 1657, 'config..export.value', '参数 INSERT INTO `sys_dict_data` VALUES (1658, 1658, 'config..export.type', '系统内置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1659, 1659, 'config..export.remark', '参数说明', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1660, 1660, 'config.sys.titleValue', 'AGrand EMS', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2023 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2024 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1662, 1662, 'config.noData', '没有可访问参数配置数据!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1663, 1663, 'config.errKey', '无效 key', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1664, 1664, 'config.errValueEq', '变更状态与旧值相等!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -591,7 +591,7 @@ INSERT INTO `sys_dict_data` VALUES (2080, 2080, 'log.operate.title.ws', 'WS会 INSERT INTO `sys_dict_data` VALUES (2081, 2081, 'log.operate.title.neHost', '网元主机', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2082, 2082, 'neHost.noData', '没有可访问主机信息数据!', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2083, 2083, 'neHost.errKeyExists', '主机信息操作【{name}】失败,同组内名称已存在', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -INSERT INTO `sys_dict_data` VALUES (2084, 2084, 'neHost.errByHostInfo', '连接主机失败,请检查连接参数后重试', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2084, 2084, 'neHost.errByHostInfo', '连接失败,请检查连接参数后重试', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2085, 2085, 'dictType.ne_host_type', '网元主机连接类型', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2086, 2086, 'dictType.ne_host_groupId', '网元主机分组', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2087, 2087, 'dictType.ne_host_authMode', '网元主机认证模式', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -602,7 +602,7 @@ INSERT INTO `sys_dict_data` VALUES (2091, 2091, 'dictData.ne_host_groupId.1', ' INSERT INTO `sys_dict_data` VALUES (2092, 2092, 'dictData.ne_host_groupId.2', '系统', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2093, 2093, 'dictData.ne_host_authMode.0', '密码认证', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2094, 2094, 'dictData.ne_host_authMode.1', '私钥认证', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -INSERT INTO `sys_dict_data` VALUES (2095, 2095, 'menu.tools.terminal', '网元主机终端', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2095, 2095, 'menu.tools.terminal', '主机终端', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2096, 2096, 'menu.ne.neHost', '网元主机', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2097, 2097, 'menu.ne.neHostCommand', '网元主机命令', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2098, 2098, 'log.operate.title.neHostCmd', '网元主机命令', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -656,8 +656,8 @@ INSERT INTO `sys_dict_data` VALUES (2145, 2145, 'menu.system.user.editPost', ' INSERT INTO `sys_dict_data` VALUES (2146, 2146, 'menu.dashboard.smscCDR', '短信话单', 'i18n_zh', '', '', '1', 'supervisor', 1717051745866, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2147, 2147, 'log.operate.title.smscCDR', '短信话单', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2148, 2148, 'menu.trace.pcapFile', '信令抓包文件', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); --- INSERT INTO `sys_dict_data` VALUES (2149, 2149, 'dictData.udm_sub_cn_type.2', '4G', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); --- INSERT INTO `sys_dict_data` VALUES (2150, 2150, 'dictData.udm_sub_cn_type.3', '5G&4G', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2149, 2149, 'menu.trace.taskAnalyze', '跟踪数据分析', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2150, 2150, 'job.ne_data_udm', '网元数据-UDM数据刷新同步', 'i18n_zh', '', '', '1', 'supervisor', 1730173767412, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2151, 2151, 'menu.system.setting.doc', '系统使用文档', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2152, 2152, 'menu.system.setting.official', '官网链接', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2153, 2153, 'menu.system.setting.lock', '锁屏操作', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -671,5 +671,29 @@ INSERT INTO `sys_dict_data` VALUES (2160, 2160, 'table.sys_log_operate', '操作 INSERT INTO `sys_dict_data` VALUES (2161, 2161, 'table.cdr_event_ims', '语音话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2162, 2162, 'table.cdr_event_smf', '数据话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2163, 2163, 'table.cdr_event_smsc', '短信话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2164, 2164, 'menu.log.exportFile', '导出文件管理', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2165, 2165, 'menu.perf.kpiCReport', '自定义指标数据', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2166, 2166, 'menu.trace.taskHLR', 'HLR 跟踪任务', 'i18n_zh', '', '', '1', 'supervisor', 1726626822538, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2167, 2167, 'dictType.cdr_cause_code', 'CDR 响应原因代码类别类型', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2168, 2168, 'dictData.cdr_cause_code.0', '未知错误', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2169, 2169, 'dictData.cdr_cause_code.8', '运营者要求禁止', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2170, 2170, 'dictData.cdr_cause_code.10', '呼叫禁止', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2171, 2171, 'dictData.cdr_cause_code.21', '短信传输拒绝', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2172, 2172, 'dictData.cdr_cause_code.22', '内存超限', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2173, 2173, 'dictData.cdr_cause_code.27', '目的地出错', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2174, 2174, 'dictData.cdr_cause_code.28', '用户身份不明', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2175, 2175, 'dictData.cdr_cause_code.29', '功能拒绝错误', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2176, 2176, 'dictData.cdr_cause_code.30', '未知用户', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2177, 2177, 'dictData.cdr_cause_code.38', '网络出错', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2178, 2178, 'dictData.cdr_cause_code.41', '临时错误', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +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 (2184, 2184, 'config.sys.homePage', '自定义主页', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2185, 2185, 'config.sys.homePageRemark', '选择列表中的任一页面作为主页路径', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2186, 2186, 'menu.config.neOverview', '网元概览', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2187, 2187, 'menu.config.neOverviewRemark', '显示所有网元状态配置和license等概览信息', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/install/sys_dict_data2_i18n_en.sql b/build/system/usr/local/omc/etc/db/install/sys_dict_data2_i18n_en.sql index 8d72e76..dd59fa1 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_dict_data2_i18n_en.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_dict_data2_i18n_en.sql @@ -78,8 +78,8 @@ INSERT INTO `sys_dict_data` VALUES (3070, 3070, 'menu.ueUser.onlineIMS', 'IMS On INSERT INTO `sys_dict_data` VALUES (3071, 3071, 'menu.ueUser.onlineUE', 'UE Online Information', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3072, 3072, 'menu.ueUser.base5G', 'Radio Information', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3073, 3073, 'menu.trace', 'Trace', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3074, 3074, 'menu.trace.task', 'Trace Tasks', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); -INSERT INTO `sys_dict_data` VALUES (3075, 3075, 'menu.trace.analysis', 'Signaling Analysis', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); +INSERT INTO `sys_dict_data` VALUES (3074, 3074, 'menu.trace.task', 'NE Trace Task', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); +INSERT INTO `sys_dict_data` VALUES (3075, 3075, 'menu.trace.analysis', 'NE Trace Task Data', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); INSERT INTO `sys_dict_data` VALUES (3076, 3076, 'menu.trace.pcap', 'Signaling Capture', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3077, 3077, 'menu.fault', 'Monitor', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3078, 3078, 'menu.config.backupManageRemark', 'Backup Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -118,11 +118,11 @@ INSERT INTO `sys_dict_data` VALUES (3110, 3110, 'menu.fault.setRemark', 'Fault G INSERT INTO `sys_dict_data` VALUES (3111, 3111, 'menu.perfRemark', 'Performance Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3112, 3112, 'menu.perf.task', 'Performance Tasks', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); INSERT INTO `sys_dict_data` VALUES (3113, 3113, 'menu.perf.data', 'Performance Data', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); -INSERT INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.report', 'Performance Reports', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.kpiOverView', 'Key Performance Overview', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3115, 3115, 'menu.perf.threshold', 'Performance Thresholds', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3116, 3116, 'menu.perf.kpi', 'Key Performance Indicators', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3117, 3117, 'menu.perf.customTarget', 'Custom Metrics', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3118, 3118, 'menu.perf.set', 'Performance General Settings', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3117, 3117, 'menu.perf.customTarget', 'Custom Indicator Management', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3118, 3118, 'menu.perf.kpiKeyTarget', 'Key Performance Reports', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3119, 3119, 'menu.mml', 'MML', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3120, 3120, 'menu.mml.ne', 'NE Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3121, 3121, 'menu.mml.udm', 'UDM Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -130,11 +130,11 @@ INSERT INTO `sys_dict_data` VALUES (3122, 3122, 'menu.mml.set', 'MML Settings', INSERT INTO `sys_dict_data` VALUES (3123, 3123, 'menu.mml.omc', 'OMC Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3124, 3124, 'menu.perf.taskRemark', 'Task Management Menu', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); INSERT INTO `sys_dict_data` VALUES (3125, 3125, 'menu.perf.dataRemark', 'Performance Data Menu', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); -INSERT INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.reportRemark', 'Performance Report Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.kpiOverViewRemark', 'Performance Report Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3127, 3127, 'menu.perf.thresholdRemark', 'Performance Threshold Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3128, 3128, 'menu.perf.kpiRemark', 'Key Performance Indicator Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3129, 3129, 'menu.perf.customTargetRemark', 'Custom Metrics Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3130, 3130, 'menu.perf.setRemark', 'Performance General Settings Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3129, 3129, 'menu.perf.customTargetRemark', 'Custom Indicator Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3130, 3130, 'menu.perf.setRemark', 'Performance General Settings Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3131, 3131, 'menu.mmlRemark', 'MML Management Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3132, 3132, 'menu.mml.neRemark', 'Network Element Operations Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3133, 3133, 'menu.mml.udmRemark', 'Network Element UDM User Data Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -188,28 +188,28 @@ INSERT INTO `sys_dict_data` VALUES (3423, 3423, 'dictData.operType.clear', 'Clea INSERT INTO `sys_dict_data` VALUES (3424, 3424, 'dictData.trace.interface', 'Interface Tracing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3425, 3425, 'dictData.trace.device', 'Module Tracing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3426, 3426, 'dictData.trace.user', 'User Tracing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3427, 3427, 'dictData.logType.download', 'Download', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3428, 3428, 'dictData.logType.activation', 'Activation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3429, 3429, 'dictData.logType.add', 'New', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3430, 3430, 'dictData.logType.other', 'Other', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3431, 3431, 'dictData.logType.back', 'Rollback', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3432, 3432, 'dictData.logType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3433, 3433, 'dictData.logType.distribute', 'Assign', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3434, 3434, 'dictData.logType.export', 'Export', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3435, 3435, 'dictData.logType.query', 'Query', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3436, 3436, 'dictData.logType.setup', 'Setup', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3437, 3437, 'dictData.logType.update', 'Update', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3438, 3438, 'dictData.logType.upload', 'Upload', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3439, 3439, 'dictData.logType.view', 'View', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3440, 3440, 'dictData.logType.login', 'Login', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3441, 3441, 'dictData.logType.logout', 'Logout', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3442, 3442, 'dictData.securityLogType.add', 'New', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3443, 3443, 'dictData.securityLogType.update', 'Update', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3444, 3444, 'dictData.securityLogType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3445, 3445, 'dictData.securityLogType.lock', 'Locked', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3446, 3446, 'dictData.securityLogType.unlock', 'Unlock', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3447, 3447, 'dictData.securityLogType.reset', 'Reset', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3448, 3448, 'dictData.securityLogType.deactivate', 'Deactivate', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3427, 3427, 'dictData.logType.download', 'Download', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3428, 3428, 'dictData.logType.activation', 'Activation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3429, 3429, 'dictData.logType.add', 'New', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3430, 3430, 'dictData.logType.other', 'Other', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3431, 3431, 'dictData.logType.back', 'Rollback', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3432, 3432, 'dictData.logType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3433, 3433, 'dictData.logType.distribute', 'Assign', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3434, 3434, 'dictData.logType.export', 'Export', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3435, 3435, 'dictData.logType.query', 'Query', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3436, 3436, 'dictData.logType.setup', 'Setup', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3437, 3437, 'dictData.logType.update', 'Update', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3438, 3438, 'dictData.logType.upload', 'Upload', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3439, 3439, 'dictData.logType.view', 'View', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3440, 3440, 'dictData.logType.login', 'Login', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3441, 3441, 'dictData.logType.logout', 'Logout', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3442, 3442, 'dictData.securityLogType.add', 'New', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3443, 3443, 'dictData.securityLogType.update', 'Update', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3444, 3444, 'dictData.securityLogType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3445, 3445, 'neHost.banNE', 'Do not operate the NE', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (3446, 3446, 'dictData.ne_host_type.redis', 'Redis', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (3447, 3447, 'menu.tools.ping', 'Net Probing Test', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (3448, 3448, 'menu.tools.iperf', 'Net Performance Test', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3449, 3449, 'dictData.jobSaveLog.no', 'No Record', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3450, 3450, 'dictData.jobSaveLog.yes', 'Recorded', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3451, 3451, 'dictData.neVersionStatus.upload', 'Uploaded', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -239,9 +239,9 @@ INSERT INTO `sys_dict_data` VALUES (3505, 3505, 'dictType.sys_yes_no', 'System o INSERT INTO `sys_dict_data` VALUES (3506, 3506, 'dictType.sys_oper_type', 'Operation Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3507, 3507, 'dictType.sys_common_status', 'System Status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3508, 3508, 'dictType.trace_type', 'Trace Types', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3509, 3509, 'dictType.operation_log_type', 'Operation Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3509, 3509, 'menu.tools.ps', 'Process Running Program', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3510, 3510, 'dictType.alarm_status', 'Alarm Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3511, 3511, 'dictType.security_log_type', 'Security Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3511, 3511, 'menu.tools.net', 'Process Net Connection', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3512, 3512, 'dictType.ne_version_status', 'Network element software version status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3513, 3513, 'dictType.i18n_en', 'Multi-language - English', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3514, 3514, 'dictType.i18n_zh', 'Multi-language - Chinese', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -254,9 +254,9 @@ INSERT INTO `sys_dict_data` VALUES (3520, 3520, 'dictType.sys_yes_no_remark', 'S INSERT INTO `sys_dict_data` VALUES (3521, 3521, 'dictType.sys_oper_type_remark', 'Operation type list', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3522, 3522, 'dictType.sys_common_status_remark', 'Login Status List', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3523, 3523, 'dictType.trace_type_remark', 'Trace Types', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3524, 3524, 'dictType.operation_log_type_remark', 'Operation log type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3525, 3525, 'dictType.alarm_status_remark', 'Alarm Log Status Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3526, 3526, 'dictType.security_log_type_remark', 'Security Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3524, 3524, 'dictType.alarm_status_remark', 'Alarm Log Status Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3525, 3525, 'menu.trace.tshark', 'Signaling Analysis', 'i18n_en', '', '', '1', 'supervisor', 1727085393370, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (3526, 3526, 'menu.trace.wireshark', 'Signaling Trace', 'i18n_en', '', '', '1', 'supervisor', 1727085393370, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3527, 3527, 'dictType.ne_version_status_remark', 'Network element software version status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3528, 3528, 'dictType.i18n_en_remark', 'Internationalization - English', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3529, 3529, 'dictType.i18n_zh_remark', 'Internationalization - Chinese', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -309,7 +309,7 @@ INSERT INTO `sys_dict_data` VALUES (3657, 3657, 'config..export.value', 'Config INSERT INTO `sys_dict_data` VALUES (3658, 3658, 'config..export.type', 'Built In', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3659, 3659, 'config..export.remark', 'Config Description', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3660, 3660, 'config.sys.titleValue', 'AGrand EMS', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2023 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2024 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3662, 3662, 'config.noData', 'No parameter configuration data is accessible!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3663, 3663, 'config.errKey', 'Invalid key', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3664, 3664, 'config.errValueEq', 'Change state is equal to the old value!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -325,7 +325,7 @@ INSERT INTO `sys_dict_data` VALUES (3705, 3705, 'job.deleteExpiredAlarmRecordRem INSERT INTO `sys_dict_data` VALUES (3706, 3706, 'job.deleteExpiredKpiRecord', 'Delete expired KPI records', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3707, 3707, 'job.deleteExpiredKpiRecordRemark', 'KPI record retention for {duration} days', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3708, 3708, 'job.backupEtcFromNE', 'Network Element Configuration Auto Backup Task', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3709, 3709, 'job.backupEtcFromNERemark', 'Automatically backs up the configuration files in the network element\'s etc directory.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3709, 3709, 'job.backupEtcFromNERemark', 'Automatically backs up the configuration files in the NE etc directory.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3710, 3710, 'job.export.jobID', 'ID', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3711, 3711, 'job.export.jobName', 'Name', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3712, 3712, 'job.export.jobGroupName', 'Group', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -444,7 +444,7 @@ INSERT INTO `sys_dict_data` VALUES (3933, 3933, 'log.login.export.browser', 'Bro INSERT INTO `sys_dict_data` VALUES (3934, 3934, 'log.login.export.os', 'Operating System', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3935, 3935, 'log.login.export.msg', 'Login Information', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3936, 3936, 'log.login.export.time', 'Login Time', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3937, 3937, 'trace.tcpdump.noData', 'Can\'t find {type} {id} information of the corresponding network element.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3937, 3937, 'trace.tcpdump.noData', 'Can it find {type} {id} information of the corresponding network element.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3938, 3938, 'register.errUsername', 'The account number cannot start with a number, but can contain upper and lower case letters, numbers, and not less than 5 digits.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3939, 3939, 'register.errPasswd', 'The password must contain at least 6 upper and lower case letters, numbers, and special symbols.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3940, 3940, 'register.errPasswdNotEq', 'User confirms password inconsistency', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -591,7 +591,7 @@ INSERT INTO `sys_dict_data` VALUES (4080, 4080, 'log.operate.title.ws', 'WS Sess INSERT INTO `sys_dict_data` VALUES (4081, 4081, 'log.operate.title.neHost', 'NE Host', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4082, 4082, 'neHost.noData', 'There is no accessible host information data!', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4083, 4083, 'neHost.errKeyExists', 'Host information operation [{name}] failed, name already exists in the same group', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -INSERT INTO `sys_dict_data` VALUES (4084, 4084, 'neHost.errByHostInfo', 'Failed to connect to the host, please check the connection parameters and try again', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4084, 4084, 'neHost.errByHostInfo', 'Connection Failed, Please check connection parameters and retry', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4085, 4085, 'dictType.ne_host_type', 'Network element host connection type', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4086, 4086, 'dictType.ne_host_groupId', 'Network element host grouping', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4087, 4087, 'dictType.ne_host_authMode', 'Network element host authentication mode', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -602,7 +602,7 @@ INSERT INTO `sys_dict_data` VALUES (4091, 4091, 'dictData.ne_host_groupId.1', 'N INSERT INTO `sys_dict_data` VALUES (4092, 4092, 'dictData.ne_host_groupId.2', 'System', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4093, 4093, 'dictData.ne_host_authMode.0', 'Password Authentication', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4094, 4094, 'dictData.ne_host_authMode.1', 'Private key authentication', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -INSERT INTO `sys_dict_data` VALUES (4095, 4095, 'menu.tools.terminal', 'NE Host Terminal', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4095, 4095, 'menu.tools.terminal', 'Host Terminal', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4096, 4096, 'menu.ne.neHost', 'NE Host', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4097, 4097, 'menu.ne.neHostCommand', 'NE Host CMD', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4098, 4098, 'log.operate.title.neHostCmd', 'NE Host CMD', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -656,8 +656,8 @@ INSERT INTO `sys_dict_data` VALUES (4145, 4145, 'menu.system.user.editPost', 'Mo INSERT INTO `sys_dict_data` VALUES (4146, 4146, 'menu.dashboard.smscCDR', 'SMS CDR', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4147, 4147, 'log.operate.title.smscCDR', 'SMS CDR', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4148, 4148, 'menu.trace.pcapFile', 'Signaling Capture File', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); --- INSERT INTO `sys_dict_data` VALUES (4149, 4149, 'dictData.udm_sub_cn_type.2', '4G', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); --- INSERT INTO `sys_dict_data` VALUES (4150, 4150, 'dictData.udm_sub_cn_type.3', '5G&4G', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4149, 4149, 'menu.trace.taskAnalyze', 'Tracking Data Analysis', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4150, 4150, 'job.ne_data_udm', 'NE Data Sync UDM', 'i18n_en', '', '', '1', 'supervisor', 1730173767412, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4151, 4151, 'menu.system.setting.doc', 'System User Documentation', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4152, 4152, 'menu.system.setting.official', 'Official Website', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4153, 4153, 'menu.system.setting.lock', 'Lockscreen Operation', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -671,5 +671,29 @@ INSERT INTO `sys_dict_data` VALUES (4160, 4160, 'table.sys_log_operate', 'Operat INSERT INTO `sys_dict_data` VALUES (4161, 4161, 'table.cdr_event_ims', 'Voice CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4162, 4162, 'table.cdr_event_smf', 'Data CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4163, 4163, 'table.cdr_event_smsc', 'SMS CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4164, 4164, 'menu.log.exportFile', 'Exported File Management', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4165, 4165, 'menu.perf.kpiCReport', 'Custom Indicator Data', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4166, 4166, 'menu.trace.taskHLR', 'HLR Trace Task', 'i18n_en', '', '', '1', 'supervisor', 1726626822538, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4167, 4167, 'dictType.cdr_cause_code', 'CDR Response Reason Code Category Type', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4168, 4168, 'dictData.cdr_cause_code.0', 'Unknown Error', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4169, 4169, 'dictData.cdr_cause_code.8', 'OPERATOR_DETERMINED_BARRING', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4170, 4170, 'dictData.cdr_cause_code.10', 'CALL_BARRED', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4171, 4171, 'dictData.cdr_cause_code.21', 'SM Trans Reject', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4172, 4172, 'dictData.cdr_cause_code.22', 'Memory Exceeded', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4173, 4173, 'dictData.cdr_cause_code.27', 'Destination Out Order', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4174, 4174, 'dictData.cdr_cause_code.28', 'Unidentified Subscriber', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4175, 4175, 'dictData.cdr_cause_code.29', 'Facility Reject Error', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4176, 4176, 'dictData.cdr_cause_code.30', 'Unknown Subscriber', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4177, 4177, 'dictData.cdr_cause_code.38', 'Network Out Order', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4178, 4178, 'dictData.cdr_cause_code.41', 'Temp Fail', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +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 (4184, 4184, 'config.sys.homePage', 'Custom Home Page', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4185, 4185, 'config.sys.homePageRemark', 'Select any page in the list as the homepage', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4186, 4186, 'menu.config.neOverview', 'NE Overview', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4187, 4187, 'menu.config.neOverviewRemark', 'Displays overview information such as status, configuration and license of all network elements', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/install/sys_dict_type.sql b/build/system/usr/local/omc/etc/db/install/sys_dict_type.sql index 00130e0..bd46756 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_dict_type.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_dict_type.sql @@ -32,9 +32,9 @@ INSERT INTO `sys_dict_type` VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', INSERT INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_oper_type_remark'); INSERT INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_common_status_remark'); INSERT INTO `sys_dict_type` VALUES (100, 'dictType.trace_type', 'trace_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.trace_type_remark'); -INSERT INTO `sys_dict_type` VALUES (101, 'dictType.operation_log_type', 'operation_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.operation_log_type_remark'); +-- INSERT INTO `sys_dict_type` VALUES (101, 'dictType.operation_log_type', 'operation_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.operation_log_type_remark'); INSERT INTO `sys_dict_type` VALUES (102, 'dictType.alarm_status', 'alarm_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.alarm_status_remark'); -INSERT INTO `sys_dict_type` VALUES (103, 'dictType.security_log_type', 'security_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.security_log_type_remark'); +-- INSERT INTO `sys_dict_type` VALUES (103, 'dictType.security_log_type', 'security_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.security_log_type_remark'); INSERT INTO `sys_dict_type` VALUES (104, 'dictType.ne_version_status', 'ne_version_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.ne_version_status_remark'); INSERT INTO `sys_dict_type` VALUES (105, 'dictType.i18n_en', 'i18n_en', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.i18n_en_remark'); INSERT INTO `sys_dict_type` VALUES (106, 'dictType.i18n_zh', 'i18n_zh', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.i18n_zh_remark'); @@ -55,7 +55,7 @@ INSERT INTO `sys_dict_type` VALUES (120, 'dictType.ne_host_authMode', 'ne_host_a INSERT INTO `sys_dict_type` VALUES (121, 'dictType.ne_host_cmd_groupId', 'ne_host_cmd_groupId', '1', 'supervisor', 1702020000000, '', 0, ''); INSERT INTO `sys_dict_type` VALUES (122, 'dictType.ne_info_status', 'ne_info_status', '1', 'supervisor', 1702020000000, '', 0, ''); INSERT INTO `sys_dict_type` VALUES (123, 'dictType.ne_license_status', 'ne_license_status', '1', 'supervisor', 1702020000000, '', 0, ''); --- INSERT INTO `sys_dict_type` VALUES (124, 'dictType.udm_sub_cn_type', 'udm_sub_cn_type', '1', 'supervisor', 1702020000000, '', 0, ''); +INSERT INTO `sys_dict_type` VALUES (124, 'dictType.cdr_cause_code', 'cdr_cause_code', '1', 'supervisor', 1725877564156, '', 0, ''); UNLOCK TABLES; diff --git a/build/system/usr/local/omc/etc/db/install/sys_job.sql b/build/system/usr/local/omc/etc/db/install/sys_job.sql index 131ad51..79d684c 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_job.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_job.sql @@ -30,6 +30,7 @@ CREATE TABLE `sys_job` ( -- ---------------------------- INSERT INTO `sys_job` VALUES (1, 'job.monitor_sys_resource', 'SYSTEM', 'monitor_sys_resource', '{\"interval\":5}', '0 0/5 * * * ?', '3', '0', '1', '0', 'supervisor', 1698478134839, 'supervisor', 1700571615807, 'job.monitor_sys_resource_remark'); INSERT INTO `sys_job` VALUES (2, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134839, 'supervisor', 1700571615807, 'job.ne_config_backup_remark'); +INSERT INTO `sys_job` VALUES (3, 'job.ne_data_udm', 'SYSTEM', 'ne_data_udm', '', '0 0 0/12 * * ?', '3', '0', '1', '1', 'supervisor', 1730173767412, '', 0, ''); INSERT INTO `sys_job` VALUES (4, 'job.delExpiredNeBackup', 'SYSTEM', 'delExpiredNeBackup', '{\"duration\":60}', '0 20 0 * * ?', '3', '0', '0', '1', 'supervisor', 1698478134840, NULL, 0, 'job.delExpiredNeBackupRemark'); INSERT INTO `sys_job` VALUES (5, 'job.deleteExpiredAlarmRecord', 'SYSTEM', 'deleteExpiredRecord', '{\"duration\":90,\"tableName\":\"alarm\",\"colName\":\"event_time\",\"extras\":\"alarm_status=\'0\'\"}', '0 10 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134841, NULL, 0, 'job.deleteExpiredAlarmRecordRemark'); INSERT INTO `sys_job` VALUES (6, 'job.deleteExpiredKpiRecord', 'SYSTEM', 'deleteExpiredRecord', '{\"duration\":30,\"tableName\":\"gold_kpi\",\"colName\":\"date\"}', '0 15 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'supervisor', 1700570673113, 'job.deleteExpiredKpiRecordRemark'); @@ -37,8 +38,10 @@ INSERT INTO `sys_job` VALUES (7, 'job.backupEtcFromNE', 'SYSTEM', 'backupEtcFrom INSERT INTO `sys_job` VALUES (8, 'job.deleteExpiredNeStateRecord', 'SYSTEM', 'deleteExpiredRecord', '{\"duration\":1,\"tableName\":\"ne_state\",\"colName\":\"timestamp\"}', '0 25 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1703668901929, 'job.deleteExpiredNeStateRecordRemark'); INSERT INTO `sys_job` VALUES (9, 'job.getStateFromNE', 'SYSTEM', 'getStateFromNE', '', '0/10 * * * * ?', '3', '0', '0', '0', 'supervisor', 1698478134842, 'admin', 1713231120503, 'job.getStateFromNERemark'); INSERT 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'); -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 (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\",\"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; diff --git a/build/system/usr/local/omc/etc/db/install/sys_menu.sql b/build/system/usr/local/omc/etc/db/install/sys_menu.sql index afe5370..ce288a7 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_menu.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_menu.sql @@ -49,6 +49,13 @@ CREATE TABLE `sys_menu` ( INSERT INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); INSERT INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); INSERT INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); +INSERT INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1715413568692, 'menu.toolsRemark'); +INSERT INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 20, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); +INSERT INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 8, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); +INSERT INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 9, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); +INSERT INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 4, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); +INSERT INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 6, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); INSERT INTO `sys_menu` VALUES (100, 'menu.security.user', 2113, 1, 'user', 'system/user/index', '1', '1', 'M', '1', '1', 'system:user:list', 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.security.userRemark'); INSERT INTO `sys_menu` VALUES (101, 'menu.security.role', 2113, 3, 'role', 'system/role/index', '1', '1', 'M', '1', '1', 'system:role:list', 'icon-anzhuo', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleRemark'); INSERT INTO `sys_menu` VALUES (102, 'menu.security.roleUser', 2113, 3, 'role/inline/auth-user/:roleId', 'system/role/auth-user', '1', '1', 'M', '0', '1', 'system:role:auth', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleUserRemark'); @@ -123,15 +130,15 @@ INSERT INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', NULL, '1 INSERT INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.authUDMRemark'); INSERT INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.subUDMRemark'); INSERT INTO `sys_menu` VALUES (2075, 'menu.config.neManage', 4, 1, 'neManage', 'configManage/neManage/index', '1', '0', 'M', '1', '0', 'configManage:neManage:index', 'icon-biaoqing', 'supervisor', 1700000000000, NULL, 0, 'menu.config.neManageRemark'); -INSERT INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 3, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.config.backupManageRemark'); +INSERT INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 100, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.config.backupManageRemark'); INSERT INTO `sys_menu` VALUES (2079, 'menu.config.softwareManage', 4, 4, 'softwareManage', 'configManage/softwareManage/index', '1', '0', 'M', '1', '0', 'configManage:softwareManage:index', 'icon-huidingbu', 'supervisor', 1700000000000, NULL, 0, 'menu.config.softwareManageRemark'); INSERT INTO `sys_menu` VALUES (2080, 'menu.ueUser.onlineIMS', 5, 4, 'ims', 'neUser/ims/index', '1', '0', 'M', '1', '1', 'neUser:ims:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.onlineIMSRemark'); INSERT INTO `sys_menu` VALUES (2081, 'menu.ueUser.onlineUE', 5, 6, 'ue', 'neUser/ue/index', '1', '0', 'M', '1', '1', 'neUser:ue:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.onlineUERemark'); INSERT INTO `sys_menu` VALUES (2082, 'menu.ueUser.base5G', 5, 7, 'base5G', 'neUser/base5G/index', '1', '0', 'M', '1', '1', 'neUser:base5G:index', 'icon-paixu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.base5GRemark'); INSERT INTO `sys_menu` VALUES (2083, 'menu.trace', 2087, 30, 'traceManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-paixu', 'supervisor', 1700000000000, NULL, 0, 'menu.traceRemark'); INSERT INTO `sys_menu` VALUES (2084, 'menu.trace.task', 2083, 1, 'task', 'traceManage/task/index', '1', '0', 'M', '0', '1', 'traceManage:task:index', 'icon-chexiao', 'supervisor', 1700000000000, 'admin', 1713176976458, 'menu.trace.taskRemark'); -INSERT INTO `sys_menu` VALUES (2085, 'menu.trace.analysis', 2083, 2, 'analysis', 'traceManage/analysis/index', '1', '0', 'M', '0', '1', 'traceManage:analysis:index', 'icon-gongnengjieshao', 'supervisor', 1700000000000, 'admin', 1713176987835, 'menu.trace.analysisRemark'); -INSERT INTO `sys_menu` VALUES (2086, 'menu.trace.pcap', 2083, 3, 'pcap', 'traceManage/pcap/index', '1', '1', 'M', '1', '1', 'traceManage:pcap:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.trace.pcapRemark'); +INSERT INTO `sys_menu` VALUES (2085, 'menu.trace.analysis', 2083, 4, 'analysis', 'traceManage/analysis/index', '1', '0', 'M', '0', '1', 'traceManage:analysis:index', 'icon-gongnengjieshao', 'supervisor', 1700000000000, 'admin', 1713176987835, 'menu.trace.analysisRemark'); +INSERT INTO `sys_menu` VALUES (2086, 'menu.trace.pcap', 2083, 11, 'pcap', 'traceManage/pcap/index', '1', '1', 'M', '1', '1', 'traceManage:pcap:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.trace.pcapRemark'); INSERT INTO `sys_menu` VALUES (2087, 'menu.fault', 0, 2, 'faultManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-jinggao', 'supervisor', 1700000000000, NULL, 0, 'menu.faultRemark'); INSERT INTO `sys_menu` VALUES (2088, 'menu.fault.active', 2129, 1, 'active-alarm', 'faultManage/active-alarm/index', '1', '1', 'M', '1', '1', 'faultManage:active-alarm:index', 'icon-wenjian', 'supervisor', 1700000000000, NULL, 0, 'menu.fault.activemRemark'); INSERT INTO `sys_menu` VALUES (2089, 'menu.log', 0, 9, 'logManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-fuzhidaima', 'supervisor', 1700000000000, NULL, 0, 'menu.logRemark'); @@ -140,15 +147,15 @@ INSERT INTO `sys_menu` VALUES (2092, 'menu.log.alarm', 2089, 40, 'alarm-log', 'l INSERT INTO `sys_menu` VALUES (2094, 'menu.log.forwarding', 2089, 41, 'forwarding', 'logManage/forwarding/index', '1', '0', 'M', '1', '1', 'logManage:forwarding:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.log.forwardingRemark'); INSERT INTO `sys_menu` VALUES (2095, 'menu.log.set', 2089, 45, 'logSet', 'logManage/logSet/index', '1', '0', 'M', '0', '0', 'logManage:logSet:index', 'icon-you', 'supervisor', 1700000000000, 'supervisor', 1715332370830, 'menu.log.setRemark'); INSERT INTO `sys_menu` VALUES (2097, 'menu.fault.history', 2129, 2, 'history-alarm', 'faultManage/history-alarm/index', '1', '1', 'M', '1', '1', 'faultManage/history-alarm/index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.fault.historyRemark'); -INSERT INTO `sys_menu` VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-setting', 'faultManage/fault-setting/index', '1', '0', 'M', '1', '1', 'faultManage/fault-setting/index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.fault.setRemark'); +INSERT INTO `sys_menu` VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-setting', 'faultManage/fault-setting/index', '1', '0', 'M', '0', '1', 'faultManage/fault-setting/index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.fault.setRemark'); INSERT INTO `sys_menu` VALUES (2099, 'menu.perf', 0, 5, 'perfManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perfRemark'); -INSERT INTO `sys_menu` VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', 'perfManage/taskManage/index', '1', '1', 'M', '0', '1', 'perfManage:taskManage:index', 'icon-wofaqi', 'supervisor', 1700000000000, 'admin', 1713177036412, 'menu.perf.taskRemark'); -INSERT INTO `sys_menu` VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '1', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', 'supervisor', 1700000000000, 'admin', 1713177042915, 'menu.perf.dataRemark'); -INSERT INTO `sys_menu` VALUES (2102, 'menu.perf.report', 2099, 3, 'perfReport', 'perfManage/perfReport/index', '1', '0', 'M', '0', '0', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.reportRemark'); +INSERT INTO `sys_menu` VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', 'perfManage/taskManage/index', '1', '0', 'M', '0', '1', 'perfManage:taskManage:index', 'icon-wofaqi', 'supervisor', 1700000000000, 'admin', 1713177036412, 'menu.perf.taskRemark'); +INSERT INTO `sys_menu` VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '0', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', 'supervisor', 1700000000000, 'admin', 1713177042915, 'menu.perf.dataRemark'); +INSERT INTO `sys_menu` VALUES (2102, 'menu.perf.kpiOverView', 2099, 10, 'kpiOverView', 'perfManage/kpiOverView/index', '1', '0', 'M', '1', '1', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2103, 'menu.perf.threshold', 2099, 4, 'perfThreshold', 'perfManage/perfThreshold/index', '1', '0', 'M', '0', '0', 'perfManage:perfThreshold:index', 'icon-zhuanrang', 'supervisor', 1700000000000, 'supervisor', 1715417264697, 'menu.perf.thresholdRemark'); -INSERT INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 5, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); -INSERT INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 6, 'customTarget', 'perfManage/customTarget/index', '1', '1', 'M', '0', '0', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); -INSERT INTO `sys_menu` VALUES (2106, 'menu.perf.set', 2099, 7, 'perfSet', 'perfManage/perfSet/index', '1', '0', 'M', '0', '0', 'perfManage:perfSet:index', 'icon-gonggao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.setRemark'); +INSERT INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 20, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); +INSERT INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 99, 'customTarget', 'perfManage/customTarget/index', '1', '0', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); +INSERT INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 12, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '1', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', 'supervisor', 1728642924734, 'supervisor', 1728642924734, ''); INSERT INTO `sys_menu` VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-zhizuoliucheng', 'supervisor', 1700000000000, NULL, 0, 'menu.mmlRemark'); INSERT INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlManage/neOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:neOperate:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.neRemark'); INSERT INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.udmRemark'); @@ -196,6 +203,13 @@ INSERT INTO `sys_menu` VALUES (2154, 'menu.ne.neConfigBackup', 4, 29, 'neConfigB INSERT INTO `sys_menu` VALUES (2155, 'menu.common.delete', 2154, 1, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:remove', '#', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_menu` VALUES (2156, 'menu.common.edit', 2154, 2, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:edit', '#', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_menu` VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1723107637982, 'supervisor', 1723107637982, ''); -INSERT INTO `sys_menu` VALUES (2158, 'menu.trace.pcapFile', 2083, 4, 'pcap/inline/file', 'traceManage/pcap/file', '1', '1', 'M', '0', '1', 'traceManage:pcap:index', '#', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2158, 'menu.trace.pcapFile', 2083, 12, 'pcap/inline/file', 'traceManage/pcap/file', '1', '1', 'M', '0', '1', 'traceManage:pcap:index', '#', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2159, 'menu.log.exportFile', 2089, 100, 'exportFile', 'logManage/exportFile/index', '1', '1', 'M', '1', '1', 'logManage:exportFile:index', 'icon-wenjian', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2160, 'menu.perf.kpiCReport', 2099, 100, 'kpiCReport', 'perfManage/kpiCReport/index', '1', '0', 'M', '1', '1', 'perfManage:kpiCReport:index', 'icon-tubiaoku', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 2083, 6, 'taskHLR', 'traceManage/task-hlr/index', '1', '0', 'M', '0', '1', 'traceManage:taskHLR:index', 'icon-chexiao', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2162, 'menu.trace.taskAnalyze', 2083, 2, 'task/inline/analyze', 'traceManage/task/analyze', '1', '0', 'M', '0', '1', 'traceManage:taskAnalyze:index', '#', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2163, 'menu.trace.tshark', 2083, 14, 'tshark', 'traceManage/tshark/index', '1', '0', 'M', '1', '1', 'traceManage:tshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2164, 'menu.trace.wireshark', 2083, 16, 'wireshark', 'traceManage/wireshark/index', '1', '0', 'M', '1', '1', 'traceManage:wireshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2165, 'menu.config.neOverview', 4, 1, 'neOverview', 'configManage/neOverview/index', '1', '0', 'M', '1', '1', 'configManage:neOverview:index', 'icon-tubiaoku', 'supervisor', 1700000000000, NULL, 0, 'menu.config.neOverviewRemark'); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/install/sys_role_menu.sql b/build/system/usr/local/omc/etc/db/install/sys_role_menu.sql index 460cc65..bbb815d 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_role_menu.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_role_menu.sql @@ -20,6 +20,12 @@ LOCK TABLES `sys_role_menu` WRITE; INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 61); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 63); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 64); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 100); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 101); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102); @@ -104,7 +110,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2102); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2103); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2105); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2106); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2109); @@ -112,6 +117,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2111); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2118); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2119); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2120); @@ -147,9 +153,18 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2155); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2158); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2159); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2160); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2163); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2165); + INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 115); @@ -168,8 +183,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2080); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2081); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2083); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2084); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2085); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2088); @@ -178,28 +191,17 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2098); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2099); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2100); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2101); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2102); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2103); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2104); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2105); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2106); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2109); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2111); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2118); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2119); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2120); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2124); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2125); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2126); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2127); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2129); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2130); @@ -211,6 +213,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2138); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2140); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2141); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2143); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2146); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2147); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2148); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2149); @@ -218,8 +221,17 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2153); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2154); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2155); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2158); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); + INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 4); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 500); @@ -229,12 +241,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1042); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1048); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2083); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2084); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2085); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2088); @@ -243,17 +250,9 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2098); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2099); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2101); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2119); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2120); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2124); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2125); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2114); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2127); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2130); @@ -269,15 +268,18 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2149); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2157); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2163); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); + INSERT IGNORE INTO `sys_role_menu` VALUES (5, 1); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 112); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2087); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2131); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2132); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2165); UNLOCK TABLES; diff --git a/build/system/usr/local/omc/etc/db/install/sys_user.sql b/build/system/usr/local/omc/etc/db/install/sys_user.sql index 50a8cf5..3292b4b 100644 --- a/build/system/usr/local/omc/etc/db/install/sys_user.sql +++ b/build/system/usr/local/omc/etc/db/install/sys_user.sql @@ -12,7 +12,7 @@ CREATE TABLE `sys_user` ( `nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称', `user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'sys' COMMENT '用户类型(sys系统用户)', `email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱', - `phonenumber` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码', + `phonenumber` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码', `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0未知 1男 2女)', `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '头像地址', `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码', @@ -34,10 +34,10 @@ CREATE TABLE `sys_user` ( LOCK TABLES `sys_user` WRITE; /*!40000 ALTER TABLE `sys_user` DISABLE KEYS */; -INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', 'sys', '', '', '', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', '127.0.0.1', 0, '', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', 'sys', '', '', '', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', '127.0.0.1', 0, '', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', 'sys', '', '', '', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', '127.0.0.1', 0, '', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', 'sys', '', '', '', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', '127.0.0.1', 0, '', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', 'sys', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', 'sys', '', '', '', '0', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', 'sys', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', 'sys', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, ''); UNLOCK TABLES; diff --git a/build/system/usr/local/omc/etc/db/install/system_log.sql b/build/system/usr/local/omc/etc/db/install/system_log.sql deleted file mode 100644 index 74ae6ba..0000000 --- a/build/system/usr/local/omc/etc/db/install/system_log.sql +++ /dev/null @@ -1,49 +0,0 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `system_log` --- - -DROP TABLE IF EXISTS `system_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `system_log` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `process_type` enum('SYS','DB','OMC','NE') DEFAULT 'OMC', - `process_name` varchar(32) NOT NULL, - `user_name` varchar(30) DEFAULT NULL, - `process_id` varchar(16) NOT NULL, - `operation` varchar(16) DEFAULT NULL, - `event` varchar(64) DEFAULT NULL, - `start_time` datetime DEFAULT NULL, - `end_time` datetime DEFAULT NULL, - `log_time` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1294 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='del-旧前端使用'; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2024-03-06 17:26:59 diff --git a/build/system/usr/local/omc/etc/db/install/trace_data.sql b/build/system/usr/local/omc/etc/db/install/trace_data.sql index e840e17..4b1d8c2 100644 --- a/build/system/usr/local/omc/etc/db/install/trace_data.sql +++ b/build/system/usr/local/omc/etc/db/install/trace_data.sql @@ -1,52 +1,23 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -- -- Table structure for table `trace_data` -- DROP TABLE IF EXISTS `trace_data`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; CREATE TABLE `trace_data` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `task_id` int(11) DEFAULT NULL, - `imsi` varchar(16) DEFAULT NULL, - `msisdn` varchar(16) DEFAULT NULL, - `src_addr` varchar(128) DEFAULT NULL, - `dst_addr` varchar(128) DEFAULT NULL, - `if_type` int(11) DEFAULT 0, - `msg_type` int(11) DEFAULT NULL, - `msg_direct` int(11) DEFAULT NULL, - `length` int(11) DEFAULT NULL, - `timestamp` bigint(20) DEFAULT NULL, - `raw_msg` blob DEFAULT NULL, - `dec_msg` blob DEFAULT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `task_id` int NOT NULL COMMENT '跟踪任务ID', + `imsi` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `msisdn` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `src_addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '源地址带端口', + `dst_addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '目标地址带端口', + `if_type` int DEFAULT NULL COMMENT '接口类型,未分类', + `msg_type` int DEFAULT NULL, + `msg_direct` int DEFAULT NULL, + `length` int DEFAULT NULL COMMENT '去除头后的原始数据byte长度', + `timestamp` bigint DEFAULT '0' COMMENT '毫秒', + `raw_msg` text COLLATE utf8mb4_general_ci COMMENT '去除头后的原始数据byteBase64', + `dec_msg` text COLLATE utf8mb4_general_ci COMMENT 'TCP内容消息', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=311486 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='跟踪_任务数据'; -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2024-03-06 17:26:59 +-- Dump completed on 2024-09-19 14:26:59 diff --git a/build/system/usr/local/omc/etc/db/install/trace_task.sql b/build/system/usr/local/omc/etc/db/install/trace_task.sql index 7de1d8f..6f4c466 100644 --- a/build/system/usr/local/omc/etc/db/install/trace_task.sql +++ b/build/system/usr/local/omc/etc/db/install/trace_task.sql @@ -1,60 +1,31 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -- -- Table structure for table `trace_task` -- DROP TABLE IF EXISTS `trace_task`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; CREATE TABLE `trace_task` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `trace_type` enum('Interface','Device','UE') DEFAULT NULL, - `start_time` datetime DEFAULT NULL, - `end_time` datetime DEFAULT NULL, - `imsi` varchar(16) DEFAULT NULL, - `msisdn` varchar(16) DEFAULT NULL, - `src_ip` varchar(50) DEFAULT NULL, - `dst_ip` varchar(50) DEFAULT NULL, - `signal_port` smallint(6) DEFAULT NULL, - `spc` varchar(30) DEFAULT NULL, - `dpc` varchar(30) DEFAULT NULL, - `ne_type` varchar(32) DEFAULT NULL, - `ne_id` varchar(32) DEFAULT NULL, - `ue_ip` varchar(50) DEFAULT NULL, - `interfaces` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `status` enum('Inactive','Active','Failed') DEFAULT 'Inactive', - `account_id` varchar(32) DEFAULT NULL, - `comment` varchar(255) DEFAULT NULL, - `succ_nes` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `fail_nes` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `update_time` datetime DEFAULT current_timestamp(), + `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID', + `trace_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务编号', + `trace_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '1-Interface,2-Device,3-User', + `start_time` bigint DEFAULT '0' COMMENT '开始时间 毫秒', + `end_time` bigint DEFAULT '0' COMMENT '结束时间 毫秒', + `interfaces` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '接口跟踪必须 例如 N8,N10', + `imsi` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户跟踪必须', + `msisdn` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户跟踪可选', + `ue_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '设备跟踪必须 IP', + `src_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '源地址IP', + `dst_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '目标地址IP', + `signal_port` int DEFAULT '0' COMMENT '地址IP端口', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '备注', + `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', + `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', + `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信息数据通知回调地址UDP 例如udp:192.168.5.58:29500', + `fetch_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '任务下发请求响应消息', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='跟踪_任务'; -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2024-03-06 17:26:59 +-- Dump completed on 2024-09-19 14:26:59 diff --git a/build/system/usr/local/omc/etc/db/install/trace_task_hlr.sql b/build/system/usr/local/omc/etc/db/install/trace_task_hlr.sql new file mode 100644 index 0000000..a84cd91 --- /dev/null +++ b/build/system/usr/local/omc/etc/db/install/trace_task_hlr.sql @@ -0,0 +1,24 @@ +-- +-- Table structure for table `trace_task_hlr` +-- + +DROP TABLE IF EXISTS `trace_task_hlr`; + +CREATE TABLE `trace_task_hlr` ( + `id` int NOT NULL AUTO_INCREMENT, + `trace_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务编号', + `imsi` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'IMSI', + `msisdn` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'MSISDN', + `start_time` bigint DEFAULT '0' COMMENT '开始时间', + `end_time` bigint DEFAULT '0' COMMENT '结束时间', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '任务状态(0停止 1进行)', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '任务信息', + `remark` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注说明', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='跟踪_任务给HRL网元'; + +-- Dump completed on 2024-09-19 14:26:59 diff --git a/build/system/usr/local/omc/etc/db/install/u_auth_user.sql b/build/system/usr/local/omc/etc/db/install/u_auth_user.sql index 7f7ad26..6e5450d 100644 --- a/build/system/usr/local/omc/etc/db/install/u_auth_user.sql +++ b/build/system/usr/local/omc/etc/db/install/u_auth_user.sql @@ -1,49 +1,21 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -- -- Table structure for table `u_auth_user` -- DROP TABLE IF EXISTS `u_auth_user`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `u_auth_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', - `msisdn` varchar(16) DEFAULT NULL COMMENT '相当手机号', - `imsi` varchar(50) DEFAULT NULL COMMENT 'SIM卡号', - `amf` varchar(50) DEFAULT NULL COMMENT 'AMF', - `status` varchar(50) DEFAULT NULL COMMENT '状态', - `ki` varchar(50) DEFAULT NULL COMMENT 'ki', - `algo_index` varchar(50) DEFAULT NULL COMMENT 'algoIndex', - `opc` varchar(50) DEFAULT NULL COMMENT 'OPC', - `ne_id` varchar(50) DEFAULT NULL COMMENT 'UDM网元标识-子系统', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_neid唯一主键' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM鉴权用户'; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +CREATE TABLE `u_auth_user` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', + `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', + `amf` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AMF', + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '状态', + `ki` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ki', + `algo_index` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'algoIndex', + `opc` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'OPC', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_neid唯一主键', + KEY `idx_ne` (`ne_id`) USING BTREE COMMENT 'neid索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM鉴权用户'; -- Dump completed on 2024-03-06 17:26:59 diff --git a/build/system/usr/local/omc/etc/db/install/u_sub_user.sql b/build/system/usr/local/omc/etc/db/install/u_sub_user.sql index dc60d47..f458bce 100644 --- a/build/system/usr/local/omc/etc/db/install/u_sub_user.sql +++ b/build/system/usr/local/omc/etc/db/install/u_sub_user.sql @@ -1,61 +1,43 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -- -- Table structure for table `u_sub_user` -- -DROP TABLE IF EXISTS `u_sub_user`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +DROP TABLE IF EXISTS `u_sub_user`; CREATE TABLE `u_sub_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', - `msisdn` varchar(50) DEFAULT NULL COMMENT '相当手机号', - `imsi` varchar(50) DEFAULT NULL COMMENT 'SIM卡号', - `ambr` varchar(50) DEFAULT NULL COMMENT 'SubUeAMBRTemp', - `nssai` varchar(50) DEFAULT NULL COMMENT 'SubSNSSAITemp', - `rat` varchar(50) DEFAULT NULL COMMENT 'rat', - `arfb` varchar(50) DEFAULT NULL COMMENT 'forbiddenAreasTemp', - `sar` varchar(50) DEFAULT NULL COMMENT 'serviceAreaRestrictTemp', - `cn` varchar(50) DEFAULT NULL COMMENT 'cnType', - `sm_data` varchar(1500) DEFAULT NULL COMMENT 'smData', - `smf_sel` varchar(50) DEFAULT NULL COMMENT 'smfSel', - `eps_dat` varchar(1500) DEFAULT NULL COMMENT 'Eps', - `ne_id` varchar(50) DEFAULT '' COMMENT 'UDM网元标识-子系统', - `eps_flag` varchar(50) DEFAULT NULL COMMENT 'epsFlag', - `eps_odb` varchar(50) DEFAULT NULL COMMENT 'epsOdb', - `hplmn_odb` varchar(50) DEFAULT NULL COMMENT 'hplmnOdb', - `ard` varchar(50) DEFAULT NULL COMMENT 'Ard', - `epstpl` varchar(50) DEFAULT NULL COMMENT 'Epstpl', - `context_id` varchar(50) DEFAULT NULL COMMENT 'ContextId', - `apn_context` varchar(50) DEFAULT NULL COMMENT 'apnContext', - `static_ip` varchar(50) DEFAULT NULL COMMENT 'staticIpstatic_ip指给4G UE分配的静态IP,没有可不带此字段名', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', + `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', + `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', + `am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData', + `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubUeAMBRTemp', + `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubSNSSAITemp', + `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR', + `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData AreaForbidden', + `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData serviceAreaRestrictTemp', + `cn_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData CNType 0x00:EPC和5GC 0x01:5GC 0x02:EPC 0x03:EPC+5GC', + `rfsp_index` varchar(50) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RfspIndex', + `reg_timer` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RegTimer', + `ue_usage_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData UEUsageType', + `active_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData ActiveTime', + `mico` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData MICO', + `odb_ps` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData ODB_PS 0-all,1-hplmn,2-vplmn', + `group_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData GroupId', + `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat', + `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat epsFlag', + `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat epsOdb', + `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat hplmnOdb', + `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat Ard', + `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat Epstpl', + `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat ContextId', + `apn_mum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat apnNum', + `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat apnContext', + `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat staticIp 指给4G UE分配的静态IP,没有可不带此字段名', + `sm_data` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smData', + `smf_sel` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smfSel', + `cag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'CAG', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_ne唯一索引' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM签约用户'; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + UNIQUE KEY `uk_imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_neid唯一主键', + KEY `idx_ne` (`ne_id`) USING BTREE COMMENT 'neid索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM签约用户'; -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2024-03-06 17:26:59 +-- Dump completed on 2024-10-12 15:26:59 diff --git a/build/system/usr/local/omc/etc/db/install/u_user_info.sql b/build/system/usr/local/omc/etc/db/install/u_user_info.sql new file mode 100644 index 0000000..23a06d2 --- /dev/null +++ b/build/system/usr/local/omc/etc/db/install/u_user_info.sql @@ -0,0 +1,17 @@ +-- +-- Table structure for table `u_user_info` +-- + +DROP TABLE IF EXISTS `u_user_info`; + +CREATE TABLE `u_user_info` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '默认ID', + `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', + `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', + `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_ne唯一索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户IMSI扩展信息'; + +-- Dump completed on 2024-09-19 11:26:59 diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_alarm_event.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_alarm_event.sql index 7a72e79..f66fa21 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_alarm_event.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_alarm_event.sql @@ -60,80 +60,80 @@ CREATE TABLE IF NOT EXISTS `alarm_event` ( ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- Move event alarm from table alarm to alarm_event -START TRANSACTION; +-- START TRANSACTION; -INSERT INTO `alarm_event` ( - `alarm_seq`, - `alarm_id`, - `alarm_title`, - `ne_type`, - `ne_id`, - `alarm_code`, - `event_time`, - `alarm_type`, - `orig_severity`, - `perceived_severity`, - `pv_flag`, - `ne_name`, - `object_uid`, - `object_name`, - `object_type`, - `location_info`, - `province`, - `alarm_status`, - `specific_problem`, - `specific_problem_id`, - `add_info`, - `counter`, - `latest_event_time`, - `ack_state`, - `ack_time`, - `ack_user`, - `clear_type`, - `clear_time`, - `clear_user`, - `timestamp` - ) -SELECT - `alarm_seq`, - `alarm_id`, - `alarm_title`, - `ne_type`, - `ne_id`, - `alarm_code`, - `event_time`, - `alarm_type`, - `orig_severity`, - `perceived_severity`, - `pv_flag`, - `ne_name`, - `object_uid`, - `object_name`, - `object_type`, - `location_info`, - `province`, - `alarm_status`, - `specific_problem`, - `specific_problem_id`, - `add_info`, - `counter`, - `latest_event_time`, - `ack_state`, - `ack_time`, - `ack_user`, - `clear_type`, - `clear_time`, - `clear_user`, - `timestamp` -FROM `alarm` -WHERE - `orig_severity` = 'Event'; +-- INSERT INTO `alarm_event` ( +-- `alarm_seq`, +-- `alarm_id`, +-- `alarm_title`, +-- `ne_type`, +-- `ne_id`, +-- `alarm_code`, +-- `event_time`, +-- `alarm_type`, +-- `orig_severity`, +-- `perceived_severity`, +-- `pv_flag`, +-- `ne_name`, +-- `object_uid`, +-- `object_name`, +-- `object_type`, +-- `location_info`, +-- `province`, +-- `alarm_status`, +-- `specific_problem`, +-- `specific_problem_id`, +-- `add_info`, +-- `counter`, +-- `latest_event_time`, +-- `ack_state`, +-- `ack_time`, +-- `ack_user`, +-- `clear_type`, +-- `clear_time`, +-- `clear_user`, +-- `timestamp` +-- ) +-- SELECT +-- `alarm_seq`, +-- `alarm_id`, +-- `alarm_title`, +-- `ne_type`, +-- `ne_id`, +-- `alarm_code`, +-- `event_time`, +-- `alarm_type`, +-- `orig_severity`, +-- `perceived_severity`, +-- `pv_flag`, +-- `ne_name`, +-- `object_uid`, +-- `object_name`, +-- `object_type`, +-- `location_info`, +-- `province`, +-- `alarm_status`, +-- `specific_problem`, +-- `specific_problem_id`, +-- `add_info`, +-- `counter`, +-- `latest_event_time`, +-- `ack_state`, +-- `ack_time`, +-- `ack_user`, +-- `clear_type`, +-- `clear_time`, +-- `clear_user`, +-- `timestamp` +-- FROM `alarm` +-- WHERE +-- `orig_severity` = 'Event'; -DELETE FROM `alarm` WHERE `orig_severity` = 'Event'; +-- DELETE FROM `alarm` WHERE `orig_severity` = 'Event'; -COMMIT; +-- COMMIT; -DELETE FROM alarm_event WHERE id NOT IN (SELECT MIN(id) FROM alarm_event GROUP BY `ne_type`, `ne_id`, `alarm_id`, `event_time`); +-- DELETE FROM alarm_event WHERE id NOT IN (SELECT MIN(id) FROM alarm_event GROUP BY `ne_type`, `ne_id`, `alarm_id`, `event_time`); ALTER TABLE `alarm_event` ADD UNIQUE INDEX IF NOT EXISTS `idx_uni_aid_ne_time`(`ne_type`, `ne_id`, `alarm_id`, `event_time`) USING BTREE; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_function.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_function.sql index 3c42634..36ee47d 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_function.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_function.sql @@ -1,16 +1,17 @@ -DELIMITER / / +DELIMITER // CREATE FUNCTION IF NOT EXISTS omc_get_dict_value(field_value VARCHAR(255), type VARCHAR(255)) -RETURNS VARCHAR(255) +RETURNS VARCHAR(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci DETERMINISTIC BEGIN DECLARE result VARCHAR(255); SELECT `dict_value` INTO result -FROM `sys_dict_data` -WHERE `dict_label` = field_value AND `dict_type` = type limit 1; +FROM `sys_dict_data` +WHERE `dict_label` = field_value AND `dict_type` = type +LIMIT 1; RETURN result; END // -DELIMITER; \ No newline at end of file +DELIMITER ; \ No newline at end of file diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_ne_host.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_ne_host.sql index b391a74..13a7e76 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_ne_host.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_ne_host.sql @@ -1,24 +1,35 @@ SET FOREIGN_KEY_CHECKS=0; -CREATE TABLE IF NOT EXISTS `ne_host` ( +CREATE TABLE IF NOT EXISTS `ne_host` ( `host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键', - `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机类型 ssh telnet', - `group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '分组(0默认 1网元 2系统)', - `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '标题名称', - `addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址', - `port` int NULL DEFAULT 22 COMMENT 'SSH端口', - `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机用户名', - `auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '认证模式(0密码 1主机私钥 2已免密)', - `password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证密码', - `private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证私钥', - `pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证私钥密码', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '连接类型 ssh telnet redis', + `group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '分组(0默认 1网元 2系统)', + `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '标题名称', + `addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址', + `port` int DEFAULT '22' COMMENT '端口 22 4100 6379', + `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证用户名', + `auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '认证模式(0密码 1主机私钥 2已免密)', + `password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证密码', + `private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥', + `pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥密码', + `db_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '数据库名称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`host_id`) USING BTREE, - UNIQUE INDEX `uk_type_group_title`(`host_type` ASC, `group_id` ASC, `title` ASC) USING BTREE COMMENT '同组内名称唯一' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元主机表' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_group_title` (`host_type`,`group_id`,`title`) USING BTREE COMMENT '同组内名称唯一' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元主机表'; -SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file +-- 20241016前旧表更新 +ALTER TABLE `ne_host` ADD COLUMN IF NOT EXISTS `db_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '数据库名称' AFTER `pass_phrase`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `host_id` bigint NOT NULL COMMENT '主机主键' FIRST; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '连接类型 ssh telnet redis' AFTER `host_id`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `port` int NULL DEFAULT 22 COMMENT '端口 22 4100 6379' AFTER `addr`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证用户名' AFTER `port`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `create_by`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间' AFTER `update_by`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键'; + +SET FOREIGN_KEY_CHECKS=1; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_ne_info.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_ne_info.sql index 0647b3d..8a552f3 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_ne_info.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_ne_info.sql @@ -7,25 +7,25 @@ CREATE TABLE IF NOT EXISTS `ne_info` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `rm_uid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `port` int NULL DEFAULT 0 COMMENT '端口', - `pv_flag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'PNF' COMMENT '\'PNF\',\'VNF\'', - `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '省份地域', - `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-', - `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ne_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'MAC地址', - `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet,telnet)', - `status` int NULL DEFAULT 0 COMMENT '0离线 1在线 2配置待下发', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `rm_uid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `port` int DEFAULT '0' COMMENT '端口', + `pv_flag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'PNF' COMMENT '''PNF'',''VNF''', + `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '省份地域', + `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-', + `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'MAC地址', + `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet)-来自ne_host表', + `status` int DEFAULT '0' COMMENT '0离线 1在线 2配置待下发', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `ux_netype_neid`(`ne_type` ASC, `ne_id` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元信息表 对应一个网元版本、网元授权、网元主机' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `ux_netype_neid` (`ne_type`,`ne_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元信息表 对应一个网元版本、网元授权、网元主机'; -- 20240511前旧表更新 ALTER TABLE `ne_info` COMMENT = '网元信息表 对应一个网元版本、网元授权、网元主机'; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_ne_license.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_ne_license.sql index a7f4f2e..cf221fc 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_ne_license.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_ne_license.sql @@ -8,18 +8,18 @@ CREATE TABLE IF NOT EXISTS `ne_license` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', `activation_request_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '激活申请代码', - `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '激活授权文件', - `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '序列号', - `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '许可证到期日期', - `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态 0无效 1有效', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '激活授权文件', + `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '序列号', + `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '许可证到期日期', + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态 0无效 1有效', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE COMMENT '唯一网元类型和网元ID' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元授权激活信息' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_id` (`ne_type`,`ne_id`) USING BTREE COMMENT '唯一网元类型和网元ID' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元授权激活信息'; -- 20240511前旧表更新 ALTER TABLE `ne_license` COMMENT = '网元授权激活信息'; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_ne_version.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_ne_version.sql index 6189fdf..850a240 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_ne_version.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_ne_version.sql @@ -7,23 +7,23 @@ CREATE TABLE IF NOT EXISTS `ne_version` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', - `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '当前包名', - `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '当前版本', - `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '当前软件包', - `pre_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '上一版本包名', - `pre_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '上一版本', - `pre_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '上一版本软件包', - `new_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '新版本报名', - `new_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '新版本', - `new_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '新版软件包', - `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '当前状态 0无 1当前版本 2上一版本 3有新版本', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前包名', + `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前版本', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '当前软件包', + `pre_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '上一版本包名', + `pre_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '上一版本', + `pre_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '上一版本软件包', + `new_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '新版本报名', + `new_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '新版本', + `new_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '新版软件包', + `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '当前状态 0无 1当前版本 2上一版本 3有新版本', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE COMMENT '唯一网元类型和ID' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元版本信息' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_id` (`ne_type`,`ne_id`) USING BTREE COMMENT '唯一网元类型和ID' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元版本信息'; -- 20240511前旧表更新 ALTER TABLE `ne_version` COMMENT = '网元版本信息'; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_config.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_config.sql index 08cdc97..6b73bcf 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_config.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_config.sql @@ -36,5 +36,6 @@ INSERT IGNORE INTO `sys_config` VALUES (107, 'config.sys.copyright', 'sys.copyri INSERT IGNORE INTO `sys_config` VALUES (108, 'config.sys.i18nOpen', 'sys.i18n.open', 'true', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nOpenRemark'); INSERT IGNORE INTO `sys_config` VALUES (109, 'config.sys.i18nDefault', 'sys.i18n.default', 'en_US', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nDefaultRemark'); INSERT IGNORE INTO `sys_config` VALUES (110, 'config.sys.lockTime', 'sys.lockTime', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.lockTimeRemark'); +INSERT IGNORE INTO `sys_config` VALUES (111, 'config.sys.homePage', 'sys.homePage', 'configManage/neOverview/index', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.homePageRemark'); SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dept.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dept.sql index 428e6c8..86192e5 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dept.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dept.sql @@ -1,6 +1,5 @@ SET FOREIGN_KEY_CHECKS=0; -DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE IF NOT EXISTS `sys_dept` ( `dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id', `parent_id` bigint(20) DEFAULT 0 COMMENT '父部门id 默认0', diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data0.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data0.sql index 5e09796..bbb7268 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data0.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data0.sql @@ -49,36 +49,36 @@ INSERT IGNORE INTO `sys_dict_data` VALUES (21, 6, 'dictData.operType.export', '5 INSERT IGNORE INTO `sys_dict_data` VALUES (22, 7, 'dictData.operType.import', '6', 'sys_oper_type', NULL, 'orange', '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (23, 8, 'dictData.operType.forced quit', '7', 'sys_oper_type', NULL, 'default', '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (24, 9, 'dictData.operType.clear', '8', 'sys_oper_type', NULL, '#f50', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (25, 1, 'dictData.trace.interface', 'Interface', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (26, 2, 'dictData.trace.device', 'Device', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (27, 3, 'dictData.trace.user', 'UE', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (28, 1, 'dictData.logType.download', 'DOWNLOAD', 'operation_log_type', NULL, 'pink', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (29, 2, 'dictData.logType.activation', 'Activation', 'operation_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (30, 3, 'dictData.logType.add', 'ADD', 'operation_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (31, 4, 'dictData.logType.other', 'AUTO', 'operation_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (32, 5, 'dictData.logType.back', 'BACK', 'operation_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (33, 6, 'dictData.logType.delete', 'DELETE', 'operation_log_type', NULL, 'red', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (34, 7, 'dictData.logType.distribute', 'Distribute', 'operation_log_type', NULL, 'yellow', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (35, 8, 'dictData.logType.export', 'EXPORT', 'operation_log_type', NULL, 'green', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (36, 9, 'dictData.logType.query', 'SELECT', 'operation_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (37, 10, 'dictData.logType.setup', 'SET', 'operation_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (38, 11, 'dictData.logType.update', 'UPDATE', 'operation_log_type', NULL, 'magenta', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (39, 12, 'dictData.logType.upload', 'UPLOAD', 'operation_log_type', NULL, 'yellow', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (40, 13, 'dictData.logType.view', 'View', 'operation_log_type', NULL, 'purple', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (41, 14, 'dictData.logType.login', '0', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (42, 15, 'dictData.logType.logout', '1', 'security_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (43, 1, 'dictData.securityLogType.add', '2', 'security_log_type', NULL, 'green', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (44, 2, 'dictData.securityLogType.update', '3', 'security_log_type', NULL, 'lime', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (45, 3, 'dictData.securityLogType.delete', '4', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (46, 4, 'dictData.securityLogType.lock', '5', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (47, 5, 'dictData.securityLogType.unlock', '6', 'security_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (48, 6, 'dictData.securityLogType.reset', '7', 'security_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (49, 7, 'dictData.securityLogType.deactivate', '8', 'security_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (25, 1, 'dictData.trace.interface', '1', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (26, 2, 'dictData.trace.device', '2', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (27, 3, 'dictData.trace.user', '3', 'trace_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (28, 1, 'dictData.logType.download', 'DOWNLOAD', 'operation_log_type', NULL, 'pink', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (29, 2, 'dictData.logType.activation', 'Activation', 'operation_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (30, 3, 'dictData.logType.add', 'ADD', 'operation_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (31, 4, 'dictData.logType.other', 'AUTO', 'operation_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (32, 5, 'dictData.logType.back', 'BACK', 'operation_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (33, 6, 'dictData.logType.delete', 'DELETE', 'operation_log_type', NULL, 'red', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (34, 7, 'dictData.logType.distribute', 'Distribute', 'operation_log_type', NULL, 'yellow', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (35, 8, 'dictData.logType.export', 'EXPORT', 'operation_log_type', NULL, 'green', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (36, 9, 'dictData.logType.query', 'SELECT', 'operation_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (37, 10, 'dictData.logType.setup', 'SET', 'operation_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (38, 11, 'dictData.logType.update', 'UPDATE', 'operation_log_type', NULL, 'magenta', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (39, 12, 'dictData.logType.upload', 'UPLOAD', 'operation_log_type', NULL, 'yellow', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (40, 13, 'dictData.logType.view', 'View', 'operation_log_type', NULL, 'purple', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (41, 14, 'dictData.logType.login', '0', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (42, 15, 'dictData.logType.logout', '1', 'security_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (43, 1, 'dictData.securityLogType.add', '2', 'security_log_type', NULL, 'green', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (44, 2, 'dictData.securityLogType.update', '3', 'security_log_type', NULL, 'lime', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (45, 3, 'dictData.securityLogType.delete', '4', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (46, 4, 'dictData.securityLogType.lock', '5', 'security_log_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (47, 5, 'dictData.securityLogType.unlock', '6', 'security_log_type', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (48, 6, 'dictData.securityLogType.reset', '7', 'security_log_type', NULL, 'cyan', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (49, 7, 'dictData.securityLogType.deactivate', '8', 'security_log_type', NULL, 'blue ', '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (50, 8, 'dictData.jobSaveLog.no', '0', 'sys_job_save_log', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (51, 9, 'dictData.jobSaveLog.yes', '1', 'sys_job_save_log', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (52, 1, 'dictData.neVersionStatus.upload', 'Uploaded', 'ne_version_status', NULL, 'processing', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (53, 2, 'dictData.neVersionStatus.inactive', 'Inactive', 'ne_version_status', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (54, 3, 'dictData.neVersionStatus.active', 'Active', 'ne_version_status', NULL, 'success', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (52, 1, 'dictData.neVersionStatus.upload', 'Uploaded', 'ne_version_status', NULL, 'processing', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +-- INSERT IGNORE INTO `sys_dict_data` VALUES (53, 2, 'dictData.neVersionStatus.inactive', 'Inactive', 'ne_version_status', NULL, 'gold', '1', 'supervisor', 1699350000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (54, 2, 'dictData.ne_host_type.redis', 'redis', 'ne_host_type', '', 'magenta', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT IGNORE INTO `sys_dict_data` VALUES (55, 1, 'dictData.alarmStatus.history', '0', 'alarm_status', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (56, 2, 'dictData.alarmStatus.active', '1', 'alarm_status', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (57, 1, 'dictData.datascope.all', '1', 'sys_role_datascope', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL); @@ -133,8 +133,8 @@ INSERT IGNORE INTO `sys_dict_data` VALUES (105, 17, 'dictData.cdr_sip_code.202', INSERT IGNORE INTO `sys_dict_data` VALUES (106, 3, 'dictData.cdr_call_type.sms', 'sms', 'cdr_call_type', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT IGNORE INTO `sys_dict_data` VALUES (107, 9, 'dictData.cdr_sip_code.488', '488', 'cdr_sip_code', '', '', '1', 'supervisor', 1706610000000, '', 0, ''); INSERT IGNORE INTO `sys_dict_data` VALUES (108, 0, 'dictData.cdr_sip_code.0', '0', 'cdr_sip_code', '', '', '1', 'supervisor', 1706610000000, '', 0, ''); -INSERT IGNORE INTO `sys_dict_data` VALUES (109, 0, 'dictData.ne_host_type.ssh', 'ssh', 'ne_host_type', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); -INSERT IGNORE INTO `sys_dict_data` VALUES (110, 1, 'dictData.ne_host_type.telnet', 'telnet', 'ne_host_type', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (109, 0, 'dictData.ne_host_type.ssh', 'ssh', 'ne_host_type', '', 'blue', '1', 'supervisor', 1706620000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (110, 1, 'dictData.ne_host_type.telnet', 'telnet', 'ne_host_type', '', 'purple', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT IGNORE INTO `sys_dict_data` VALUES (111, 0, 'dictData.ne_host_groupId.0', '0', 'ne_host_groupId', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT IGNORE INTO `sys_dict_data` VALUES (112, 1, 'dictData.ne_host_groupId.1', '1', 'ne_host_groupId', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); INSERT IGNORE INTO `sys_dict_data` VALUES (113, 2, 'dictData.ne_host_groupId.2', '2', 'ne_host_groupId', '', '', '1', 'supervisor', 1706620000000, '', 0, ''); @@ -153,10 +153,22 @@ INSERT IGNORE INTO `sys_dict_data` VALUES (125, 0, 'dictData.ne_version_status.0 INSERT IGNORE INTO `sys_dict_data` VALUES (126, 1, 'dictData.ne_version_status.1', '1', 'ne_version_status', '', 'success', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, ''); INSERT IGNORE INTO `sys_dict_data` VALUES (127, 1, 'dictData.ne_version_status.2', '2', 'ne_version_status', '', 'purple', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, ''); INSERT IGNORE INTO `sys_dict_data` VALUES (128, 1, 'dictData.ne_version_status.3', '3', 'ne_version_status', '', 'processing', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, ''); --- INSERT IGNORE INTO `sys_dict_data` VALUES (129, 0, 'dictData.udm_sub_cn_type.0', '0', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); --- INSERT IGNORE INTO `sys_dict_data` VALUES (130, 1, 'dictData.udm_sub_cn_type.1', '1', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); --- INSERT IGNORE INTO `sys_dict_data` VALUES (131, 2, 'dictData.udm_sub_cn_type.2', '2', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); --- INSERT IGNORE INTO `sys_dict_data` VALUES (132, 3, 'dictData.udm_sub_cn_type.3', '3', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (129, 0, 'dictData.cdr_cause_code.0', '0', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (130, 1, 'dictData.cdr_cause_code.8', '8', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (131, 2, 'dictData.cdr_cause_code.10', '10', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (132, 10, 'dictData.cdr_cause_code.21', '21', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (133, 11, 'dictData.cdr_cause_code.22', '22', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (134, 12, 'dictData.cdr_cause_code.27', '27', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (135, 13, 'dictData.cdr_cause_code.28', '28', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (136, 14, 'dictData.cdr_cause_code.29', '29', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (137, 15, 'dictData.cdr_cause_code.30', '30', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (138, 16, 'dictData.cdr_cause_code.38', '38', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (139, 20, 'dictData.cdr_cause_code.41', '41', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (140, 21, 'dictData.cdr_cause_code.41', '41', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (141, 22, 'dictData.cdr_cause_code.42', '42', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (142, 23, 'dictData.cdr_cause_code.47', '47', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (143, 30, 'dictData.cdr_cause_code.50', '50', 'cdr_cause_code', '', '', '1', 'supervisor', 1712720201349, '', 0, ''); + -- 指定记录条件更新 diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data1_i18n_zh.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data1_i18n_zh.sql index 7d65b94..8fecce0 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -91,8 +91,8 @@ REPLACE INTO `sys_dict_data` VALUES (1070, 1070, 'menu.ueUser.onlineIMS', 'IMS REPLACE INTO `sys_dict_data` VALUES (1071, 1071, 'menu.ueUser.onlineUE', 'UE在线信息', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1072, 1072, 'menu.ueUser.base5G', '基站信息', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1073, 1073, 'menu.trace', '跟踪', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1074, 1074, 'menu.trace.task', '跟踪任务', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1075, 1075, 'menu.trace.analysis', '信令分析', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1074, 1074, 'menu.trace.task', '网元跟踪任务', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1075, 1075, 'menu.trace.analysis', '网元跟踪数据', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1076, 1076, 'menu.trace.pcap', '信令抓包', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1077, 1077, 'menu.fault', '监控', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1078, 1078, 'menu.config.backupManageRemark', '备份管理菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -125,11 +125,11 @@ REPLACE INTO `sys_dict_data` VALUES (1110, 1110, 'menu.fault.setRemark', '故障 REPLACE INTO `sys_dict_data` VALUES (1111, 1111, 'menu.perfRemark', '性能目录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1112, 1112, 'menu.perf.task', '任务管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1113, 1113, 'menu.perf.data', '性能数据', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.report', '性能报表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.kpiOverView', '关键指标概览', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1115, 1115, 'menu.perf.threshold', '性能门限', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '黄金指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '关键指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1117, 1117, 'menu.perf.customTarget', '自定义指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1118, 1118, 'menu.perf.set', '性能通用设置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1118, 1118, 'menu.perf.kpiKeyTarget', '关键指标报表', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1119, 1119, 'menu.mml', 'MML', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1120, 1120, 'menu.mml.ne', '网元操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1121, 1121, 'menu.mml.udm', 'UDM操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -137,11 +137,11 @@ REPLACE INTO `sys_dict_data` VALUES (1122, 1122, 'menu.mml.set', 'MML设置', 'i REPLACE INTO `sys_dict_data` VALUES (1123, 1123, 'menu.mml.omc', 'OMC操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1124, 1124, 'menu.perf.taskRemark', '任务管理菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1125, 1125, 'menu.perf.dataRemark', '性能数据菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.reportRemark', '性能报表菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.kpiOverViewRemark', '性能报表菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1127, 1127, 'menu.perf.thresholdRemark', '性能门限菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1128, 1128, 'menu.perf.kpiRemark', '黄金指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1129, 1129, 'menu.perf.customTargetRemark', '自定义指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1130, 1130, 'menu.perf.setRemark', '性能通用设置菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1130, 1130, 'menu.perf.setRemark', '性能通用设置菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1131, 1131, 'menu.mmlRemark', 'MML管理目录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1132, 1132, 'menu.mml.neRemark', '网元操作菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1133, 1133, 'menu.mml.udmRemark', '网元UDM用户数据菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -195,28 +195,28 @@ REPLACE INTO `sys_dict_data` VALUES (1423, 1423, 'dictData.operType.clear', '清 REPLACE INTO `sys_dict_data` VALUES (1424, 1424, 'dictData.trace.interface', '接口跟踪', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1425, 1425, 'dictData.trace.device', '设备跟踪', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1426, 1426, 'dictData.trace.user', '用户跟踪', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1427, 1427, 'dictData.logType.download', '下载', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1428, 1428, 'dictData.logType.activation', '激活', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1429, 1429, 'dictData.logType.add', '新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1430, 1430, 'dictData.logType.other', '其他', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1431, 1431, 'dictData.logType.back', '回退', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1432, 1432, 'dictData.logType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1433, 1433, 'dictData.logType.distribute', '分配', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1434, 1434, 'dictData.logType.export', '导出', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1435, 1435, 'dictData.logType.query', '查询', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1436, 1436, 'dictData.logType.setup', '设置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1437, 1437, 'dictData.logType.update', '更新', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1438, 1438, 'dictData.logType.upload', '上传', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1439, 1439, 'dictData.logType.view', '查看', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1440, 1440, 'dictData.logType.login', '登录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1441, 1441, 'dictData.logType.logout', '登出', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1442, 1442, 'dictData.securityLogType.add', '新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1443, 1443, 'dictData.securityLogType.update', '更新', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1444, 1444, 'dictData.securityLogType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1445, 1445, 'dictData.securityLogType.lock', '锁定', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1446, 1446, 'dictData.securityLogType.unlock', '解锁', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1447, 1447, 'dictData.securityLogType.reset', '重置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1448, 1448, 'dictData.securityLogType.deactivate', '停用', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1427, 1427, 'dictData.logType.download', '下载', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1428, 1428, 'dictData.logType.activation', '激活', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1429, 1429, 'dictData.logType.add', '新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1430, 1430, 'dictData.logType.other', '其他', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1431, 1431, 'dictData.logType.back', '回退', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1432, 1432, 'dictData.logType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1433, 1433, 'dictData.logType.distribute', '分配', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1434, 1434, 'dictData.logType.export', '导出', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1435, 1435, 'dictData.logType.query', '查询', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1436, 1436, 'dictData.logType.setup', '设置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1437, 1437, 'dictData.logType.update', '更新', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1438, 1438, 'dictData.logType.upload', '上传', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1439, 1439, 'dictData.logType.view', '查看', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1440, 1440, 'dictData.logType.login', '登录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1441, 1441, 'dictData.logType.logout', '登出', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1442, 1442, 'dictData.securityLogType.add', '新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1443, 1443, 'dictData.securityLogType.update', '更新', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1444, 1444, 'dictData.securityLogType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1445, 1445, 'neHost.banNE', '禁止操作网元', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (1446, 1446, 'dictData.ne_host_type.redis', 'Redis', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (1447, 1447, 'menu.tools.ping', '网络探测测试', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (1448, 1448, 'menu.tools.iperf', '网络性能测试', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1449, 1449, 'dictData.jobSaveLog.no', '不记录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1450, 1450, 'dictData.jobSaveLog.yes', '记录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1451, 1451, 'dictData.neVersionStatus.upload', '已上传', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -246,9 +246,9 @@ REPLACE INTO `sys_dict_data` VALUES (1505, 1505, 'dictType.sys_yes_no', '系统 REPLACE INTO `sys_dict_data` VALUES (1506, 1506, 'dictType.sys_oper_type', '操作类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1507, 1507, 'dictType.sys_common_status', '系统状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1508, 1508, 'dictType.trace_type', '跟踪类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1509, 1509, 'dictType.operation_log_type', '操作日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1509, 1509, 'menu.tools.ps', '进程运行程序', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1510, 1510, 'dictType.alarm_status', '告警日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1511, 1511, 'dictType.security_log_type', '安全日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1511, 1511, 'menu.tools.net', '进程网络连接', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1512, 1512, 'dictType.ne_version_status', '网元软件版本状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1513, 1513, 'dictType.i18n_en', '多语言-英文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1514, 1514, 'dictType.i18n_zh', '多语言-中文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -261,9 +261,9 @@ REPLACE INTO `sys_dict_data` VALUES (1520, 1520, 'dictType.sys_yes_no_remark', ' REPLACE INTO `sys_dict_data` VALUES (1521, 1521, 'dictType.sys_oper_type_remark', '操作类型列表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1522, 1522, 'dictType.sys_common_status_remark', '登录状态列表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1523, 1523, 'dictType.trace_type_remark', '跟踪类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1524, 1524, 'dictType.operation_log_type_remark', '操作日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1525, 1525, 'dictType.alarm_status_remark', '告警日志状态类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1526, 1526, 'dictType.security_log_type_remark', '安全日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1524, 1524, 'dictType.alarm_status_remark', '告警日志状态类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1525, 1525, 'menu.trace.tshark', '信令分析', 'i18n_zh', '', '', '1', 'supervisor', 1727085393370, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (1526, 1526, 'menu.trace.wireshark', '信令跟踪', 'i18n_zh', '', '', '1', 'supervisor', 1727085393370, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1527, 1527, 'dictType.ne_version_status_remark', '网元软件版本状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1528, 1528, 'dictType.i18n_en_remark', 'Internationalization - English', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1529, 1529, 'dictType.i18n_zh_remark', 'Internationalization - Chinese', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -316,7 +316,7 @@ REPLACE INTO `sys_dict_data` VALUES (1657, 1657, 'config..export.value', '参数 REPLACE INTO `sys_dict_data` VALUES (1658, 1658, 'config..export.type', '系统内置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1659, 1659, 'config..export.remark', '参数说明', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (1660, 1660, 'config.sys.titleValue', 'AGrand EMS', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2023 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2024 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1662, 1662, 'config.noData', '没有可访问参数配置数据!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1663, 1663, 'config.errKey', '无效 key', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1664, 1664, 'config.errValueEq', '变更状态与旧值相等!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -598,7 +598,7 @@ REPLACE INTO `sys_dict_data` VALUES (2080, 2080, 'log.operate.title.ws', 'WS会 REPLACE INTO `sys_dict_data` VALUES (2081, 2081, 'log.operate.title.neHost', '网元主机', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2082, 2082, 'neHost.noData', '没有可访问主机信息数据!', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2083, 2083, 'neHost.errKeyExists', '主机信息操作【{name}】失败,同组内名称已存在', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -REPLACE INTO `sys_dict_data` VALUES (2084, 2084, 'neHost.errByHostInfo', '连接主机失败,请检查连接参数后重试', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2084, 2084, 'neHost.errByHostInfo', '连接失败,请检查连接参数后重试', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2085, 2085, 'dictType.ne_host_type', '网元主机连接类型', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2086, 2086, 'dictType.ne_host_groupId', '网元主机分组', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2087, 2087, 'dictType.ne_host_authMode', '网元主机认证模式', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -609,7 +609,7 @@ REPLACE INTO `sys_dict_data` VALUES (2091, 2091, 'dictData.ne_host_groupId.1', ' REPLACE INTO `sys_dict_data` VALUES (2092, 2092, 'dictData.ne_host_groupId.2', '系统', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2093, 2093, 'dictData.ne_host_authMode.0', '密码认证', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2094, 2094, 'dictData.ne_host_authMode.1', '私钥认证', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -REPLACE INTO `sys_dict_data` VALUES (2095, 2095, 'menu.tools.terminal', '网元主机终端', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2095, 2095, 'menu.tools.terminal', '主机终端', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2096, 2096, 'menu.ne.neHost', '网元主机', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2097, 2097, 'menu.ne.neHostCommand', '网元主机命令', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2098, 2098, 'log.operate.title.neHostCmd', '网元主机命令', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -663,8 +663,8 @@ REPLACE INTO `sys_dict_data` VALUES (2145, 2145, 'menu.system.user.editPost', ' REPLACE INTO `sys_dict_data` VALUES (2146, 2146, 'menu.dashboard.smscCDR', '短信话单', 'i18n_zh', '', '', '1', 'supervisor', 1717051745866, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2147, 2147, 'log.operate.title.smscCDR', '短信话单', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2148, 2148, 'menu.trace.pcapFile', '信令抓包文件', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); --- REPLACE INTO `sys_dict_data` VALUES (2149, 2149, 'dictData.udm_sub_cn_type.2', '4G', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); --- REPLACE INTO `sys_dict_data` VALUES (2150, 2150, 'dictData.udm_sub_cn_type.3', '5G&4G', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2149, 2149, 'menu.trace.taskAnalyze', '跟踪数据分析', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2150, 2150, 'job.ne_data_udm', '网元数据-UDM数据刷新同步', 'i18n_zh', '', '', '1', 'supervisor', 1730173767412, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2151, 2151, 'menu.system.setting.doc', '系统使用文档', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2152, 2152, 'menu.system.setting.official', '官网链接', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2153, 2153, 'menu.system.setting.lock', '锁屏操作', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -678,5 +678,29 @@ REPLACE INTO `sys_dict_data` VALUES (2160, 2160, 'table.sys_log_operate', '操 REPLACE INTO `sys_dict_data` VALUES (2161, 2161, 'table.cdr_event_ims', '语音话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2162, 2162, 'table.cdr_event_smf', '数据话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2163, 2163, 'table.cdr_event_smsc', '短信话单', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2164, 2164, 'menu.log.exportFile', '导出文件管理', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2165, 2165, 'menu.perf.kpiCReport', '自定义指标数据', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2166, 2166, 'menu.trace.taskHLR', 'HLR 跟踪任务', 'i18n_zh', '', '', '1', 'supervisor', 1726626822538, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2167, 2167, 'dictType.cdr_cause_code', 'CDR 响应原因代码类别类型', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2168, 2168, 'dictData.cdr_cause_code.0', '未知错误', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2169, 2169, 'dictData.cdr_cause_code.8', '运营者要求禁止', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2170, 2170, 'dictData.cdr_cause_code.10', '呼叫禁止', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2171, 2171, 'dictData.cdr_cause_code.21', '短信传输拒绝', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2172, 2172, 'dictData.cdr_cause_code.22', '内存超限', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2173, 2173, 'dictData.cdr_cause_code.27', '目的地出错', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2174, 2174, 'dictData.cdr_cause_code.28', '用户身份不明', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2175, 2175, 'dictData.cdr_cause_code.29', '功能拒绝错误', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2176, 2176, 'dictData.cdr_cause_code.30', '未知用户', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2177, 2177, 'dictData.cdr_cause_code.38', '网络出错', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2178, 2178, 'dictData.cdr_cause_code.41', '临时错误', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +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, ''); +REPLACE INTO `sys_dict_data` VALUES (2184, 2184, 'config.sys.homePage', '自定义主页', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2185, 2185, 'config.sys.homePageRemark', '选择列表中的任一页面作为主页路径', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2186, 2186, 'menu.config.neOverview', '网元概览', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2187, 2187, 'menu.config.neOverviewRemark', '显示所有网元状态配置和license等概览信息', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data2_i18n_en.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data2_i18n_en.sql index 6b2c575..6c6ad00 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -89,8 +89,8 @@ REPLACE INTO `sys_dict_data` VALUES (3070, 3070, 'menu.ueUser.onlineIMS', 'IMS O REPLACE INTO `sys_dict_data` VALUES (3071, 3071, 'menu.ueUser.onlineUE', 'UE Online Information', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3072, 3072, 'menu.ueUser.base5G', 'Radio Information', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3073, 3073, 'menu.trace', 'Trace', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3074, 3074, 'menu.trace.task', 'Trace Tasks', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3075, 3075, 'menu.trace.analysis', 'Signaling Analysis', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3074, 3074, 'menu.trace.task', 'NE Trace Task', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3075, 3075, 'menu.trace.analysis', 'NE Trace Task Data', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3076, 3076, 'menu.trace.pcap', 'Signaling Capture', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3077, 3077, 'menu.fault', 'Monitor', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3078, 3078, 'menu.config.backupManageRemark', 'Backup Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -123,11 +123,11 @@ REPLACE INTO `sys_dict_data` VALUES (3110, 3110, 'menu.fault.setRemark', 'Fault REPLACE INTO `sys_dict_data` VALUES (3111, 3111, 'menu.perfRemark', 'Performance Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3112, 3112, 'menu.perf.task', 'Performance Tasks', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3113, 3113, 'menu.perf.data', 'Performance Data', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.report', 'Performance Reports', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.kpiOverView', 'Key Performance Overview', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3115, 3115, 'menu.perf.threshold', 'Performance Thresholds', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3116, 3116, 'menu.perf.kpi', 'Key Performance Indicators', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3117, 3117, 'menu.perf.customTarget', 'Custom Metrics', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3118, 3118, 'menu.perf.set', 'Performance General Settings', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3117, 3117, 'menu.perf.customTarget', 'Custom Indicator Management', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3118, 3118, 'menu.perf.kpiKeyTarget', 'Key Performance Reports', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3119, 3119, 'menu.mml', 'MML', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3120, 3120, 'menu.mml.ne', 'NE Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3121, 3121, 'menu.mml.udm', 'UDM Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -135,11 +135,11 @@ REPLACE INTO `sys_dict_data` VALUES (3122, 3122, 'menu.mml.set', 'MML Settings', REPLACE INTO `sys_dict_data` VALUES (3123, 3123, 'menu.mml.omc', 'OMC Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3124, 3124, 'menu.perf.taskRemark', 'Task Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3125, 3125, 'menu.perf.dataRemark', 'Performance Data Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.reportRemark', 'Performance Report Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.kpiOverViewRemark', 'Performance Report Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3127, 3127, 'menu.perf.thresholdRemark', 'Performance Threshold Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3128, 3128, 'menu.perf.kpiRemark', 'Key Performance Indicator Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3129, 3129, 'menu.perf.customTargetRemark', 'Custom Metrics Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3130, 3130, 'menu.perf.setRemark', 'Performance General Settings Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3129, 3129, 'menu.perf.customTargetRemark', 'Custom Indicator Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3130, 3130, 'menu.perf.setRemark', 'Performance General Settings Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3131, 3131, 'menu.mmlRemark', 'MML Management Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3132, 3132, 'menu.mml.neRemark', 'Network Element Operations Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3133, 3133, 'menu.mml.udmRemark', 'Network Element UDM User Data Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -189,28 +189,28 @@ REPLACE INTO `sys_dict_data` VALUES (3423, 3423, 'dictData.operType.clear', 'Cle REPLACE INTO `sys_dict_data` VALUES (3424, 3424, 'dictData.trace.interface', 'Interface Tracing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3425, 3425, 'dictData.trace.device', 'Module Tracing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3426, 3426, 'dictData.trace.user', 'User Tracing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3427, 3427, 'dictData.logType.download', 'Download', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3428, 3428, 'dictData.logType.activation', 'Activation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3429, 3429, 'dictData.logType.add', 'New', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3430, 3430, 'dictData.logType.other', 'Other', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3431, 3431, 'dictData.logType.back', 'Rollback', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3432, 3432, 'dictData.logType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3433, 3433, 'dictData.logType.distribute', 'Assign', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3434, 3434, 'dictData.logType.export', 'Export', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3435, 3435, 'dictData.logType.query', 'Query', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3436, 3436, 'dictData.logType.setup', 'Setup', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3437, 3437, 'dictData.logType.update', 'Update', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3438, 3438, 'dictData.logType.upload', 'Upload', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3439, 3439, 'dictData.logType.view', 'View', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3440, 3440, 'dictData.logType.login', 'Login', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3441, 3441, 'dictData.logType.logout', 'Logout', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3442, 3442, 'dictData.securityLogType.add', 'New', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3443, 3443, 'dictData.securityLogType.update', 'Update', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3444, 3444, 'dictData.securityLogType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3445, 3445, 'dictData.securityLogType.lock', 'Locked', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3446, 3446, 'dictData.securityLogType.unlock', 'Unlock', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3447, 3447, 'dictData.securityLogType.reset', 'Reset', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3448, 3448, 'dictData.securityLogType.deactivate', 'Deactivate', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3427, 3427, 'dictData.logType.download', 'Download', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3428, 3428, 'dictData.logType.activation', 'Activation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3429, 3429, 'dictData.logType.add', 'New', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3430, 3430, 'dictData.logType.other', 'Other', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3431, 3431, 'dictData.logType.back', 'Rollback', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3432, 3432, 'dictData.logType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3433, 3433, 'dictData.logType.distribute', 'Assign', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3434, 3434, 'dictData.logType.export', 'Export', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3435, 3435, 'dictData.logType.query', 'Query', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3436, 3436, 'dictData.logType.setup', 'Setup', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3437, 3437, 'dictData.logType.update', 'Update', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3438, 3438, 'dictData.logType.upload', 'Upload', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3439, 3439, 'dictData.logType.view', 'View', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3440, 3440, 'dictData.logType.login', 'Login', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3441, 3441, 'dictData.logType.logout', 'Logout', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3442, 3442, 'dictData.securityLogType.add', 'New', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3443, 3443, 'dictData.securityLogType.update', 'Update', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3444, 3444, 'dictData.securityLogType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3445, 3445, 'neHost.banNE', 'Do not operate the NE', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (3446, 3446, 'dictData.ne_host_type.redis', 'Redis', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (3447, 3447, 'menu.tools.ping', 'Net Probing Test', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (3448, 3448, 'menu.tools.iperf', 'Net Performance Test', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3449, 3449, 'dictData.jobSaveLog.no', 'No Record', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3450, 3450, 'dictData.jobSaveLog.yes', 'Recorded', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3451, 3451, 'dictData.neVersionStatus.upload', 'Uploaded', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -240,9 +240,9 @@ REPLACE INTO `sys_dict_data` VALUES (3505, 3505, 'dictType.sys_yes_no', 'System REPLACE INTO `sys_dict_data` VALUES (3506, 3506, 'dictType.sys_oper_type', 'Operation Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3507, 3507, 'dictType.sys_common_status', 'System Status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3508, 3508, 'dictType.trace_type', 'Trace Types', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3509, 3509, 'dictType.operation_log_type', 'Operation Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3509, 3509, 'menu.tools.ps', 'Process Running Program', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3510, 3510, 'dictType.alarm_status', 'Alarm Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3511, 3511, 'dictType.security_log_type', 'Security Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3511, 3511, 'menu.tools.net', 'Process Network Connection', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3512, 3512, 'dictType.ne_version_status', 'Network element software version status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3513, 3513, 'dictType.i18n_en', 'Multi-language - English', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3514, 3514, 'dictType.i18n_zh', 'Multi-language - Chinese', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -255,9 +255,9 @@ REPLACE INTO `sys_dict_data` VALUES (3520, 3520, 'dictType.sys_yes_no_remark', ' REPLACE INTO `sys_dict_data` VALUES (3521, 3521, 'dictType.sys_oper_type_remark', 'Operation type list', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3522, 3522, 'dictType.sys_common_status_remark', 'Login Status List', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3523, 3523, 'dictType.trace_type_remark', 'Trace Types', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3524, 3524, 'dictType.operation_log_type_remark', 'Operation log type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3525, 3525, 'dictType.alarm_status_remark', 'Alarm Log Status Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3526, 3526, 'dictType.security_log_type_remark', 'Security Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3524, 3524, 'dictType.alarm_status_remark', 'Alarm Log Status Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3525, 3525, 'menu.trace.tshark', 'Signaling Analysis', 'i18n_en', '', '', '1', 'supervisor', 1727085393370, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (3526, 3526, 'menu.trace.wireshark', 'Signaling Trace', 'i18n_en', '', '', '1', 'supervisor', 1727085393370, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3527, 3527, 'dictType.ne_version_status_remark', 'Network element software version status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3528, 3528, 'dictType.i18n_en_remark', 'Internationalization - English', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3529, 3529, 'dictType.i18n_zh_remark', 'Internationalization - Chinese', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -310,7 +310,7 @@ REPLACE INTO `sys_dict_data` VALUES (3657, 3657, 'config..export.value', 'Config REPLACE INTO `sys_dict_data` VALUES (3658, 3658, 'config..export.type', 'Built In', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3659, 3659, 'config..export.remark', 'Config Description', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (3660, 3660, 'config.sys.titleValue', 'AGrand EMS', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2023 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2024 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3662, 3662, 'config.noData', 'No parameter configuration data is accessible!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3663, 3663, 'config.errKey', 'Invalid key', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3664, 3664, 'config.errValueEq', 'Change state is equal to the old value!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -326,7 +326,7 @@ REPLACE INTO `sys_dict_data` VALUES (3705, 3705, 'job.deleteExpiredAlarmRecordRe REPLACE INTO `sys_dict_data` VALUES (3706, 3706, 'job.deleteExpiredKpiRecord', 'Delete expired KPI records', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3707, 3707, 'job.deleteExpiredKpiRecordRemark', 'KPI record retention for {duration} days', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3708, 3708, 'job.backupEtcFromNE', 'Network Element Configuration Auto Backup Task', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3709, 3709, 'job.backupEtcFromNERemark', 'Automatically backs up the configuration files in the network element\'s etc directory.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3709, 3709, 'job.backupEtcFromNERemark', 'Automatically backs up the configuration files in the NE etc directory.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3710, 3710, 'job.export.jobID', 'ID', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3711, 3711, 'job.export.jobName', 'Name', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3712, 3712, 'job.export.jobGroupName', 'Group', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -446,7 +446,7 @@ REPLACE INTO `sys_dict_data` VALUES (3933, 3933, 'log.login.export.browser', 'Br REPLACE INTO `sys_dict_data` VALUES (3934, 3934, 'log.login.export.os', 'Operating System', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3935, 3935, 'log.login.export.msg', 'Login Information', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3936, 3936, 'log.login.export.time', 'Login Time', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3937, 3937, 'trace.tcpdump.noData', 'Can\'t find {type} {id} information of the corresponding network element.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3937, 3937, 'trace.tcpdump.noData', 'Can it find {type} {id} information of the corresponding network element.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3938, 3938, 'register.errUsername', 'The account number cannot start with a number, but can contain upper and lower case letters, numbers, and not less than 5 digits.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3939, 3939, 'register.errPasswd', 'The password must contain at least 6 upper and lower case letters, numbers, and special symbols.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3940, 3940, 'register.errPasswdNotEq', 'User confirms password inconsistency', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -593,7 +593,7 @@ REPLACE INTO `sys_dict_data` VALUES (4080, 4080, 'log.operate.title.ws', 'WS Ses REPLACE INTO `sys_dict_data` VALUES (4081, 4081, 'log.operate.title.neHost', 'NE Host', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4082, 4082, 'neHost.noData', 'There is no accessible host information data!', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4083, 4083, 'neHost.errKeyExists', 'Host information operation [{name}] failed, name already exists in the same group', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -REPLACE INTO `sys_dict_data` VALUES (4084, 4084, 'neHost.errByHostInfo', 'Failed to connect to the host, please check the connection parameters and try again', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4084, 4084, 'neHost.errByHostInfo', 'Connection Failed, Please check connection parameters and retry', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4085, 4085, 'dictType.ne_host_type', 'Network element host connection type', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4086, 4086, 'dictType.ne_host_groupId', 'Network element host grouping', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4087, 4087, 'dictType.ne_host_authMode', 'Network element host authentication mode', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -604,7 +604,7 @@ REPLACE INTO `sys_dict_data` VALUES (4091, 4091, 'dictData.ne_host_groupId.1', ' REPLACE INTO `sys_dict_data` VALUES (4092, 4092, 'dictData.ne_host_groupId.2', 'System', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4093, 4093, 'dictData.ne_host_authMode.0', 'Password Auth Mode', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4094, 4094, 'dictData.ne_host_authMode.1', 'PrivateKey Auth Mode', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -REPLACE INTO `sys_dict_data` VALUES (4095, 4095, 'menu.tools.terminal', 'NE Host Terminal', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4095, 4095, 'menu.tools.terminal', 'Host Terminal', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4096, 4096, 'menu.ne.neHost', 'NE Host', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4097, 4097, 'menu.ne.neHostCommand', 'NE Host CMD', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4098, 4098, 'log.operate.title.neHostCmd', 'NE Host CMD', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -658,8 +658,8 @@ REPLACE INTO `sys_dict_data` VALUES (4145, 4145, 'menu.system.user.editPost', 'M REPLACE INTO `sys_dict_data` VALUES (4146, 4146, 'menu.dashboard.smscCDR', 'SMS CDR', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4147, 4147, 'log.operate.title.smscCDR', 'SMS CDR', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4148, 4148, 'menu.trace.pcapFile', 'Signaling Capture File', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); --- REPLACE INTO `sys_dict_data` VALUES (4149, 4149, 'dictData.udm_sub_cn_type.2', '4G', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); --- REPLACE INTO `sys_dict_data` VALUES (4150, 4150, 'dictData.udm_sub_cn_type.3', '5G&4G', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4149, 4149, 'menu.trace.taskAnalyze', 'Tracking Data Analysis', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4150, 4150, 'job.ne_data_udm', 'NE Data Sync UDM', 'i18n_en', '', '', '1', 'supervisor', 1730173767412, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4151, 4151, 'menu.system.setting.doc', 'System User Documentation', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4152, 4152, 'menu.system.setting.official', 'Official Website', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4153, 4153, 'menu.system.setting.lock', 'Lockscreen Operation', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); @@ -673,5 +673,29 @@ REPLACE INTO `sys_dict_data` VALUES (4160, 4160, 'table.sys_log_operate', 'Opera REPLACE INTO `sys_dict_data` VALUES (4161, 4161, 'table.cdr_event_ims', 'Voice CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4162, 4162, 'table.cdr_event_smf', 'Data CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4163, 4163, 'table.cdr_event_smsc', 'SMS CDR', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4164, 4164, 'menu.log.exportFile', 'Exported File Management', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4165, 4165, 'menu.perf.kpiCReport', 'Custom Indicator Data', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4166, 4166, 'menu.trace.taskHLR', 'HLR Trace Task', 'i18n_en', '', '', '1', 'supervisor', 1726626822538, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4167, 4167, 'dictType.cdr_cause_code', 'CDR Response Reason Code Category Type', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4168, 4168, 'dictData.cdr_cause_code.0', 'Unknown Error', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4169, 4169, 'dictData.cdr_cause_code.8', 'OPERATOR_DETERMINED_BARRING', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4170, 4170, 'dictData.cdr_cause_code.10', 'CALL_BARRED', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4171, 4171, 'dictData.cdr_cause_code.21', 'SM Trans Reject', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4172, 4172, 'dictData.cdr_cause_code.22', 'Memory Exceeded', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4173, 4173, 'dictData.cdr_cause_code.27', 'Destination Out Order', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4174, 4174, 'dictData.cdr_cause_code.28', 'Unidentified Subscriber', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4175, 4175, 'dictData.cdr_cause_code.29', 'Facility Reject Error', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4176, 4176, 'dictData.cdr_cause_code.30', 'Unknown Subscriber', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4177, 4177, 'dictData.cdr_cause_code.38', 'Network Out Order', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4178, 4178, 'dictData.cdr_cause_code.41', 'Temp Fail', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); +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 (4184, 4184, 'config.sys.homePage', 'Custom Home Page', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4185, 4185, 'config.sys.homePageRemark', 'Select any page in the list as the homepage', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4186, 4186, 'menu.config.neOverview', 'NE Overview', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4187, 4187, 'menu.config.neOverviewRemark', 'Displays overview information such as status, configuration and license of all network elements', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_type.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_type.sql index 2ad714f..6c2c5b3 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_type.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_dict_type.sql @@ -30,9 +30,9 @@ INSERT IGNORE INTO `sys_dict_type` VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no INSERT IGNORE INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_oper_type_remark'); INSERT IGNORE INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_common_status_remark'); INSERT IGNORE INTO `sys_dict_type` VALUES (100, 'dictType.trace_type', 'trace_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.trace_type_remark'); -INSERT IGNORE INTO `sys_dict_type` VALUES (101, 'dictType.operation_log_type', 'operation_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.operation_log_type_remark'); +-- INSERT IGNORE INTO `sys_dict_type` VALUES (101, 'dictType.operation_log_type', 'operation_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.operation_log_type_remark'); INSERT IGNORE INTO `sys_dict_type` VALUES (102, 'dictType.alarm_status', 'alarm_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.alarm_status_remark'); -INSERT IGNORE INTO `sys_dict_type` VALUES (103, 'dictType.security_log_type', 'security_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.security_log_type_remark'); +-- INSERT IGNORE INTO `sys_dict_type` VALUES (103, 'dictType.security_log_type', 'security_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.security_log_type_remark'); INSERT IGNORE INTO `sys_dict_type` VALUES (104, 'dictType.ne_version_status', 'ne_version_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.ne_version_status_remark'); INSERT IGNORE INTO `sys_dict_type` VALUES (105, 'dictType.i18n_en', 'i18n_en', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.i18n_en_remark'); INSERT IGNORE INTO `sys_dict_type` VALUES (106, 'dictType.i18n_zh', 'i18n_zh', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.i18n_zh_remark'); @@ -53,6 +53,6 @@ INSERT IGNORE INTO `sys_dict_type` VALUES (120, 'dictType.ne_host_authMode', 'ne INSERT IGNORE INTO `sys_dict_type` VALUES (121, 'dictType.ne_host_cmd_groupId', 'ne_host_cmd_groupId', '1', 'supervisor', 1702020000000, '', 0, ''); INSERT IGNORE INTO `sys_dict_type` VALUES (122, 'dictType.ne_info_status', 'ne_info_status', '1', 'supervisor', 1702020000000, '', 0, ''); INSERT IGNORE INTO `sys_dict_type` VALUES (123, 'dictType.ne_license_status', 'ne_license_status', '1', 'supervisor', 1702020000000, '', 0, ''); --- INSERT IGNORE INTO `sys_dict_type` VALUES (124, 'dictType.udm_sub_cn_type', 'udm_sub_cn_type', '1', 'supervisor', 1702020000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_type` VALUES (124, 'dictType.cdr_cause_code', 'cdr_cause_code', '1', 'supervisor', 1725877564156, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_job.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_job.sql index 4833208..67cdba0 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_job.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_job.sql @@ -34,6 +34,7 @@ MODIFY COLUMN `target_params` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb REPLACE INTO `sys_job` VALUES (1, 'job.monitor_sys_resource', 'SYSTEM', 'monitor_sys_resource', '{\"interval\":5}', '0 0/5 * * * ?', '3', '0', '1', '0', 'supervisor', 1698478134839, 'supervisor', 1700571615807, 'job.monitor_sys_resource_remark'); REPLACE INTO `sys_job` VALUES (2, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134839, 'supervisor', 1700571615807, 'job.ne_config_backup_remark'); +REPLACE INTO `sys_job` VALUES (3, 'job.ne_data_udm', 'SYSTEM', 'ne_data_udm', '', '0 0 0/12 * * ?', '3', '0', '1', '1', 'supervisor', 1730173767412, '', 0, ''); REPLACE INTO `sys_job` VALUES (4, 'job.delExpiredNeBackup', 'SYSTEM', 'delExpiredNeBackup', '{\"duration\":60}', '0 20 0 * * ?', '3', '0', '0', '1', 'supervisor', 1698478134840, NULL, 0, 'job.delExpiredNeBackupRemark'); REPLACE INTO `sys_job` VALUES (5, 'job.deleteExpiredAlarmRecord', 'SYSTEM', 'deleteExpiredRecord', '{\"duration\":90,\"tableName\":\"alarm\",\"colName\":\"event_time\",\"extras\":\"alarm_status=\'0\'\"}', '0 10 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134841, NULL, 0, 'job.deleteExpiredAlarmRecordRemark'); REPLACE INTO `sys_job` VALUES (6, 'job.deleteExpiredKpiRecord', 'SYSTEM', 'deleteExpiredRecord', '{\"duration\":30,\"tableName\":\"gold_kpi\",\"colName\":\"date\"}', '0 15 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'supervisor', 1700570673113, 'job.deleteExpiredKpiRecordRemark'); @@ -41,8 +42,10 @@ REPLACE INTO `sys_job` VALUES (7, 'job.backupEtcFromNE', 'SYSTEM', 'backupEtcFro REPLACE INTO `sys_job` VALUES (8, 'job.deleteExpiredNeStateRecord', 'SYSTEM', 'deleteExpiredRecord', '{\"duration\":1,\"tableName\":\"ne_state\",\"colName\":\"timestamp\"}', '0 25 0 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134842, 'admin', 1703668901929, 'job.deleteExpiredNeStateRecordRemark'); REPLACE INTO `sys_job` VALUES (9, 'job.getStateFromNE', 'SYSTEM', 'getStateFromNE', '', '0/10 * * * * ?', '3', '0', '0', '0', 'supervisor', 1698478134842, 'admin', 1713231120503, 'job.getStateFromNERemark'); 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 (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\",\"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; \ No newline at end of file diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_menu.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_menu.sql index 491c88c..fe92135 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_menu.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_menu.sql @@ -32,6 +32,13 @@ CREATE TABLE IF NOT EXISTS `sys_menu` ( REPLACE INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); REPLACE INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); REPLACE INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); +REPLACE INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1715413568692, 'menu.toolsRemark'); +REPLACE INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 20, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); +REPLACE INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 8, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); +REPLACE INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 9, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); +REPLACE INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 4, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); +REPLACE INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 6, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); REPLACE INTO `sys_menu` VALUES (100, 'menu.security.user', 2113, 1, 'user', 'system/user/index', '1', '1', 'M', '1', '1', 'system:user:list', 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.security.userRemark'); REPLACE INTO `sys_menu` VALUES (101, 'menu.security.role', 2113, 3, 'role', 'system/role/index', '1', '1', 'M', '1', '1', 'system:role:list', 'icon-anzhuo', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleRemark'); REPLACE INTO `sys_menu` VALUES (102, 'menu.security.roleUser', 2113, 3, 'role/inline/auth-user/:roleId', 'system/role/auth-user', '1', '1', 'M', '0', '1', 'system:role:auth', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleUserRemark'); @@ -106,15 +113,15 @@ REPLACE INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', NULL, ' REPLACE INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.authUDMRemark'); REPLACE INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.subUDMRemark'); REPLACE INTO `sys_menu` VALUES (2075, 'menu.config.neManage', 4, 1, 'neManage', 'configManage/neManage/index', '1', '0', 'M', '1', '0', 'configManage:neManage:index', 'icon-biaoqing', 'supervisor', 1700000000000, NULL, 0, 'menu.config.neManageRemark'); -REPLACE INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 3, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.config.backupManageRemark'); +REPLACE INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 100, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.config.backupManageRemark'); REPLACE INTO `sys_menu` VALUES (2079, 'menu.config.softwareManage', 4, 4, 'softwareManage', 'configManage/softwareManage/index', '1', '0', 'M', '1', '0', 'configManage:softwareManage:index', 'icon-huidingbu', 'supervisor', 1700000000000, NULL, 0, 'menu.config.softwareManageRemark'); REPLACE INTO `sys_menu` VALUES (2080, 'menu.ueUser.onlineIMS', 5, 4, 'ims', 'neUser/ims/index', '1', '0', 'M', '1', '1', 'neUser:ims:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.onlineIMSRemark'); REPLACE INTO `sys_menu` VALUES (2081, 'menu.ueUser.onlineUE', 5, 6, 'ue', 'neUser/ue/index', '1', '0', 'M', '1', '1', 'neUser:ue:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.onlineUERemark'); REPLACE INTO `sys_menu` VALUES (2082, 'menu.ueUser.base5G', 5, 7, 'base5G', 'neUser/base5G/index', '1', '0', 'M', '1', '1', 'neUser:base5G:index', 'icon-paixu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.base5GRemark'); REPLACE INTO `sys_menu` VALUES (2083, 'menu.trace', 2087, 30, 'traceManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-paixu', 'supervisor', 1700000000000, NULL, 0, 'menu.traceRemark'); REPLACE INTO `sys_menu` VALUES (2084, 'menu.trace.task', 2083, 1, 'task', 'traceManage/task/index', '1', '0', 'M', '0', '1', 'traceManage:task:index', 'icon-chexiao', 'supervisor', 1700000000000, 'admin', 1713176976458, 'menu.trace.taskRemark'); -REPLACE INTO `sys_menu` VALUES (2085, 'menu.trace.analysis', 2083, 2, 'analysis', 'traceManage/analysis/index', '1', '0', 'M', '0', '1', 'traceManage:analysis:index', 'icon-gongnengjieshao', 'supervisor', 1700000000000, 'admin', 1713176987835, 'menu.trace.analysisRemark'); -REPLACE INTO `sys_menu` VALUES (2086, 'menu.trace.pcap', 2083, 3, 'pcap', 'traceManage/pcap/index', '1', '1', 'M', '1', '1', 'traceManage:pcap:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.trace.pcapRemark'); +REPLACE INTO `sys_menu` VALUES (2085, 'menu.trace.analysis', 2083, 4, 'analysis', 'traceManage/analysis/index', '1', '0', 'M', '0', '1', 'traceManage:analysis:index', 'icon-gongnengjieshao', 'supervisor', 1700000000000, 'admin', 1713176987835, 'menu.trace.analysisRemark'); +REPLACE INTO `sys_menu` VALUES (2086, 'menu.trace.pcap', 2083, 11, 'pcap', 'traceManage/pcap/index', '1', '1', 'M', '1', '1', 'traceManage:pcap:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.trace.pcapRemark'); REPLACE INTO `sys_menu` VALUES (2087, 'menu.fault', 0, 2, 'faultManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-jinggao', 'supervisor', 1700000000000, NULL, 0, 'menu.faultRemark'); REPLACE INTO `sys_menu` VALUES (2088, 'menu.fault.active', 2129, 1, 'active-alarm', 'faultManage/active-alarm/index', '1', '1', 'M', '1', '1', 'faultManage:active-alarm:index', 'icon-wenjian', 'supervisor', 1700000000000, NULL, 0, 'menu.fault.activemRemark'); REPLACE INTO `sys_menu` VALUES (2089, 'menu.log', 0, 9, 'logManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-fuzhidaima', 'supervisor', 1700000000000, NULL, 0, 'menu.logRemark'); @@ -123,15 +130,15 @@ REPLACE INTO `sys_menu` VALUES (2092, 'menu.log.alarm', 2089, 40, 'alarm-log', ' REPLACE INTO `sys_menu` VALUES (2094, 'menu.log.forwarding', 2089, 41, 'forwarding', 'logManage/forwarding/index', '1', '0', 'M', '1', '1', 'logManage:forwarding:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.log.forwardingRemark'); REPLACE INTO `sys_menu` VALUES (2095, 'menu.log.set', 2089, 45, 'logSet', 'logManage/logSet/index', '1', '0', 'M', '0', '0', 'logManage:logSet:index', 'icon-you', 'supervisor', 1700000000000, 'supervisor', 1715332370830, 'menu.log.setRemark'); REPLACE INTO `sys_menu` VALUES (2097, 'menu.fault.history', 2129, 2, 'history-alarm', 'faultManage/history-alarm/index', '1', '1', 'M', '1', '1', 'faultManage/history-alarm/index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.fault.historyRemark'); -REPLACE INTO `sys_menu` VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-setting', 'faultManage/fault-setting/index', '1', '0', 'M', '1', '1', 'faultManage/fault-setting/index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.fault.setRemark'); +REPLACE INTO `sys_menu` VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-setting', 'faultManage/fault-setting/index', '1', '0', 'M', '0', '1', 'faultManage/fault-setting/index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.fault.setRemark'); REPLACE INTO `sys_menu` VALUES (2099, 'menu.perf', 0, 5, 'perfManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perfRemark'); -REPLACE INTO `sys_menu` VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', 'perfManage/taskManage/index', '1', '1', 'M', '0', '1', 'perfManage:taskManage:index', 'icon-wofaqi', 'supervisor', 1700000000000, 'admin', 1713177036412, 'menu.perf.taskRemark'); -REPLACE INTO `sys_menu` VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '1', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', 'supervisor', 1700000000000, 'admin', 1713177042915, 'menu.perf.dataRemark'); -REPLACE INTO `sys_menu` VALUES (2102, 'menu.perf.report', 2099, 3, 'perfReport', 'perfManage/perfReport/index', '1', '0', 'M', '0', '0', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.reportRemark'); +REPLACE INTO `sys_menu` VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', 'perfManage/taskManage/index', '1', '0', 'M', '0', '1', 'perfManage:taskManage:index', 'icon-wofaqi', 'supervisor', 1700000000000, 'admin', 1713177036412, 'menu.perf.taskRemark'); +REPLACE INTO `sys_menu` VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '0', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', 'supervisor', 1700000000000, 'admin', 1713177042915, 'menu.perf.dataRemark'); +REPLACE INTO `sys_menu` VALUES (2102, 'menu.perf.kpiOverView', 2099, 10, 'kpiOverView', 'perfManage/kpiOverView/index', '1', '0', 'M', '1', '1', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2103, 'menu.perf.threshold', 2099, 4, 'perfThreshold', 'perfManage/perfThreshold/index', '1', '0', 'M', '0', '0', 'perfManage:perfThreshold:index', 'icon-zhuanrang', 'supervisor', 1700000000000, 'supervisor', 1715417264697, 'menu.perf.thresholdRemark'); -REPLACE INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 5, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); -REPLACE INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 6, 'customTarget', 'perfManage/customTarget/index', '1', '1', 'M', '0', '0', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); -REPLACE INTO `sys_menu` VALUES (2106, 'menu.perf.set', 2099, 7, 'perfSet', 'perfManage/perfSet/index', '1', '0', 'M', '0', '0', 'perfManage:perfSet:index', 'icon-gonggao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.setRemark'); +REPLACE INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 20, 'goldTarget', 'perfManage/goldTarget/index', '1', '0', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); +REPLACE INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 99, 'customTarget', 'perfManage/customTarget/index', '1', '0', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); +REPLACE INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 12, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '1', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', 'supervisor', 1728642924734, 'supervisor', 1728642924734, ''); REPLACE INTO `sys_menu` VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-zhizuoliucheng', 'supervisor', 1700000000000, NULL, 0, 'menu.mmlRemark'); REPLACE INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlManage/neOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:neOperate:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.neRemark'); REPLACE INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.udmRemark'); @@ -179,7 +186,14 @@ REPLACE INTO `sys_menu` VALUES (2154, 'menu.ne.neConfigBackup', 4, 29, 'neConfig REPLACE INTO `sys_menu` VALUES (2155, 'menu.common.delete', 2154, 1, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:remove', '#', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2156, 'menu.common.edit', 2154, 2, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:edit', '#', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCDR', 'dashboard/smscCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1723107637982, 'supervisor', 1723107637982, ''); -REPLACE INTO `sys_menu` VALUES (2158, 'menu.trace.pcapFile', 2083, 4, 'pcap/inline/file', 'traceManage/pcap/file', '1', '1', 'M', '0', '1', 'traceManage:pcap:index', '#', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2158, 'menu.trace.pcapFile', 2083, 12, 'pcap/inline/file', 'traceManage/pcap/file', '1', '1', 'M', '0', '1', 'traceManage:pcap:index', '#', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2159, 'menu.log.exportFile', 2089, 100, 'exportFile', 'logManage/exportFile/index', '1', '1', 'M', '1', '1', 'logManage:exportFile:index', 'icon-wenjian', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2160, 'menu.perf.kpiCReport', 2099, 100, 'kpiCReport', 'perfManage/kpiCReport/index', '1', '0', 'M', '1', '1', 'perfManage:kpiCReport:index', 'icon-tubiaoku', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 2083, 6, 'taskHLR', 'traceManage/task-hlr/index', '1', '0', 'M', '0', '1', 'traceManage:taskHLR:index', 'icon-chexiao', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2162, 'menu.trace.taskAnalyze', 2083, 2, 'task/inline/analyze', 'traceManage/task/analyze', '1', '0', 'M', '0', '1', 'traceManage:taskAnalyze:index', '#', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2163, 'menu.trace.tshark', 2083, 14, 'tshark', 'traceManage/tshark/index', '1', '0', 'M', '1', '1', 'traceManage:tshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2164, 'menu.trace.wireshark', 2083, 16, 'wireshark', 'traceManage/wireshark/index', '1', '0', 'M', '1', '1', 'traceManage:wireshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2165, 'menu.config.neOverview', 4, 1, 'neOverview', 'configManage/neOverview/index', '1', '0', 'M', '1', '1', 'configManage:neOverview:index', 'icon-tubiaoku', 'supervisor', 1700000000000, NULL, 0, 'menu.config.neOverviewRemark'); -- 指定记录条件更新 diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_role_menu.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_role_menu.sql index 03f0e80..7f86cd6 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_role_menu.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_role_menu.sql @@ -1,19 +1,3 @@ -/* - Navicat Premium Data Transfer - - Source Server : local_mariadb - Source Server Type : MariaDB - Source Server Version : 100338 (10.3.38-MariaDB) - Source Host : localhost:33066 - Source Schema : omc_db - - Target Server Type : MariaDB - Target Server Version : 100338 (10.3.38-MariaDB) - File Encoding : 65001 - - Date: 01/02/2024 16:05:38 -*/ - SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; @@ -29,9 +13,16 @@ CREATE TABLE IF NOT EXISTS `sys_role_menu` ( -- ---------------------------- -- Records of sys_role_menu -- ---------------------------- + INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 61); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 63); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 64); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 100); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 101); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102); @@ -116,13 +107,14 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2102); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2103); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2105); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2106); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2109); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2111); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2118); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2119); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2120); @@ -158,9 +150,18 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2155); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2158); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2159); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2160); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2163); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2165); + INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 115); @@ -179,8 +180,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2080); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2081); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2083); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2084); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2085); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2088); @@ -189,28 +188,17 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2098); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2099); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2100); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2101); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2102); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2103); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2104); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2105); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2106); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2109); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2111); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2118); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2119); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2120); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2124); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2125); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2126); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2127); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2129); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2130); @@ -222,6 +210,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2138); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2140); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2141); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2143); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2146); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2147); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2148); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2149); @@ -229,8 +218,17 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2153); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2154); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2155); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2158); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); + INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 4); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 500); @@ -240,12 +238,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1042); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1048); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2083); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2084); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2085); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2088); @@ -254,17 +247,9 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2098); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2099); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2101); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2119); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2120); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2124); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2125); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2114); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2127); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2130); @@ -280,14 +265,17 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2149); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2157); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2163); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); + INSERT IGNORE INTO `sys_role_menu` VALUES (5, 1); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 112); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2087); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2131); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2132); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2165); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_user.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_user.sql index 547aa13..a2bba87 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_sys_user.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_sys_user.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS `sys_user` ( `nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称', `user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'sys' COMMENT '用户类型(sys系统用户)', `email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱', - `phonenumber` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码', + `phonenumber` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码', `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0未知 1男 2女)', `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '头像地址', `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码', @@ -22,185 +22,13 @@ CREATE TABLE IF NOT EXISTS `sys_user` ( `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', PRIMARY KEY (`user_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户信息表'; - -INSERT IGNORE INTO `sys_user` ( - `user_id`, - `dept_id`, - `user_name`, - `nick_name`, - `user_type`, - `email`, - `phonenumber`, - `sex`, - `avatar`, - `password`, - `status`, - `del_flag`, - `login_ip`, - `login_date`, - `create_by`, - `create_time`, - `update_by`, - `update_time`, - `remark` - ) -VALUES ( - 1, - '100', - 'supervisor', - 'supervisor', - 'sys', - '', - '', - '', - '', - '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', - '1', - '0', - '192.168.2.114', - 1698920815347, - 'admin', - 1697091656500, - 'supervisor', - 1698920815347, - '' - ); - -INSERT IGNORE INTO `sys_user` ( - `user_id`, - `dept_id`, - `user_name`, - `nick_name`, - `user_type`, - `email`, - `phonenumber`, - `sex`, - `avatar`, - `password`, - `status`, - `del_flag`, - `login_ip`, - `login_date`, - `create_by`, - `create_time`, - `update_by`, - `update_time`, - `remark` - ) -VALUES ( - 2, - '100', - 'admin', - 'admin', - 'sys', - '', - '', - '', - '', - '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', - '1', - '0', - '192.168.2.219', - 1699338435424, - 'admin', - 1697091656500, - 'admin', - 1699338435425, - '' - ); - -INSERT IGNORE INTO `sys_user` ( - `user_id`, - `dept_id`, - `user_name`, - `nick_name`, - `user_type`, - `email`, - `phonenumber`, - `sex`, - `avatar`, - `password`, - `status`, - `del_flag`, - `login_ip`, - `login_date`, - `create_by`, - `create_time`, - `update_by`, - `update_time`, - `remark` - ) -VALUES ( - 103, - '100', - 'manager', - 'manager', - 'sys', - '', - '', - '1', - '', - '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', - '1', - '0', - '192.168.2.114', - 1698661596191, - 'admin', - 1698661521780, - 'admin', - 1699340083864, - 'manager' - ); - -INSERT IGNORE INTO `sys_user` ( - `user_id`, - `dept_id`, - `user_name`, - `nick_name`, - `user_type`, - `email`, - `phonenumber`, - `sex`, - `avatar`, - `password`, - `status`, - `del_flag`, - `login_ip`, - `login_date`, - `create_by`, - `create_time`, - `update_by`, - `update_time`, - `remark` - ) -VALUES ( - 104, - '100', - 'monitor', - 'monitor', - 'sys', - '', - '', - '1', - '', - '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', - '1', - '0', - '', - 0, - 'admin', - 1698661684898, - 'admin', - 1698740853724, - '' - ); - + -- 20240508 ALTER TABLE `sys_user` MODIFY COLUMN `dept_id` bigint NULL DEFAULT 0 COMMENT '部门ID' AFTER `user_id`; ALTER TABLE `sys_user` MODIFY COLUMN `user_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户账号' AFTER `dept_id`; ALTER TABLE `sys_user` MODIFY COLUMN `nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称' AFTER `user_name`; ALTER TABLE `sys_user` MODIFY COLUMN `email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户邮箱' AFTER `user_type`; -ALTER TABLE `sys_user` MODIFY COLUMN `phonenumber` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码' AFTER `email`; +ALTER TABLE `sys_user` MODIFY COLUMN `phonenumber` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码' AFTER `email`; ALTER TABLE `sys_user` MODIFY COLUMN `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注' AFTER `update_time`; SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_u_auth_user.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_u_auth_user.sql new file mode 100644 index 0000000..be328fc --- /dev/null +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_u_auth_user.sql @@ -0,0 +1,28 @@ +-- +-- Table structure for table `u_auth_user` +-- +-- DROP TABLE IF EXISTS `u_auth_user`; +CREATE TABLE IF NOT EXISTS `u_auth_user` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', + `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', + `amf` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AMF', + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '状态', + `ki` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ki', + `algo_index` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'algoIndex', + `opc` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'OPC', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_neid唯一主键' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM鉴权用户'; + +-- Dump completed on 2024-03-06 17:26:59 + +ALTER TABLE `u_auth_user` MODIFY COLUMN IF EXISTS `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID' AFTER `id`; +ALTER TABLE `u_auth_user` MODIFY COLUMN IF EXISTS `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'UDM网元标识' AFTER `imsi`; +ALTER TABLE `u_auth_user` MODIFY COLUMN IF EXISTS `amf` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AMF' AFTER `ne_id`; +ALTER TABLE `u_auth_user` MODIFY COLUMN IF EXISTS `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '状态' AFTER `amf`; +ALTER TABLE `u_auth_user` MODIFY COLUMN IF EXISTS `ki` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'ki' AFTER `status`; +ALTER TABLE `u_auth_user` MODIFY COLUMN IF EXISTS `algo_index` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'algoIndex' AFTER `ki`; +ALTER TABLE `u_auth_user` MODIFY COLUMN IF EXISTS `opc` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'OPC' AFTER `algo_index`; +ALTER TABLE `u_auth_user` DROP COLUMN IF EXISTS `msisdn`; +ALTER TABLE `u_auth_user` ADD INDEX IF NOT EXISTS `idx_ne`(`ne_id`) USING BTREE COMMENT 'neid索引'; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_u_sub_user.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_u_sub_user.sql index c87abf2..a51c8b3 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/upg_u_sub_user.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_u_sub_user.sql @@ -1,60 +1,71 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -- -- Table structure for table `u_sub_user` -- - -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +-- DROP TABLE IF EXISTS `u_sub_user`; CREATE TABLE IF NOT EXISTS `u_sub_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', - `msisdn` varchar(50) DEFAULT NULL COMMENT '相当手机号', - `imsi` varchar(50) DEFAULT NULL COMMENT 'SIM卡号', - `ambr` varchar(50) DEFAULT NULL COMMENT 'SubUeAMBRTemp', - `nssai` varchar(50) DEFAULT NULL COMMENT 'SubSNSSAITemp', - `rat` varchar(50) DEFAULT NULL COMMENT 'rat', - `arfb` varchar(50) DEFAULT NULL COMMENT 'forbiddenAreasTemp', - `sar` varchar(50) DEFAULT NULL COMMENT 'serviceAreaRestrictTemp', - `cn` varchar(50) DEFAULT NULL COMMENT 'cnType', - `sm_data` varchar(1500) DEFAULT NULL COMMENT 'smData', - `smf_sel` varchar(50) DEFAULT NULL COMMENT 'smfSel', - `eps_dat` varchar(1500) DEFAULT NULL COMMENT 'Eps', - `ne_id` varchar(50) DEFAULT '' COMMENT 'UDM网元标识-子系统', - `eps_flag` varchar(50) DEFAULT NULL COMMENT 'epsFlag', - `eps_odb` varchar(50) DEFAULT NULL COMMENT 'epsOdb', - `hplmn_odb` varchar(50) DEFAULT NULL COMMENT 'hplmnOdb', - `ard` varchar(50) DEFAULT NULL COMMENT 'Ard', - `epstpl` varchar(50) DEFAULT NULL COMMENT 'Epstpl', - `context_id` varchar(50) DEFAULT NULL COMMENT 'ContextId', - `apn_context` varchar(50) DEFAULT NULL COMMENT 'apnContext', - `static_ip` varchar(50) DEFAULT NULL COMMENT 'staticIpstatic_ip指给4G UE分配的静态IP,没有可不带此字段名', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', + `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', + `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', + `am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData', + `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubUeAMBRTemp', + `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubSNSSAITemp', + `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR', + `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData AreaForbidden', + `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData serviceAreaRestrictTemp', + `cn_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData CNType 0x00:EPC和5GC 0x01:5GC 0x02:EPC 0x03:EPC+5GC', + `rfsp_index` varchar(50) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RfspIndex', + `reg_timer` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RegTimer', + `ue_usage_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData UEUsageType', + `active_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData ActiveTime', + `mico` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData MICO', + `odb_ps` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData ODB_PS 0-all,1-hplmn,2-vplmn', + `group_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData GroupId', + `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat', + `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat epsFlag', + `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat epsOdb', + `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat hplmnOdb', + `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat Ard', + `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat Epstpl', + `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat ContextId', + `apn_mum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat apnNum', + `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat apnContext', + `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat staticIp 指给4G UE分配的静态IP,没有可不带此字段名', + `sm_data` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smData', + `smf_sel` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smfSel', + `cag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'CAG', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_ne唯一索引' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM签约用户'; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM签约用户'; -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +-- Dump completed on 2024-10-12 15:26:59 --- Dump completed on 2024-03-06 17:26:59 +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData' AFTER `ne_id`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `cn_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData CNType 0x00:EPC和5GC 0x01:5GC 0x02:EPC 0x03:EPC+5GC' AFTER `sar`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `rfsp_index` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData RfspIndex' AFTER `cn_type`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `reg_timer` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData RegTimer' AFTER `rfsp_index`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `ue_usage_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData UEUsageType' AFTER `reg_timer`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `active_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData ActiveTime' AFTER `ue_usage_type`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `mico` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData MICO' AFTER `active_time`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `odb_ps` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData ODB_PS 0-all,1-hplmn,2-vplmn' AFTER `mico`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `group_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData GroupId' AFTER `odb_ps`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `apn_mum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat apnNum' AFTER `context_id`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `cag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'CAG' AFTER `smf_sel`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData SubUeAMBRTemp' AFTER `am_dat`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData SubSNSSAITemp' AFTER `ambr`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR' AFTER `nssai`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData AreaForbidden' AFTER `rat`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData serviceAreaRestrictTemp' AFTER `arfb`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat' AFTER `group_id`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat epsFlag' AFTER `eps_dat`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat epsOdb' AFTER `eps_flag`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat hplmnOdb' AFTER `eps_odb`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat Ard' AFTER `hplmn_odb`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat Epstpl' AFTER `ard`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat ContextId' AFTER `epstpl`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat apnContext' AFTER `apn_mum`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat staticIp 指给4G UE分配的静态IP,没有可不带此字段名' AFTER `apn_context`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `sm_data` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'smData' AFTER `static_ip`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `smf_sel` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'smfSel' AFTER `sm_data`; +ALTER TABLE `u_sub_user` DROP COLUMN IF EXISTS `cn`; +ALTER TABLE `u_sub_user` ADD INDEX IF NOT EXISTS `idx_ne`(`ne_id`) USING BTREE COMMENT 'neid索引'; diff --git a/build/system/usr/local/omc/etc/db/upgrade/upg_u_user_info.sql b/build/system/usr/local/omc/etc/db/upgrade/upg_u_user_info.sql new file mode 100644 index 0000000..b2bb734 --- /dev/null +++ b/build/system/usr/local/omc/etc/db/upgrade/upg_u_user_info.sql @@ -0,0 +1,15 @@ +-- +-- Table structure for table `u_user_info` +-- + +CREATE TABLE IF NOT EXISTS `u_user_info` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '默认ID', + `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', + `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', + `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_ne唯一索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户IMSI扩展信息'; + +-- Dump completed on 2024-09-19 11:26:59 diff --git a/build/system/usr/local/omc/etc/db/upgrade/zupgrade.sql b/build/system/usr/local/omc/etc/db/upgrade/zupgrade.sql index f1ae3e3..c52bdb9 100644 --- a/build/system/usr/local/omc/etc/db/upgrade/zupgrade.sql +++ b/build/system/usr/local/omc/etc/db/upgrade/zupgrade.sql @@ -1,10 +1,5 @@ DROP TRIGGER IF EXISTS `tg_account_menu`; -ALTER TABLE `gold_kpi` -MODIFY COLUMN `value` bigint NULL DEFAULT 0 AFTER `kpi_id`; - -ALTER TABLE `ne_link` DROP INDEX IF EXISTS `idx_netype_neid`; - ALTER TABLE `nbi_operation_log` MODIFY COLUMN `created_at` datetime NULL DEFAULT NULL AFTER `log_time`; @@ -23,21 +18,6 @@ ALTER TABLE `measure_task` ADD COLUMN IF NOT EXISTS `account_id` varchar(32) NULL AFTER `status`, ADD COLUMN IF NOT EXISTS `comment` varchar(255) NULL AFTER `account_id`; -ALTER TABLE `trace_task` -ADD COLUMN IF NOT EXISTS `account_id` varchar(32) NULL AFTER `status`, -ADD COLUMN IF NOT EXISTS `comment` varchar(255) NULL AFTER `account_id`; - -DELETE FROM trace_data WHERE timestamp LIKE '2023-%'; -ALTER TABLE `trace_data` -MODIFY COLUMN `timestamp` bigint NULL DEFAULT NULL AFTER `msg_direct`; - -ALTER TABLE `trace_data` -ADD COLUMN IF NOT EXISTS `length` int NULL AFTER `msg_direct`; - -ALTER TABLE `ne_backup` -ADD - COLUMN IF NOT EXISTS `comment` varchar(255) NULL AFTER `md5_sum`; - ALTER TABLE `mml_command` ADD COLUMN IF NOT EXISTS `status` enum('Active', 'Inactive') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Active' COMMENT '激活: Active 未激活: Inactive' AFTER `param_json`; diff --git a/build/system/usr/local/omc/etc/default/omc.yaml b/build/system/usr/local/omc/etc/default/omc.yaml index 44edbf1..31f9f0d 100644 --- a/build/system/usr/local/omc/etc/default/omc.yaml +++ b/build/system/usr/local/omc/etc/default/omc.yaml @@ -61,17 +61,19 @@ redis: # sleep: time delay for after write buffer (millisecond) # deadLine: timeout for io read and write (second) mml: - port: 4100 - port2: 5002 sleep: 200 deadLine: 10 sizeRow: 600 sizeCol: 128 bufferSize: 65535 - user: admin - password: admin mmlHome: ./mmlhome +# Tracking configuration +trace: + enabled: false + host: "172.16.5.100" # Fill in the specific IP address + port: 33033 + # NE config ne: user: omcuser @@ -118,28 +120,36 @@ omc: # Alarm module setting # Forward interface: -# email/sms/smsc +# TLS Skip verify: true/false +# email/sms +# smProxy: sms(Short Message Service)/smsc(SMS Centre) +# dataCoding: 0:GSM7BIT, 1:ASCII, 2:BINARY8BIT1, 3:LATIN1, +# 4:BINARY8BIT2, 6:CYRILLIC, 7:HEBREW, 8:UCS2 alarm: - forwardAlarm: false - email: - smtp: smtp.xxx.com + alarmEmailForward: + enable: true + emailList: + smtp: mail.smtp.com port: 25 - user: smtpuser@xxx.com - password: xxxxxx - # TLS skip verify: true/false + user: smtpext@smtp.com + password: "1000smtp@omc!" tlsSkipVerify: true - smProxy: smsc - sms: - apiURL: http://smsc.xxx.com - accessKeyID: xxx - accessKeySecret: xxx - signName: XXX SMSC - templateCode: 1000 - smsc: - addr: "192.168.13.114:2775" - systemID: "alarmsmsfw" + alarmSMSForward: + enable: true + mobileList: + smscAddr: "192.168.13.114:2775" + systemID: "omc" password: "omc123" - systemType: "" + systemType: "UTRAN" + dataCoding: 0 + serviceNumber: "OMC" + sms: + apiURL: http://smsc.xxx.com/ + accessKeyID: xxxx + accessKeySecret: xxxx + signName: xxx SMSC + templateCode: 1000 + smProxy: smsc # User authorized information # crypt: mysql/md5/bcrypt @@ -189,9 +199,9 @@ nmsCXY: # Kafka配置 kafka: addrs: - - "192.168.8.58:19092" - - "192.168.8.58:29092" - - "192.168.8.58:39092" + - "192.168.9.58:19092" + - "192.168.9.58:29092" + - "192.168.9.58:39092" # 启用 Kerberos 认证 krb5: enable: false @@ -205,7 +215,7 @@ nmsCXY: # OSS配置 oss: bucketname: "omc-bucket" - endpoint: "192.168.8.58:39000" + endpoint: "192.168.9.58:19000" useSSL: false accessKeyID: "hZjJOByIz6TFzOzNkKB9" secretAccessKey: "eLpRYAG5Wb3Dr6bvmznGoiLmmflUsydOENLp9tlu" diff --git a/features/aaaa/aaaa.go b/features/aaaa/aaaa.go index 9476bf3..26c0370 100644 --- a/features/aaaa/aaaa.go +++ b/features/aaaa/aaaa.go @@ -9,11 +9,11 @@ import ( "github.com/go-resty/resty/v2" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/lib/oauth" - "nms_cxy/lib/services" - "nms_cxy/omc/config" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/lib/services" + "be.ems/restagent/config" ) var ( diff --git a/features/cdr/cdrevent.go b/features/cdr/cdrevent.go index a5ea06a..12bb676 100644 --- a/features/cdr/cdrevent.go +++ b/features/cdr/cdrevent.go @@ -5,13 +5,13 @@ import ( "net/http" "strings" - "nms_cxy/lib/core/ctx" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - neService "nms_cxy/src/modules/network_element/service" - wsService "nms_cxy/src/modules/ws/service" + "be.ems/lib/core/ctx" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" + neService "be.ems/src/modules/network_element/service" + wsService "be.ems/src/modules/ws/service" ) var ( @@ -56,18 +56,18 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(cdrEvent.RmUID) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(cdrEvent.RmUID) if neInfo.RmUID == cdrEvent.RmUID { // 推送到ws订阅组 switch neInfo.NeType { case "IMS": if v, ok := cdrEvent.CDR["recordType"]; ok && (v == "MOC" || v == "MTSM") { - wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_IMS_CDR+neInfo.NeId, cdrEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_IMS_CDR+neInfo.NeId, cdrEvent) } case "SMF": - wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_SMF_CDR+neInfo.NeId, cdrEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_SMF_CDR+neInfo.NeId, cdrEvent) case "SMSC": - wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_SMSC_CDR+neInfo.NeId, cdrEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_SMSC_CDR+neInfo.NeId, cdrEvent) } } diff --git a/features/cm/exec_linux.go b/features/cm/exec_linux.go index 9ab21d2..b8b7b36 100644 --- a/features/cm/exec_linux.go +++ b/features/cm/exec_linux.go @@ -9,7 +9,7 @@ import ( "os/exec" "time" - "nms_cxy/lib/log" + "be.ems/lib/log" ) func ExecCmd(command string) error { diff --git a/features/cm/exec_windows.go b/features/cm/exec_windows.go index a048209..9e151bf 100644 --- a/features/cm/exec_windows.go +++ b/features/cm/exec_windows.go @@ -9,7 +9,7 @@ import ( "os/exec" "time" - "nms_cxy/lib/log" + "be.ems/lib/log" ) func ExecCmd(command string) error { diff --git a/features/cm/license.go b/features/cm/license.go deleted file mode 100644 index 09419da..0000000 --- a/features/cm/license.go +++ /dev/null @@ -1,559 +0,0 @@ -package cm - -import ( - "fmt" - "io" - "net/http" - "os" - "os/exec" - "strings" - - "nms_cxy/lib/core/ctx" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - neModel "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - - "github.com/gorilla/mux" -) - -var ( - // General License URI - UriLicense = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/license" - UriLicenseExt = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/license" - - CustomUriLicense = config.UriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/license" - CustomUriLicenseExt = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/license" -) - -func UploadLicenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("UploadLicenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // neTypeUpper := strings.ToUpper(neType) - // neTypeLower := strings.ToLower(neType) - - services.ResponseStatusOK204NoContent(w) -} - -func DownloadLicenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadLicenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // // neTypeUpper := strings.ToUpper(neType) - // //neTypeLower := strings.ToLower(neType) - - // version := vars["version"] - // if version == "" { - // log.Error("version is empty") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - // neSoftware, err := dborm.XormGetDataBySQL(sql) - // if err != nil { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if len(*neSoftware) == 0 { - // err := global.ErrCMNotFoundTargetSoftware - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // fileName := (*neSoftware)[0]["file_name"] - // path := (*neSoftware)[0]["path"] - // md5Sum := (*neSoftware)[0]["md5_sum"] - - // services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, md5Sum) -} - -func DeleteLcenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteLcenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // neTypeUpper := strings.ToUpper(neType) - // //neTypeLower := strings.ToLower(neType) - - // version := vars["version"] - // if version == "" { - // log.Error("version is empty") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - // neSoftware, err := dborm.XormGetDataBySQL(sql) - // if err != nil { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if len(*neSoftware) == 0 { - // err := global.ErrCMNotFoundTargetSoftware - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // where := fmt.Sprintf("ne_type='%s' and version='%s'", neTypeUpper, version) - // affected, err := dborm.XormDeleteDataByWhere(where, "ne_software") - // if err != nil || affected == 0 { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // fileName := (*neSoftware)[0]["file_name"] - // path := (*neSoftware)[0]["path"] - // filePath := fmt.Sprintf("%s/%s", path, fileName) - // err = os.Remove(filePath) - // if err != nil { - // log.Error("Faile to Remove:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - services.ResponseStatusOK204NoContent(w) -} - -// type MMLRequest struct { -// MML []string `json:"mml"` -// } - -// var TIME_DELAY_AFTER_WRITE time.Duration = 200 -// var TIME_DEAD_LINE time.Duration = 10 - -// func init() { -// if config.GetYamlConfig().MML.Sleep != 0 { -// TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) -// } -// if config.GetYamlConfig().MML.DeadLine != 0 { -// TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) -// } -// } - -func UploadLicenseFileData(w http.ResponseWriter, r *http.Request) { - log.Info("UploadLicenseFileData processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - //md5Param := services.GetUriParamString(r, "md5Sum", ",", false, false) - - neId := services.GetUriParamString(r, "neId", ",", false, false) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Errorf("Failed to get ne_info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neInfo:", neInfo) - - licensePath := fmt.Sprintf("%s/%s", config.GetYamlConfig().OMC.License, neTypeLower) - err = os.MkdirAll(licensePath, os.ModePerm) - if err != nil { - log.Error("Failed to Mkdir:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - //fileName, err := services.HandleUploadFile(r, softwarePath, "") - - // 解析multipart/form-data请求 - err = r.ParseMultipartForm(10 << 20) // 10MB - if err != nil { - log.Error("Faile to ParseMultipartForm:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 获取文件和数据 - licFile := r.MultipartForm.File["file"] - data := r.MultipartForm.Value["comment"] - - var licenseFileName, comment string - - // 处理license文件 - if len(licFile) > 0 { - file := licFile[0] - // 打开文件 - f, err := file.Open() - if err != nil { - log.Error("Faile to Open:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer f.Close() - - // 创建本地文件 - dst, err := os.Create(licensePath + "/" + file.Filename) - if err != nil { - log.Error("Faile to Create:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer dst.Close() - - licenseFileName = file.Filename - // 将文件内容拷贝到本地文件 - _, err = io.Copy(dst, f) - if err != nil { - log.Error("Faile to Copy:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // 处理数据 - if len(data) > 0 { - comment = data[0] - } - - neLicensePath := strings.ReplaceAll(config.GetYamlConfig().NE.LicenseDir, "{neType}", neTypeLower) - - srcFile := fmt.Sprintf("%s/%s", licensePath, licenseFileName) - scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - cmd := exec.Command("scp", "-r", srcFile, scpDir) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // backup system.ini to system.ini.bak - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - cpCmd := fmt.Sprintf("sudo test -f %s/system.ini && cp -f %s/system.ini %s/system.ini.bak||echo 0", - neLicensePath, neLicensePath, neLicensePath) - cmd = exec.Command("ssh", sshHost, cpCmd) - out, err = cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to execute cp command:%v, cmd:%s", err, cpCmd) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // replace system.ini - neFilePath := config.GetYamlConfig().NE.ScpDir + "/" + licenseFileName - cpCmd = fmt.Sprintf("sudo mv -f %s %s/system.ini", neFilePath, neLicensePath) - cmd = exec.Command("ssh", sshHost, cpCmd) - out, err = cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute cp command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - /* - // judge license if expired - isRestart := false - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, neTypeLower) - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}). - //SetHeaders(map[string]string{"accessToken": token}). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Get(requestURI2NF) - if err != nil { - log.Error("Failed to get system state:", err) - isRestart = true - } else { - systemState := make(map[string]interface{}) - _ = json.Unmarshal(resp.Body(), &systemState) - expiryDate := fmt.Sprintf("%v", systemState["expiryDate"]) - t1_expiry, _ := time.ParseInLocation(time.DateOnly, expiryDate, time.Local) - nowDate := time.Now().Local() - nowDate.Format(time.DateOnly) - isRestart = t1_expiry.Before(nowDate) - } - // case non-expired license: send NE reload license MML - if !isRestart { - // send reload license MML - var buf [20 * 1024]byte - //buf := make([]byte, 0) - var n int - if neInfo != nil { - switch strings.ToLower(neType) { - case "ims": - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0:n])) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - mmlCommand := "check lic\r\n" - - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - // upf telnet buffer只能读取一次,需要去掉前面的多余字符 - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - if !strings.Contains(result, "COMMAND OK") { - err = fmt.Errorf("failed to check license, %s", result) - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0:n])) - - mmlCommand := "check lic\n" - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - if !strings.Contains(result, "COMMAND OK") { - err = fmt.Errorf("failed to check license, %s", result) - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - } else { - // case expired license: restart NE service - switch neTypeLower { - case "omc": - restartCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh restart", config.GetYamlConfig().NE.OmcDir) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh restart omc:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "ims": - restartCmd := "sudo ims-stop && sudo ims-start" - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - restartCmd := fmt.Sprintf("sudo systemctl restart %s.service", neTypeLower) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - */ - - // neLicense := dborm.NeLicense{ - // NeType: neTypeUpper, - // NeID: neId, - // Status: "ACTIVE", - // Path: licensePath, - // FileName: licenseFileName, - // Comment: comment, - // } - - // log.Debug("neLicense:", neLicense) - // _, err = dborm.XormInsertTableOne("ne_license", neLicense) - // if err != nil { - // log.Error("Faile to XormInsertTableOne:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // } - - neLicense := neModel.NeLicense{ - NeType: neTypeUpper, - NeId: neId, - Status: "0", - LicensePath: neFilePath, - Remark: comment, - } - - log.Debug("neLicense:", neLicense) - - // 检查是否存在授权记录 - neLicense2 := neService.NewNeLicenseImpl.SelectByNeTypeAndNeID(neTypeUpper, neId) - if neLicense2.NeId != neId { - // 读取授权码 - code, _ := neService.NewNeLicenseImpl.ReadLicenseInfo(neLicense) - neLicense.ActivationRequestCode = code - - neLicense.CreateBy = ctx.LoginUserToUserName(r) - insertId := neService.NewNeLicenseImpl.Insert(neLicense) - if insertId != "" { - services.ResponseStatusOK204NoContent(w) - return - } - } else { - neLicense2.UpdateBy = ctx.LoginUserToUserName(r) - upRows := neService.NewNeLicenseImpl.Update(neLicense2) - if upRows > 0 { - services.ResponseStatusOK204NoContent(w) - return - } - } - - services.ResponseInternalServerError500ProcessError(w, err) -} diff --git a/features/cm/ne.go b/features/cm/ne.go index a409022..f5f1007 100644 --- a/features/cm/ne.go +++ b/features/cm/ne.go @@ -10,13 +10,13 @@ import ( "strings" "time" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - tokenConst "nms_cxy/src/framework/constants/token" - neService "nms_cxy/src/modules/network_element/service" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" + tokenConst "be.ems/src/framework/constants/token" + neService "be.ems/src/modules/network_element/service" "github.com/go-resty/resty/v2" "github.com/gorilla/mux" @@ -157,7 +157,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -208,7 +208,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) services.ResponseStatusOK204NoContent(w) return @@ -267,7 +267,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -319,7 +319,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) services.ResponseStatusOK204NoContent(w) return @@ -381,7 +381,7 @@ func DeleteNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -862,7 +862,7 @@ func PostNeServiceAction(w http.ResponseWriter, r *http.Request) { // send 204 to fe firstly services.ResponseStatusOK204NoContent(w) //actionCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh %s", config.GetYamlConfig().NE.OmcDir, action) - actionCmd := fmt.Sprintf("sudo systemctl %s omc", action) + actionCmd := fmt.Sprintf("sudo systemctl %s restagent", action) go RunSSHCmd(sshHost, actionCmd) return // cmd := exec.Command("ssh", sshHost, actionCmd) diff --git a/features/cm/omc/controller.go b/features/cm/omc/controller.go new file mode 100644 index 0000000..888f182 --- /dev/null +++ b/features/cm/omc/controller.go @@ -0,0 +1,46 @@ +package cm_omc + +import ( + "fmt" + "net/http" + + "be.ems/lib/services" + "github.com/gin-gonic/gin" +) + +func (o *ConfigOMC) Get(c *gin.Context) { + paramName := c.Param("paramName") + results, err := o.Query(paramName) + if err != nil { + c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + return + } + c.JSON(http.StatusOK, services.DataResp(results)) +} + +func (o *ConfigOMC) Post(c *gin.Context) { + err := fmt.Errorf("method not allowed") + c.JSON(http.StatusMethodNotAllowed, services.ErrResp(err.Error())) +} + +func (o *ConfigOMC) Put(c *gin.Context) { + paramName := c.Param("paramName") + var paramData map[string]any + + if err := c.ShouldBindJSON(¶mData); err != nil { + c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + return + } + + result, err := o.Modify(paramName, paramData) + if err != nil { + c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + return + } + c.JSON(http.StatusOK, services.DataResp(result)) +} + +func (o *ConfigOMC) Delete(c *gin.Context) { + err := fmt.Errorf("method not allowed") + c.JSON(http.StatusMethodNotAllowed, services.ErrResp(err.Error())) +} diff --git a/features/cm/omc/implement.go b/features/cm/omc/implement.go new file mode 100644 index 0000000..6ef2e65 --- /dev/null +++ b/features/cm/omc/implement.go @@ -0,0 +1,69 @@ +package cm_omc + +import ( + "fmt" + + "be.ems/restagent/config" +) + +const ( + PASSWORD_MASK = "********" +) + +func (o *ConfigOMC) Query(paramName string) (any, error) { + var results []any + + switch paramName { + case "alarmEmailForward": + result := config.GetYamlConfig().Alarm.EmailForward + result.Password = PASSWORD_MASK + results = append(results, result) + case "alarmSMSForward": + result := config.GetYamlConfig().Alarm.SMSCForward + result.Password = PASSWORD_MASK + results = append(results, result) + default: + return nil, fmt.Errorf("invalid source parameter") + } + + return results, nil +} + +func (o *ConfigOMC) Add() { + +} + +func (o *ConfigOMC) Modify(paramName string, paramData map[string]any) (any, error) { + var results []any + + switch paramName { + case "alarmEmailForward": + param := &(config.GetYamlConfig().Alarm.EmailForward) + config.UpdateStructFromMap(param, paramData) + result := *param + results = append(results, result) + err := config.WriteOrignalConfig(config.YamlConfigInfo.FilePath, paramName, paramData) + if err != nil { + fmt.Println("failed to write config yaml file:", err) + return results, err + } + case "alarmSMSForward": + param := &(config.GetYamlConfig().Alarm.SMSCForward) + config.UpdateStructFromMap(param, paramData) + result := *param + results = append(results, result) + err := config.WriteOrignalConfig(config.YamlConfigInfo.FilePath, paramName, paramData) + if err != nil { + fmt.Println("failed to write config yaml file:", err) + return results, err + } + default: + return nil, fmt.Errorf("invalid source parameter") + } + + return results, nil +} + +func (o *ConfigOMC) Remove() { + +} diff --git a/features/cm/omc/model.go b/features/cm/omc/model.go new file mode 100644 index 0000000..967c84c --- /dev/null +++ b/features/cm/omc/model.go @@ -0,0 +1,26 @@ +package cm_omc + +type ConfigOMC struct{} + +type SystemConfig struct { + ForwardFlag bool `json:"forwardFlag"` +} + +type AlarmEmailForward struct { + Enable bool `json:"enable"` + EmailList string `json:"emailList"` + SMTP string `json:"smtp"` + Port uint16 `json:"port"` + User string `json:"user"` + Password string `json:"password"` + TLSSkipVerify bool `json:"tlsSkipVerify"` +} + +type AlarmSMSForward struct { + Enable bool `json:"enable"` + MobileList string `json:"mobileList"` + SMSCAddr string `json:"smscAddr"` + SystemID string `json:"systemID"` + Password string `json:"password"` + SystemType string `json:"systemType"` +} diff --git a/features/cm/omc/route.go b/features/cm/omc/route.go new file mode 100644 index 0000000..906cb1e --- /dev/null +++ b/features/cm/omc/route.go @@ -0,0 +1,30 @@ +package cm_omc + +import ( + "be.ems/src/framework/middleware" + "github.com/gin-gonic/gin" +) + +// Register Routes for file_export +func Register(r *gin.RouterGroup) { + cmOMC := r.Group("/omc") + { + var o *ConfigOMC + cmOMC.GET("/config/:paramName", + middleware.PreAuthorize(nil), + o.Get, + ) + cmOMC.POST("/config/:paramName", + middleware.PreAuthorize(nil), + o.Post, + ) + cmOMC.PUT("/config/:paramName", + middleware.PreAuthorize(nil), + o.Put, + ) + cmOMC.DELETE("/config/:paramName", + middleware.PreAuthorize(nil), + o.Delete, + ) + } +} diff --git a/features/cm/param.go b/features/cm/param.go index 275437c..c44c974 100644 --- a/features/cm/param.go +++ b/features/cm/param.go @@ -3,18 +3,18 @@ package cm import ( "strings" - "nms_cxy/lib/core/ctx" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" + "be.ems/lib/core/ctx" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "encoding/json" "fmt" "io" "net/http" - neService "nms_cxy/src/modules/network_element/service" + neService "be.ems/src/modules/network_element/service" "github.com/go-resty/resty/v2" "github.com/gorilla/mux" @@ -39,7 +39,7 @@ func GetParamConfigFromNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) var response services.DataResponse if neInfo.NeId == neId && neInfo.NeId != "" { @@ -76,7 +76,7 @@ func PostParamConfigToNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") @@ -128,7 +128,7 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) { } neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") @@ -181,7 +181,7 @@ func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) { } neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") diff --git a/features/cm/service.go b/features/cm/service.go new file mode 100644 index 0000000..f5d8b69 --- /dev/null +++ b/features/cm/service.go @@ -0,0 +1,17 @@ +package cm + +import ( + cm_omc "be.ems/features/cm/omc" + "be.ems/lib/log" + "github.com/gin-gonic/gin" +) + +func InitSubServiceRoute(r *gin.Engine) { + log.Info("======init PM group gin.Engine") + + cmGroup := r.Group("/cm") + // register sub modules routes + cm_omc.Register(cmGroup) + + // return featuresGroup +} diff --git a/features/cm/software.go b/features/cm/software.go index 2d28356..2085b5c 100644 --- a/features/cm/software.go +++ b/features/cm/software.go @@ -10,11 +10,11 @@ import ( "strconv" "strings" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "github.com/gorilla/mux" ) diff --git a/features/dbrest/backup.go b/features/dbrest/backup.go index 339d99f..3bf7bb7 100644 --- a/features/dbrest/backup.go +++ b/features/dbrest/backup.go @@ -10,12 +10,11 @@ import ( "path/filepath" "time" - "nms_cxy/lib/core/conf" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - + "be.ems/lib/core/conf" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" _ "github.com/go-sql-driver/mysql" ) diff --git a/features/dbrest/dbrest.go b/features/dbrest/dbrest.go index 729b7f1..4d3888a 100644 --- a/features/dbrest/dbrest.go +++ b/features/dbrest/dbrest.go @@ -9,12 +9,12 @@ import ( "strings" "time" - "nms_cxy/lib/core/ctx" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" + "be.ems/lib/core/ctx" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "github.com/gorilla/mux" "xorm.io/xorm" diff --git a/features/event/event.go b/features/event/event.go index 6b8662d..1f75012 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -8,15 +8,14 @@ import ( "strings" "time" - "nms_cxy/lib/core/ctx" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - neService "nms_cxy/src/modules/network_element/service" - wsService "nms_cxy/src/modules/ws/service" - + "be.ems/lib/core/ctx" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" + neService "be.ems/src/modules/network_element/service" + wsService "be.ems/src/modules/ws/service" "github.com/gin-gonic/gin" ) @@ -75,7 +74,7 @@ func PostUEEventFromAMF(c *gin.Context) { // AMF没有RmUID,直接推送 // 推送到ws订阅组 - wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_AMF_UE, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent) services.ResponseStatusOK204NoContent(c.Writer) } @@ -100,11 +99,11 @@ func PostUEEvent(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(ueEvent.RmUID) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(ueEvent.RmUID) if neInfo.RmUID == ueEvent.RmUID { // 推送到ws订阅组 if ueEvent.NeType == "MME" { - wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_MME_UE+neInfo.NeId, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+neInfo.NeId, ueEvent) } } diff --git a/features/features.go b/features/features.go index dc2e0c4..e4f68c7 100644 --- a/features/features.go +++ b/features/features.go @@ -1,10 +1,11 @@ package features import ( - "nms_cxy/features/lm" - "nms_cxy/features/pm" - "nms_cxy/lib/log" - + "be.ems/features/cm" + "be.ems/features/lm" + "be.ems/features/nbi" + "be.ems/features/pm" + "be.ems/lib/log" "github.com/gin-gonic/gin" ) @@ -12,9 +13,10 @@ func InitServiceEngine(r *gin.Engine) { log.Info("======init feature group gin.Engine") // featuresGroup := r.Group("/") - // 注册 各个features 模块的路由 + // register features routers pm.InitSubServiceRoute(r) lm.InitSubServiceRoute(r) - + cm.InitSubServiceRoute(r) + nbi.InitSubServiceRoute(r) // return featuresGroup } diff --git a/features/file/file.go b/features/file/file.go index e102c05..1906acf 100644 --- a/features/file/file.go +++ b/features/file/file.go @@ -4,10 +4,9 @@ import ( "net/http" "path/filepath" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "github.com/gorilla/mux" ) diff --git a/features/fm/alarm.go b/features/fm/alarm.go index c5a9717..e22eca1 100644 --- a/features/fm/alarm.go +++ b/features/fm/alarm.go @@ -10,12 +10,11 @@ import ( "strings" "time" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "xorm.io/xorm" "github.com/go-resty/resty/v2" @@ -467,10 +466,12 @@ func PostAlarmFromNF(w http.ResponseWriter, r *http.Request) { } session.Commit() } - if config.GetYamlConfig().Alarm.ForwardAlarm { + if config.GetYamlConfig().Alarm.EmailForward.Enable { if err = AlarmEmailForward(&alarmData); err != nil { log.Error("Failed to AlarmEmailForward:", err) } + } + if config.GetYamlConfig().Alarm.SMSCForward.Enable { if err = AlarmSMSForward(&alarmData); err != nil { log.Error("Failed to AlarmSMSForward:", err) } @@ -594,7 +595,7 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { exist, err := session.Table("alarm"). Where("ne_type=? and ne_id=? and alarm_id=? and alarm_status=1", alarmData.NeType, alarmData.NeId, alarmData.AlarmId). Exist() - if err == nil || !exist { + if err != nil || !exist { log.Infof("Not found active alarm: ne_id=%s, alarm_id=%s", alarmData.NeId, alarmData.AlarmId) continue } @@ -777,10 +778,12 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { continue } session.Commit() - if config.GetYamlConfig().Alarm.ForwardAlarm { + if config.GetYamlConfig().Alarm.EmailForward.Enable { if err = AlarmEmailForward(&alarmData); err != nil { log.Error("Failed to AlarmEmailForward:", err) } + } + if config.GetYamlConfig().Alarm.SMSCForward.Enable { if err = AlarmSMSForward(&alarmData); err != nil { log.Error("Failed to AlarmSMSForward:", err) } diff --git a/features/fm/email.go b/features/fm/email.go index 47ae909..aa25d92 100644 --- a/features/fm/email.go +++ b/features/fm/email.go @@ -2,13 +2,12 @@ package fm import ( "crypto/tls" - "errors" "fmt" "strings" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/omc/config" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/restagent/config" "gopkg.in/gomail.v2" ) @@ -48,25 +47,25 @@ func AlarmEmailForward(alarmData *Alarm) error { // userName := "smtpext@agrandtech.com" // password := "1000smtp@omc!" - host := config.GetYamlConfig().Alarm.Email.Smtp - port := int(config.GetYamlConfig().Alarm.Email.Port) - userName := config.GetYamlConfig().Alarm.Email.User - password := config.GetYamlConfig().Alarm.Email.Password + host := config.GetYamlConfig().Alarm.EmailForward.SMTP + port := int(config.GetYamlConfig().Alarm.EmailForward.Port) + userName := config.GetYamlConfig().Alarm.EmailForward.User + password := config.GetYamlConfig().Alarm.EmailForward.Password m := gomail.NewMessage() m.SetHeader("From", userName) // 发件人 //m.SetHeader("From", "alias"+"<"+"aliastest"+">") // 增加发件人别名 - emails, err := dborm.XormGetAlarmForward("Email") - if err != nil { - log.Error("Failed to XormGetAlarmForward:", err) - return err - } else if emails == nil || len(*emails) == 0 { - err := errors.New("not found forward email list") - log.Error(err) - return err - } - + // emails, err := dborm.XormGetAlarmForward("Email") + // if err != nil { + // log.Error("Failed to XormGetAlarmForward:", err) + // return err + // } else if emails == nil || len(*emails) == 0 { + // err := errors.New("not found forward email list") + // log.Error(err) + // return err + // } + emails := strings.Split(config.GetYamlConfig().Alarm.EmailForward.EmailList, ",") forwardLog := &dborm.AlarmForwardLog{ NeType: alarmData.NeType, NeID: alarmData.NeId, @@ -74,10 +73,10 @@ func AlarmEmailForward(alarmData *Alarm) error { AlarmTitle: alarmData.AlarmTitle, AlarmSeq: alarmData.AlarmSeq, EventTime: alarmData.EventTime, - ToUser: strings.Join(*emails, ","), + ToUser: config.GetYamlConfig().Alarm.EmailForward.EmailList, } - m.SetHeader("To", *emails...) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 + m.SetHeader("To", emails...) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 //m.SetHeader("To", strings.Join(*emails, " ")) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 //m.SetHeader("To", "zhangshuzhong@agrandtech.com", "simonzhangsz@outlook.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 //m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个 @@ -103,7 +102,7 @@ func AlarmEmailForward(alarmData *Alarm) error { ) // 关闭SSL协议认证 d.TLSConfig = &tls.Config{InsecureSkipVerify: true} - if !config.GetYamlConfig().Alarm.Email.TlsSkipVerify { + if !config.GetYamlConfig().Alarm.EmailForward.TLSSkipVerify { // 打开SSL协议认证 d.TLSConfig = &tls.Config{InsecureSkipVerify: false} } diff --git a/features/fm/smsforward.go b/features/fm/smsforward.go index 4746436..325c210 100644 --- a/features/fm/smsforward.go +++ b/features/fm/smsforward.go @@ -8,10 +8,9 @@ import ( "strings" "time" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/omc/config" - + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/restagent/config" "github.com/linxGnu/gosmpp" "github.com/linxGnu/gosmpp/data" "github.com/linxGnu/gosmpp/pdu" @@ -91,36 +90,24 @@ func AlarmForwardBySMS(alarmData *Alarm) (string, error) { case http.StatusOK, http.StatusAccepted, http.StatusNoContent, http.StatusCreated: return userList, nil default: - err := fmt.Errorf("Failed to send SMS: %s(Code=%d)", resp.Status, resp.StatusCode) - log.Error(err) + log.Error(fmt.Errorf("failed to send SMS: %s(Code=%d)", resp.Status, resp.StatusCode)) return userList, err } } +var smsForward = &(config.GetYamlConfig().Alarm.SMSCForward) + func AlarmForwardBySMPP(alarmData *Alarm) (string, error) { log.Info("AlarmForwardBySMPP processing... ") - toUsers, err := dborm.XormGetAlarmForward("SMS") - if err != nil { - log.Error("Failed to XormGetAlarmForward:", err) - return "", err - } else if toUsers == nil { - err := errors.New("not found forward phone number") - log.Error(err) - return "", err - } - userList := strings.Join(*toUsers, ",") - + userList := smsForward.MobileList auth := gosmpp.Auth{ - SMSC: config.GetYamlConfig().Alarm.SMSC.Addr, - SystemID: config.GetYamlConfig().Alarm.SMSC.SystemID, - Password: config.GetYamlConfig().Alarm.SMSC.Password, - SystemType: config.GetYamlConfig().Alarm.SMSC.SystemType, + SMSC: smsForward.SMSCAddr, + SystemID: smsForward.SystemID, + Password: smsForward.Password, + SystemType: smsForward.SystemType, } - // conn, err := gosmpp.NonTLSDialer(auth.SMSC) - // connection := gosmpp.NewConnection(conn) - trans, err := gosmpp.NewSession( gosmpp.TXConnector(gosmpp.NonTLSDialer, auth), gosmpp.Settings{ @@ -150,17 +137,22 @@ func AlarmForwardBySMPP(alarmData *Alarm) (string, error) { _ = trans.Close() }() - // sending SMS(s) - // var results []string - // for _, toUser := range *toUsers { - message := "Alarm Notification: " + alarmData.AlarmTitle + " from " + alarmData.NeType + " " + alarmData.NeId + " at " + alarmData.EventTime - if err = trans.Transceiver().Submit(newSubmitSM(userList, message)); err != nil { - // result := fmt.Sprintf("Failed to submit %s hort message:%s", toUser, err.Error()) - // results = append(results, result) - log.Error("Failed to submit hort message:", err) - return userList, err + message := "Alarm Notification: " + alarmData.AlarmTitle + " from " + alarmData.NeType + "_" + alarmData.NeId + " at " + alarmData.EventTime + for _, user := range strings.Split(userList, ",") { + sm, err := newSubmitSM(user, message) + if err != nil { + log.Errorf("Failed to newSubmitSM %s short message: %v", user, err) + writeLog(alarmData, user, "SMS", err) + continue + } + if err = trans.Transceiver().Submit(sm); err != nil { + log.Errorf("Failed to Submit %s short message: %v", user, err) + writeLog(alarmData, user, "SMS", err) + continue + } + writeLog(alarmData, user, "SMS", nil) } - // } + return userList, nil } @@ -191,61 +183,58 @@ func writeLog(alarmData *Alarm, toUser, forwardBy string, err error) error { return nil } -func handlePDU() func(pdu.PDU) (pdu.PDU, bool) { - return func(p pdu.PDU) (pdu.PDU, bool) { - switch pd := p.(type) { - case *pdu.Unbind: - log.Trace("Unbind Received") - return pd.GetResponse(), true - - case *pdu.UnbindResp: - log.Trace("UnbindResp Received") - - case *pdu.SubmitSMResp: - log.Trace("SubmitSMResp Received") - - case *pdu.GenericNack: - log.Trace("GenericNack Received") - - case *pdu.EnquireLinkResp: - fmt.Println("EnquireLinkResp Received") - - case *pdu.EnquireLink: - log.Trace("EnquireLink Received") - return pd.GetResponse(), false - - case *pdu.DataSM: - log.Trace("DataSM receiver") - return pd.GetResponse(), false - - case *pdu.DeliverSM: - log.Trace("DeliverSM receiver") - return pd.GetResponse(), false - } - return nil, false - } -} - -func newSubmitSM(phoneNumber string, message string) *pdu.SubmitSM { +func newSubmitSM(phoneNumber string, message string) (*pdu.SubmitSM, error) { // build up submitSM srcAddr := pdu.NewAddress() srcAddr.SetTon(5) srcAddr.SetNpi(0) - _ = srcAddr.SetAddress("alarm notification:") - + err := srcAddr.SetAddress(smsForward.ServiceNumber) + if err != nil { + return nil, err + } destAddr := pdu.NewAddress() destAddr.SetTon(1) destAddr.SetNpi(1) - _ = destAddr.SetAddress(phoneNumber) - + err = destAddr.SetAddress(phoneNumber) + if err != nil { + return nil, err + } submitSM := pdu.NewSubmitSM().(*pdu.SubmitSM) submitSM.SourceAddr = srcAddr submitSM.DestAddr = destAddr - _ = submitSM.Message.SetMessageWithEncoding(message, data.UCS2) + dataCoding := data.FromDataCoding(smsForward.DataCoding) + err = submitSM.Message.SetMessageWithEncoding(message, dataCoding) + if err != nil { + return nil, err + } submitSM.ProtocolID = 0 submitSM.RegisteredDelivery = 1 submitSM.ReplaceIfPresentFlag = 0 submitSM.EsmClass = 0 - return submitSM + return submitSM, nil } + +// const ( +// // Short message data coding type +// SMS_CODING_GSM7BIT byte = iota +// SMS_CODING_ASCII +// SMS_CODING_BINARY8BIT1 +// SMS_CODING_LATIN1 +// SMS_CODING_BINARY8BIT2 +// SMS_CODING_NODEF +// SMS_CODING_CYRILLIC +// SMS_CODING_HEBREW +// SMS_CODING_UCS2 +// ) + +// var codingMap = map[byte]data.Encoding{ +// SMS_CODING_GSM7BIT: data.GSM7BIT, +// SMS_CODING_ASCII: data.ASCII, +// SMS_CODING_BINARY8BIT1: data.BINARY8BIT1, +// SMS_CODING_LATIN1: data.LATIN1, +// SMS_CODING_BINARY8BIT2: data.BINARY8BIT2, +// SMS_CODING_CYRILLIC: data.CYRILLIC, +// SMS_CODING_HEBREW: data.HEBREW, +// SMS_CODING_UCS2: data.UCS2, +// } diff --git a/features/handle/handle.go b/features/handle/handle.go index a037c04..654fd16 100644 --- a/features/handle/handle.go +++ b/features/handle/handle.go @@ -8,17 +8,17 @@ import ( "strconv" "strings" - "nms_cxy/lib/dborm" + "be.ems/lib/dborm" "github.com/gorilla/mux" g "github.com/gosnmp/gosnmp" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/oauth" - "nms_cxy/lib/services" - "nms_cxy/lib/session" - "nms_cxy/omc/config" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/lib/services" + "be.ems/lib/session" + "be.ems/restagent/config" ) var TodoList []stTodo diff --git a/features/lm/file_export/controller.go b/features/lm/file_export/controller.go index df40f11..d5610ff 100644 --- a/features/lm/file_export/controller.go +++ b/features/lm/file_export/controller.go @@ -6,13 +6,12 @@ import ( "os" "path/filepath" - "nms_cxy/lib/file" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - + "be.ems/lib/file" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/src/framework/datasource" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" "github.com/gin-gonic/gin" ) @@ -39,7 +38,7 @@ func (m *SysJob) GetFileExportTable(c *gin.Context) { err := datasource.DefaultDB().Table(m.TableName()).Where("invoke_target=? and status=1", INVOKE_FILE_EXPORT). Find(&results).Error if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } language := ctx.AcceptLanguage(c) @@ -47,7 +46,7 @@ func (m *SysJob) GetFileExportTable(c *gin.Context) { for _, job := range results { var params TargetParams if err := json.Unmarshal([]byte(job.TargetParams), ¶ms); err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } TableDisplay := i18n.TKey(language, "table."+params.TableName) @@ -68,14 +67,15 @@ func (m *FileExport) GetFileList(c *gin.Context) { var querys FileExportQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } files, err := file.GetFileInfo(querys.Path, querys.Suffix) if err != nil { - log.Error(err) - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + log.Error("failed to GetFileInfo:", err) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return } // split files list @@ -99,8 +99,8 @@ func (m *FileExport) Total(c *gin.Context) { fileCount, dirCount, err := file.GetFileAndDirCount(dir) if err != nil { - log.Error(err) - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + log.Error("failed to GetFileAndDirCount:", err) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } total := fileCount + dirCount @@ -114,13 +114,13 @@ func (m *FileExport) DownloadHandler(c *gin.Context) { file, err := os.Open(filePath) if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } defer file.Close() if _, err := os.Stat(filePath); os.IsNotExist(err) { - c.JSON(http.StatusNotFound, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -135,7 +135,7 @@ func (m *FileExport) Delete(c *gin.Context) { filePath := filepath.Join(dir, fileName) if err := os.Remove(filePath); err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } c.JSON(http.StatusNoContent, nil) // 204 No Content diff --git a/features/lm/file_export/model.go b/features/lm/file_export/model.go index 8fefa8c..33a611f 100644 --- a/features/lm/file_export/model.go +++ b/features/lm/file_export/model.go @@ -1,7 +1,7 @@ package file_export import ( - "nms_cxy/lib/file" + "be.ems/lib/file" ) const ( diff --git a/features/lm/file_export/route.go b/features/lm/file_export/route.go index 3b0b72d..d6caba9 100644 --- a/features/lm/file_export/route.go +++ b/features/lm/file_export/route.go @@ -1,8 +1,7 @@ package file_export import ( - "nms_cxy/src/framework/middleware" - + "be.ems/src/framework/middleware" "github.com/gin-gonic/gin" ) diff --git a/features/lm/logbak.go b/features/lm/logbak.go index 1de8658..b744e82 100644 --- a/features/lm/logbak.go +++ b/features/lm/logbak.go @@ -6,10 +6,10 @@ import ( "os/exec" "time" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "github.com/gorilla/mux" "xorm.io/xorm" diff --git a/features/lm/service.go b/features/lm/service.go index a3ef349..5cdaa94 100644 --- a/features/lm/service.go +++ b/features/lm/service.go @@ -3,9 +3,8 @@ package lm import ( - "nms_cxy/features/lm/file_export" - "nms_cxy/lib/log" - + "be.ems/features/lm/file_export" + "be.ems/lib/log" "github.com/gin-gonic/gin" ) diff --git a/features/mml/mml.go b/features/mml/mml.go index e1e2630..feaa691 100644 --- a/features/mml/mml.go +++ b/features/mml/mml.go @@ -10,16 +10,15 @@ import ( "strings" "time" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/mmlp" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - - tokenConst "nms_cxy/src/framework/constants/token" - - "github.com/gorilla/mux" + "be.ems/lib/core/ctx" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/mmlp" + "be.ems/lib/services" + "be.ems/restagent/config" + tokenConst "be.ems/src/framework/constants/token" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" ) // const ( @@ -75,30 +74,463 @@ func InitMML() { func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { log.Info("PostMML2ToNF processing... ") - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - neInfo := new(dborm.NeInfo) - params := r.URL.Query() - neId := params["ne_id"] - neInfo, err := dborm.XormGetNeInfo(neType, neId[0]) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) + neType := ctx.GetParam(r, "elementTypeValue") + neId := ctx.GetQuery(r, "ne_id") + if neId == "" { + log.Error("NOT FOUND ne_id") + services.ResponseBadRequest400WrongParamValue(w) return } + log.Debug("neType:", neType, "neId", neId) + + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + if len(neInfoArr) < 1 { + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + neInfo := neInfoArr[0] + if neInfo.NeId != neId || neInfo.IP == "" || len(neInfo.Hosts) < 2 { + services.ResponseWithJson(w, 200, map[string]any{ + "code": 0, + "msg": "neInfo not found", + }) + return + } + telnetHost := neInfo.Hosts[1] buf := make([]byte, BUFFER_SIZE) var n int var mmlResult []string - port2 := 5002 - if config.GetYamlConfig().MML.Port2 != 0 { - port2 = config.GetYamlConfig().MML.Port2 + hostMML := fmt.Sprintf("%s:%d", telnetHost.Addr, telnetHost.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + // localAddr := conn.LocalAddr() + // remoteAddr := conn.RemoteAddr() + // if localAddr == nil || remoteAddr == nil { + // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + + // 发送窗口大小设置命令 + conn.Write([]byte{255, 251, 31}) // 发送WILL WINDOW SIZE + conn.Write([]byte{ + 255, 250, 31, + byte(WIN_COL_SIZE >> 8), byte(WIN_COL_SIZE & 0xFF), + byte(WIN_ROW_SIZE >> 8), byte(WIN_ROW_SIZE & 0xFF), + 255, 240, + }) // 发送设置 WINDOW SIZE + + conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) + loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) + _, err = conn.Write([]byte(loginStr)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return } - if neInfo != nil { - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, port2) + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0:n])) + + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("Failed to ReadAll:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + for _, mml := range mmlRequest.MML { + mmlCommand := fmt.Sprintf("%s\n", mml) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue + } + log.Trace(string(buf[0 : n-len(neType)-2])) + re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 + //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 + re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 + //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) + result := re1.ReplaceAllString(string(buf[0:n]), "") + result = re2.ReplaceAllString(result, "") + mmlResult = append(mmlResult, result) + } + + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) +} + +func PostMMLToNF(w http.ResponseWriter, r *http.Request) { + log.Debug("PostMMLToNF processing... ") + + // token, err := services.CheckExtValidRequest(w, r) + // if err != nil { + // log.Error("Request error:", err) + // return + // } + // 经过测试,linux下,延时需要大于100ms + // var TIME_DELAY_AFTER_WRITE time.Duration = 200 + // var TIME_DEAD_LINE time.Duration = 10 + // if config.GetYamlConfig().MML.Sleep != 0 { + // TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) + // } + // if config.GetYamlConfig().MML.DeadLine != 0 { + // TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) + // } + + neType := ctx.GetParam(r, "elementTypeValue") + neId := ctx.GetQuery(r, "ne_id") + if neId == "" { + log.Error("NOT FOUND ne_id") + services.ResponseBadRequest400WrongParamValue(w) + return + } + log.Debug("neType:", neType, "neId", neId) + + if strings.ToLower(neType) == "omc" { + PostMMLToOMC(w, r) + return + } + + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + if len(neInfoArr) < 1 { + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + neInfo := neInfoArr[0] + if neInfo.NeId != neId || neInfo.IP == "" || len(neInfo.Hosts) < 2 { + services.ResponseWithJson(w, 200, map[string]any{ + "code": 0, + "msg": "neInfo not found", + }) + return + } + telnetHost := neInfo.Hosts[1] + + var buf [20 * 1024]byte + //buf := make([]byte, 0) + var n int + var mmlResult []string + switch strings.ToLower(neType) { + case "xxx": + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("io.ReadAll is failed:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + // hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) + // conn, err := net.Dial("tcp", hostMML) + // if err != nil { + // errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // defer conn.Close() + + // conn.SetDeadline(time.Now().Add(10 * time.Second)) + // loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + // _, err = conn.Write([]byte(loginStr)) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\n")) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + // n, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\n")) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + for _, mml := range mmlRequest.MML { + hostMML := fmt.Sprintf("%s:%d", telnetHost.Addr, telnetHost.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) + + loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) + _, err = conn.Write([]byte(loginStr)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + //response := Response{mmlResult} + //services.ResponseWithJson(w, http.StatusOK, response) + //return + continue + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + mmlCommand := fmt.Sprintf("%s\n", mml) + log.Debug("mml command:", mmlCommand) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + //response := Response{mmlResult} + //services.ResponseWithJson(w, http.StatusOK, response) + //return + continue + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + //response := Response{mmlResult} + //services.ResponseWithJson(w, http.StatusOK, response) + //return + continue + } + log.Trace(string(buf[0 : n-len(neType)-2])) + + re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 + //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 + re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 + //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) + // upf telnet buffer只能读取一次,需要去掉前面的多余字符 + //result := re1.ReplaceAllString(string(buf[config.GetYamlConfig().MML.UpfHeaderLength:n-len(neType)-2]), "") + result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") + result = re2.ReplaceAllString(result, "") + mmlResult = append(mmlResult, result) + conn.Close() + //mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) + + // can't read buffer from upf telnet server, so return ok always + // mmlResult = append(mmlResult, "COMMAND OK\n") + } + case "ims": + hostMML := fmt.Sprintf("%s:%d", telnetHost.Addr, telnetHost.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + // localAddr := conn.LocalAddr() + // remoteAddr := conn.RemoteAddr() + // if localAddr == nil || remoteAddr == nil { + // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) + + _, err = conn.Write([]byte(telnetHost.User + "\r\n")) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0:n])) + + _, err = conn.Write([]byte(telnetHost.Password + "\r\n")) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // loginStr := fmt.Sprintf("%s\r\n%s\r\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + // _, err = conn.Write([]byte(loginStr)) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0 : n-len(neType)-2])) + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("io.ReadAll is failed:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + for _, mml := range mmlRequest.MML { + mmlCommand := fmt.Sprintf("%s\r\n", mml) + log.Debug("mml command:", mmlCommand) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue + } + log.Trace(string(buf[0 : n-len(neType)-2])) + + re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 + //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 + re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 + //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) + result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") + result = re2.ReplaceAllString(result, "") + mmlResult = append(mmlResult, result) + } + default: + hostMML := fmt.Sprintf("%s:%d", telnetHost.Addr, telnetHost.Port) conn, err := net.Dial("tcp", hostMML) - //conn, err := net.Dial("tcp", hostMML) if err != nil { errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) log.Error(errMsg) @@ -120,17 +552,8 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { // return // } - // 发送窗口大小设置命令 - conn.Write([]byte{255, 251, 31}) // 发送WILL WINDOW SIZE - conn.Write([]byte{ - 255, 250, 31, - byte(WIN_COL_SIZE >> 8), byte(WIN_COL_SIZE & 0xFF), - byte(WIN_ROW_SIZE >> 8), byte(WIN_ROW_SIZE & 0xFF), - 255, 240, - }) // 发送设置 WINDOW SIZE - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) _, err = conn.Write([]byte(loginStr)) if err != nil { log.Error("Failed to write:", err) @@ -190,455 +613,10 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n]), "") + result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") result = re2.ReplaceAllString(result, "") mmlResult = append(mmlResult, result) } - - } - - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func PostMMLToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMMLToNF processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // 经过测试,linux下,延时需要大于100ms - // var TIME_DELAY_AFTER_WRITE time.Duration = 200 - // var TIME_DEAD_LINE time.Duration = 10 - // if config.GetYamlConfig().MML.Sleep != 0 { - // TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) - // } - // if config.GetYamlConfig().MML.DeadLine != 0 { - // TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) - // } - - pack := "mml" - vars := mux.Vars(r) - module := vars["managedType"] - neType := vars["elementTypeValue"] - params := r.URL.Query() - neId := params["ne_id"] - if len(neId) == 0 { - log.Error("NOT FOUND ne_id") - services.ResponseBadRequest400WrongParamValue(w) - return - } - log.Debug("neType:", neType, "neId", neId) - - log.Debugf("method:%s, managementType:%s dbname:%s, tbname:%s pack:%s", r.Method, module, neType, neId[0], pack) - - var buf [20 * 1024]byte - //buf := make([]byte, 0) - var n int - var mmlResult []string - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, neType, neId[0], pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // errMsg := fmt.Sprintf("RetCode = -1 operation failed: do not have the operation permissions") - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // //services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("Not permission!") - // errMsg := fmt.Sprintf("RetCode = -1 operation failed: do not have the operation permissions") - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // //services.ResponseForbidden403NotPermission(w) - // return - // } - - if strings.ToLower(neType) == "omc" { - PostMMLToOMC(w, r) - return - } - - neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo(neType, neId[0]) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - if neInfo != nil { - switch strings.ToLower(neType) { - case "xxx": - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - // conn, err := net.Dial("tcp", hostMML) - // if err != nil { - // errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // defer conn.Close() - - // conn.SetDeadline(time.Now().Add(10 * time.Second)) - // loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - // _, err = conn.Write([]byte(loginStr)) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\n")) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // n, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\n")) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - for _, mml := range mmlRequest.MML { - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - mmlCommand := fmt.Sprintf("%s\n", mml) - log.Debug("mml command:", mmlCommand) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - // upf telnet buffer只能读取一次,需要去掉前面的多余字符 - //result := re1.ReplaceAllString(string(buf[config.GetYamlConfig().MML.UpfHeaderLength:n-len(neType)-2]), "") - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - conn.Close() - //mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) - - // can't read buffer from upf telnet server, so return ok always - // mmlResult = append(mmlResult, "COMMAND OK\n") - } - case "ims": - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - // localAddr := conn.LocalAddr() - // remoteAddr := conn.RemoteAddr() - // if localAddr == nil || remoteAddr == nil { - // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0:n])) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // loginStr := fmt.Sprintf("%s\r\n%s\r\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - // _, err = conn.Write([]byte(loginStr)) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - for _, mml := range mmlRequest.MML { - mmlCommand := fmt.Sprintf("%s\r\n", mml) - log.Debug("mml command:", mmlCommand) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - } - default: - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - // localAddr := conn.LocalAddr() - // remoteAddr := conn.RemoteAddr() - // if localAddr == nil || remoteAddr == nil { - // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0:n])) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - for _, mml := range mmlRequest.MML { - mmlCommand := fmt.Sprintf("%s\n", mml) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - } - } } response := Response{mmlResult} @@ -648,28 +626,28 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { log.Debug("PostMMLToOMC processing... ") - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Failed to CheckMmlValidRequest:", err) - // return - // } - - params := r.URL.Query() - neId := params["ne_id"] - if len(neId) == 0 { - log.Error("NOT FOUND ne_id ") + neType := "OMC" //ctx.GetParam(r, "elementTypeValue") + neId := ctx.GetQuery(r, "ne_id") + if neId == "" { + log.Error("NOT FOUND ne_id") services.ResponseBadRequest400WrongParamValue(w) return } + log.Debug("neType:", neType, "neId", neId) - neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo("OMC", neId[0]) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) + if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return } - log.Trace("neInfo:", neInfo) + neInfo := neInfoArr[0] + if neInfo.NeId != neId || neInfo.IP == "" { + services.ResponseWithJson(w, 200, map[string]any{ + "code": 0, + "msg": "neInfo not found", + }) + return + } body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) if err != nil { @@ -679,8 +657,7 @@ func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { } log.Trace("Body:", string(body)) - hostUri := fmt.Sprintf("http://%s:%s", neInfo.Ip, neInfo.Port) - + hostUri := fmt.Sprintf("http://%s:%d", neInfo.IP, neInfo.Port) omcMmlVar := &mmlp.MmlVar{ Version: global.Version, Output: mmlp.DefaultFormatType, diff --git a/features/nbi/file/controller.go b/features/nbi/file/controller.go new file mode 100644 index 0000000..cc5edc8 --- /dev/null +++ b/features/nbi/file/controller.go @@ -0,0 +1,257 @@ +package nbi_file + +import ( + "archive/zip" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "time" + + "be.ems/lib/dborm" + "be.ems/lib/file" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "github.com/gin-gonic/gin" +) + +type SysJobResponse struct { + SysJob + TableName string `json:"tableName"` + TableDisplay string `json:"tableDisplay"` + FilePath string `json:"filePath"` +} + +type TargetParams struct { + Duration int `json:"duration"` + TableName string `json:"tableName"` + Columns string `json:"columns"` // exported column name of time string + TimeCol string `json:"timeCol"` // time stamp of column name + TimeUnit string `json:"timeUnit"` // timestamp unit: second/micro/milli + Extras string `json:"extras"` // extras condition for where + FilePath string `json:"filePath"` // file path +} + +func (m *FileNBI) GetFileList(c *gin.Context) { + var querys FileNBIQuery + + querys.Category = c.Param("category") + querys.Type = c.Param("type") + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + if querys.Path == "" { + tableName := "" + ok := false + switch querys.Category { + case "cdr": + tableName, ok = CDRTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) + return + } + case "log": + tableName, ok = LogTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) + return + } + default: + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) + return + } + + s := SysJob{} + where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) + _, err := dborm.XEngDB().Table(s.TableName()). + Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). + Where(where). + Get(&querys.Path) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + } + + files, err := file.GetFileInfo(querys.Path, querys.Suffix) + if err != nil { + log.Error("failed to GetFileInfo:", err) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + // split files list + lenNum := int64(len(files)) + start := (querys.PageNum - 1) * querys.PageSize + end := start + querys.PageSize + var splitList []file.FileInfo + if start >= lenNum { + splitList = []file.FileInfo{} + } else if end >= lenNum { + splitList = files[start:] + } else { + splitList = files[start:end] + } + total := len(files) + c.JSON(http.StatusOK, services.TotalDataResp(splitList, total)) +} + +func (m *FileNBI) Total(c *gin.Context) { + dir := c.Query("path") + + fileCount, dirCount, err := file.GetFileAndDirCount(dir) + if err != nil { + log.Error("failed to GetFileAndDirCount:", err) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + total := fileCount + dirCount + c.JSON(http.StatusOK, services.TotalResp(int64(total))) +} + +func (m *FileNBI) GetSingleFileHandler(c *gin.Context) { + var querys FileNBIQuery + + querys.Category = c.Param("category") + querys.Type = c.Param("type") + querys.DateIndex = c.Param("dateIndex") + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + tableName := "" + if querys.Path == "" { + ok := false + switch querys.Category { + case "cdr": + tableName, ok = CDRTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) + return + } + case "log": + tableName, ok = LogTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) + return + } + default: + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) + return + } + + s := SysJob{} + where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) + _, err := dborm.XEngDB().Table(s.TableName()). + Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). + Where(where). + Get(&querys.Path) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + } + + fileName := tableName + "_export_" + querys.DateIndex + "0000" + ".csv" + filePath := filepath.Join(querys.Path, fileName) + + file, err := os.Open(filePath) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + defer file.Close() + + if _, err := os.Stat(filePath); os.IsNotExist(err) { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + c.Header("Content-Disposition", "attachment; filename="+fileName) + c.Header("Content-Type", "application/octet-stream") + c.File(filePath) +} + +func (m *FileNBI) GetMultiFileHandler(c *gin.Context) { + var querys FileNBIQuery + + querys.Category = c.Param("category") + querys.Type = c.Param("type") + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + tableName := "" + if querys.Path == "" { + ok := false + switch querys.Category { + case "cdr": + tableName, ok = CDRTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) + return + } + case "log": + tableName, ok = LogTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) + return + } + default: + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) + return + } + + s := SysJob{} + where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) + _, err := dborm.XEngDB().Table(s.TableName()). + Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). + Where(where). + Get(&querys.Path) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + } + + zipWriter := zip.NewWriter(c.Writer) + defer zipWriter.Close() + + for _, fileName := range querys.FileNames { + filePath := filepath.Join(querys.Path, fileName) + + file, err := os.Open(filePath) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + defer file.Close() + + if _, err := os.Stat(filePath); os.IsNotExist(err) { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + writer, err := zipWriter.Create(filepath.Base(fileName)) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + if _, err := io.Copy(writer, file); err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + } + zipFile := tableName + "_export_" + time.Now().Local().Format(global.DateData) + ".zip" + c.Header("Content-Disposition", "attachment; filename="+zipFile) + c.Header("Content-Type", "application/zip") + //c.File(filePath) +} diff --git a/features/nbi/file/model.go b/features/nbi/file/model.go new file mode 100644 index 0000000..5dcdd9f --- /dev/null +++ b/features/nbi/file/model.go @@ -0,0 +1,47 @@ +package nbi_file + +import ( + "be.ems/lib/file" +) + +const ( + INVOKE_FILE_EXPORT = "exportTable" +) + +var CDRTableMapper map[string]string = map[string]string{ + "ims": "cdr_event_ims", + "smf": "cdr_event_smf", + "smsc": "cdr_event_smsc", + "sms": "cdr_event_smsc", +} + +var LogTableMapper map[string]string = map[string]string{ + "operate": "sys_log_operate", + "security": "sys_log_login", + "alarm": "alarm_log", +} + +type SysJob struct { + JobID int64 `gorm:"column:job_id;primary_key;auto_increment" json:"job_id"` //任务ID + InvokeTarget string `gorm:"column:invoke_target" json:"invoke_target"` //调用目标字符串 + TargetParams string `gorm:"column:target_params;type:json" json:"target_params,omitempty"` //调用目标传入参数 +} + +func (s *SysJob) TableName() string { + return "sys_job" +} + +type FileNBI struct { + file.FileInfo +} + +type FileNBIQuery struct { + Category string `form:"category" binding:"required"` + Type string `form:"type" binding:"required"` + DateIndex string `form:"dateIndex"` + Path string `json:"path" form:"path"` + FileNames []string `json:"fileName" form:"fileName"` + Suffix string `form:"suffix"` + PageNum int64 `form:"pageNum"` + PageSize int64 `form:"pageSize"` +} diff --git a/features/nbi/file/route.go b/features/nbi/file/route.go new file mode 100644 index 0000000..f0cb58f --- /dev/null +++ b/features/nbi/file/route.go @@ -0,0 +1,26 @@ +package nbi_file + +import ( + "be.ems/src/framework/middleware" + "github.com/gin-gonic/gin" +) + +// Register Routes for file_export +func Register(r *gin.RouterGroup) { + fileNBI := r.Group("/file") + { + var f *FileNBI + fileNBI.GET("/:category/:type/list", + middleware.PreAuthorize(nil), + f.GetFileList, + ) + fileNBI.GET("/:category/:type/:dateIndex", + middleware.PreAuthorize(nil), + f.GetSingleFileHandler, + ) + fileNBI.GET("/:category/:type", + middleware.PreAuthorize(nil), + f.GetMultiFileHandler, + ) + } +} diff --git a/features/nbi/nbi.go b/features/nbi/nbi.go index e715e0f..3686fe5 100644 --- a/features/nbi/nbi.go +++ b/features/nbi/nbi.go @@ -6,18 +6,16 @@ import ( "net/http" "strings" - "nms_cxy/lib/dborm" - + "be.ems/lib/dborm" "github.com/go-resty/resty/v2" "github.com/gorilla/mux" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/oauth" - "nms_cxy/lib/services" - "nms_cxy/lib/session" - "nms_cxy/omc/config" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/lib/services" + "be.ems/restagent/config" ) type ErrorOAuthResponse struct { @@ -36,7 +34,7 @@ type ApiResponse struct { ResultMessage interface{} } -var globalSession = session.NewSessManager("restagent") +//var globalSession = session.NewSessManager("restagent") var ( MAX_RMUID_NUM int diff --git a/features/nbi/service.go b/features/nbi/service.go new file mode 100644 index 0000000..7b913d5 --- /dev/null +++ b/features/nbi/service.go @@ -0,0 +1,16 @@ +// log management package + +package nbi + +import ( + nbi_file "be.ems/features/nbi/file" + "be.ems/lib/log" + "github.com/gin-gonic/gin" +) + +func InitSubServiceRoute(r *gin.Engine) { + log.Info("======init North-Bound Interface group gin.Engine") + + nbiGroup := r.Group("/nbi") + nbi_file.Register(nbiGroup) +} diff --git a/features/nbi/snmp.go b/features/nbi/snmp.go index 58c3d88..1ab4c00 100644 --- a/features/nbi/snmp.go +++ b/features/nbi/snmp.go @@ -9,9 +9,9 @@ import ( "github.com/gorilla/mux" g "github.com/gosnmp/gosnmp" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" ) func init() { @@ -54,28 +54,28 @@ func GetNRMByUri(w http.ResponseWriter, r *http.Request) { // error processing ... // 401-1 response - token, ret := globalSession.IsCarriedToken(r) - if ret == false { - log.Error("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } + // token, ret := globalSession.IsCarriedToken(r) + // if ret == false { + // log.Error("AccessToken is not carried") + // services.ResponseUnauthorized401AccessTokenNotCarried(w) + // return + // } // 401-2 response - if globalSession.IsValidToken(token) == false { - log.Error("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } + // if globalSession.IsValidToken(token) == false { + // log.Error("AccessToken fails or does not exist") + // services.ResponseUnauthorized401AccessTokenNotExist(w) + // return + // } // response 403 Forbidden, permissions deny // todo... - plist := globalSession.GetPermissionFromSession(token) - log.Debug("permission list:", plist) - if len(plist) == 0 || plist[0] == false { - log.Error("User permission deny") - services.ResponseForbidden403NotPermission(w) - return - } + // plist := globalSession.GetPermissionFromSession(token) + // log.Debug("permission list:", plist) + // if len(plist) == 0 || plist[0] == false { + // log.Error("User permission deny") + // services.ResponseForbidden403NotPermission(w) + // return + // } vars := mux.Vars(r) qeuryUri := vars["apiCategory"] + "/" + vars["elementTypeValue"] + "/" + vars["objectTypeValue"] diff --git a/features/pm/kpi_c_report/controller.go b/features/pm/kpi_c_report/controller.go index bc46a80..03f6ae2 100644 --- a/features/pm/kpi_c_report/controller.go +++ b/features/pm/kpi_c_report/controller.go @@ -5,9 +5,8 @@ import ( "net/http" "strings" - "nms_cxy/lib/dborm" - "nms_cxy/lib/services" - + "be.ems/lib/dborm" + "be.ems/lib/services" "github.com/gin-gonic/gin" ) @@ -41,13 +40,14 @@ func (k *KpiCReport) Get(c *gin.Context) { return } if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") params = append(params, querys.StartTime) } if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") params = append(params, querys.EndTime) } + conditions = append(conditions, "kpi_values != 'null'") whereSql := "" if len(conditions) > 0 { @@ -71,7 +71,7 @@ func (k *KpiCReport) Get(c *gin.Context) { //err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error err := dbg.Find(&reports).Error if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } c.JSON(http.StatusOK, services.DataResp(reports)) @@ -84,7 +84,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { var querys KpiCReportQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -93,7 +93,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { conditions = append(conditions, "ne_type = ?") params = append(params, strings.ToUpper(querys.NeType)) } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found required parameter NE type")) + c.JSON(http.StatusOK, services.ErrResp("Not found required parameter NE type")) return } tableName := TableName() + "_" + strings.ToLower(querys.NeType) @@ -107,13 +107,14 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { return } if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") params = append(params, querys.StartTime) } if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") params = append(params, querys.EndTime) } + conditions = append(conditions, "kpi_values != 'null'") whereSql := "" if len(conditions) > 0 { @@ -137,7 +138,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { //err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error err := dbg.Find(&results).Error if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -150,7 +151,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { "neName": *r.NeName, "rmUID": *r.RmUID, "startIndex": r.Index, - "timeGroup": r.Date[:10] + " " + *r.StartTime, + "timeGroup": r.Date[:10] + " " + *r.EndTime, "createdAt": r.CreatedAt, "granularity": r.Granularity, } @@ -170,7 +171,7 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) { var querys KpiCReportQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -179,20 +180,21 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) { conditions = append(conditions, "ne_type = ?") params = append(params, strings.ToUpper(querys.NeType)) } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found NE type")) + c.JSON(http.StatusOK, services.ErrResp("Not found NE type")) return } tableName := TableName() + "_" + strings.ToLower(querys.NeType) dbg := dborm.DefaultDB().Table(tableName) if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") params = append(params, querys.StartTime) } if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") params = append(params, querys.EndTime) } + conditions = append(conditions, "kpi_values != 'null'") whereSql := "" if len(conditions) > 0 { @@ -204,7 +206,7 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) { var total int64 = 0 err := dbg.Count(&total).Error if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -225,7 +227,7 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) { //err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error err = dbg.Find(&reports).Error if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -238,7 +240,7 @@ func (k *KpiCReport) Total(c *gin.Context) { var querys KpiCReportQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -247,20 +249,21 @@ func (k *KpiCReport) Total(c *gin.Context) { conditions = append(conditions, "ne_type = ?") params = append(params, strings.ToUpper(querys.NeType)) } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found NE type")) + c.JSON(http.StatusOK, services.ErrResp("Not found NE type")) return } tableName := TableName() + "_" + strings.ToLower(querys.NeType) dbg := dborm.DefaultDB().Table(tableName) if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") params = append(params, querys.StartTime) } if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") params = append(params, querys.EndTime) } + conditions = append(conditions, "kpi_values != 'null'") whereSql := "" if len(conditions) > 0 { @@ -270,7 +273,7 @@ func (k *KpiCReport) Total(c *gin.Context) { var total int64 = 0 err := dbg.Count(&total).Error if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -281,11 +284,11 @@ func (k *KpiCReport) Post(c *gin.Context) { var report KpiCReport if err := c.ShouldBindJSON(&report); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } if err := dborm.DefaultDB().Create(&report).Error; err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } c.JSON(http.StatusCreated, services.DataResp(report)) @@ -296,12 +299,12 @@ func (k *KpiCReport) Put(c *gin.Context) { id := c.Param("id") if err := dborm.DefaultDB().First(&report, id).Error; err != nil { - c.JSON(http.StatusNotFound, services.ErrResp("KPI report not found")) + c.JSON(http.StatusOK, services.ErrResp("custom indicator report not found")) return } if err := c.ShouldBindJSON(&report); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } dborm.DefaultDB().Save(&report) @@ -312,7 +315,7 @@ func (k *KpiCReport) Delete(c *gin.Context) { id := c.Param("id") if err := dborm.DefaultDB().Delete(&KpiCReport{}, id).Error; err != nil { - c.JSON(http.StatusNotFound, services.ErrResp("KPI report not found")) + c.JSON(http.StatusOK, services.ErrResp("custom indicator report not found")) return } diff --git a/features/pm/kpi_c_report/model.go b/features/pm/kpi_c_report/model.go index 627040a..b96b7f0 100644 --- a/features/pm/kpi_c_report/model.go +++ b/features/pm/kpi_c_report/model.go @@ -30,17 +30,16 @@ type KpiCReport struct { } type KpiCReportQuery struct { - NeType string `json:"neType" form:"neType" binding:"required"` - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` - TenantName string `json:"tenantName" form:"tenantName"` - UserName string `json:"userName" form:"userName"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=created_at"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int `json:"pageNum" form:"pageNum"` - PageSize int `json:"pageSize" form:"pageSize"` + NeType string `json:"neType" form:"neType" binding:"required"` + NeID string `json:"neId" form:"neId" binding:"required"` + RmUID string `json:"rmUID" form:"rmUID"` + StartTime string `json:"startTime" form:"startTime"` + EndTime string `json:"endTime" form:"endTime"` + UserName string `json:"userName" form:"userName"` + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=created_at"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + PageNum int `json:"pageNum" form:"pageNum"` + PageSize int `json:"pageSize" form:"pageSize"` } type KpiCReport2FE struct { @@ -51,7 +50,6 @@ type KpiCReport2FE struct { TimeGroup string `json:"timeGroup"` StartIndex int16 `json:"startIndex" gorm:"column:index"` Granularity int8 `json:"granularity" gorm:"column:granularity"` - TenantID string `json:"tenantID" gorm:"column:tenant_id"` } func TableName() string { diff --git a/features/pm/kpi_c_report/route.go b/features/pm/kpi_c_report/route.go index ee7b2b3..7e64f95 100644 --- a/features/pm/kpi_c_report/route.go +++ b/features/pm/kpi_c_report/route.go @@ -1,8 +1,7 @@ package kpi_c_report import ( - "nms_cxy/src/framework/middleware" - + "be.ems/src/framework/middleware" "github.com/gin-gonic/gin" ) diff --git a/features/pm/kpi_c_title/controller.go b/features/pm/kpi_c_title/controller.go index 959ac79..c787460 100644 --- a/features/pm/kpi_c_title/controller.go +++ b/features/pm/kpi_c_title/controller.go @@ -3,22 +3,27 @@ package kpi_c_title import ( "fmt" "net/http" + "regexp" + "strconv" "strings" - "nms_cxy/lib/dborm" - "nms_cxy/lib/services" - + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/src/framework/utils/ctx" "github.com/gin-gonic/gin" ) +// get customize kpi total and list func (k *KpiCTitle) GetToalList(c *gin.Context) { var titles []KpiCTitle var conditions []string var params []any + i18n := ctx.AcceptLanguage(c) var querys KpiCTitleQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -41,7 +46,7 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) { // Get total number var total int64 = 0 if err := dbg.Count(&total).Error; err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -59,10 +64,12 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) { dbg = dbg.Order(orderBy) } if err := dbg.Find(&titles).Error; err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } + k.expressionAlias(titles, i18n) + c.JSON(http.StatusOK, services.TotalDataResp(titles, total)) //c.JSON(http.StatusOK, titles) } @@ -71,6 +78,7 @@ func (k *KpiCTitle) Get(c *gin.Context) { var titles []KpiCTitle var conditions []string var params []any + i18n := ctx.AcceptLanguage(c) // construct condition to get if neType := c.Query("neType"); neType != "" { @@ -86,14 +94,42 @@ func (k *KpiCTitle) Get(c *gin.Context) { whereSql += strings.Join(conditions, " and ") } if err := dborm.DefaultDB().Where(whereSql, params...).Find(&titles).Error; err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } + k.expressionAlias(titles, i18n) + c.JSON(http.StatusOK, services.DataResp(titles)) //c.JSON(http.StatusOK, titles) } +// alias customized kpi expression with cn/en title +func (k *KpiCTitle) expressionAlias(titles []KpiCTitle, i18n string) { + var title *KpiCTitle + for i := 0; i < len(titles); i++ { + title = &titles[i] + title.ExprAlias = *title.Expression + re := regexp.MustCompile(`'([^']+)'`) + matches := re.FindAllStringSubmatch(title.ExprAlias, -1) + + for _, match := range matches { + var alias, sql string + if i18n == "zh" { + sql = fmt.Sprintf("SELECT cn_title FROM kpi_title WHERE kpi_id='%s'", match[1]) + } else { + sql = fmt.Sprintf("SELECT en_title FROM kpi_title WHERE kpi_id='%s'", match[1]) + } + err := dborm.XCoreDB().QueryRow(sql).Scan(&alias) + if err != nil { + log.Warn("Failed to QueryRow:", err) + continue + } + title.ExprAlias = regexp.MustCompile(match[1]).ReplaceAllString(title.ExprAlias, alias) + } + } +} + func (k *KpiCTitle) Total(c *gin.Context) { var conditions []string var params []any @@ -113,7 +149,7 @@ func (k *KpiCTitle) Total(c *gin.Context) { } var total int64 = 0 if err := dborm.DefaultDB().Table(k.TableName()).Where(whereSql, params...).Count(&total).Error; err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } @@ -121,19 +157,47 @@ func (k *KpiCTitle) Total(c *gin.Context) { } func (k *KpiCTitle) Post(c *gin.Context) { - var title KpiCTitle + var title, res KpiCTitle if err := c.ShouldBindJSON(&title); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } - result := dborm.DefaultDB().Where("ne_type=? and kpi_id=?", title.NeType, title.KpiID).First(&title) + userName := ctx.LoginUserToUserName(c) + title.CreatedBy = &userName + result := dborm.DefaultDB().Where("ne_type=? and (kpi_id=? or title=?)", title.NeType, title.KpiID, title.Title).First(&title) if result.RowsAffected > 0 { - c.JSON(http.StatusInternalServerError, services.ErrResp("target kpiC title already exist")) + c.JSON(http.StatusOK, services.ErrResp("custom indicator already exist")) return } + ret := dborm.DefaultDB().Table("kpi_c_title").Where("ne_type=? ORDER BY kpi_id DESC LIMIT 1", title.NeType).Scan(&res) + if err := ret.Error; err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + newKpiID := *title.NeType + ".C" + ".01" + if ret.RowsAffected != 0 { + maxKpiID := *res.KpiID + prefix := maxKpiID[:len(maxKpiID)-2] + suffix := maxKpiID[len(maxKpiID)-2:] + suffixInt, err := strconv.Atoi(suffix) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + if suffixInt >= MAX_KPI_C_ID { + err := fmt.Errorf("exceed the max customized KPI ID") + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + suffixInt++ + newSuffix := fmt.Sprintf("%02d", suffixInt) + newKpiID = prefix + newSuffix + } + title.KpiID = &newKpiID if err := dborm.DefaultDB().Create(&title).Error; err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } kpiCReportTable := "kpi_c_report_" + strings.ToLower(*title.NeType) @@ -141,17 +205,17 @@ func (k *KpiCTitle) Post(c *gin.Context) { // clone table "kpi_c_report" to "kpi_c_report_{neType}" sql := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s AS SELECT * FROM %s WHERE 1=0", kpiCReportTable, "kpi_c_report") if _, err := dborm.ExecSQL(sql, nil); err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } sql = fmt.Sprintf("ALTER TABLE %s MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY IF NOT EXISTS (`id`)", kpiCReportTable) if _, err := dborm.ExecSQL(sql, nil); err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } sql = fmt.Sprintf("ALTER TABLE %s ADD INDEX IF NOT EXISTS `idx_timestamp`(`created_at`) USING BTREE, ADD INDEX IF NOT EXISTS `idx_uid_datetime`(`rm_uid`, `date`, `start_time`) USING BTREE", kpiCReportTable) if _, err := dborm.ExecSQL(sql, nil); err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } } @@ -163,12 +227,12 @@ func (k *KpiCTitle) Put(c *gin.Context) { id := c.Param("id") if err := dborm.DefaultDB().First(&title, id).Error; err != nil { - c.JSON(http.StatusNotFound, services.ErrResp("KPIC Title not found")) + c.JSON(http.StatusOK, services.ErrResp("custom indicator not found")) return } if err := c.ShouldBindJSON(&title); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } dborm.DefaultDB().Save(&title) @@ -180,7 +244,7 @@ func (k *KpiCTitle) Delete(c *gin.Context) { id := c.Param("id") if err := dborm.DefaultDB().Delete(&KpiCTitle{}, id).Error; err != nil { - c.JSON(http.StatusNotFound, services.ErrResp("KPIC Title not found")) + c.JSON(http.StatusOK, services.ErrResp("custom indicator not found")) return } diff --git a/features/pm/kpi_c_title/model.go b/features/pm/kpi_c_title/model.go index 77bb942..cdc2b5c 100644 --- a/features/pm/kpi_c_title/model.go +++ b/features/pm/kpi_c_title/model.go @@ -2,12 +2,17 @@ package kpi_c_title import "time" +const ( + MAX_KPI_C_ID = 99 +) + type KpiCTitle struct { ID int `gorm:"column:id;primary_key;auto_increment" json:"id"` NeType *string `gorm:"column:ne_type;default:NULL," json:"neType,omitempty"` KpiID *string `gorm:"column:kpi_id;default:NULL," json:"kpiId,omitempty"` Title *string `gorm:"column:title;default:NULL," json:"title,omitempty"` Expression *string `gorm:"column:expression;default:NULL," json:"expression,omitempty"` + ExprAlias string `gorm:"-" json:"exprAlias"` Status string `gorm:"column:status;default:'Active'" json:"status"` Unit *string `gorm:"column:unit" json:"unit,omitempty"` Description *string `gorm:"column:description;default:NULL," json:"description,omitempty"` diff --git a/features/pm/kpi_c_title/route.go b/features/pm/kpi_c_title/route.go index 196c064..f058dbe 100644 --- a/features/pm/kpi_c_title/route.go +++ b/features/pm/kpi_c_title/route.go @@ -1,8 +1,7 @@ package kpi_c_title import ( - "nms_cxy/src/framework/middleware" - + "be.ems/src/framework/middleware" "github.com/gin-gonic/gin" ) diff --git a/features/pm/performance.go b/features/pm/performance.go index 917815b..cd54c74 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -10,18 +10,17 @@ import ( "strings" "time" - "nms_cxy/features/pm/kpi_c_report" - "nms_cxy/features/pm/kpi_c_title" - "nms_cxy/lib/dborm" - evaluate "nms_cxy/lib/eval" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - - neService "nms_cxy/src/modules/network_element/service" - wsService "nms_cxy/src/modules/ws/service" + "be.ems/features/pm/kpi_c_report" + "be.ems/features/pm/kpi_c_title" + "be.ems/lib/dborm" + evaluate "be.ems/lib/eval" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" + neService "be.ems/src/modules/network_element/service" + wsService "be.ems/src/modules/ws/service" "github.com/go-resty/resty/v2" _ "github.com/go-sql-driver/mysql" "github.com/gorilla/mux" @@ -45,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"` @@ -63,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"` } @@ -289,7 +288,7 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(kpiData.RmUid) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(kpiData.RmUid) // custom kpi report to FE kpiCEvent := map[string]any{ // kip_id ... @@ -298,7 +297,7 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { "neName": kpiData.NEName, "rmUID": kpiData.RmUid, "startIndex": kpiData.Index, - "timeGroup": kpiData.Date[:10] + " " + kpiData.StartTime, + "timeGroup": kpiData.Date[:10] + " " + kpiData.EndTime, "createdAt": kpiData.CreatedAt, "granularity": kpiData.Granularity, } @@ -325,147 +324,17 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { if neInfo.RmUID == kpiData.RmUid { // 推送到ws订阅组 - wsService.NewWSSendImpl.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent) + wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent) // 推送自定义KPI到ws订阅组 - wsService.NewWSSendImpl.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent) + wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent) if neInfo.NeType == "UPF" { - // 推送标识为:12_RMUID, exp: 12_4400HXUPF001 - wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_KPI_UPF+kpiReport.Task.NE.RmUID, kpiEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+neInfo.NeId, kpiEvent) } } services.ResponseStatusOK204NoContent(w) } -// PostGoldKPIFromNF 已废弃 -// post kpi report from NEs, insert insto gold_kpi table, discard... -func PostGoldKPIFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostKPIReportFromNF processing... ") - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Faile to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Request body:", string(body)) - kpiReport := new(KpiReport) - _ = json.Unmarshal(body, &kpiReport) - log.Trace("kpiReport:", kpiReport) - - session := xEngine.NewSession() - defer session.Close() - goldKpi := new(GoldKpi) - layout := time.RFC3339Nano - goldKpi.Date = GetDateFromTimeString(layout, kpiReport.Task.Period.StartTime) - goldKpi.Index, _ = strconv.Atoi(vars["index"]) - goldKpi.StartTime = global.GetFmtTimeString(layout, kpiReport.Task.Period.StartTime, time.DateTime) - goldKpi.EndTime = global.GetFmtTimeString(layout, kpiReport.Task.Period.EndTime, time.DateTime) - // get time granularity from startTime and endTime - seconds, _ := global.GetSecondDuration(goldKpi.StartTime, goldKpi.EndTime) - goldKpi.Granularity = 60 - if seconds != 0 && seconds <= math.MaxInt8 && seconds >= math.MinInt8 { - goldKpi.Granularity = int8(seconds) - } - goldKpi.NEName = kpiReport.Task.NE.NEName - goldKpi.RmUid = kpiReport.Task.NE.RmUID - goldKpi.NEType = kpiReport.Task.NE.NeType - goldKpi.Timestamp = global.GetFmtTimeString(layout, kpiReport.Timestamp, time.DateTime) - // 黄金指标事件对象 - kpiEvent := map[string]any{ - // kip_id ... - "neType": goldKpi.NEType, - "neName": goldKpi.NEName, - "rmUID": goldKpi.RmUid, - "startIndex": goldKpi.Index, - "timeGroup": goldKpi.StartTime, - } - // insert into new kpi_report_xxx table - kpiData := new(KpiData) - kpiData.Date = goldKpi.Date - kpiData.Index = goldKpi.Index - //st, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.StartTime, time.Local) - //et, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.EndTime, time.Local) - kpiData.StartTime = goldKpi.StartTime - kpiData.EndTime = goldKpi.EndTime - kpiData.Granularity = goldKpi.Granularity - kpiData.NEName = goldKpi.NEName - kpiData.NEType = goldKpi.NEType - kpiData.RmUid = goldKpi.RmUid - kpiVal := new(KPIVal) - kpiData.CreatedAt = time.Now().UnixMilli() - for _, k := range kpiReport.Task.NE.KPIs { - kpiEvent[k.KPIID] = k.Value // kip_id - goldKpi.KpiId = k.KPIID - goldKpi.Value = k.Value - goldKpi.Error = k.Err - - kpiVal.KPIID = k.KPIID - kpiVal.Value = int64(k.Value) - kpiVal.Err = k.Err - kpiData.KPIValues = append(kpiData.KPIValues, *kpiVal) - - //log.Trace("goldKpi:", goldKpi) - - // 启动事务 - err := session.Begin() - if err != nil { - log.Error("Failed to Begin gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - gkpi := &GoldKpi{} - _, err = session.Where("id = ?", 1).ForUpdate().Get(gkpi) - if err != nil { - // 回滚事务 - session.Rollback() - log.Error("Failed to ForUpdate gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - affected, err := session.Insert(goldKpi) - if err != nil && affected <= 0 { - session.Rollback() - log.Error("Failed to insert gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // 提交事务 - err = session.Commit() - if err != nil { - log.Error("Failed to Commit gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // insert kpi_report table, no session - tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType) - affected, err := xEngine.Table(tableName).Insert(kpiData) - if err != nil && affected <= 0 { - log.Errorf("Failed to insert %s:%v", tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 推送到ws订阅组 - wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_KPI, kpiEvent) - if goldKpi.NEType == "UPF" { - wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_KPI_UPF, kpiEvent) - } - - services.ResponseStatusOK204NoContent(w) -} - type MeasureTask struct { Tasks []Task `json:"Tasks"` NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */ diff --git a/features/pm/service.go b/features/pm/service.go index bbd0bed..ff2a653 100644 --- a/features/pm/service.go +++ b/features/pm/service.go @@ -1,10 +1,9 @@ package pm import ( - "nms_cxy/features/pm/kpi_c_report" - "nms_cxy/features/pm/kpi_c_title" - "nms_cxy/lib/log" - + "be.ems/features/pm/kpi_c_report" + "be.ems/features/pm/kpi_c_title" + "be.ems/lib/log" "github.com/gin-gonic/gin" ) diff --git a/features/security/account.go b/features/security/account.go index caa20d6..9440aba 100644 --- a/features/security/account.go +++ b/features/security/account.go @@ -6,12 +6,12 @@ import ( "net/http" "strings" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/oauth" - "nms_cxy/lib/services" - "nms_cxy/omc/config" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/lib/services" + "be.ems/restagent/config" ) var ( diff --git a/features/sm/backup.go b/features/sm/backup.go index ce39084..a946de8 100644 --- a/features/sm/backup.go +++ b/features/sm/backup.go @@ -8,10 +8,9 @@ import ( "os/exec" "time" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" _ "github.com/go-sql-driver/mysql" ) diff --git a/features/state/getstate.go b/features/state/getstate.go index 263d023..9a79e50 100644 --- a/features/state/getstate.go +++ b/features/state/getstate.go @@ -14,12 +14,12 @@ import ( "github.com/go-resty/resty/v2" "github.com/gorilla/mux" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - tokenConst "nms_cxy/src/framework/constants/token" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" + tokenConst "be.ems/src/framework/constants/token" ) type CpuUsage struct { diff --git a/features/state/state_linux.go b/features/state/state_linux.go index 91ccd19..a0944a1 100644 --- a/features/state/state_linux.go +++ b/features/state/state_linux.go @@ -11,8 +11,7 @@ import ( "syscall" "time" - "nms_cxy/lib/log" - + "be.ems/lib/log" "github.com/shirou/gopsutil/v4/cpu" "github.com/shirou/gopsutil/v4/disk" "github.com/shirou/gopsutil/v4/mem" diff --git a/features/state/sysinfo.go b/features/state/sysinfo.go index ba65ca9..f6f25b1 100644 --- a/features/state/sysinfo.go +++ b/features/state/sysinfo.go @@ -1,8 +1,7 @@ package state import ( - "nms_cxy/lib/log" - + "be.ems/lib/log" "github.com/shirou/gopsutil/v4/cpu" "github.com/shirou/gopsutil/v4/mem" ) diff --git a/features/trace/trace.go b/features/trace/trace.go index e90d377..73a8c82 100644 --- a/features/trace/trace.go +++ b/features/trace/trace.go @@ -12,12 +12,12 @@ import ( "github.com/go-resty/resty/v2" "github.com/gorilla/mux" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/run" - "nms_cxy/lib/services" - "nms_cxy/omc/config" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/run" + "be.ems/lib/services" + "be.ems/restagent/config" ) var ( diff --git a/features/ue/ue.go b/features/ue/ue.go index 608ae7e..cd2bb02 100644 --- a/features/ue/ue.go +++ b/features/ue/ue.go @@ -8,15 +8,14 @@ import ( "strings" "time" - "nms_cxy/lib/core/ctx" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - "nms_cxy/omc/config" - tokenConst "nms_cxy/src/framework/constants/token" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/lib/core/ctx" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" + tokenConst "be.ems/src/framework/constants/token" + neService "be.ems/src/modules/network_element/service" "github.com/go-resty/resty/v2" "github.com/gorilla/mux" ) @@ -254,7 +253,7 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) var response services.MapResponse if neInfo.NeId == neId && neInfo.NeId != "" { diff --git a/go.mod b/go.mod index 3d5b380..f398c8b 100644 --- a/go.mod +++ b/go.mod @@ -1,21 +1,27 @@ -module nms_cxy +module be.ems -go 1.21 +go 1.22 + +toolchain go1.23.1 require ( github.com/IBM/sarama v1.43.3 github.com/dlclark/regexp2 v1.11.4 + github.com/dustin/go-humanize v1.0.1 github.com/gin-gonic/gin v1.10.0 github.com/go-resty/resty/v2 v2.14.0 github.com/go-sql-driver/mysql v1.8.1 github.com/golang-jwt/jwt/v5 v5.2.1 + github.com/gopacket/gopacket v1.2.0 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.3 github.com/gosnmp/gosnmp v1.38.0 + github.com/jasonlvhit/gocron v0.0.1 github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f github.com/linxGnu/gosmpp v0.3.0 github.com/matoous/go-nanoid/v2 v2.1.0 - github.com/minio/minio-go/v7 v7.0.76 + github.com/metaleap/go-xsd v0.0.0-20180330193350-61f7638f502f + github.com/minio/minio-go/v7 v7.0.80 github.com/mojocn/base64Captcha v1.3.6 github.com/mssola/useragent v1.0.0 github.com/patrickmn/go-cache v2.1.0+incompatible @@ -24,12 +30,15 @@ require ( github.com/redis/go-redis/v9 v9.6.1 github.com/robfig/cron/v3 v3.0.1 github.com/shirou/gopsutil/v4 v4.24.7 + github.com/slayercat/GoSNMPServer v0.5.2 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 github.com/xuri/excelize/v2 v2.8.1 - golang.org/x/crypto v0.26.0 - golang.org/x/net v0.28.0 - golang.org/x/text v0.17.0 + github.com/xuri/xgen v0.0.0-20240722131518-d0691b701898 + golang.org/x/crypto v0.28.0 + golang.org/x/net v0.30.0 + golang.org/x/term v0.25.0 + golang.org/x/text v0.19.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/mysql v1.5.7 @@ -39,7 +48,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dustin/go-humanize v1.0.1 // indirect github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect @@ -56,6 +64,9 @@ require ( github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rs/xid v1.6.0 // indirect +) + +require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bytedance/sonic v1.12.1 // indirect @@ -69,11 +80,12 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.5 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-forks/fsnotify v1.4.7 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.22.0 // indirect - github.com/goccy/go-json v0.10.3 + github.com/goccy/go-json v0.10.3 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect @@ -83,8 +95,9 @@ require ( github.com/jinzhu/now v1.1.5 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect github.com/kr/fs v0.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 // indirect @@ -92,6 +105,7 @@ require ( github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/metaleap/go-util v0.0.0-20180330192724-a09253046f73 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -111,7 +125,9 @@ require ( github.com/richardlehane/msoleps v1.0.3 // indirect github.com/sagikazarmark/locafero v0.6.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/shirou/gopsutil/v3 v3.23.11 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/sirupsen/logrus v1.4.2 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.7.0 // indirect @@ -130,7 +146,8 @@ require ( golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect golang.org/x/image v0.19.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.24.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/tools/cmd/guru v0.1.1-deprecated // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 5879847..f93b16d 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,22 @@ +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= +gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/IBM/sarama v1.43.3 h1:Yj6L2IaNvb2mRBop39N7mmJAHBVY3dTPncr3qGVkxPA= github.com/IBM/sarama v1.43.3/go.mod h1:FVIRaLrhK3Cla/9FfRF5X9Zua2KpS3SYIXxhac1H+FQ= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/allegro/bigcache/v3 v3.1.0/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= @@ -23,6 +36,9 @@ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/ github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -31,6 +47,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= @@ -41,8 +59,8 @@ github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -55,8 +73,14 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-forks/fsnotify v1.4.7 h1:lyiU2Wqd4fNGCQDn9dZ4UxSiSFgeU1rM6yIfahk8haY= +github.com/go-forks/fsnotify v1.4.7/go.mod h1:AU8mot+GznW5+B4jRJHxKg/2EeO+jMORGRkKSxs0biw= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -68,6 +92,7 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-resty/resty/v2 v2.14.0 h1:/rhkzsAqGQkozwfKS5aFAbb6TyKd3zyFRWcdRXLPCAU= github.com/go-resty/resty/v2 v2.14.0/go.mod h1:IW6mekUOsElt9C7oWr0XRt9BNSD6D5rr9mhk6NjmNHg= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= @@ -76,10 +101,15 @@ github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqw github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -87,43 +117,70 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopacket/gopacket v1.2.0 h1:eXbzFad7f73P1n2EJHQlsKuvIMJjVXK5tXoSca78I3A= +github.com/gopacket/gopacket v1.2.0/go.mod h1:BrAKEy5EOGQ76LSqh7DMAr7z0NNPdczWm2GxCG7+I8M= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gosnmp/gosnmp v1.36.2-0.20231009064202-d306ed5aa998/go.mod h1:O938QjIS4vpSag1UTcnnBq9MfNmimuOGtvQsT1NbErc= github.com/gosnmp/gosnmp v1.38.0 h1:I5ZOMR8kb0DXAFg/88ACurnuwGwYkXWq3eLpJPHMEYc= github.com/gosnmp/gosnmp v1.38.0/go.mod h1:FE+PEZvKrFz9afP9ii1W3cprXuVZ17ypCcyyfYuu5LY= +github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.18.0/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= +github.com/jasonlvhit/gocron v0.0.1 h1:qTt5qF3b3srDjeOIR4Le1LfeyvoYzJlYpqvG7tJX5YU= +github.com/jasonlvhit/gocron v0.0.1/go.mod h1:k9a3TV8VcU73XZxfVHCHWMWF9SOqgoku0/QlY2yvlA4= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= @@ -137,17 +194,23 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -164,22 +227,31 @@ github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f h1:sgU github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 h1:Bvq8AziQ5jFF4BHGAEDSqwPW1NJS3XshxbRCxtjFAZc= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linxGnu/gosmpp v0.3.0 h1:LL+eY+zc9Ei/YY0po9A6L6SHf8nPyGvqsLddttr/y/4= github.com/linxGnu/gosmpp v0.3.0/go.mod h1:Ba6SULQql3IbF2A5Mtj3DqMKoFbx1pEz/8xyiOh8ZOs= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae h1:dIZY4ULFcto4tAFlj1FYZl8ztUZ13bdq+PLY+NOfbyI= github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matoous/go-nanoid/v2 v2.1.0 h1:P64+dmq21hhWdtvZfEAofnvJULaRR1Yib0+PnU669bE= github.com/matoous/go-nanoid/v2 v2.1.0/go.mod h1:KlbGNQ+FhrUNIHUxZdL63t7tl4LaPkZNpUULS8H4uVM= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/metaleap/go-util v0.0.0-20180330192724-a09253046f73 h1:4vKVhAdype/dejZjdQZZXVTKLz8mD0oakKz128L+IFQ= +github.com/metaleap/go-util v0.0.0-20180330192724-a09253046f73/go.mod h1:l71/5fppWP5A6nqhcxz6wQAYok6pr/vM2+KHIy50/LY= +github.com/metaleap/go-xsd v0.0.0-20180330193350-61f7638f502f h1:eeJGcYszuvOpmuJxeq57LaOO8mJurfjpOHJJMfQSD0s= +github.com/metaleap/go-xsd v0.0.0-20180330193350-61f7638f502f/go.mod h1:WK3zEKtwVd/v+NM3lh1ZE6MdDfHsdOFFOD5Ezi4Hutg= +github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.76 h1:9nxHH2XDai61cT/EFhyIw/wW4vJfpPNvl7lSFpRt+Ng= -github.com/minio/minio-go/v7 v7.0.76/go.mod h1:AVM3IUN6WwKzmwBxVdjzhH8xq+f57JSbbvzqvUzR6eg= +github.com/minio/minio-go/v7 v7.0.80 h1:2mdUHXEykRdY/BigLt3Iuu1otL0JTogT0Nmltg0wujk= +github.com/minio/minio-go/v7 v7.0.80/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -195,15 +267,22 @@ github.com/mssola/useragent v1.0.0 h1:WRlDpXyxHDNfvZaPEut5Biveq86Ze4o4EMffyMxmH5 github.com/mssola/useragent v1.0.0/go.mod h1:hz9Cqz4RXusgg1EdI4Al0INR62kP7aPSRNHnpU+b85Y= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.21.1 h1:OB/euWYIExnPBohllTicTHmGTrMaqJ67nIu80j0/uEM= @@ -223,6 +302,7 @@ github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Q github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus-community/pro-bing v0.4.1 h1:aMaJwyifHZO0y+h8+icUz0xbToHbia0wdmzdVZ+Kl3w= @@ -233,6 +313,7 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= @@ -252,16 +333,26 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk= github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= +github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= github.com/shirou/gopsutil/v4 v4.24.7 h1:V9UGTK4gQ8HvcnPKf6Zt3XHyQq/peaekfxpJ2HSocJk= github.com/shirou/gopsutil/v4 v4.24.7/go.mod h1:0uW/073rP7FYLOkvxolUQM5rMOLTNmRXnFKafpb71rw= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/slayercat/GoSNMPServer v0.5.2 h1:IK2d3kz6JoiYHbAZT5H7hrQQRzAD7rxF0iJZxWrV7Ns= +github.com/slayercat/GoSNMPServer v0.5.2/go.mod h1:6taMSIwudR+7pKRO6dz2U+xoNccZds8eiMVlEN66fXY= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= @@ -273,9 +364,11 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -292,26 +385,51 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tebeka/strftime v0.1.5 h1:1NQKN1NiQgkqd/2moD6ySP/5CoZQsKa1d3ZhJ44Jpmg= github.com/tebeka/strftime v0.1.5/go.mod h1:29/OidkoWHdEKZqzyDLUyC+LmgDgdHo4WAFCDT7D/Ig= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg= +github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY= github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGuQ= github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluUhG7c+CEE= github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A= github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= +github.com/xuri/xgen v0.0.0-20240722131518-d0691b701898 h1:qqSByV3qojIVp1XbrFgD3nO38w1m6aePzmknorZQmRc= +github.com/xuri/xgen v0.0.0-20240722131518-d0691b701898/go.mod h1:tBkmlRf8JH62H5fAW+BPFj0LNZWRmKglWTLFfpXhhbg= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= +go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= +go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E= +go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k= golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -326,12 +444,17 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk= golang.org/x/image v0.19.0 h1:D9FX4QWkLfkeqaC62SonffIIuYdOk/UE2XKUBgRIBIQ= golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -343,9 +466,11 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -357,9 +482,14 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= @@ -370,6 +500,7 @@ golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -379,6 +510,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -386,12 +519,17 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -404,6 +542,7 @@ golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -416,21 +555,34 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools/cmd/guru v0.1.1-deprecated h1:WiL3pQGXG71u4N45C0eRkE2IcEMAiQdDZ2H5lGspNjM= +golang.org/x/tools/cmd/guru v0.1.1-deprecated/go.mod h1:yFb7vixnH8+ByFZ63niwlvUUxyTE/6ULZ6AiEHZwlTk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -455,7 +607,9 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= @@ -484,6 +638,7 @@ modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= xorm.io/builder v0.3.13 h1:a3jmiVVL19psGeXx8GIurTp7p0IIgqeDmwhcR6BAOAo= xorm.io/builder v0.3.13/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= xorm.io/xorm v1.3.9 h1:TUovzS0ko+IQ1XnNLfs5dqK1cJl1H5uHpWbWqAQ04nU= diff --git a/lib/core/ctx/ctx.go b/lib/core/ctx/ctx.go index 2d0c914..723dd80 100644 --- a/lib/core/ctx/ctx.go +++ b/lib/core/ctx/ctx.go @@ -10,10 +10,9 @@ import ( "path/filepath" "strings" - "nms_cxy/src/framework/constants/token" - tokenUtils "nms_cxy/src/framework/utils/token" - "nms_cxy/src/framework/vo" - + "be.ems/src/framework/constants/token" + tokenUtils "be.ems/src/framework/utils/token" + "be.ems/src/framework/vo" "github.com/gorilla/mux" "golang.org/x/text/language" ) diff --git a/lib/core/vo/login_user.go b/lib/core/vo/login_user.go index 4f4ae73..0b4899f 100644 --- a/lib/core/vo/login_user.go +++ b/lib/core/vo/login_user.go @@ -1,7 +1,7 @@ package vo import ( - "nms_cxy/lib/dborm" + "be.ems/lib/dborm" ) // LoginUser 登录用户身份权限信息对象 diff --git a/lib/dborm/dbgorm.go b/lib/dborm/dbgorm.go index 95f794b..30ff7c6 100644 --- a/lib/dborm/dbgorm.go +++ b/lib/dborm/dbgorm.go @@ -1,6 +1,7 @@ package dborm import ( + "database/sql" "fmt" "log" "os" @@ -85,11 +86,16 @@ func Close() { } } -// 获取默认数据源 +// default gorm DB func DefaultDB() *gorm.DB { return dbgEngine } +// get sql DB +func GCoreDB() (*sql.DB, error) { + return dbgEngine.DB() +} + // RawSQL 原生查询语句 func RawSQL(sql string, parameters []any) ([]map[string]any, error) { // 数据源 diff --git a/lib/dborm/dborm.go b/lib/dborm/dborm.go index aba81eb..1f782c0 100644 --- a/lib/dborm/dborm.go +++ b/lib/dborm/dborm.go @@ -10,12 +10,13 @@ import ( "strings" - "nms_cxy/lib/log" - "nms_cxy/lib/oauth" - "nms_cxy/src/modules/system/model" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/src/modules/system/model" _ "github.com/go-sql-driver/mysql" "xorm.io/xorm" + "xorm.io/xorm/core" ) const ( @@ -124,6 +125,14 @@ func XormConnectDatabase(dbType, dbUser, dbPassword, dbHost, dbPort, dbName stri return xEngine, nil } +func XCoreDB() *core.DB { + return xEngine.DB() +} + +func XEngDB() *xorm.Engine { + return xEngine +} + func ConstructInsertSQL(tableName string, insertData interface{}) (string, []string) { log.Debug("ConstructInsertSQL processing... ") log.Debug("Request insertData:", insertData) @@ -419,68 +428,6 @@ func XormParseResult(body []byte) ([]NeInfo, error) { return neInfo, nil } -type ParamConfig struct { - // Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType"` - NeId string `json:"neId"` - TopTag string `json:"topTag"` - TopDisplay string `json:"topDisplay"` - ParamJson string `json:"paramJson"` -} - -func XormInsertParamConfig(mapJson *map[string]interface{}) (int64, error) { - var affected, a int64 - var err error - paramConfig := new(ParamConfig) - for n, d := range *mapJson { - if d == nil { - break - } - log.Debugf("n: %s", n) - - for t, p := range d.(map[string]interface{}) { - if p == nil { - break - } - log.Debug("t:", t) - log.Debug("p:", p) - for k, v := range p.(map[string]interface{}) { - log.Debug("k, v: ", k, v) - if k == "display" { - paramConfig.TopDisplay = fmt.Sprintf("%v", v) - - } else { - pc, _ := json.Marshal(v) - paramConfig.ParamJson = fmt.Sprintf("{\"%v\":%v}", k, string(pc)) - } - } - - paramConfig.NeType = strings.ToUpper(n) - paramConfig.NeId = "" - paramConfig.TopTag = t - // paramConfig.TopDisplay = p["display"] - // paramConfig.ParamJson = p.(string) - - log.Debug("paramConfig:", paramConfig) - - xSession := xEngine.NewSession() - defer xSession.Close() - _, err = xSession.Table("param_config").Where("ne_type = ? and top_tag = ?", paramConfig.NeType, paramConfig.TopTag).Delete() - if err != nil { - log.Error("Failed to insert param_config:", err) - } - a, err = xSession.Insert(paramConfig) - if err != nil { - log.Error("Failed to insert param_config:", err) - } - affected += a - xSession.Commit() - } - } - - return affected, err -} - func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) { log.Debug("ConstructUpdateSQL processing... ") log.Debug("Request updateData:", updateData) diff --git a/lib/eval/evaluate.go b/lib/eval/evaluate.go index d0ff37e..664d717 100644 --- a/lib/eval/evaluate.go +++ b/lib/eval/evaluate.go @@ -5,6 +5,7 @@ import ( "go/ast" "go/parser" "go/token" + "math" "regexp" "strconv" "strings" @@ -29,6 +30,9 @@ func CalcExpr(expr string, paramValues map[string]any) (float64, error) { // expression to evaluate result, err := evalExpr(expr) + if math.IsNaN(result) { + return 0.0, err + } return result, err } @@ -87,6 +91,10 @@ func evalNode(node ast.Node) (float64, error) { case token.MUL: result = left * right case token.QUO: + if right == 0 { + return math.NaN(), fmt.Errorf("divisor cannot be zero") + } + result = left / right } case *ast.BasicLit: diff --git a/lib/file/file_linux.go b/lib/file/file_linux.go index 9e459ef..4d93461 100644 --- a/lib/file/file_linux.go +++ b/lib/file/file_linux.go @@ -6,8 +6,12 @@ package file import ( "fmt" "os" + "os/user" "path/filepath" + "strings" "syscall" + + "github.com/dustin/go-humanize" ) type FileInfo struct { @@ -16,7 +20,7 @@ type FileInfo struct { LinkCount int64 `json:"linkCount"` // 硬链接数目 Owner string `json:"owner"` // 所属用户 Group string `json:"group"` // 所属组 - Size int64 `json:"size"` // 文件的大小 + Size string `json:"size"` // 文件的大小 ModifiedTime int64 `json:"modifiedTime"` // 最后修改时间,单位为秒 FileName string `json:"fileName"` // 文件的名称 } @@ -42,13 +46,26 @@ func GetFileInfo(dir, suffix string) ([]FileInfo, error) { // check if match suffix if (suffix != "" && filepath.Ext(path) == suffix) || suffix == "" { + stat, ok := info.Sys().(*syscall.Stat_t) + if !ok { + return fmt.Errorf("not a syscall.Stat_t") + } + userInfo, err := user.LookupId(fmt.Sprint(stat.Uid)) + if err != nil { + return err + } + groupInfo, err := user.LookupGroupId(fmt.Sprint(stat.Gid)) + if err != nil { + return err + } + humanReadableSize := humanize.Bytes(uint64(info.Size())) fileInfo := FileInfo{ FileType: fileType, FileMode: info.Mode().String(), LinkCount: int64(info.Sys().(*syscall.Stat_t).Nlink), - Owner: fmt.Sprintf("%d", info.Sys().(*syscall.Stat_t).Uid), - Group: fmt.Sprintf("%d", info.Sys().(*syscall.Stat_t).Gid), - Size: info.Size(), + Owner: userInfo.Username, + Group: groupInfo.Name, + Size: strings.ToUpper(humanReadableSize), ModifiedTime: info.ModTime().Unix(), FileName: info.Name(), } diff --git a/lib/file/file_windows.go b/lib/file/file_windows.go index 5371d44..7c97f11 100644 --- a/lib/file/file_windows.go +++ b/lib/file/file_windows.go @@ -9,14 +9,15 @@ import ( ) type FileInfo struct { - FileType string `json:"fileType"` // 文件类型 - FileMode string `json:"fileMode"` // 文件的权限 - LinkCount int64 `json:"linkCount"` // 硬链接数目 - Owner string `json:"owner"` // 所属用户 - Group string `json:"group"` // 所属组 - Size int64 `json:"size"` // 文件的大小 - ModifiedTime int64 `json:"modifiedTime"` // 最后修改时间,单位为秒 - FileName string `json:"fileName"` // 文件的名称 + FileType string `json:"fileType"` // file type: file/directory + FileMode string `json:"fileMode"` // file mode + LinkCount int64 `json:"linkCount"` // link count + Owner string `json:"owner"` // owner + Group string `json:"group"` // group + Size int64 `json:"size"` // size: xx byte + ModifiedTime int64 `json:"modifiedTime"` // last modified time:seconds + FilePath string `json:"filePath"` // file path + FileName string `json:"fileName"` // file name } func GetFileInfo(dir, suffix string) ([]FileInfo, error) { @@ -44,10 +45,11 @@ func GetFileInfo(dir, suffix string) ([]FileInfo, error) { FileType: fileType, FileMode: info.Mode().String(), LinkCount: 0, - Owner: "N/A", - Group: "N/A", + Owner: "-", + Group: "-", Size: info.Size(), ModifiedTime: info.ModTime().Unix(), + FilePath: dir, FileName: info.Name(), } files = append(files, fileInfo) diff --git a/lib/midware/midhandle.go b/lib/midware/midhandle.go index b598379..ca7e366 100644 --- a/lib/midware/midhandle.go +++ b/lib/midware/midhandle.go @@ -4,10 +4,9 @@ import ( "net/http" "strings" - "nms_cxy/lib/log" - "nms_cxy/lib/services" - tokenConst "nms_cxy/src/framework/constants/token" - + "be.ems/lib/log" + "be.ems/lib/services" + tokenConst "be.ems/src/framework/constants/token" "github.com/gorilla/mux" ) diff --git a/lib/midware/mml_log.go b/lib/midware/mml_log.go index 2bb8c28..c63ac73 100644 --- a/lib/midware/mml_log.go +++ b/lib/midware/mml_log.go @@ -9,10 +9,10 @@ import ( "strings" "time" - "nms_cxy/lib/core/ctx" - "nms_cxy/lib/log" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/utils/date" + "be.ems/lib/core/ctx" + "be.ems/lib/log" + "be.ems/src/framework/datasource" + "be.ems/src/framework/utils/date" ) // LogMML mml操作日志搜集 diff --git a/lib/midware/operate_log.go b/lib/midware/operate_log.go index f780b24..a264728 100644 --- a/lib/midware/operate_log.go +++ b/lib/midware/operate_log.go @@ -11,13 +11,13 @@ import ( "strings" "time" - "nms_cxy/lib/core/ctx" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/middleware/collectlogs" - "nms_cxy/src/framework/utils/ip2region" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/lib/core/ctx" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/framework/utils/ip2region" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" ) // 敏感属性字段进行掩码 diff --git a/lib/mmlp/parse.go b/lib/mmlp/parse.go index 71c1c1a..e24230e 100644 --- a/lib/mmlp/parse.go +++ b/lib/mmlp/parse.go @@ -11,12 +11,11 @@ import ( "strconv" "strings" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/run" - tokenConst "nms_cxy/src/framework/constants/token" - + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/run" + tokenConst "be.ems/src/framework/constants/token" "github.com/go-resty/resty/v2" ) @@ -47,6 +46,7 @@ type MmlVar struct { Authorization string `josn:"authorization"` HttpUri string `json:"httpUri"` UserAgent string `json:"userAgent"` + TagNE string `json:"tagNE"` } // func init() { diff --git a/lib/oauth/oauth.go b/lib/oauth/oauth.go index f59454e..b261f35 100644 --- a/lib/oauth/oauth.go +++ b/lib/oauth/oauth.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "nms_cxy/lib/log" + "be.ems/lib/log" "golang.org/x/crypto/bcrypt" ) diff --git a/lib/routes/routes.go b/lib/routes/routes.go index 61c76a0..a3143d0 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -5,24 +5,24 @@ import ( // "log" - "nms_cxy/features/aaaa" - "nms_cxy/features/cdr" - "nms_cxy/features/cm" - "nms_cxy/features/dbrest" - "nms_cxy/features/event" - "nms_cxy/features/file" - "nms_cxy/features/fm" - "nms_cxy/features/lm" - "nms_cxy/features/mml" - "nms_cxy/features/pm" - "nms_cxy/features/security" - "nms_cxy/features/sm" - "nms_cxy/features/state" - "nms_cxy/features/trace" - "nms_cxy/features/ue" - "nms_cxy/lib/midware" - "nms_cxy/lib/services" - "nms_cxy/src/framework/middleware/collectlogs" + "be.ems/features/aaaa" + "be.ems/features/cdr" + "be.ems/features/cm" + "be.ems/features/dbrest" + "be.ems/features/event" + "be.ems/features/file" + "be.ems/features/fm" + "be.ems/features/lm" + "be.ems/features/mml" + "be.ems/features/pm" + "be.ems/features/security" + "be.ems/features/sm" + "be.ems/features/state" + "be.ems/features/trace" + "be.ems/features/ue" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/src/framework/middleware/collectlogs" "github.com/gorilla/mux" ) @@ -207,13 +207,6 @@ func init() { Register("PUT", cm.CustomUriSoftwareNE, cm.ActiveSoftwareToNF, nil) Register("PATCH", cm.CustomUriSoftwareNE, cm.RollBackSoftwareToNF, nil) - // License management - Register("POST", cm.UriLicense, cm.UploadLicenseFileData, midware.LogOperate(collectlogs.OptionNew("License", collectlogs.BUSINESS_TYPE_INSERT))) - Register("POST", cm.UriLicenseExt, cm.UploadLicenseFileData, midware.LogOperate(collectlogs.OptionNew("License", collectlogs.BUSINESS_TYPE_INSERT))) - - Register("POST", cm.CustomUriLicense, cm.UploadLicenseFileData, nil) - Register("POST", cm.CustomUriLicenseExt, cm.UploadLicenseFileData, nil) - // Trace management 跟踪任务 Register("POST", trace.UriTraceTask, trace.PostTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_INSERT))) Register("PUT", trace.UriTraceTask, trace.PutTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_UPDATE))) diff --git a/lib/run/exec_linux.go b/lib/run/exec_linux.go index ca0a1e0..e36f89e 100644 --- a/lib/run/exec_linux.go +++ b/lib/run/exec_linux.go @@ -7,7 +7,7 @@ import ( "bytes" "os/exec" - "nms_cxy/lib/log" + "be.ems/lib/log" ) func ExecCmd(command, path string) ([]byte, error) { diff --git a/lib/run/exec_wasm.go b/lib/run/exec_wasm.go index be8ca79..9633073 100644 --- a/lib/run/exec_wasm.go +++ b/lib/run/exec_wasm.go @@ -6,7 +6,7 @@ package run import ( "os/exec" - "nms_cxy/lib/log" + "be.ems/lib/log" ) func ExecCmd(command, path string) ([]byte, error) { diff --git a/lib/run/exec_windows.go b/lib/run/exec_windows.go index 1ddd3c7..1af2b97 100644 --- a/lib/run/exec_windows.go +++ b/lib/run/exec_windows.go @@ -6,7 +6,7 @@ package run import ( "os/exec" - "nms_cxy/lib/log" + "be.ems/lib/log" ) func ExecCmd(command, path string) ([]byte, error) { diff --git a/lib/services/file.go b/lib/services/file.go index 7c6f98a..439f814 100644 --- a/lib/services/file.go +++ b/lib/services/file.go @@ -11,7 +11,7 @@ import ( "strconv" "strings" - "nms_cxy/lib/log" + "be.ems/lib/log" ) const ( diff --git a/lib/services/response.go b/lib/services/response.go index 93f2442..0c5ce1a 100644 --- a/lib/services/response.go +++ b/lib/services/response.go @@ -6,7 +6,7 @@ const ( ) func ErrResp(msg string) map[string]any { - return map[string]any{"code": CODE_FAIL, "message": msg} + return map[string]any{"code": CODE_FAIL, "msg": msg} } func DataResp(data any) map[string]any { @@ -14,7 +14,7 @@ func DataResp(data any) map[string]any { } func SuccMessageResp() map[string]any { - return map[string]any{"code": CODE_SUCC, "message": "success"} + return map[string]any{"code": CODE_SUCC, "msg": "success"} } func TotalResp(total int64) map[string]any { diff --git a/lib/services/services.go b/lib/services/services.go index 6b732dc..8b55bf4 100644 --- a/lib/services/services.go +++ b/lib/services/services.go @@ -16,12 +16,11 @@ import ( "strconv" "strings" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/oauth" - "nms_cxy/omc/config" - + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/restagent/config" "github.com/gorilla/mux" ) diff --git a/lib/session/session.go b/lib/session/session.go index 86e438b..a953cfc 100644 --- a/lib/session/session.go +++ b/lib/session/session.go @@ -11,9 +11,9 @@ import ( "sync" "time" - "nms_cxy/lib/log" - "nms_cxy/lib/oauth" - "nms_cxy/omc/config" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/restagent/config" ) // SessionMgr session manager diff --git a/omc/config/config.go b/restagent/config/config.go similarity index 64% rename from omc/config/config.go rename to restagent/config/config.go index f424356..8f4951c 100644 --- a/omc/config/config.go +++ b/restagent/config/config.go @@ -1,14 +1,18 @@ package config import ( + "bufio" "fmt" "os" + "reflect" "strings" - "nms_cxy/lib/global" - "nms_cxy/lib/log" + "be.ems/lib/global" + "be.ems/lib/log" "gopkg.in/yaml.v3" + //"github.com/go-yaml-comment/yaml" + //"github.com/goccy/go-yaml" ) // Yaml struct of config @@ -147,41 +151,44 @@ type DbConfig struct { } type AlarmConfig struct { - SplitEventAlarm bool `yaml:"splitEventAlarm"` - ForwardAlarm bool `yaml:"forwardAlarm"` - SMProxy string `yaml:"smProxy"` - Email struct { - Smtp string `yaml:"smtp"` - Port uint16 `yaml:"port"` - User string `yaml:"user"` - Password string `yaml:"password"` - TlsSkipVerify bool `yaml:"tlsSkipVerify"` - } `yaml:"email"` + SplitEventAlarm bool `yaml:"splitEventAlarm"` + //ForwardAlarm bool `yaml:"forwardAlarm"` + + EmailForward struct { + Enable bool `yaml:"enable" json:"enable"` + EmailList string `yaml:"emailList" json:"emailList"` + SMTP string `yaml:"smtp" json:"smtp"` + Port uint16 `yaml:"port" json:"port"` + User string `yaml:"user" json:"user"` + Password string `yaml:"password" json:"password"` + TLSSkipVerify bool `yaml:"tlsSkipVerify" json:"tlsSkipVerify"` + } `yaml:"alarmEmailForward"` + SMSCForward struct { + Enable bool `yaml:"enable" json:"enable"` + MobileList string `yaml:"mobileList" json:"mobileList"` + SMSCAddr string `yaml:"smscAddr" json:"smscAddr"` + SystemID string `yaml:"systemID" json:"systemID"` + Password string `yaml:"password" json:"password"` + SystemType string `yaml:"systemType" json:"systemType"` + DataCoding byte `yaml:"dataCoding" json:"dataCoding"` + ServiceNumber string `yaml:"serviceNumber" json:"serviceNumber"` + } `yaml:"alarmSMSForward"` SMS struct { ApiURL string `yaml:"apiURL"` AccessKeyID string `yaml:"AccessKeyID"` AccessKeySecret string `yaml:"accessKeySecret"` SignName string `yaml:"signName"` TemplateCode string `yaml:"templateCode"` - } `yaml:"sms"` - SMSC struct { - Addr string `yaml:"addr"` - SystemID string `yaml:"systemID"` - Password string `yaml:"password"` - SystemType string `yaml:"systemType"` - } `yaml:"smsc"` + } `yaml:"smsForward"` + SMProxy string `yaml:"smProxy"` } type MMLParam struct { - Port int `yaml:"port"` - Port2 int `yaml:"port2"` Sleep int64 `yaml:"sleep"` DeadLine int64 `yaml:"deadLine"` SizeRow int16 `yaml:"sizeRow"` SizeCol int16 `yaml:"sizeCol"` BufferSize int `yaml:"bufferSize"` - User string `yaml:"user"` - Password string `ymal:"password"` MmlHome string `yaml:"mmlHome"` } @@ -218,6 +225,16 @@ type TestDataMap struct { var yamlConfig YamlConfig = NewYamlConfig() +type YamlConfigFile struct { + FilePath string `json:"filePath"` + ConfigLines YamlConfig `json:"configLines"` + OrignalLines []string `json:"orignalLines"` +} + +var YamlConfigInfo YamlConfigFile = YamlConfigFile{ + ConfigLines: NewYamlConfig(), +} + // set default value for yaml config func NewYamlConfig() YamlConfig { return YamlConfig{ @@ -237,6 +254,8 @@ func NewYamlConfig() YamlConfig { } func ReadConfig(configFile string) { + YamlConfigInfo.FilePath = configFile + yamlFile, err := os.ReadFile(configFile) if err != nil { fmt.Println("Read yaml config file error:", err) @@ -244,25 +263,97 @@ func ReadConfig(configFile string) { } // fmt.Println("yamlfile:", string(yamlFile)) - err = yaml.Unmarshal(yamlFile, &yamlConfig) + err = yaml.Unmarshal(yamlFile, &YamlConfigInfo.ConfigLines) if err != nil { fmt.Println("Unmarshal error:", err) os.Exit(3) } + yamlConfig = YamlConfigInfo.ConfigLines + + ReadOriginalConfig(configFile) } -func WriteYamlConfig(newConfigData YamlConfig, configFile string) { +func ReadOriginalConfig(configFile string) { + // 读取原始YAML文件 + inputFile, err := os.Open(configFile) + if err != nil { + fmt.Println("failed to open:", err) + os.Exit(3) + } + defer inputFile.Close() + + scanner := bufio.NewScanner(inputFile) + for scanner.Scan() { + YamlConfigInfo.OrignalLines = append(YamlConfigInfo.OrignalLines, scanner.Text()) + } + + if err := scanner.Err(); err != nil { + fmt.Println("failed to scanner:", err) + os.Exit(3) + } +} + +func WriteOrignalConfig(configFile string, paramName string, paramData map[string]any) error { + lines := YamlConfigInfo.OrignalLines + for i, line := range lines { + if strings.Contains(line, paramName) { + for k, v := range paramData { + // find the first line nearby the paramName + for j := i + 1; j < len(lines); j++ { + if strings.Contains(lines[j], k+":") { + index := strings.Index(lines[j], k) + // Determine the type of v + switch v := v.(type) { + case string: + lines[j] = lines[j][:index] + fmt.Sprintf("%s: \"%s\"", k, v) + // case int: + // lines[j] = lines[j][:index] + fmt.Sprintf("%s: %d", k, v) + // case float64: + // lines[j] = lines[j][:index] + fmt.Sprintf("%s: %f", k, v) + case bool: + lines[j] = lines[j][:index] + fmt.Sprintf("%s: %t", k, v) + default: + lines[j] = lines[j][:index] + fmt.Sprintf("%s: %v", k, v) + } + break + } + } + } + break + } + } + + // write back to yaml file + outputFile, err := os.Create(configFile) + if err != nil { + fmt.Println(err) + return err + } + defer outputFile.Close() + + writer := bufio.NewWriter(outputFile) + for _, line := range YamlConfigInfo.OrignalLines { + writer.WriteString(line + "\n") + } + writer.Flush() + return nil +} + +func WriteYamlConfig(newConfigData YamlConfig, configFile string) error { // 将配置转换回YAML数据 newYamlData, err := yaml.Marshal(&newConfigData) if err != nil { log.Errorf("Failed to marshal YAML: %v", err) + return err } // 将新的YAML数据写入文件 err = os.WriteFile(configFile, newYamlData, 0644) if err != nil { log.Errorf("Failed to write YAML file: %v", err) + return err } + return nil } var mapYaml map[string]interface{} @@ -284,8 +375,30 @@ func ReadParamConfig(fileName string) *map[string]interface{} { return &mapYaml } +func UpdateStructFromMap(s any, updates map[string]any) { + v := reflect.ValueOf(s).Elem() + t := v.Type() + + for key, value := range updates { + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + if field.Tag.Get("json") == key { + structField := v.FieldByName(field.Name) + if structField.IsValid() && structField.CanSet() { + // Convert value to the appropriate type if necessary + convertedValue := reflect.ValueOf(value).Convert(structField.Type()) + if structField.Type() == convertedValue.Type() { + structField.Set(convertedValue) + } + } + break + } + } + } +} + func GetYamlConfig() *YamlConfig { - return &yamlConfig + return &YamlConfigInfo.ConfigLines } func GetAuthFromConfig() interface{} { @@ -370,7 +483,7 @@ func ReadTestConfigYaml(pfile string) (ret error) { } func GetDefaultUserAgent() string { - return "OMC/" + global.Version + return "OMC-restagent/" + global.Version } func GetOMCHostUrl() string { @@ -389,3 +502,34 @@ func GetOMCHostUrl() string { return fmt.Sprintf("%s://%s:%d", scheme, omcip, port) } + +// const defaultConfigFile = "./etc/restconf.yaml" + +// func init() { +// cfile := flag.String("c", defaultConfigFile, "config file") +// pv := flag.Bool("version", false, "print version") +// ph := flag.Bool("help", false, "print help") + +// //global.BuildTime = "Wed May 31 18:24:04 CST 2023" +// //global.GoVer = "go version go1.15.7 linux/arm64" +// flag.Parse() +// if *pv { +// fmt.Printf("OMC restagent version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) +// os.Exit(0) +// } +// if *ph { +// flag.Usage() +// os.Exit(0) +// } + +// // 使用viper读取配置 +// conf.InitConfig(*cfile) + +// ReadConfig(*cfile) +// if GetYamlConfig().OMC.UriPrefix != "" { +// UriPrefix = GetYamlConfig().OMC.UriPrefix +// } +// if GetYamlConfig().TestConfig.Enabled { +// ReadTestConfigYaml(GetYamlConfig().TestConfig.File) +// } +// } diff --git a/omc/config/map.go b/restagent/config/map.go similarity index 98% rename from omc/config/map.go rename to restagent/config/map.go index 1d54b5a..4c01279 100644 --- a/omc/config/map.go +++ b/restagent/config/map.go @@ -6,7 +6,7 @@ import ( "gopkg.in/yaml.v3" - "nms_cxy/lib/global" + "be.ems/lib/global" ) type Uri2Object struct { diff --git a/omc/etc/certs/ca.crt b/restagent/etc/certs/ca.crt similarity index 100% rename from omc/etc/certs/ca.crt rename to restagent/etc/certs/ca.crt diff --git a/omc/etc/certs/omc-ca.crt b/restagent/etc/certs/omc-ca.crt similarity index 100% rename from omc/etc/certs/omc-ca.crt rename to restagent/etc/certs/omc-ca.crt diff --git a/omc/etc/certs/omc-server.crt b/restagent/etc/certs/omc-server.crt similarity index 100% rename from omc/etc/certs/omc-server.crt rename to restagent/etc/certs/omc-server.crt diff --git a/omc/etc/certs/omc-server.key b/restagent/etc/certs/omc-server.key similarity index 100% rename from omc/etc/certs/omc-server.key rename to restagent/etc/certs/omc-server.key diff --git a/omc/etc/certs/omc-web.crt b/restagent/etc/certs/omc-web.crt similarity index 100% rename from omc/etc/certs/omc-web.crt rename to restagent/etc/certs/omc-web.crt diff --git a/omc/etc/certs/omc-web.key b/restagent/etc/certs/omc-web.key similarity index 100% rename from omc/etc/certs/omc-web.key rename to restagent/etc/certs/omc-web.key diff --git a/restagent/etc/restconf-t.yaml b/restagent/etc/restconf-t.yaml new file mode 100644 index 0000000..2ec34bd --- /dev/null +++ b/restagent/etc/restconf-t.yaml @@ -0,0 +1,195 @@ +# file: log file name +# level: /trace/debug/info/warn/error/fatal, default: debug +# duration: rotation time with xx hours, example: 1/12/24 hours +# count: rotation count of log, default is 30 rotation +logger: + file: d:/omc.git/be.ems/restagent/log/restagent.log + level: trace + duration: 24 + count: 2 + +# rest agent listen ipv4/v6 and port, support multiple routines +# ip: 0.0.0.0 or ::0, support IPv4/v6 +# clientAuthType: 0:NoClientCert (default), 1:RequestClientCert, 2:RequireAnyClientCert, +# 3:VerifyClientCertIfGiven, 4:RequireAndVerifyClientCerts +rest: + - ipv4: 0.0.0.0 + ipv6: + port: 33030 + - ipv4: 0.0.0.0 + ipv6: + port: 33443 + scheme: https + clientAuthType: 0 + caFile: ./etc/certs/omc-ca.crt + certFile: ./etc/certs/omc-server.crt + keyFile: ./etc/certs/omc-server.key + +webServer: + enabled: false + rootDir: d:/omc.git/fe.ems.vue3/dist + listen: + - addr: :80 + schema: http + - addr: :443 + scheme: https + clientAuthType: 0 + caFile: ./etc/certs/omc-ca.crt + certFile: ./etc/certs/omc-server.crt + keyFile: ./etc/certs/omc-server.key + +database: + type: mysql + user: root + password: 1000omc@kp! + host: 127.0.0.1 + port: 33066 + name: omc_db + connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True + backup: d:/omc.git/be.ems/restagent/database + +# Redis 缓存数据,数据源声明全小写 +redis: + dataSource: + # OMC系统使用库 + default: + port: 6379 # Redis port + host: "127.0.0.1" # Redis host + password: "helloearth" + db: 10 # Redis db_num + # UDM网元用户库 + udmuser: + port: 6379 # Redis port + host: "127.0.0.1" + password: "helloearth" + db: 0 # Redis db_num + # 多个数据源时可以用这个指定默认的数据源 + defaultDataSourceName: "default" + +# sleep: time delay for after write buffer (millisecond) +# deadLine: timeout for io read and write (second) +mml: + port: 4100 + port2: 5002 + sleep: 200 + deadLine: 10 + sizeRow: 600 + sizeCol: 128 + bufferSize: 65535 + user: admin + password: admin + mmlHome: ./mmlhome + +# NE config +ne: + user: root + etcdir: /usr/local/etc + bindir: /usr/local/bin + omcdir: /usr/local/omc + scpdir: /tmp + licensedir: /usr/local/etc/{neType}/license + # backup etc list of IMS,no space + etcListIMS: '{*.yaml,mmtel,vars.cfg}' + etcListDefault: '{*.yaml,*.conf,*.cfg}' + # true/false to overwrite config file when dpkg ne software + dpkgOverwrite: false + # dpkg timeout (second) + dpkgTimeout: 180 + +# chk2ne: true/false, if put OmcNeConfig parameters to NE +omc: + uriPrefix: "/omc/rest" + neType: OMC + neId: 001 + rmUID: 4400HX101 + neName: OMC + province: GD + vendor: "" + dn: 4600 + chk2ne: false + sn: "-" + checksign: false + rootDir: ./ + binDir: ./bin + backup: ./backup + upload: ./upload + frontUpload: d:/omc.git/fe.ems/upload + frontTraceDir: d:/omc.git/fe.ems/trace + software: ./software + license: ./license + gtpUri: gtp:192.168.2.219:2152 + checkContentType: false + testMode: false + rbacMode: true + runDir: + cmdTimeout: 120 + +# Alarm module setting +# Forward interface: +# email/sms +# smProxy: sms(Short Message Service)/smsc(SMS Centre) +alarm: + forwardAlarm: true + email: + smtp: mail.agrandtech.com + port: 25 + user: smtpext@agrandtech.com + password: "1000smtp@omc!" + # TLS skip verify: true/false + tlsSkipVerify: true + smProxy: smsc + sms: + apiURL: http://smsc.xxx.com/ + accessKeyID: xxxx + accessKeySecret: xxxx + signName: xxx SMSC + templateCode: 1000 + smsc: + addr: "192.168.13.114:2775" + systemID: "omc" + password: "omc123" + systemType: "UTRAN" + +#User authorized information +# crypt: mysql/md5/bcrypt +# token: true/false to check accessToken +# expires for session, unit: second +# Support single/multiple session of user +# +auth: + crypt: bcrypt + token: true + expires: 1800 + session: multiple + publicKey: ./etc/certs/omc_pub.key + privateKey: ./etc/certs/omc_pri.key + +# Parameter for limit number +# rmuid_maxnum: the max number of rmUID, default: 50 +# alarmid_maxnum: the max number of AlarmID, default: 50 +# pmid_maxnum: the max number of pmID, default: 50 +# subid_maxnum: the max number of subscription ID, default: 20 +# uri_maxlen: the max length of uri, default: 8192 +# rmuid_regexp: regexp pattern of rmUID +params: + rmuidmaxnum: 50 + alarmidmaxnum: 50 + pmidmaxnum: 50 + subidmaxnum: 20 + urimaxlen: 2100000 + rmuidregexp: "[0-9]{4}[A-Z]{2}[A-Z]{2}[0-9A-Z]{1}[0-9A-Z]{3}[0-9A-Z]{1,16}" + +testConfig: + enabled: true + file: ./etc/testconfig.yaml + +# 静态文件配置, 相对项目根路径或填绝对路径 +staticFile: + # 默认资源,dir目录需要预先创建 + default: + prefix: "/static" + dir: "./static" + # 文件上传资源目录映射,与项目目录同级 + upload: + prefix: "/upload" + dir: "./upload" diff --git a/omc/etc/omc.yaml b/restagent/etc/restconf.yaml similarity index 84% rename from omc/etc/omc.yaml rename to restagent/etc/restconf.yaml index f48a0db..abc3347 100644 --- a/omc/etc/omc.yaml +++ b/restagent/etc/restconf.yaml @@ -4,7 +4,7 @@ # count: rotation count of log, default is 30 rotation # pprof: false(default)/true to disable/enable pprof logger: - file: ./etc/omc/log/omc.log + file: d:/omc.git/be.ems/restagent/log/restagent.log level: trace duration: 24 count: 2 @@ -24,7 +24,7 @@ rest: webServer: enabled: false - rootDir: d:/local.git/fe.ems.vue3/dist + rootDir: d:/omc.git/fe.ems.vue3/dist listen: - addr: :80 schema: http @@ -43,40 +43,36 @@ database: port: 13306 name: "omc_db_nms_cxy" connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True - backup: d:/local.git/be.ems/restagent/database + backup: d:/omc.git/be.ems/restagent/database -# Redis 缓存数据,数据源声明全小写 +# Redis data cache redis: dataSource: - # OMC系统使用库 + # OMC system db default: - port: 6379 # Redis port - host: "192.168.8.58" # Redis host + port: 16379 # Redis port + host: "192.168.9.58" # Redis host password: "helloearth" db: 10 # Redis db_num - # UDM网元用户库 - udmuser: - port: 6379 # Redis port - host: "192.168.8.58" - password: "helloearth" - db: 0 # Redis db_num - # 多个数据源时可以用这个指定默认的数据源 + # used to specify the default data source for multiple data resourece defaultDataSourceName: "default" # sleep: time delay for after write buffer (millisecond) # deadLine: timeout for io read and write (second) mml: - port: 4100 - port2: 5002 sleep: 200 deadLine: 10 sizeRow: 600 sizeCol: 128 bufferSize: 65535 - user: admin - password: admin mmlHome: ./mmlhome +# Tracking configuration +trace: + enabled: true + host: "192.168.5.58" # Fill in the specific IP address + port: 33033 + # NE config ne: user: omcuser @@ -123,29 +119,36 @@ omc: # Alarm module setting # Forward interface: +# TLS Skip verify: true/false # email/sms # smProxy: sms(Short Message Service)/smsc(SMS Centre) +# dataCoding: 0:GSM7BIT, 1:ASCII, 2:BINARY8BIT1, 3:LATIN1, +# 4:BINARY8BIT2, 6:CYRILLIC, 7:HEBREW, 8:UCS2 alarm: - forwardAlarm: false - email: - smtp: mail.agrandtech.com + alarmEmailForward: + enable: true + emailList: + smtp: mail.smtp.com port: 25 - user: smtpext@agrandtech.com + user: smtpext@smtp.com password: "1000smtp@omc!" - # TLS skip verify: true/false tlsSkipVerify: true - smProxy: smsc + alarmSMSForward: + enable: true + mobileList: "1006,1008" + smscAddr: "192.168.14.212:2775" + systemID: "123456" + password: "123456" + systemType: "UTRAN" + dataCoding: 0 + serviceNumber: "OMC" sms: apiURL: http://smsc.xxx.com/ accessKeyID: xxxx accessKeySecret: xxxx signName: xxx SMSC templateCode: 1000 - smsc: - addr: "192.168.13.114:2775" - systemID: "omc" - password: "omc123" - systemType: "UTRAN" + smProxy: smsc #User authorized information # crypt: mysql/md5/bcrypt diff --git a/omc/etc/testconfig.yaml b/restagent/etc/testconfig.yaml similarity index 100% rename from omc/etc/testconfig.yaml rename to restagent/etc/testconfig.yaml diff --git a/omc/makefile b/restagent/makefile similarity index 54% rename from omc/makefile rename to restagent/makefile index 3df56e7..f6eb38f 100644 --- a/omc/makefile +++ b/restagent/makefile @@ -1,8 +1,15 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2408.1 -LIBDIR = nms_cxy/lib +VERSION = 2.2411.3 +PLATFORM = amd64 +ARMPLATFORM = aarch64 +BUILDDIR = ../../build +DEBBUILDDIR = ../../debbuild +RPMBUILDDIR = $(HOME)/goprojects/rpmbuild +INSTALLDIR = /usr/local/omc +RELEASEDIR = ../../release +LIBDIR = be.ems/lib BINNAME = omc .PHONY: build $(BINNAME) @@ -11,8 +18,8 @@ build $(BINNAME): -X '$(LIBDIR)/global.BuildTime=`date`' \ -X '$(LIBDIR)/global.GoVer=`go version`'" -run: $(BINNAME) - ./$(BINNAME) +run: $(BINNAME) + ./$(BINNAME) clean: rm ./$(BINNAME) diff --git a/omc/omc.go b/restagent/restagent.go similarity index 81% rename from omc/omc.go rename to restagent/restagent.go index 7a22773..9dd6abc 100644 --- a/omc/omc.go +++ b/restagent/restagent.go @@ -11,26 +11,67 @@ import ( _ "net/http/pprof" - "nms_cxy/features" - "nms_cxy/features/dbrest" - "nms_cxy/features/event" - "nms_cxy/features/fm" - "nms_cxy/features/lm" - "nms_cxy/features/mml" - "nms_cxy/features/pm" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/lib/routes" - "nms_cxy/omc/config" - "nms_cxy/src" - "nms_cxy/src/framework/middleware" - + "be.ems/features" + "be.ems/features/dbrest" + "be.ems/features/event" + "be.ems/features/fm" + "be.ems/features/lm" + "be.ems/features/mml" + "be.ems/features/pm" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/routes" + "be.ems/restagent/config" + "be.ems/src" + "be.ems/src/framework/middleware" "github.com/gin-gonic/gin" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" ) +// const defaultConfigFile = "./etc/restconf.yaml" + +// func init() { +// cfile := flag.String("c", defaultConfigFile, "config file") +// pv := flag.Bool("v", false, "print version") +// ph := flag.Bool("h", false, "print help") + +// flag.Parse() +// if *pv { +// fmt.Printf("OMC restagent version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) +// os.Exit(0) +// } +// if *ph { +// flag.Usage() +// os.Exit(0) +// } + +// config.ReadConfig(*cfile) +// config.UriPrefix = config.GetYamlConfig().OMC.UriPrefix +// //fmt.Println(config.UriPrefix) +// } + +// func listenIPv6(ipv6 string, port int) { +// // +// addr := &net.TCPAddr{ +// IP: net.ParseIP(ipv6), +// Port: port, +// } + +// listener, err := net.ListenTCP("tcp6", addr) +// if err != nil { +// fmt.Println("Failed to listen:", err) +// return +// } + +// server := &http.Server{} +// err = server.Serve(listener) +// if err != nil { +// fmt.Println("Failed to serve:", err) +// } +// } + func HttpListen(addr string, router http.Handler) { // 创建HTTP服务器 h2s := &http2.Server{ @@ -161,10 +202,10 @@ func main() { }() } - log.InitLogger(conf.Logger.File, conf.Logger.Duration, conf.Logger.Count, "omc:", config.GetLogLevel()) - fmt.Printf("OMC version: %s\n", global.Version) - log.Infof("========================= OMC startup =========================") - log.Infof("OMC version: %s %s %s", global.Version, global.BuildTime, global.GoVer) + log.InitLogger(conf.Logger.File, conf.Logger.Duration, conf.Logger.Count, "omc:restagent", config.GetLogLevel()) + fmt.Printf("OMC restagent version: %s\n", global.Version) + log.Infof("========================= OMC restagent startup =========================") + log.Infof("OMC restagent version: %s %s %s", global.Version, global.BuildTime, global.GoVer) err := dborm.InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, conf.Database.Host, conf.Database.Port, conf.Database.Name, conf.Database.ConnParam) diff --git a/restagent/static/helpDoc/zh_doc.pdf b/restagent/static/helpDoc/zh_doc.pdf new file mode 100644 index 0000000..e25d5ca Binary files /dev/null and b/restagent/static/helpDoc/zh_doc.pdf differ diff --git a/restagent/static/logo/en_brand.png b/restagent/static/logo/en_brand.png new file mode 100644 index 0000000..200025e Binary files /dev/null and b/restagent/static/logo/en_brand.png differ diff --git a/restagent/static/logo/en_icon.png b/restagent/static/logo/en_icon.png new file mode 100644 index 0000000..3ed445d Binary files /dev/null and b/restagent/static/logo/en_icon.png differ diff --git a/restagent/static/logo/zh_brand.png b/restagent/static/logo/zh_brand.png new file mode 100644 index 0000000..5810cf5 Binary files /dev/null and b/restagent/static/logo/zh_brand.png differ diff --git a/restagent/static/logo/zh_icon.png b/restagent/static/logo/zh_icon.png new file mode 100644 index 0000000..a5b6907 Binary files /dev/null and b/restagent/static/logo/zh_icon.png differ diff --git a/src/app.go b/src/app.go index 59a4090..1b69e6a 100644 --- a/src/app.go +++ b/src/app.go @@ -4,21 +4,22 @@ import ( "embed" "fmt" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/errorcatch" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/framework/middleware/security" - "nms_cxy/src/framework/utils/machine" - "nms_cxy/src/modules/chart" - "nms_cxy/src/modules/common" - "nms_cxy/src/modules/crontask" - "nms_cxy/src/modules/monitor" - networkdata "nms_cxy/src/modules/network_data" - networkelement "nms_cxy/src/modules/network_element" - nmscxy "nms_cxy/src/modules/nms_cxy" - "nms_cxy/src/modules/system" - "nms_cxy/src/modules/trace" - "nms_cxy/src/modules/ws" + "be.ems/src/framework/config" + "be.ems/src/framework/errorcatch" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/security" + "be.ems/src/framework/utils/machine" + "be.ems/src/modules/chart" + "be.ems/src/modules/common" + "be.ems/src/modules/crontask" + "be.ems/src/modules/monitor" + networkdata "be.ems/src/modules/network_data" + networkelement "be.ems/src/modules/network_element" + nmscxy "be.ems/src/modules/nms_cxy" + "be.ems/src/modules/system" + "be.ems/src/modules/tool" + "be.ems/src/modules/trace" + "be.ems/src/modules/ws" "github.com/chenjiandongx/ginprom" "github.com/gin-gonic/gin" @@ -144,6 +145,8 @@ func initModulesRoute(app *gin.Engine) { trace.Setup(app) // 图表模块 chart.Setup(app) + // 工具模块 + tool.Setup(app) // ws 模块 ws.Setup(app) // 北向模块 - 中国星网 diff --git a/src/assets/dependency/iperf/deb/iperf_2.0.13+dfsg1-1build1_amd64.deb b/src/assets/dependency/iperf/deb/iperf_2.0.13+dfsg1-1build1_amd64.deb new file mode 100644 index 0000000..323ae58 Binary files /dev/null and b/src/assets/dependency/iperf/deb/iperf_2.0.13+dfsg1-1build1_amd64.deb differ diff --git a/src/assets/dependency/iperf/rpm/iperf-2.1.6-2.el8.aarch64.rpm b/src/assets/dependency/iperf/rpm/iperf-2.1.6-2.el8.aarch64.rpm new file mode 100644 index 0000000..ec6b931 Binary files /dev/null and b/src/assets/dependency/iperf/rpm/iperf-2.1.6-2.el8.aarch64.rpm differ diff --git a/src/assets/dependency/iperf/rpm/iperf3-3.6-6.ky10.aarch64.rpm b/src/assets/dependency/iperf/rpm/iperf3-3.6-6.ky10.aarch64.rpm new file mode 100644 index 0000000..b5d5a4a Binary files /dev/null and b/src/assets/dependency/iperf/rpm/iperf3-3.6-6.ky10.aarch64.rpm differ diff --git a/src/assets/dependency/iperf3/deb/iperf3_3.1.3-1_amd64.deb b/src/assets/dependency/iperf3/deb/iperf3_3.1.3-1_amd64.deb new file mode 100644 index 0000000..0c687e3 Binary files /dev/null and b/src/assets/dependency/iperf3/deb/iperf3_3.1.3-1_amd64.deb differ diff --git a/src/assets/dependency/iperf3/deb/libiperf0_3.1.3-1_amd64.deb b/src/assets/dependency/iperf3/deb/libiperf0_3.1.3-1_amd64.deb new file mode 100644 index 0000000..c81f662 Binary files /dev/null and b/src/assets/dependency/iperf3/deb/libiperf0_3.1.3-1_amd64.deb differ diff --git a/src/assets/dependency/iperf3/deb/libsctp1_1.0.19+dfsg-1build1_amd64.deb b/src/assets/dependency/iperf3/deb/libsctp1_1.0.19+dfsg-1build1_amd64.deb new file mode 100644 index 0000000..03c3947 Binary files /dev/null and b/src/assets/dependency/iperf3/deb/libsctp1_1.0.19+dfsg-1build1_amd64.deb differ diff --git a/src/assets/dependency/iperf3/rpm/iperf3-3.6-6.ky10.aarch64.rpm b/src/assets/dependency/iperf3/rpm/iperf3-3.6-6.ky10.aarch64.rpm new file mode 100644 index 0000000..b5d5a4a Binary files /dev/null and b/src/assets/dependency/iperf3/rpm/iperf3-3.6-6.ky10.aarch64.rpm differ diff --git a/src/assets/dependency/iperf3/rpm/iperf3-help-3.6-6.ky10.noarch.rpm b/src/assets/dependency/iperf3/rpm/iperf3-help-3.6-6.ky10.noarch.rpm new file mode 100644 index 0000000..78a425f Binary files /dev/null and b/src/assets/dependency/iperf3/rpm/iperf3-help-3.6-6.ky10.noarch.rpm differ diff --git a/src/configuration.go b/src/configuration.go index 3c1515e..cb0f4b1 100644 --- a/src/configuration.go +++ b/src/configuration.go @@ -1,11 +1,11 @@ package src import ( - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/redis" + "be.ems/src/framework/config" + "be.ems/src/framework/cron" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" ) // 配置中心初始加载 diff --git a/src/framework/config/config.go b/src/framework/config/config.go index bdc31a4..8974d4c 100644 --- a/src/framework/config/config.go +++ b/src/framework/config/config.go @@ -8,8 +8,7 @@ import ( "os" "time" - libConfig "nms_cxy/src/lib_features/config" - + libConfig "be.ems/src/lib_features/config" "github.com/spf13/pflag" "github.com/spf13/viper" ) @@ -27,9 +26,9 @@ func InitConfig() { func initFlag() { // --env prod pflag.String("env", "prod", "Specify Run Environment Configuration local or prod") - // --c /etc/omc.yaml - // -c /etc/omc.yaml - pConfig := pflag.StringP("config", "c", "./etc/omc.yaml", "Specify Configuration File") + // --c /etc/restconf.yaml + // -c /etc/restconf.yaml + pConfig := pflag.StringP("config", "c", "./etc/restconf.yaml", "Specify Configuration File") // --version // -V pVersion := pflag.BoolP("version", "V", false, "Output program version") diff --git a/src/framework/config/config/config.default.yaml b/src/framework/config/config/config.default.yaml index 8251852..1af1221 100644 --- a/src/framework/config/config/config.default.yaml +++ b/src/framework/config/config/config.default.yaml @@ -1,7 +1,7 @@ # 项目信息 framework: name: "OMC" - version: "2.2408.5" + version: "2.2411.2" # 应用服务配置 server: diff --git a/src/framework/cron/cron_test.go b/src/framework/cron/cron_test.go index 426af69..53af81a 100644 --- a/src/framework/cron/cron_test.go +++ b/src/framework/cron/cron_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" ) // 参考文章: diff --git a/src/framework/cron/log.go b/src/framework/cron/log.go index 0970252..22140a2 100644 --- a/src/framework/cron/log.go +++ b/src/framework/cron/log.go @@ -4,9 +4,9 @@ import ( "encoding/json" "time" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/modules/monitor/model" - "nms_cxy/src/modules/monitor/repository" + "be.ems/src/framework/constants/common" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" ) // 实例任务执行日志收集 diff --git a/src/framework/datasource/datasource.go b/src/framework/datasource/datasource.go index 2f1e101..736e48d 100644 --- a/src/framework/datasource/datasource.go +++ b/src/framework/datasource/datasource.go @@ -7,8 +7,8 @@ import ( "regexp" "time" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" "gorm.io/driver/mysql" "gorm.io/gorm" @@ -117,6 +117,9 @@ func DefaultDB() *gorm.DB { // 获取数据源 func DB(source string) *gorm.DB { + if source == "" { + source = config.Get("gorm.defaultDataSourceName").(string) + } return dbMap[source] } diff --git a/src/framework/errorcatch/errorcatch.go b/src/framework/errorcatch/errorcatch.go index 0a3583e..6e6f9e9 100644 --- a/src/framework/errorcatch/errorcatch.go +++ b/src/framework/errorcatch/errorcatch.go @@ -3,9 +3,9 @@ package errorcatch import ( "fmt" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/vo/result" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/vo/result" "github.com/gin-gonic/gin" ) diff --git a/src/framework/i18n/i18n.go b/src/framework/i18n/i18n.go index 37ced8c..657964f 100644 --- a/src/framework/i18n/i18n.go +++ b/src/framework/i18n/i18n.go @@ -5,7 +5,7 @@ import ( "regexp" "strings" - systemService "nms_cxy/src/modules/system/service" + systemService "be.ems/src/modules/system/service" ) // localeItem 国际化数据项 @@ -26,7 +26,7 @@ func ClearLocaleData() { // LoadLocaleData 加载国际化数据 func LoadLocaleData(language string) []localeItem { dictType := fmt.Sprintf("i18n_%s", language) - dictTypeList := systemService.NewSysDictTypeImpl.DictDataCache(dictType) + dictTypeList := systemService.NewSysDictType.DictDataCache(dictType) localeData := []localeItem{} for _, v := range dictTypeList { localeData = append(localeData, localeItem{ @@ -58,7 +58,7 @@ func UpdateKeyValue(language, key, value string) bool { } // 更新字典数据 - sysDictDataService := systemService.NewSysDictDataImpl + sysDictDataService := systemService.NewSysDictData item := sysDictDataService.SelectDictDataByCode(code) if item.DictCode == code && item.DictLabel == key { item.DictValue = value diff --git a/src/framework/middleware/collectlogs/operate_log.go b/src/framework/middleware/collectlogs/operate_log.go index 3331181..9528ace 100644 --- a/src/framework/middleware/collectlogs/operate_log.go +++ b/src/framework/middleware/collectlogs/operate_log.go @@ -7,14 +7,14 @@ import ( "strings" "time" - "nms_cxy/src/framework/constants/common" - tokenConstants "nms_cxy/src/framework/constants/token" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/constants/common" + tokenConstants "be.ems/src/framework/constants/token" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/cors.go b/src/framework/middleware/cors.go index 37f8eb1..7630153 100644 --- a/src/framework/middleware/cors.go +++ b/src/framework/middleware/cors.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/config" + "be.ems/src/framework/config" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/crypto_api.go b/src/framework/middleware/crypto_api.go index b5b1862..bfb8f7a 100644 --- a/src/framework/middleware/crypto_api.go +++ b/src/framework/middleware/crypto_api.go @@ -7,12 +7,11 @@ import ( "io" "strings" - "nms_cxy/src/framework/config" - constResult "nms_cxy/src/framework/constants/result" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/crypto" - "nms_cxy/src/framework/utils/parse" - + "be.ems/src/framework/config" + constResult "be.ems/src/framework/constants/result" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/pre_authorize.go b/src/framework/middleware/pre_authorize.go index 34741ff..588ad29 100644 --- a/src/framework/middleware/pre_authorize.go +++ b/src/framework/middleware/pre_authorize.go @@ -3,12 +3,12 @@ package middleware import ( "strings" - AdminConstants "nms_cxy/src/framework/constants/admin" - commonConstants "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/i18n" - ctxUtils "nms_cxy/src/framework/utils/ctx" - tokenUtils "nms_cxy/src/framework/utils/token" - "nms_cxy/src/framework/vo/result" + AdminConstants "be.ems/src/framework/constants/admin" + commonConstants "be.ems/src/framework/constants/common" + "be.ems/src/framework/i18n" + ctxUtils "be.ems/src/framework/utils/ctx" + tokenUtils "be.ems/src/framework/utils/token" + "be.ems/src/framework/vo/result" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/rate_limit.go b/src/framework/middleware/rate_limit.go index 17888a8..368028d 100644 --- a/src/framework/middleware/rate_limit.go +++ b/src/framework/middleware/rate_limit.go @@ -5,12 +5,12 @@ import ( "strings" "time" - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/ip2region" - "nms_cxy/src/framework/vo/result" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/i18n" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/ip2region" + "be.ems/src/framework/vo/result" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/repeat/repeat.go b/src/framework/middleware/repeat/repeat.go index a2b109f..1d08c59 100644 --- a/src/framework/middleware/repeat/repeat.go +++ b/src/framework/middleware/repeat/repeat.go @@ -5,12 +5,12 @@ import ( "strconv" "time" - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/ip2region" - "nms_cxy/src/framework/vo/result" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/ip2region" + "be.ems/src/framework/vo/result" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/report.go b/src/framework/middleware/report.go index 9dde09e..3a6522b 100644 --- a/src/framework/middleware/report.go +++ b/src/framework/middleware/report.go @@ -4,7 +4,7 @@ import ( "runtime" "time" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/security/csp.go b/src/framework/middleware/security/csp.go index c9afb22..3746811 100644 --- a/src/framework/middleware/security/csp.go +++ b/src/framework/middleware/security/csp.go @@ -1,8 +1,8 @@ package security import ( - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/utils/generate" + "be.ems/src/framework/config" + "be.ems/src/framework/utils/generate" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/security/hsts.go b/src/framework/middleware/security/hsts.go index 8f94945..61837d7 100644 --- a/src/framework/middleware/security/hsts.go +++ b/src/framework/middleware/security/hsts.go @@ -3,7 +3,7 @@ package security import ( "fmt" - "nms_cxy/src/framework/config" + "be.ems/src/framework/config" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/security/noopen.go b/src/framework/middleware/security/noopen.go index 0bbeadc..e75f588 100644 --- a/src/framework/middleware/security/noopen.go +++ b/src/framework/middleware/security/noopen.go @@ -1,7 +1,7 @@ package security import ( - "nms_cxy/src/framework/config" + "be.ems/src/framework/config" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/security/nosniff.go b/src/framework/middleware/security/nosniff.go index fc1efee..4bd13ad 100644 --- a/src/framework/middleware/security/nosniff.go +++ b/src/framework/middleware/security/nosniff.go @@ -1,7 +1,7 @@ package security import ( - "nms_cxy/src/framework/config" + "be.ems/src/framework/config" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/security/referer.go b/src/framework/middleware/security/referer.go index 4c89f87..1fbc99a 100644 --- a/src/framework/middleware/security/referer.go +++ b/src/framework/middleware/security/referer.go @@ -3,8 +3,8 @@ package security import ( "net/url" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/vo/result" + "be.ems/src/framework/config" + "be.ems/src/framework/vo/result" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/security/xframe.go b/src/framework/middleware/security/xframe.go index ecb8470..6a5f367 100644 --- a/src/framework/middleware/security/xframe.go +++ b/src/framework/middleware/security/xframe.go @@ -1,7 +1,7 @@ package security import ( - "nms_cxy/src/framework/config" + "be.ems/src/framework/config" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/security/xss_protection.go b/src/framework/middleware/security/xss_protection.go index ba6492d..bd5b1f8 100644 --- a/src/framework/middleware/security/xss_protection.go +++ b/src/framework/middleware/security/xss_protection.go @@ -1,7 +1,7 @@ package security import ( - "nms_cxy/src/framework/config" + "be.ems/src/framework/config" "github.com/gin-gonic/gin" ) diff --git a/src/framework/redis/conn.go b/src/framework/redis/conn.go new file mode 100644 index 0000000..e31ec90 --- /dev/null +++ b/src/framework/redis/conn.go @@ -0,0 +1,79 @@ +package redis + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/redis/go-redis/v9" +) + +// ConnRedis 连接redis对象 +type ConnRedis struct { + Addr string `json:"addr"` // 地址 + Port int64 `json:"port"` // 端口 + User string `json:"user"` // 用户名 + Password string `json:"password"` // 认证密码 + Database int `json:"database"` // 数据库名称 + + DialTimeOut time.Duration `json:"dialTimeOut"` // 连接超时断开 + + Client *redis.Client `json:"client"` +} + +// NewClient 创建Redis客户端 +func (c *ConnRedis) NewClient() (*ConnRedis, error) { + // IPV6地址协议 + if strings.Contains(c.Addr, ":") { + c.Addr = fmt.Sprintf("[%s]", c.Addr) + } + addr := fmt.Sprintf("%s:%d", c.Addr, c.Port) + + // 默认等待5s + if c.DialTimeOut == 0 { + c.DialTimeOut = 5 * time.Second + } + + // 连接 + rdb := redis.NewClient(&redis.Options{ + Addr: addr, + // Username: c.User, + Password: c.Password, + DB: c.Database, + DialTimeout: c.DialTimeOut, + }) + + // 测试数据库连接 + if _, err := rdb.Ping(context.Background()).Result(); err != nil { + return nil, err + } + + c.Client = rdb + return c, nil +} + +// Close 关闭当前Redis客户端 +func (c *ConnRedis) Close() { + if c.Client != nil { + c.Client.Close() + } +} + +// RunCMD 执行单次命令 "GET key" +func (c *ConnRedis) RunCMD(cmd string) (any, error) { + if c.Client == nil { + return "", fmt.Errorf("redis client not connected") + } + // 写入命令 + cmdArr := strings.Fields(cmd) + if len(cmdArr) == 0 { + return "", fmt.Errorf("redis command is empty") + } + conn := *c.Client + args := make([]any, 0) + for _, v := range cmdArr { + args = append(args, v) + } + return conn.Do(context.Background(), args...).Result() +} diff --git a/src/framework/redis/redis.go b/src/framework/redis/redis.go index 244f907..eb36121 100644 --- a/src/framework/redis/redis.go +++ b/src/framework/redis/redis.go @@ -4,10 +4,11 @@ import ( "context" "fmt" "strings" + "sync" "time" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" "github.com/redis/go-redis/v9" ) @@ -30,6 +31,15 @@ if tonumber(current) == 1 then end return tonumber(current);`) +// 连接Redis实例 +func ConnectPush(source string, rdb *redis.Client) { + if rdb == nil { + delete(rdbMap, source) + return + } + rdbMap[source] = rdb +} + // 连接Redis实例 func Connect() { ctx := context.Background() @@ -170,31 +180,22 @@ func GetExpire(source string, key string) (float64, error) { } // 获得缓存数据的key列表 -func GetKeys(source string, pattern string) ([]string, error) { +func GetKeys(source string, match string) ([]string, error) { // 数据源 rdb := DefaultRDB() if source != "" { rdb = RDB(source) } - // 初始化变量 - var keys []string - var cursor uint64 = 0 + keys := make([]string, 0) ctx := context.Background() - // 循环遍历获取匹配的键 - for { - // 使用 SCAN 命令获取匹配的键 - batchKeys, nextCursor, err := rdb.Scan(ctx, cursor, pattern, 100).Result() - if err != nil { - logger.Errorf("Failed to scan keys: %v", err) - return keys, err - } - cursor = nextCursor - keys = append(keys, batchKeys...) - // 当 cursor 为 0,表示遍历完成 - if cursor == 0 { - break - } + iter := rdb.Scan(ctx, 0, match, 1000).Iterator() + if err := iter.Err(); err != nil { + logger.Errorf("Failed to scan keys: %v", err) + return keys, err + } + for iter.Next(ctx) { + keys = append(keys, iter.Val()) } return keys, nil } @@ -252,6 +253,84 @@ func GetHash(source, key string) (map[string]string, error) { return value, nil } +// 批量获得缓存数据 [key]result +func GetHashBatch(source string, keys []string) (map[string]map[string]string, error) { + result := make(map[string]map[string]string, 0) + if len(keys) == 0 { + return result, fmt.Errorf("not keys") + } + + // 数据源 + rdb := DefaultRDB() + if source != "" { + rdb = RDB(source) + } + + // 创建一个有限的并发控制信号通道 + sem := make(chan struct{}, 10) + var wg sync.WaitGroup + var mt sync.Mutex + batchSize := 1000 + total := len(keys) + if total < batchSize { + batchSize = total + } + + for i := 0; i < total; i += batchSize { + wg.Add(1) + go func(start int) { + ctx := context.Background() + // 并发控制,限制同时执行的 Goroutine 数量 + sem <- struct{}{} + defer func() { + <-sem + ctx.Done() + wg.Done() + }() + + pipe := rdb.Pipeline() + for _, key := range keys[start : start+batchSize] { + pipe.HGetAll(ctx, key) + } + + cmds, err := pipe.Exec(ctx) + if err != nil { + logger.Errorf("Failed to get hash batch exec err: %v", err) + return + } + + // 将结果添加到 result map 并发访问 + mt.Lock() + defer mt.Unlock() + + // 处理命令结果 + for _, cmd := range cmds { + if cmd.Err() != nil { + logger.Errorf("Failed to get hash batch cmds err: %v", cmd.Err()) + continue + } + // 将结果转换为 *redis.StringStringMapCmd 类型 + rcmd, ok := cmd.(*redis.MapStringStringCmd) + if !ok { + logger.Errorf("Failed to get hash batch type err: %v", cmd.Err()) + continue + } + + key := "-" + args := rcmd.Args() + if len(args) > 0 { + key = fmt.Sprint(args[1]) + } + + result[key] = rcmd.Val() + } + }(i) + } + + wg.Wait() + return result, nil +} + // 判断是否存在 func Has(source string, keys ...string) (bool, error) { // 数据源 diff --git a/src/framework/socket/tcp_client.go b/src/framework/socket/tcp_client.go new file mode 100644 index 0000000..fb8899b --- /dev/null +++ b/src/framework/socket/tcp_client.go @@ -0,0 +1,96 @@ +package socket + +import ( + "bytes" + "fmt" + "net" + "strings" + "time" +) + +// ConnTCP 连接TCP客户端 +type ConnTCP struct { + Addr string `json:"addr"` // 主机地址 + Port int64 `json:"port"` // 端口 + + DialTimeOut time.Duration `json:"dialTimeOut"` // 连接超时断开 + + Client *net.Conn `json:"client"` + LastResult string `json:"lastResult"` // 记最后一次发送消息的结果 +} + +// New 创建TCP客户端 +func (c *ConnTCP) New() (*ConnTCP, error) { + // IPV6地址协议 + proto := "tcp" + if strings.Contains(c.Addr, ":") { + proto = "tcp6" + c.Addr = fmt.Sprintf("[%s]", c.Addr) + } + address := fmt.Sprintf("%s:%d", c.Addr, c.Port) + + // 默认等待5s + if c.DialTimeOut == 0 { + c.DialTimeOut = 5 * time.Second + } + + // 连接到服务端 + client, err := net.DialTimeout(proto, address, c.DialTimeOut) + if err != nil { + return nil, err + } + + c.Client = &client + return c, nil +} + +// Close 关闭当前TCP客户端 +func (c *ConnTCP) Close() { + if c.Client != nil { + (*c.Client).Close() + } +} + +// Send 发送消息 +func (c *ConnTCP) Send(msg []byte, timer time.Duration) (string, error) { + if c.Client == nil { + return "", fmt.Errorf("tcp client not connected") + } + conn := *c.Client + + // 写入信息 + if len(msg) > 0 { + if _, err := conn.Write(msg); err != nil { + return "", err + } + } + + var buf bytes.Buffer + defer buf.Reset() + + tmp := make([]byte, 1024) + for { + select { + case <-time.After(timer): + c.LastResult = buf.String() + return c.LastResult, fmt.Errorf("timeout") + default: + // 读取命令消息 + n, err := conn.Read(tmp) + if n == 0 || err != nil { + tmp = nil + break + } + + tmpStr := string(tmp[:n]) + buf.WriteString(tmpStr) + + // 是否有终止符 + if strings.HasSuffix(tmpStr, ">") || strings.HasSuffix(tmpStr, "> ") || strings.HasSuffix(tmpStr, "# ") { + tmp = nil + c.LastResult = buf.String() + return c.LastResult, nil + } + } + } +} diff --git a/src/framework/socket/tcp_server.go b/src/framework/socket/tcp_server.go new file mode 100644 index 0000000..0957438 --- /dev/null +++ b/src/framework/socket/tcp_server.go @@ -0,0 +1,77 @@ +package socket + +import ( + "fmt" + "net" + "strings" + + "be.ems/src/framework/logger" +) + +// SocketTCP TCP服务端 +type SocketTCP struct { + Addr string `json:"addr"` // 主机地址 + Port int64 `json:"port"` // 端口 + Listener *net.TCPListener `json:"listener"` + StopChan chan struct{} `json:"stop"` // 停止信号 +} + +// New 创建TCP服务端 +func (s *SocketTCP) New() (*SocketTCP, error) { + // IPV6地址协议 + proto := "tcp" + if strings.Contains(s.Addr, ":") { + proto = "tcp6" + s.Addr = fmt.Sprintf("[%s]", s.Addr) + } + address := fmt.Sprintf("%s:%d", s.Addr, s.Port) + + // 解析 TCP 地址 + tcpAddr, err := net.ResolveTCPAddr(proto, address) + if err != nil { + return nil, err + } + + // 监听 TCP 地址 + listener, err := net.ListenTCP(proto, tcpAddr) + if err != nil { + return nil, err + } + + s.Listener = listener + s.StopChan = make(chan struct{}, 1) + return s, nil +} + +// Close 关闭当前TCP服务端 +func (s *SocketTCP) Close() { + if s.Listener != nil { + s.StopChan <- struct{}{} + (*s.Listener).Close() + } +} + +// Resolve 处理消息 +func (s *SocketTCP) Resolve(callback func(conn *net.Conn, err error)) { + if s.Listener == nil { + callback(nil, fmt.Errorf("tcp service not created")) + return + } + listener := *s.Listener + + for { + select { + case <-s.StopChan: + callback(nil, fmt.Errorf("udp service stop")) + return + default: + conn, err := listener.Accept() + if err != nil { + logger.Errorf("Error accepting connection: %v ", err) + continue + } + defer conn.Close() + callback(&conn, nil) + } + } +} diff --git a/src/framework/socket/udp_client.go b/src/framework/socket/udp_client.go new file mode 100644 index 0000000..ecaa486 --- /dev/null +++ b/src/framework/socket/udp_client.go @@ -0,0 +1,96 @@ +package socket + +import ( + "bytes" + "fmt" + "net" + "strings" + "time" +) + +// ConnUDP 连接UDP客户端 +type ConnUDP struct { + Addr string `json:"addr"` // 主机地址 + Port int64 `json:"port"` // 端口 + + DialTimeOut time.Duration `json:"dialTimeOut"` // 连接超时断开 + + Client *net.Conn `json:"client"` + LastResult string `json:"lastResult"` // 记最后一次发送消息的结果 +} + +// New 创建UDP客户端 +func (c *ConnUDP) New() (*ConnUDP, error) { + // IPV6地址协议 + proto := "udp" + if strings.Contains(c.Addr, ":") { + proto = "udp6" + c.Addr = fmt.Sprintf("[%s]", c.Addr) + } + address := fmt.Sprintf("%s:%d", c.Addr, c.Port) + + // 默认等待5s + if c.DialTimeOut == 0 { + c.DialTimeOut = 5 * time.Second + } + + // 连接到服务端 + client, err := net.DialTimeout(proto, address, c.DialTimeOut) + if err != nil { + return nil, err + } + + c.Client = &client + return c, nil +} + +// Close 关闭当前UDP客户端 +func (c *ConnUDP) Close() { + if c.Client != nil { + (*c.Client).Close() + } +} + +// Send 发送消息 +func (c *ConnUDP) Send(msg []byte, ms int) (string, error) { + if c.Client == nil { + return "", fmt.Errorf("udp client not connected") + } + conn := *c.Client + + // 写入信息 + if len(msg) > 0 { + if _, err := conn.Write(msg); err != nil { + return "", err + } + } + + var buf bytes.Buffer + defer buf.Reset() + + tmp := make([]byte, 1024) + for { + select { + case <-time.After(time.Duration(time.Duration(ms).Milliseconds())): + c.LastResult = buf.String() + return c.LastResult, fmt.Errorf("timeout") + default: + // 读取命令消息 + n, err := conn.Read(tmp) + if n == 0 || err != nil { + tmp = nil + break + } + + tmpStr := string(tmp[:n]) + buf.WriteString(tmpStr) + + // 是否有终止符 + if strings.HasSuffix(tmpStr, ">") || strings.HasSuffix(tmpStr, "> ") || strings.HasSuffix(tmpStr, "# ") { + tmp = nil + c.LastResult = buf.String() + return c.LastResult, nil + } + } + } +} diff --git a/src/framework/socket/udp_server.go b/src/framework/socket/udp_server.go new file mode 100644 index 0000000..d93001b --- /dev/null +++ b/src/framework/socket/udp_server.go @@ -0,0 +1,67 @@ +package socket + +import ( + "fmt" + "net" + "strings" +) + +// SocketUDP UDP服务端 +type SocketUDP struct { + Addr string `json:"addr"` // 主机地址 + Port int64 `json:"port"` // 端口 + Conn *net.UDPConn `json:"conn"` + StopChan chan struct{} `json:"stop"` // 停止信号 +} + +// New 创建UDP服务端 +func (s *SocketUDP) New() (*SocketUDP, error) { + // IPV6地址协议 + proto := "udp" + if strings.Contains(s.Addr, ":") { + proto = "udp6" + s.Addr = fmt.Sprintf("[%s]", s.Addr) + } + address := fmt.Sprintf("%s:%d", s.Addr, s.Port) + + // 解析 UDP 地址 + udpAddr, err := net.ResolveUDPAddr(proto, address) + if err != nil { + return nil, err + } + + // 监听 UDP 地址 + conn, err := net.ListenUDP("udp", udpAddr) + if err != nil { + return nil, err + } + + s.Conn = conn + s.StopChan = make(chan struct{}, 1) + return s, nil +} + +// CloseService 关闭当前UDP服务端 +func (s *SocketUDP) Close() { + if s.Conn != nil { + s.StopChan <- struct{}{} + (*s.Conn).Close() + } +} + +// Resolve 处理消息 +func (s *SocketUDP) Resolve(callback func(*net.UDPConn, error)) { + if s.Conn == nil { + callback(nil, fmt.Errorf("udp service not created")) + return + } + + for { + select { + case <-s.StopChan: + callback(nil, fmt.Errorf("udp service not created")) + default: + callback(s.Conn, nil) + } + } +} diff --git a/src/framework/utils/telnet/parse.go b/src/framework/telnet/parse.go similarity index 100% rename from src/framework/utils/telnet/parse.go rename to src/framework/telnet/parse.go diff --git a/src/framework/utils/telnet/telnet.go b/src/framework/telnet/telnet.go similarity index 89% rename from src/framework/utils/telnet/telnet.go rename to src/framework/telnet/telnet.go index 33579e9..8b2c2ec 100644 --- a/src/framework/utils/telnet/telnet.go +++ b/src/framework/telnet/telnet.go @@ -50,11 +50,6 @@ func (c *ConnTelnet) NewClient() (*ConnTelnet, error) { // fmt.Fprintln(client, c.User) // fmt.Fprintln(client, c.Password) - // 调整窗口大小 (120 列 x 128 行) - // 需要确保接收方理解并正确处理发送窗口大小设置命令 - client.Write([]byte{255, 251, 31}) - client.Write([]byte{255, 250, 31, byte(120 >> 8), byte(120 & 0xFF), byte(128 >> 8), byte(128 & 0xFF), 255, 240}) - c.Client = &client // 排空连接登录的信息 @@ -116,6 +111,6 @@ func (c *ConnTelnet) NewClientSession(cols, rows int) (*TelnetClientSession, err s := &TelnetClientSession{ Client: *c.Client, } - s.WindowChange(cols, rows) + // s.WindowChange(cols, rows) return s, nil } diff --git a/src/framework/utils/telnet/telnet_session.go b/src/framework/telnet/telnet_session.go similarity index 97% rename from src/framework/utils/telnet/telnet_session.go rename to src/framework/telnet/telnet_session.go index 4d0cc59..33994a5 100644 --- a/src/framework/utils/telnet/telnet_session.go +++ b/src/framework/telnet/telnet_session.go @@ -47,11 +47,11 @@ func (s *TelnetClientSession) Read() []byte { buf := make([]byte, 1024) // 设置读取超时时间为100毫秒 s.Client.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) - _, err := s.Client.Read(buf) + n, err := s.Client.Read(buf) if err != nil { return []byte{} } - return buf + return buf[:n] } // CombinedOutput 发送命令带结果返回 diff --git a/src/framework/utils/ctx/ctx.go b/src/framework/utils/ctx/ctx.go index 551a854..b9f2f1e 100644 --- a/src/framework/utils/ctx/ctx.go +++ b/src/framework/utils/ctx/ctx.go @@ -4,18 +4,16 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/constants/roledatascope" - "nms_cxy/src/framework/constants/token" - "nms_cxy/src/framework/utils/ip2region" - "nms_cxy/src/framework/utils/ua" - "nms_cxy/src/framework/vo" - + "be.ems/src/framework/config" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/constants/roledatascope" + "be.ems/src/framework/constants/token" + "be.ems/src/framework/utils/ip2region" + "be.ems/src/framework/utils/ua" + "be.ems/src/framework/vo" "golang.org/x/text/language" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // QueryMap 查询参数转换Map @@ -31,7 +29,7 @@ func QueryMap(c *gin.Context) map[string]any { // BodyJSONMap JSON参数转换Map func BodyJSONMap(c *gin.Context) map[string]any { params := make(map[string]any) - c.ShouldBindBodyWith(¶ms, binding.JSON) + c.ShouldBindBodyWithJSON(¶ms) return params } @@ -40,7 +38,7 @@ func RequestParamsMap(c *gin.Context) map[string]any { params := make(map[string]any) // json if strings.HasPrefix(c.ContentType(), "application/json") { - c.ShouldBindBodyWith(¶ms, binding.JSON) + c.ShouldBindBodyWithJSON(¶ms) } // 表单 diff --git a/src/framework/utils/date/date.go b/src/framework/utils/date/date.go index f726a83..35cf339 100644 --- a/src/framework/utils/date/date.go +++ b/src/framework/utils/date/date.go @@ -3,7 +3,7 @@ package date import ( "time" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" ) const ( diff --git a/src/framework/utils/fetch/fetch.go b/src/framework/utils/fetch/fetch.go index 008b557..be7cc07 100644 --- a/src/framework/utils/fetch/fetch.go +++ b/src/framework/utils/fetch/fetch.go @@ -87,7 +87,7 @@ func Post(url string, data url.Values, headers map[string]string) ([]byte, error // PostJSON 发送 POST 请求,并将请求体序列化为 JSON 格式 func PostJSON(url string, data any, headers map[string]string) ([]byte, error) { client := &http.Client{ - Timeout: 3 * time.Second, // 超时时间 + Timeout: 10 * time.Second, // 超时时间 } jsonData, err := json.Marshal(data) @@ -180,7 +180,7 @@ func PostUploadFile(url string, params map[string]string, file *os.File) ([]byte // PutJSON 发送 PUT 请求,并将请求体序列化为 JSON 格式 func PutJSON(url string, data any, headers map[string]string) ([]byte, error) { client := &http.Client{ - Timeout: 3 * time.Second, // 超时时间 + Timeout: 10 * time.Second, // 超时时间 } jsonData, err := json.Marshal(data) diff --git a/src/framework/utils/file/csv.go b/src/framework/utils/file/csv.go index 4eb9643..b6cec70 100644 --- a/src/framework/utils/file/csv.go +++ b/src/framework/utils/file/csv.go @@ -6,7 +6,7 @@ import ( "path/filepath" "strings" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" ) // 写入CSV文件,需要转换数据 diff --git a/src/framework/utils/file/excel.go b/src/framework/utils/file/excel.go index 4b72d83..69b7aa5 100644 --- a/src/framework/utils/file/excel.go +++ b/src/framework/utils/file/excel.go @@ -7,9 +7,9 @@ import ( "path/filepath" "time" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/date" + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" "github.com/xuri/excelize/v2" ) diff --git a/src/framework/utils/file/file.go b/src/framework/utils/file/file.go index 80b7156..25ad258 100644 --- a/src/framework/utils/file/file.go +++ b/src/framework/utils/file/file.go @@ -11,13 +11,13 @@ import ( "strings" "time" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/generate" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/regular" + "be.ems/src/framework/config" + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/generate" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/regular" ) /**最大文件名长度 */ diff --git a/src/framework/utils/file/json.go b/src/framework/utils/file/json.go index 6b31a67..4421c2b 100644 --- a/src/framework/utils/file/json.go +++ b/src/framework/utils/file/json.go @@ -7,7 +7,7 @@ import ( "os" "path/filepath" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" ) // WriterFileJSON 写入JSON文件 diff --git a/src/framework/utils/file/tar.go b/src/framework/utils/file/tar.go new file mode 100644 index 0000000..22c3fb6 --- /dev/null +++ b/src/framework/utils/file/tar.go @@ -0,0 +1,76 @@ +package file + +import ( + "archive/tar" + "compress/gzip" + "io" + "os" + "path/filepath" +) + +// CompressTarGZByDir 将目录下文件添加到 tar.gz 压缩文件 +func CompressTarGZByDir(zipFilePath, dirPath string) error { + // 创建本地输出目录 + if err := os.MkdirAll(filepath.Dir(zipFilePath), 0775); err != nil { + return err + } + + // 创建输出文件 + tarFile, err := os.Create(zipFilePath) + if err != nil { + return err + } + defer tarFile.Close() + + gw := gzip.NewWriter(tarFile) + defer gw.Close() + + tw := tar.NewWriter(gw) + defer tw.Close() + + // 遍历目录下的所有文件和子目录 + err = filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // 忽略目录 + if info.IsDir() { + return nil + } + + // 创建文件条目 + header, err := tar.FileInfoHeader(info, "") + if err != nil { + return err + } + relPath, err := filepath.Rel(dirPath, path) + if err != nil { + return err + } + header.Name = relPath + if err := tw.WriteHeader(header); err != nil { + return err + } + if !info.Mode().IsRegular() { + return nil + } + + // 打开文件 + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + // 写入文件内容 + _, err = io.Copy(tw, file) + if err != nil { + return err + } + + return nil + }) + + return err +} diff --git a/src/framework/utils/file/txt.go b/src/framework/utils/file/txt.go index 010a804..e468a19 100644 --- a/src/framework/utils/file/txt.go +++ b/src/framework/utils/file/txt.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strings" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" ) // WriterFileTXT 写入txt文件 sep 分割符号 需要转换数据 diff --git a/src/framework/utils/file/utils.go b/src/framework/utils/file/utils.go index 93270c1..eccf54c 100644 --- a/src/framework/utils/file/utils.go +++ b/src/framework/utils/file/utils.go @@ -9,7 +9,7 @@ import ( "sort" "strconv" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" ) // transferToNewFile 读取目标文件转移到新路径下 diff --git a/src/framework/utils/generate/generate.go b/src/framework/utils/generate/generate.go index 7e52411..f76c7f5 100644 --- a/src/framework/utils/generate/generate.go +++ b/src/framework/utils/generate/generate.go @@ -4,7 +4,7 @@ import ( "math/rand" "time" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" gonanoid "github.com/matoous/go-nanoid/v2" ) diff --git a/src/framework/utils/ip2region/ip2region.go b/src/framework/utils/ip2region/ip2region.go index 49a256d..0dc48f3 100644 --- a/src/framework/utils/ip2region/ip2region.go +++ b/src/framework/utils/ip2region/ip2region.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" ) // 网络地址(内网) diff --git a/src/framework/utils/machine/launch.go b/src/framework/utils/machine/launch.go index b0a9cc0..60d3aa8 100644 --- a/src/framework/utils/machine/launch.go +++ b/src/framework/utils/machine/launch.go @@ -8,12 +8,12 @@ import ( "runtime" "time" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/cmd" - "nms_cxy/src/framework/utils/crypto" - "nms_cxy/src/framework/utils/parse" + "be.ems/src/framework/config" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/cmd" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" ) // 机器的唯一标识符 @@ -167,7 +167,7 @@ func Reset() error { return err } // 重启服务 - if _, err := cmd.Execf("nohup sh -c \"sleep 1s && %s\" > /dev/null 2>&1 &", "sudo systemctl restart omc"); err != nil { + if _, err := cmd.Execf("nohup sh -c \"sleep 1s && %s\" > /dev/null 2>&1 &", "sudo systemctl restart restagent"); err != nil { return err } } diff --git a/src/framework/utils/parse/parse.go b/src/framework/utils/parse/parse.go index 67fb831..a51e313 100644 --- a/src/framework/utils/parse/parse.go +++ b/src/framework/utils/parse/parse.go @@ -17,46 +17,53 @@ import ( ) // Number 解析数值型 -func Number(str any) int64 { - switch str := str.(type) { +func Number(value any) int64 { + switch v := value.(type) { case string: - if str == "" { + if v == "" { return 0 } - num, err := strconv.ParseInt(str, 10, 64) + num, err := strconv.ParseInt(v, 10, 64) if err != nil { return 0 } return num - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: - return reflect.ValueOf(str).Int() + case int, int8, int16, int32, int64: + return reflect.ValueOf(v).Int() + case uint, uint8, uint16, uint32, uint64: + return int64(reflect.ValueOf(v).Uint()) case float32, float64: - return int64(reflect.ValueOf(str).Float()) + return int64(reflect.ValueOf(v).Float()) + case bool: + if v { + return 1 + } + return 0 default: return 0 } } // Boolean 解析布尔型 -func Boolean(str any) bool { - switch str := str.(type) { +func Boolean(value any) bool { + switch v := value.(type) { case string: - if str == "" || str == "false" || str == "0" { + b, err := strconv.ParseBool(v) + if err != nil { return false } - // 尝试将字符串解析为数字 - if num, err := strconv.ParseFloat(str, 64); err == nil { - return num != 0 - } - return true - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: - num := reflect.ValueOf(str).Int() + return b + case int, int8, int16, int32, int64: + num := reflect.ValueOf(v).Int() + return num != 0 + case uint, uint8, uint16, uint32, uint64: + num := int64(reflect.ValueOf(v).Uint()) return num != 0 case float32, float64: - num := reflect.ValueOf(str).Float() + num := reflect.ValueOf(v).Float() return num != 0 case bool: - return str + return v default: return false } diff --git a/src/framework/utils/repo/repo.go b/src/framework/utils/repo/repo.go index 7924ddb..6e5e82f 100644 --- a/src/framework/utils/repo/repo.go +++ b/src/framework/utils/repo/repo.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "nms_cxy/src/framework/utils/parse" + "be.ems/src/framework/utils/parse" ) // PageNumSize 分页页码记录数 diff --git a/src/framework/utils/ssh/files.go b/src/framework/utils/ssh/files.go index 39822e1..187d9c8 100644 --- a/src/framework/utils/ssh/files.go +++ b/src/framework/utils/ssh/files.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/cmd" - "nms_cxy/src/framework/utils/parse" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/cmd" + "be.ems/src/framework/utils/parse" ) // FileListRow 文件列表行数据 @@ -24,9 +24,8 @@ type FileListRow struct { // 文件列表 // search 文件名后模糊* // -// return 目录大小,行记录,异常 -func FileList(sshClient *ConnSSH, path, search string) (string, []FileListRow, error) { - totalSize := "" +// return 行记录,异常 +func FileList(sshClient *ConnSSH, path, search string) ([]FileListRow, error) { var rows []FileListRow rowStr := "" @@ -35,40 +34,37 @@ func FileList(sshClient *ConnSSH, path, search string) (string, []FileListRow, e if search != "" { searchStr = search + searchStr } - cmdStr := fmt.Sprintf("cd %s && ls -lthd --time-style=+%%s %s", path, searchStr) + // cd /var/log && find. -maxdepth 1 -name'mme*' -exec ls -lthd --time-style=+%s {} + + cmdStr := fmt.Sprintf("cd %s && find . -maxdepth 1 -name '%s' -exec ls -lthd --time-style=+%%s {} +", path, searchStr) + // cd /var/log && ls -lthd --time-style=+%s mme* + // cmdStr := fmt.Sprintf("cd %s && ls -lthd --time-style=+%%s %s", path, searchStr) // 是否远程客户端读取 if sshClient == nil { resultStr, err := cmd.Execf(cmdStr) if err != nil { logger.Errorf("Ne FileList Path: %s, Search: %s, Error:%s", path, search, err.Error()) - return totalSize, rows, err + return rows, err } rowStr = resultStr } else { resultStr, err := sshClient.RunCMD(cmdStr) if err != nil { logger.Errorf("Ne FileList Path: %s, Search: %s, Error:%s", path, search, err.Error()) - return totalSize, rows, err + return rows, err } rowStr = resultStr } // 遍历组装 rowStrList := strings.Split(rowStr, "\n") - for i, rowStr := range rowStrList { + for _, rowStr := range rowStrList { if rowStr == "" { continue } // 使用空格对字符串进行切割 fields := strings.Fields(rowStr) - // 无查询过滤会有total总计 - if i == 0 && searchStr == "" { - totalSize = fields[1] - continue - } - // 拆分不足7位跳过 if len(fields) != 7 { continue @@ -83,6 +79,14 @@ func FileList(sshClient *ConnSSH, path, search string) (string, []FileListRow, e fileType = "symlink" } + // 文件名 + fileName := fields[6] + if fileName == "." { + continue + } else if strings.HasPrefix(fileName, "./") { + fileName = strings.TrimPrefix(fileName, "./") + } + // 提取各个字段的值 rows = append(rows, FileListRow{ FileMode: fileMode, @@ -92,8 +96,8 @@ func FileList(sshClient *ConnSSH, path, search string) (string, []FileListRow, e Group: fields[3], Size: fields[4], ModifiedTime: parse.Number(fields[5]), - FileName: fields[6], + FileName: fileName, }) } - return totalSize, rows, nil + return rows, nil } diff --git a/src/framework/utils/ssh/sftp.go b/src/framework/utils/ssh/sftp.go index e99f373..45ef9af 100644 --- a/src/framework/utils/ssh/sftp.go +++ b/src/framework/utils/ssh/sftp.go @@ -5,8 +5,7 @@ import ( "os" "path/filepath" - "nms_cxy/src/framework/logger" - + "be.ems/src/framework/logger" gosftp "github.com/pkg/sftp" ) @@ -61,7 +60,7 @@ func (s *SSHClientSFTP) CopyDirRemoteToLocal(remoteDir, localDir string) error { return nil } -// CopyDirRemoteToLocal 复制目录-本地到远程 +// CopyDirLocalToRemote 复制目录-本地到远程 func (s *SSHClientSFTP) CopyDirLocalToRemote(localDir, remoteDir string) error { // 遍历本地目录中的文件和子目录并复制到远程 err := filepath.Walk(localDir, func(localPath string, info os.FileInfo, err error) error { @@ -95,7 +94,7 @@ func (s *SSHClientSFTP) CopyDirLocalToRemote(localDir, remoteDir string) error { return nil } -// CopyDirRemoteToLocal 复制文件-远程到本地 +// CopyFileRemoteToLocal 复制文件-远程到本地 func (s *SSHClientSFTP) CopyFileRemoteToLocal(remotePath, localPath string) error { if err := os.MkdirAll(filepath.Dir(localPath), 0775); err != nil { return err @@ -125,7 +124,7 @@ func (s *SSHClientSFTP) CopyFileRemoteToLocal(remotePath, localPath string) erro return nil } -// CopyDirRemoteToLocal 复制文件-本地到远程 +// CopyFileLocalToRemote 复制文件-本地到远程 func (s *SSHClientSFTP) CopyFileLocalToRemote(localPath, remotePath string) error { // 打开本地文件 localFile, err := os.Open(localPath) diff --git a/src/framework/utils/ssh/ssh.go b/src/framework/utils/ssh/ssh.go index 3365826..6a4a526 100644 --- a/src/framework/utils/ssh/ssh.go +++ b/src/framework/utils/ssh/ssh.go @@ -7,9 +7,8 @@ import ( "strings" "time" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/cmd" - + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/cmd" gosftp "github.com/pkg/sftp" gossh "golang.org/x/crypto/ssh" ) @@ -213,11 +212,14 @@ func (c *ConnSSH) SendToAuthorizedKeys() error { if err != nil { return err } + // "sudo mkdir -p ~/.ssh && sudo chown omcuser:omcuser ~/.ssh && sudo chmod 700 ~/.ssh" + // "sudo touch ~/.ssh/authorized_keys && sudo chown omcuser:omcuser ~/.ssh/authorized_keys && sudo chmod 600 ~/.ssh/authorized_keys" + // "echo 'ssh-rsa AAAAB3= pc-host\n' | sudo tee -a ~/.ssh/authorized_keys" authorizedKeysEntry := fmt.Sprintln(strings.TrimSpace(publicKey)) cmdStrArr := []string{ - fmt.Sprintf("sudo mkdir -p /home/%s/.ssh && sudo chown %s:%s /home/%s/.ssh && sudo chmod 700 /home/%s/.ssh", c.User, c.User, c.User, c.User, c.User), - fmt.Sprintf("sudo touch /home/%s/.ssh/authorized_keys && sudo chown %s:%s /home/%s/.ssh/authorized_keys && sudo chmod 600 /home/%s/.ssh/authorized_keys", c.User, c.User, c.User, c.User, c.User), - fmt.Sprintf("echo '%s' | sudo tee -a /home/%s/.ssh/authorized_keys", authorizedKeysEntry, c.User), + fmt.Sprintf("sudo mkdir -p ~/.ssh && sudo chown %s:%s ~/.ssh && sudo chmod 700 ~/.ssh", c.User, c.User), + fmt.Sprintf("sudo touch ~/.ssh/authorized_keys && sudo chown %s:%s ~/.ssh/authorized_keys && sudo chmod 600 ~/.ssh/authorized_keys", c.User, c.User), + fmt.Sprintf("echo '%s' | sudo tee -a ~/.ssh/authorized_keys", authorizedKeysEntry), } _, err = c.RunCMD(strings.Join(cmdStrArr, " && ")) if err != nil { diff --git a/src/framework/utils/token/token.go b/src/framework/utils/token/token.go index 642b36c..b07879d 100644 --- a/src/framework/utils/token/token.go +++ b/src/framework/utils/token/token.go @@ -5,14 +5,14 @@ import ( "fmt" "time" - "nms_cxy/src/framework/config" - cachekeyConstants "nms_cxy/src/framework/constants/cachekey" - tokenConstants "nms_cxy/src/framework/constants/token" - "nms_cxy/src/framework/logger" - redisCahe "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/generate" - "nms_cxy/src/framework/utils/machine" - "nms_cxy/src/framework/vo" + "be.ems/src/framework/config" + cachekeyConstants "be.ems/src/framework/constants/cachekey" + tokenConstants "be.ems/src/framework/constants/token" + "be.ems/src/framework/logger" + redisCahe "be.ems/src/framework/redis" + "be.ems/src/framework/utils/generate" + "be.ems/src/framework/utils/machine" + "be.ems/src/framework/vo" jwt "github.com/golang-jwt/jwt/v5" ) diff --git a/src/framework/vo/loginuser.go b/src/framework/vo/loginuser.go index fd29483..f5e538e 100644 --- a/src/framework/vo/loginuser.go +++ b/src/framework/vo/loginuser.go @@ -1,6 +1,6 @@ package vo -import systemModel "nms_cxy/src/modules/system/model" +import systemModel "be.ems/src/modules/system/model" // LoginUser 登录用户身份权限信息对象 type LoginUser struct { diff --git a/src/framework/vo/result/result.go b/src/framework/vo/result/result.go index b435de3..192e646 100644 --- a/src/framework/vo/result/result.go +++ b/src/framework/vo/result/result.go @@ -1,7 +1,7 @@ package result import ( - constResult "nms_cxy/src/framework/constants/result" + constResult "be.ems/src/framework/constants/result" ) // CodeMsg 响应结果 diff --git a/src/framework/vo/treeselect.go b/src/framework/vo/treeselect.go index 1f1bb13..01fcf89 100644 --- a/src/framework/vo/treeselect.go +++ b/src/framework/vo/treeselect.go @@ -1,6 +1,6 @@ package vo -import systemModel "nms_cxy/src/modules/system/model" +import systemModel "be.ems/src/modules/system/model" // TreeSelect 树结构实体类 type TreeSelect struct { diff --git a/src/lib_features/config/config.go b/src/lib_features/config/config.go index c446902..e315460 100644 --- a/src/lib_features/config/config.go +++ b/src/lib_features/config/config.go @@ -3,16 +3,15 @@ package libfeatures import ( "fmt" - libConf "nms_cxy/lib/core/conf" - libGlobal "nms_cxy/lib/global" - libConfig "nms_cxy/omc/config" - + libConf "be.ems/lib/core/conf" + libGlobal "be.ems/lib/global" + libConfig "be.ems/restagent/config" "github.com/spf13/viper" ) // BuildInfo 程序-V查看编译版本号信息 func BuildInfo() string { - return fmt.Sprintf("OMC Version: %s\n%s\n%s\n\n", libGlobal.Version, libGlobal.BuildTime, libGlobal.GoVer) + return fmt.Sprintf("OMC restagent version: %s\n%s\n%s\n\n", libGlobal.Version, libGlobal.BuildTime, libGlobal.GoVer) } // ConfigRead 指定配置文件读取 diff --git a/src/lib_features/readme.md b/src/lib_features/readme.md index a3853f3..57a250c 100644 --- a/src/lib_features/readme.md +++ b/src/lib_features/readme.md @@ -1,4 +1,4 @@ # 外层 lib 和 features 粘合层 -- config.go 配置合并: omc.yaml 文件内容,主要是数据库配置 +- config.go 配置合并: restagent.yaml 文件内容,主要是数据库配置 diff --git a/src/modules/chart/chart.go b/src/modules/chart/chart.go index 1908087..83455e2 100644 --- a/src/modules/chart/chart.go +++ b/src/modules/chart/chart.go @@ -1,10 +1,10 @@ package chart import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/framework/middleware/collectlogs" - "nms_cxy/src/modules/chart/controller" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/modules/chart/controller" "github.com/gin-gonic/gin" ) @@ -13,10 +13,8 @@ import ( func Setup(router *gin.Engine) { logger.Infof("开始加载 ====> chart 模块路由") - chartGroup := router.Group("/chart") - - // 关系图 - chartGraphGroup := chartGroup.Group("/graph") + // G6关系图 + chartGraphGroup := router.Group("/chart/graph") { chartGraphGroup.GET("", middleware.PreAuthorize(nil), diff --git a/src/modules/chart/controller/chart_graph.go b/src/modules/chart/controller/chart_graph.go index 7a19772..acad8af 100644 --- a/src/modules/chart/controller/chart_graph.go +++ b/src/modules/chart/controller/chart_graph.go @@ -1,18 +1,17 @@ package controller import ( - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - chartService "nms_cxy/src/modules/chart/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/chart/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 ChartGraphController 结构体 var NewChartGraph = &ChartGraphController{ - chartGraphService: chartService.NewChartGraphImpl, + chartGraphService: service.NewChartGraph, } // G6关系图 @@ -20,7 +19,7 @@ var NewChartGraph = &ChartGraphController{ // PATH /graph type ChartGraphController struct { // G6关系图数据表服务 - chartGraphService chartService.IChartGraph + chartGraphService *service.ChartGraph } // 获取关系图组名 diff --git a/src/modules/chart/model/chart_graph.go b/src/modules/chart/model/chart_graph.go index 26dd823..c087d3e 100644 --- a/src/modules/chart/model/chart_graph.go +++ b/src/modules/chart/model/chart_graph.go @@ -1,31 +1,32 @@ package model -// ChartGraph G6关系图数据对象 chart_graph +// ChartGraph 图表-G6关系图数据对象 chart_graph type ChartGraph struct { RowID int64 `json:"rowId,omitempty" gorm:"column:row_id;primaryKey;autoIncrement"` // 记录ID - RowType string `json:"rowType,omitempty" gorm:"column:row_type"` // 记录类型(node/edge/combo) - RowGroup string `json:"rowGroup,omitempty" gorm:"column:row_group"` // 记录组名 - ID string `json:"id,omitempty" gorm:"column:id"` // 元素ID - Type string `json:"type,omitempty" gorm:"column:type"` // node/combo 类型 - Depth int `json:"depth,omitempty" gorm:"column:depth"` // node/combo 深度 - X float64 `json:"x,omitempty" gorm:"column:x"` // node/combo 横向坐标 - Y float64 `json:"y,omitempty" gorm:"column:y"` // node/combo 纵向坐标 - Size string `json:"size,omitempty" gorm:"column:size"` // node/combo 大小-JSON数组 - Icon string `json:"icon,omitempty" gorm:"column:icon"` // node-部分类型支持图标JSON配置 - Img string `json:"img,omitempty" gorm:"column:img"` // node-img 图片 - ClipCfg string `json:"clipCfg,omitempty" gorm:"column:clip_cfg"` // node-img 图片裁剪JSON配置 - Direction string `json:"direction,omitempty" gorm:"column:direction"` // node-triangle 三角形的方向(up/down/left/right) - Source string `json:"source,omitempty" gorm:"column:source"` // edge-边起始 - Target string `json:"target,omitempty" gorm:"column:target"` // edge-边目标 - ComboID string `json:"combo_id,omitempty" gorm:"column:combo_id"` // combo-分组 - Padding string `json:"padding,omitempty" gorm:"column:padding"` // combo-JSON分组内边距 - ParentID string `json:"parentId,omitempty" gorm:"column:parent_id"` // combo-父级分组 - Children string `json:"children,omitempty" gorm:"column:children"` // combo-JSON分组内含元素 - Style string `json:"style,omitempty" gorm:"column:style"` // 元素样式-JONS配置 - Label string `json:"label,omitempty" gorm:"column:label"` // 标签文本 - LabelCfg string `json:"labelCfg,omitempty" gorm:"column:label_cfg"` // 标签文本-JSON配置 + RowType string `json:"rowType" gorm:"row_type"` // 记录类型 + RowGroup string `json:"rowGroup" gorm:"row_group"` // 记录组名 + ID string `json:"id" gorm:"id"` // 元素ID + Type string `json:"type" gorm:"type"` // node/combo 类型 + Depth int64 `json:"depth" gorm:"depth"` // node/combo 深度 + X float64 `json:"x" gorm:"x"` // node/combo 横向坐标 + Y float64 `json:"y" gorm:"y"` // node/combo 纵向坐标 + Size string `json:"size" gorm:"size"` // node/combo 大小-JSON数组 + Icon string `json:"icon" gorm:"icon"` // node-部分类型支持图标JSON配置 + Img string `json:"img" gorm:"img"` // node-img 图片 + ClipCfg string `json:"clipCfg" gorm:"clip_cfg"` // node-img 图片裁剪JSON配置 + Direction string `json:"direction" gorm:"direction"` // node-triangle 三角形的方向 + Source string `json:"source" gorm:"source"` // edge-边起始 + Target string `json:"target" gorm:"target"` // edge-边目标 + ComboId string `json:"comboId" gorm:"combo_id"` // combo-分组 + Padding string `json:"padding" gorm:"padding"` // combo-JSON分组内边距 + ParentId string `json:"parentId" gorm:"parent_id"` // combo-父级分组 + Children string `json:"children" gorm:"children"` // combo-JSON分组内含元素 + Style string `json:"style" gorm:"style"` // 元素样式-JONS配置 + Label string `json:"label" gorm:"label"` // 标签文本 + LabelCfg string `json:"labelCfg" gorm:"label_cfg"` // 标签文本-JSON配置 } -func (ChartGraph) TableName() string { +// TableName 表名称 +func (*ChartGraph) TableName() string { return "chart_graph" } diff --git a/src/modules/chart/repository/chart_graph.go b/src/modules/chart/repository/chart_graph.go index ca4d811..4d917e3 100644 --- a/src/modules/chart/repository/chart_graph.go +++ b/src/modules/chart/repository/chart_graph.go @@ -1,21 +1,194 @@ package repository -import "nms_cxy/src/modules/chart/model" +import ( + "strings" -// G6关系图数据 数据层接口 -type IChartGraph interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/chart/model" +) - // SelectList 根据实体查询 - SelectList(graph model.ChartGraph) []model.ChartGraph +// 实例化数据层 ChartGraph 结构体 +var NewChartGraph = &ChartGraph{ + selectSql: `select + row_id, row_type, row_group, + id, type, depth, x, y, size, icon, img, + clip_cfg, direction, + source, target, combo_id, + padding, parent_id, children, + style, label, label_cfg + from chart_graph`, - // SelectGroup 查询组名 - SelectGroup() []string - - // Insert 批量添加 - Inserts(graphs []model.ChartGraph) int64 - - // Delete 删除组数据 - DeleteGroup(rowGroup string) int64 + resultMap: map[string]string{ + "row_id": "RowID", + "row_type": "RowType", + "row_group": "RowGroup", + "id": "ID", + "type": "Type", + "depth": "Depth", + "x": "X", + "y": "Y", + "size": "Size", + "icon": "Icon", + "img": "Img", + "clip_cfg": "ClipCfg", + "direction": "Direction", + "source": "Source", + "target": "Target", + "combo_id": "ComboID", + "padding": "Padding", + "parent_id": "ParentID", + "children": "Children", + "style": "Style", + "label": "Label", + "label_cfg": "LabelCfg", + }, +} + +// ChartGraph G6关系图数据表 数据层处理 +type ChartGraph struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *ChartGraph) convertResultRows(rows []map[string]any) []model.ChartGraph { + arr := make([]model.ChartGraph, 0) + for _, row := range rows { + item := model.ChartGraph{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *ChartGraph) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["rowType"]; ok && v != "" { + conditions = append(conditions, "row_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["rowGroup"]; ok && v != "" { + conditions = append(conditions, "row_group = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.ChartGraph{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from chart_graph" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *ChartGraph) SelectList(graph model.ChartGraph) []model.ChartGraph { + // 查询条件拼接 + var conditions []string + var params []any + if graph.RowType != "" { + conditions = append(conditions, "row_type = ?") + params = append(params, graph.RowType) + } + if graph.RowGroup != "" { + conditions = append(conditions, "row_group = ?") + params = append(params, graph.RowGroup) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by depth asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectGroup 查询组名 +func (r *ChartGraph) SelectGroup() []string { + rows := []string{} + // 查询数量 长度为0直接返回 + querySql := "select row_group as 'str' from chart_graph GROUP BY row_group" + strRows, err := datasource.RawDB("", querySql, nil) + if err != nil { + logger.Errorf("Query err => %v", err) + return rows + } + for _, v := range strRows { + rows = append(rows, v["str"].(string)) + } + return rows +} + +// Insert 批量添加 +func (r *ChartGraph) Inserts(graphs []model.ChartGraph) int64 { + tx := datasource.DefaultDB().CreateInBatches(graphs, 2000) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return tx.RowsAffected +} + +// Delete 删除组数据 +func (r *ChartGraph) DeleteGroup(rowGroup string) int64 { + tx := datasource.DefaultDB().Where("row_group = ?", rowGroup).Delete(&model.ChartGraph{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected } diff --git a/src/modules/chart/repository/chart_graph.impl.go b/src/modules/chart/repository/chart_graph.impl.go deleted file mode 100644 index eb7efe7..0000000 --- a/src/modules/chart/repository/chart_graph.impl.go +++ /dev/null @@ -1,194 +0,0 @@ -package repository - -import ( - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/chart/model" -) - -// 实例化数据层 NewChartGraphImpl 结构体 -var NewChartGraphImpl = &ChartGraphImpl{ - selectSql: `select - row_id, row_type, row_group, - id, type, depth, x, y, size, icon, img, - clip_cfg, direction, - source, target, combo_id, - padding, parent_id, children, - style, label, label_cfg - from chart_graph`, - - resultMap: map[string]string{ - "row_id": "RowID", - "row_type": "RowType", - "row_group": "RowGroup", - "id": "ID", - "type": "Type", - "depth": "Depth", - "x": "X", - "y": "Y", - "size": "Size", - "icon": "Icon", - "img": "Img", - "clip_cfg": "ClipCfg", - "direction": "Direction", - "source": "Source", - "target": "Target", - "combo_id": "ComboID", - "padding": "Padding", - "parent_id": "ParentID", - "children": "Children", - "style": "Style", - "label": "Label", - "label_cfg": "LabelCfg", - }, -} - -// ChartGraphImpl G6关系图数据表 数据层处理 -type ChartGraphImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *ChartGraphImpl) convertResultRows(rows []map[string]any) []model.ChartGraph { - arr := make([]model.ChartGraph, 0) - for _, row := range rows { - item := model.ChartGraph{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *ChartGraphImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["rowType"]; ok && v != "" { - conditions = append(conditions, "row_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["rowGroup"]; ok && v != "" { - conditions = append(conditions, "row_group = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.ChartGraph{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from chart_graph" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *ChartGraphImpl) SelectList(graph model.ChartGraph) []model.ChartGraph { - // 查询条件拼接 - var conditions []string - var params []any - if graph.RowType != "" { - conditions = append(conditions, "row_type = ?") - params = append(params, graph.RowType) - } - if graph.RowGroup != "" { - conditions = append(conditions, "row_group = ?") - params = append(params, graph.RowGroup) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by depth asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectGroup 查询组名 -func (r *ChartGraphImpl) SelectGroup() []string { - rows := []string{} - // 查询数量 长度为0直接返回 - querySql := "select row_group as 'str' from chart_graph GROUP BY row_group" - strRows, err := datasource.RawDB("", querySql, nil) - if err != nil { - logger.Errorf("Query err => %v", err) - return rows - } - for _, v := range strRows { - rows = append(rows, v["str"].(string)) - } - return rows -} - -// Insert 批量添加 -func (r *ChartGraphImpl) Inserts(graphs []model.ChartGraph) int64 { - tx := datasource.DefaultDB().CreateInBatches(graphs, 2000) - if err := tx.Error; err != nil { - logger.Errorf("CreateInBatches err => %v", err) - } - return tx.RowsAffected -} - -// Delete 删除组数据 -func (r *ChartGraphImpl) DeleteGroup(rowGroup string) int64 { - tx := datasource.DefaultDB().Where("row_group = ?", rowGroup).Delete(&model.ChartGraph{}) - if err := tx.Error; err != nil { - logger.Errorf("Delete err => %v", err) - } - return tx.RowsAffected -} diff --git a/src/modules/chart/service/chart_graph.go b/src/modules/chart/service/chart_graph.go index 470183d..6eaf3cb 100644 --- a/src/modules/chart/service/chart_graph.go +++ b/src/modules/chart/service/chart_graph.go @@ -1,16 +1,359 @@ package service -// G6关系图数据 服务层接口 -type IChartGraph interface { - // SelectGroup 查询组名 - SelectGroup() []string +import ( + "encoding/json" + "strings" - // LoadData 查询所组图数据 - LoadData(rowGroup, rowType string) map[string]any + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/chart/model" + "be.ems/src/modules/chart/repository" +) - // SaveData 添加组图数据 - SaveData(rowGroup string, data map[string]any) int64 - - // DeleteGroup 删除所组图数据 - DeleteGroup(rowGroup string) int64 +// 实例化服务层 ChartGraph 结构体 +var NewChartGraph = &ChartGraph{ + graphRepository: repository.NewChartGraph, +} + +// ChartGraph G6关系图数据表 服务层处理 +type ChartGraph struct { + // G6关系图数据服务 + graphRepository *repository.ChartGraph +} + +// SelectGroup 查询组名 +func (s *ChartGraph) SelectGroup() []string { + return s.graphRepository.SelectGroup() +} + +// LoadData 查询所组图数据 +func (s *ChartGraph) LoadData(rowGroup, rowType string) map[string]any { + // 查询数据 + graph := model.ChartGraph{ + RowGroup: rowGroup, + } + if rowType != "" { + graph.RowType = rowType + } + data := s.graphRepository.SelectList(graph) + + // 数据项 + nodes := []map[string]any{} + edges := []map[string]any{} + combos := []map[string]any{} + + for _, v := range data { + if v.RowType == "node" { + nodes = append(nodes, s.loadNode(v)) + } + if v.RowType == "edge" { + edges = append(edges, s.loadEdge(v)) + } + if v.RowType == "combo" { + combos = append(combos, s.loadCombo(v)) + } + } + + return map[string]any{ + "nodes": nodes, + "edges": edges, + "combos": combos, + } +} + +// loadNode 图数据Node +func (s *ChartGraph) loadNode(v model.ChartGraph) map[string]any { + node := map[string]any{ + "id": v.ID, + "comboId": v.ComboId, + "x": v.X, + "y": v.Y, + "type": v.Type, + "depth": v.Depth, + } + + // 元素样式 + style := map[string]any{} + if len(v.Style) > 7 { + json.Unmarshal([]byte(v.Style), &style) + } + node["style"] = style + + // 元素大小 + if strings.Contains(v.Size, "[") { + sizeArr := []int64{} + json.Unmarshal([]byte(v.Size), &sizeArr) + node["size"] = sizeArr + } else { + node["size"] = parse.Number(v.Size) + } + + // 标签文本 + node["label"] = v.Label + labelCfg := map[string]any{} + if len(v.LabelCfg) > 7 { + json.Unmarshal([]byte(v.LabelCfg), &labelCfg) + } + node["labelCfg"] = labelCfg + + // 三角形属性 + if v.Type == "triangle" { + node["direction"] = v.Direction + } + + // 图片属性 + if strings.Index(v.Type, "image") == 0 { + node["img"] = v.Img + clipCfg := map[string]any{} + if len(v.ClipCfg) > 7 { + json.Unmarshal([]byte(v.ClipCfg), &clipCfg) + } + node["clipCfg"] = clipCfg + } + + // 图标属性 + if v.Icon != "" { + icon := map[string]any{} + if len(v.Icon) > 7 { + json.Unmarshal([]byte(v.Icon), &icon) + } + node["icon"] = icon + } + + return node +} + +// loadEdge 图数据Edge +func (s *ChartGraph) loadEdge(v model.ChartGraph) map[string]any { + edge := map[string]any{ + "id": v.ID, + "source": v.Source, + "target": v.Target, + "type": v.Type, + } + + // 元素样式 + style := map[string]any{} + if len(v.Style) > 7 { + json.Unmarshal([]byte(v.Style), &style) + } + edge["style"] = style + + // 标签文本 + edge["label"] = v.Label + labelCfg := map[string]any{} + if len(v.LabelCfg) > 7 { + json.Unmarshal([]byte(v.LabelCfg), &labelCfg) + } + edge["labelCfg"] = labelCfg + + return edge +} + +// loadCombo 图数据Combo +func (s *ChartGraph) loadCombo(v model.ChartGraph) map[string]any { + combo := map[string]any{ + "id": v.ID, + "x": v.X, + "y": v.Y, + "type": v.Type, + "depth": v.Depth, + } + + // 元素样式 + style := map[string]any{} + if len(v.Style) > 7 { + json.Unmarshal([]byte(v.Style), &style) + } + combo["style"] = style + + // 元素大小 + if strings.Contains(v.Size, "[") { + sizeArr := []int64{} + json.Unmarshal([]byte(v.Size), &sizeArr) + combo["size"] = sizeArr + } else { + combo["size"] = parse.Number(v.Size) + } + + // 元素内边距 + if strings.Contains(v.Padding, "[") { + paddingArr := []int64{} + json.Unmarshal([]byte(v.Padding), &paddingArr) + combo["padding"] = paddingArr + } else { + combo["padding"] = parse.Number(v.Padding) + } + + // 标签文本 + combo["label"] = v.Label + labelCfg := map[string]any{} + if len(v.LabelCfg) > 7 { + json.Unmarshal([]byte(v.LabelCfg), &labelCfg) + } + combo["labelCfg"] = labelCfg + + // 分组内元素 + if v.Children != "" { + children := []map[string]any{} + if len(v.Children) > 7 { + json.Unmarshal([]byte(v.Children), &children) + } + combo["children"] = children + } + + return combo +} + +// SaveData 添加组图数据 +func (s *ChartGraph) SaveData(rowGroup string, data map[string]any) int64 { + graphs := []model.ChartGraph{} + nodes := data["nodes"].([]map[string]any) + graphNodes := s.saveNode(rowGroup, nodes) + graphs = append(graphs, graphNodes...) + edges := data["edges"].([]map[string]any) + graphEdges := s.saveEdge(rowGroup, edges) + graphs = append(graphs, graphEdges...) + combos := data["combos"].([]map[string]any) + graphCombos := s.saveCombo(rowGroup, combos) + graphs = append(graphs, graphCombos...) + // 删除组数据后插入 + if len(graphs) > 0 { + s.graphRepository.DeleteGroup(rowGroup) + } + return s.graphRepository.Inserts(graphs) +} + +// saveNode 图数据Node +func (s *ChartGraph) saveNode(rowGroup string, nodes []map[string]any) []model.ChartGraph { + var graphs []model.ChartGraph + for _, v := range nodes { + node := model.ChartGraph{ + RowType: "node", + RowGroup: rowGroup, + ID: v["id"].(string), + X: v["x"].(float64), + Y: v["y"].(float64), + Type: v["type"].(string), + } + if comboId, ok := v["comboId"]; ok && comboId != nil { + node.ComboId = comboId.(string) + } + if depth, ok := v["depth"]; ok && depth != nil { + node.Depth = int64(depth.(float64)) + } + if styleByte, err := json.Marshal(v["style"]); err == nil { + node.Style = string(styleByte) + } + + // 元素大小 + if sizeByte, err := json.Marshal(v["size"]); err == nil { + node.Size = string(sizeByte) + } + + // 标签文本 + if label, ok := v["label"]; ok && label != nil { + node.Label = label.(string) + } + if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { + node.LabelCfg = string(labelCfgByte) + } + // 三角形属性 + if direction, ok := v["direction"]; ok && direction != nil && node.Type == "triangle" { + node.Direction = direction.(string) + } + // 图片属性 + if img, ok := v["img"]; ok && img != nil { + node.Img = img.(string) + if clipCfgByte, err := json.Marshal(v["clipCfg"]); err == nil { + node.ClipCfg = string(clipCfgByte) + } + } + // 图标属性 + if icon, ok := v["icon"]; ok && icon != nil { + if iconByte, err := json.Marshal(icon); err == nil { + node.Icon = string(iconByte) + } + } + + graphs = append(graphs, node) + } + return graphs +} + +// saveEdge 图数据Edge +func (s *ChartGraph) saveEdge(rowGroup string, edges []map[string]any) []model.ChartGraph { + var graphs []model.ChartGraph + for _, v := range edges { + edge := model.ChartGraph{ + RowType: "edge", + RowGroup: rowGroup, + ID: v["id"].(string), + Source: v["source"].(string), + Target: v["target"].(string), + Type: v["type"].(string), + } + + if styleByte, err := json.Marshal(v["style"]); err == nil { + edge.Style = string(styleByte) + } + + // 标签文本 + if label, ok := v["label"]; ok && label != nil { + edge.Label = label.(string) + } + if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { + edge.LabelCfg = string(labelCfgByte) + } + + graphs = append(graphs, edge) + } + return graphs +} + +// saveCombo 图数据Combo +func (s *ChartGraph) saveCombo(rowGroup string, combos []map[string]any) []model.ChartGraph { + var graphs []model.ChartGraph + for _, v := range combos { + combo := model.ChartGraph{ + RowType: "combo", + RowGroup: rowGroup, + ID: v["id"].(string), + X: v["x"].(float64), + Y: v["y"].(float64), + Type: v["type"].(string), + } + if depth, ok := v["depth"]; ok && depth != nil { + combo.Depth = int64(depth.(float64)) + } + if styleByte, err := json.Marshal(v["style"]); err == nil { + combo.Style = string(styleByte) + } + if paddingByte, err := json.Marshal(v["padding"]); err == nil { + combo.Padding = string(paddingByte) + } + if childrenByte, err := json.Marshal(v["children"]); err == nil { + combo.Children = string(childrenByte) + } + + // 元素大小 + if sizeByte, err := json.Marshal(v["size"]); err == nil { + combo.Size = string(sizeByte) + } + + // 标签文本 + if label, ok := v["label"]; ok && label != nil { + combo.Label = label.(string) + } + if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { + combo.LabelCfg = string(labelCfgByte) + } + + graphs = append(graphs, combo) + } + return graphs +} + +// Delete 删除所组图数据 +func (s *ChartGraph) DeleteGroup(rowGroup string) int64 { + return s.graphRepository.DeleteGroup(rowGroup) } diff --git a/src/modules/chart/service/chart_graph.impl.go b/src/modules/chart/service/chart_graph.impl.go deleted file mode 100644 index 0294c45..0000000 --- a/src/modules/chart/service/chart_graph.impl.go +++ /dev/null @@ -1,360 +0,0 @@ -package service - -import ( - "strings" - - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/modules/chart/model" - chartRepository "nms_cxy/src/modules/chart/repository" - - "github.com/goccy/go-json" -) - -// 实例化服务层 ChartGraphImpl 结构体 -var NewChartGraphImpl = &ChartGraphImpl{ - graphRepository: chartRepository.NewChartGraphImpl, -} - -// ChartGraphImpl G6关系图数据表 服务层处理 -type ChartGraphImpl struct { - // G6关系图数据服务 - graphRepository chartRepository.IChartGraph -} - -// SelectGroup 查询组名 -func (s *ChartGraphImpl) SelectGroup() []string { - return s.graphRepository.SelectGroup() -} - -// LoadData 查询所组图数据 -func (s *ChartGraphImpl) LoadData(rowGroup, rowType string) map[string]any { - // 查询数据 - graph := model.ChartGraph{ - RowGroup: rowGroup, - } - if rowType != "" { - graph.RowType = rowType - } - data := s.graphRepository.SelectList(graph) - - // 数据项 - nodes := []map[string]any{} - edges := []map[string]any{} - combos := []map[string]any{} - - for _, v := range data { - if v.RowType == "node" { - nodes = append(nodes, s.loadNode(v)) - } - if v.RowType == "edge" { - edges = append(edges, s.loadEdge(v)) - } - if v.RowType == "combo" { - combos = append(combos, s.loadCombo(v)) - } - } - - return map[string]any{ - "nodes": nodes, - "edges": edges, - "combos": combos, - } -} - -// loadNode 图数据Node -func (s *ChartGraphImpl) loadNode(v model.ChartGraph) map[string]any { - node := map[string]any{ - "id": v.ID, - "comboId": v.ComboID, - "x": v.X, - "y": v.Y, - "type": v.Type, - "depth": v.Depth, - } - - // 元素样式 - style := map[string]any{} - if len(v.Style) > 7 { - json.Unmarshal([]byte(v.Style), &style) - } - node["style"] = style - - // 元素大小 - if strings.Contains(v.Size, "[") { - sizeArr := []int64{} - json.Unmarshal([]byte(v.Size), &sizeArr) - node["size"] = sizeArr - } else { - node["size"] = parse.Number(v.Size) - } - - // 标签文本 - node["label"] = v.Label - labelCfg := map[string]any{} - if len(v.LabelCfg) > 7 { - json.Unmarshal([]byte(v.LabelCfg), &labelCfg) - } - node["labelCfg"] = labelCfg - - // 三角形属性 - if v.Type == "triangle" { - node["direction"] = v.Direction - } - - // 图片属性 - if strings.Index(v.Type, "image") == 0 { - node["img"] = v.Img - clipCfg := map[string]any{} - if len(v.ClipCfg) > 7 { - json.Unmarshal([]byte(v.ClipCfg), &clipCfg) - } - node["clipCfg"] = clipCfg - } - - // 图标属性 - if v.Icon != "" { - icon := map[string]any{} - if len(v.Icon) > 7 { - json.Unmarshal([]byte(v.Icon), &icon) - } - node["icon"] = icon - } - - return node -} - -// loadEdge 图数据Edge -func (s *ChartGraphImpl) loadEdge(v model.ChartGraph) map[string]any { - edge := map[string]any{ - "id": v.ID, - "source": v.Source, - "target": v.Target, - "type": v.Type, - } - - // 元素样式 - style := map[string]any{} - if len(v.Style) > 7 { - json.Unmarshal([]byte(v.Style), &style) - } - edge["style"] = style - - // 标签文本 - edge["label"] = v.Label - labelCfg := map[string]any{} - if len(v.LabelCfg) > 7 { - json.Unmarshal([]byte(v.LabelCfg), &labelCfg) - } - edge["labelCfg"] = labelCfg - - return edge -} - -// loadCombo 图数据Combo -func (s *ChartGraphImpl) loadCombo(v model.ChartGraph) map[string]any { - combo := map[string]any{ - "id": v.ID, - "x": v.X, - "y": v.Y, - "type": v.Type, - "depth": v.Depth, - } - - // 元素样式 - style := map[string]any{} - if len(v.Style) > 7 { - json.Unmarshal([]byte(v.Style), &style) - } - combo["style"] = style - - // 元素大小 - if strings.Contains(v.Size, "[") { - sizeArr := []int64{} - json.Unmarshal([]byte(v.Size), &sizeArr) - combo["size"] = sizeArr - } else { - combo["size"] = parse.Number(v.Size) - } - - // 元素内边距 - if strings.Contains(v.Padding, "[") { - paddingArr := []int64{} - json.Unmarshal([]byte(v.Padding), &paddingArr) - combo["padding"] = paddingArr - } else { - combo["padding"] = parse.Number(v.Padding) - } - - // 标签文本 - combo["label"] = v.Label - labelCfg := map[string]any{} - if len(v.LabelCfg) > 7 { - json.Unmarshal([]byte(v.LabelCfg), &labelCfg) - } - combo["labelCfg"] = labelCfg - - // 分组内元素 - if v.Children != "" { - children := []map[string]any{} - if len(v.Children) > 7 { - json.Unmarshal([]byte(v.Children), &children) - } - combo["children"] = children - } - - return combo -} - -// SaveData 添加组图数据 -func (s *ChartGraphImpl) SaveData(rowGroup string, data map[string]any) int64 { - graphs := []model.ChartGraph{} - nodes := data["nodes"].([]map[string]any) - graphNodes := s.saveNode(rowGroup, nodes) - graphs = append(graphs, graphNodes...) - edges := data["edges"].([]map[string]any) - graphEdges := s.saveEdge(rowGroup, edges) - graphs = append(graphs, graphEdges...) - combos := data["combos"].([]map[string]any) - graphCombos := s.saveCombo(rowGroup, combos) - graphs = append(graphs, graphCombos...) - // 删除组数据后插入 - if len(graphs) > 0 { - s.graphRepository.DeleteGroup(rowGroup) - } - return s.graphRepository.Inserts(graphs) -} - -// saveNode 图数据Node -func (s *ChartGraphImpl) saveNode(rowGroup string, nodes []map[string]any) []model.ChartGraph { - var graphs []model.ChartGraph - for _, v := range nodes { - node := model.ChartGraph{ - RowType: "node", - RowGroup: rowGroup, - ID: v["id"].(string), - X: v["x"].(float64), - Y: v["y"].(float64), - Type: v["type"].(string), - } - if comboId, ok := v["comboId"]; ok && comboId != nil { - node.ComboID = comboId.(string) - } - if depth, ok := v["depth"]; ok && depth != nil { - node.Depth = int(depth.(float64)) - } - if styleByte, err := json.Marshal(v["style"]); err == nil { - node.Style = string(styleByte) - } - - // 元素大小 - if sizeByte, err := json.Marshal(v["size"]); err == nil { - node.Size = string(sizeByte) - } - - // 标签文本 - if label, ok := v["label"]; ok && label != nil { - node.Label = label.(string) - } - if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { - node.LabelCfg = string(labelCfgByte) - } - // 三角形属性 - if direction, ok := v["direction"]; ok && direction != nil && node.Type == "triangle" { - node.Direction = direction.(string) - } - // 图片属性 - if img, ok := v["img"]; ok && img != nil { - node.Img = img.(string) - if clipCfgByte, err := json.Marshal(v["clipCfg"]); err == nil { - node.ClipCfg = string(clipCfgByte) - } - } - // 图标属性 - if icon, ok := v["icon"]; ok && icon != nil { - if iconByte, err := json.Marshal(icon); err == nil { - node.Icon = string(iconByte) - } - } - - graphs = append(graphs, node) - } - return graphs -} - -// saveEdge 图数据Edge -func (s *ChartGraphImpl) saveEdge(rowGroup string, edges []map[string]any) []model.ChartGraph { - var graphs []model.ChartGraph - for _, v := range edges { - edge := model.ChartGraph{ - RowType: "edge", - RowGroup: rowGroup, - ID: v["id"].(string), - Source: v["source"].(string), - Target: v["target"].(string), - Type: v["type"].(string), - } - - if styleByte, err := json.Marshal(v["style"]); err == nil { - edge.Style = string(styleByte) - } - - // 标签文本 - if label, ok := v["label"]; ok && label != nil { - edge.Label = label.(string) - } - if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { - edge.LabelCfg = string(labelCfgByte) - } - - graphs = append(graphs, edge) - } - return graphs -} - -// saveCombo 图数据Combo -func (s *ChartGraphImpl) saveCombo(rowGroup string, combos []map[string]any) []model.ChartGraph { - var graphs []model.ChartGraph - for _, v := range combos { - combo := model.ChartGraph{ - RowType: "combo", - RowGroup: rowGroup, - ID: v["id"].(string), - X: v["x"].(float64), - Y: v["y"].(float64), - Type: v["type"].(string), - } - if depth, ok := v["depth"]; ok && depth != nil { - combo.Depth = int(depth.(float64)) - } - if styleByte, err := json.Marshal(v["style"]); err == nil { - combo.Style = string(styleByte) - } - if paddingByte, err := json.Marshal(v["padding"]); err == nil { - combo.Padding = string(paddingByte) - } - if childrenByte, err := json.Marshal(v["children"]); err == nil { - combo.Children = string(childrenByte) - } - - // 元素大小 - if sizeByte, err := json.Marshal(v["size"]); err == nil { - combo.Size = string(sizeByte) - } - - // 标签文本 - if label, ok := v["label"]; ok && label != nil { - combo.Label = label.(string) - } - if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { - combo.LabelCfg = string(labelCfgByte) - } - - graphs = append(graphs, combo) - } - return graphs -} - -// Delete 删除所组图数据 -func (s *ChartGraphImpl) DeleteGroup(rowGroup string) int64 { - return s.graphRepository.DeleteGroup(rowGroup) -} diff --git a/src/modules/common/common.go b/src/modules/common/common.go index 24ed6af..3bbbd97 100644 --- a/src/modules/common/common.go +++ b/src/modules/common/common.go @@ -1,9 +1,9 @@ package common import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/modules/common/controller" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/modules/common/controller" "github.com/gin-gonic/gin" ) diff --git a/src/modules/common/controller/account.go b/src/modules/common/controller/account.go index 39333f4..f41d38d 100644 --- a/src/modules/common/controller/account.go +++ b/src/modules/common/controller/account.go @@ -1,24 +1,23 @@ package controller import ( - "nms_cxy/src/framework/config" - commonConstants "nms_cxy/src/framework/constants/common" - tokenConstants "nms_cxy/src/framework/constants/token" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - tokenUtils "nms_cxy/src/framework/utils/token" - "nms_cxy/src/framework/vo" - "nms_cxy/src/framework/vo/result" - commonModel "nms_cxy/src/modules/common/model" - commonService "nms_cxy/src/modules/common/service" - systemService "nms_cxy/src/modules/system/service" - + "be.ems/src/framework/config" + commonConstants "be.ems/src/framework/constants/common" + tokenConstants "be.ems/src/framework/constants/token" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + tokenUtils "be.ems/src/framework/utils/token" + "be.ems/src/framework/vo" + "be.ems/src/framework/vo/result" + commonModel "be.ems/src/modules/common/model" + commonService "be.ems/src/modules/common/service" + systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) // 实例化控制层 AccountController 结构体 var NewAccount = &AccountController{ - accountService: commonService.NewAccountImpl, + accountService: commonService.NewAccount, sysLogLoginService: systemService.NewSysLogLoginImpl, } @@ -26,8 +25,7 @@ var NewAccount = &AccountController{ // // PATH / type AccountController struct { - // 账号身份操作服务 - accountService commonService.IAccount + accountService *commonService.Account // 账号身份操作服务 // 系统登录访问 sysLogLoginService systemService.ISysLogLogin } diff --git a/src/modules/common/controller/bootloader.go b/src/modules/common/controller/bootloader.go index 0e6c46f..0c9f520 100644 --- a/src/modules/common/controller/bootloader.go +++ b/src/modules/common/controller/bootloader.go @@ -1,25 +1,24 @@ package controller import ( - adminConstants "nms_cxy/src/framework/constants/admin" - "nms_cxy/src/framework/constants/common" - tokenConstants "nms_cxy/src/framework/constants/token" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/machine" - "nms_cxy/src/framework/utils/regular" - tokenUtils "nms_cxy/src/framework/utils/token" - "nms_cxy/src/framework/vo" - "nms_cxy/src/framework/vo/result" - commonService "nms_cxy/src/modules/common/service" - systemService "nms_cxy/src/modules/system/service" - + adminConstants "be.ems/src/framework/constants/admin" + "be.ems/src/framework/constants/common" + tokenConstants "be.ems/src/framework/constants/token" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/machine" + "be.ems/src/framework/utils/regular" + tokenUtils "be.ems/src/framework/utils/token" + "be.ems/src/framework/vo" + "be.ems/src/framework/vo/result" + commonService "be.ems/src/modules/common/service" + systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) // 实例化控制层 BootloaderController 结构体 var NewBootloader = &BootloaderController{ - accountService: commonService.NewAccountImpl, + accountService: commonService.NewAccount, sysUserService: systemService.NewSysUserImpl, } @@ -27,8 +26,7 @@ var NewBootloader = &BootloaderController{ // // PATH /bootloader type BootloaderController struct { - // 账号身份操作服务 - accountService commonService.IAccount + accountService *commonService.Account // 账号身份操作服务 // 用户信息服务 sysUserService systemService.ISysUser } diff --git a/src/modules/common/controller/captcha.go b/src/modules/common/controller/captcha.go index b93598f..50bf563 100644 --- a/src/modules/common/controller/captcha.go +++ b/src/modules/common/controller/captcha.go @@ -3,14 +3,14 @@ package controller import ( "time" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/constants/captcha" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - systemService "nms_cxy/src/modules/system/service" + "be.ems/src/framework/config" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants/captcha" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/mojocn/base64Captcha" diff --git a/src/modules/common/controller/common.go b/src/modules/common/controller/common.go index ff6e75d..5e2ec70 100644 --- a/src/modules/common/controller/common.go +++ b/src/modules/common/controller/common.go @@ -1,11 +1,10 @@ package controller import ( - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - commonService "nms_cxy/src/modules/common/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + commonService "be.ems/src/modules/common/service" "github.com/gin-gonic/gin" ) diff --git a/src/modules/common/controller/file.go b/src/modules/common/controller/file.go index e0434a4..6dc67b7 100644 --- a/src/modules/common/controller/file.go +++ b/src/modules/common/controller/file.go @@ -7,12 +7,12 @@ import ( "path/filepath" "strings" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/vo/result" + "be.ems/src/framework/config" + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/vo/result" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" diff --git a/src/modules/common/controller/index.go b/src/modules/common/controller/index.go index dd80c35..020b5be 100644 --- a/src/modules/common/controller/index.go +++ b/src/modules/common/controller/index.go @@ -3,8 +3,8 @@ package controller import ( "fmt" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/vo/result" + "be.ems/src/framework/config" + "be.ems/src/framework/vo/result" "github.com/gin-gonic/gin" ) diff --git a/src/modules/common/controller/register.go b/src/modules/common/controller/register.go index 526b8d6..7b5f344 100644 --- a/src/modules/common/controller/register.go +++ b/src/modules/common/controller/register.go @@ -1,14 +1,14 @@ package controller import ( - commonConstants "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/regular" - "nms_cxy/src/framework/vo/result" - commonModel "nms_cxy/src/modules/common/model" - commonService "nms_cxy/src/modules/common/service" - systemService "nms_cxy/src/modules/system/service" + commonConstants "be.ems/src/framework/constants/common" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/regular" + "be.ems/src/framework/vo/result" + commonModel "be.ems/src/modules/common/model" + commonService "be.ems/src/modules/common/service" + systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) diff --git a/src/modules/common/service/account.go b/src/modules/common/service/account.go index ad52af4..dce06a0 100644 --- a/src/modules/common/service/account.go +++ b/src/modules/common/service/account.go @@ -1,24 +1,194 @@ package service -import "nms_cxy/src/framework/vo" +import ( + "fmt" + "time" -// 账号身份操作服务 服务层接口 -type IAccount interface { - // ValidateCaptcha 校验验证码 - ValidateCaptcha(code, uuid string) error + "be.ems/src/framework/config" + adminConstants "be.ems/src/framework/constants/admin" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo" + "be.ems/src/modules/system/model" + systemService "be.ems/src/modules/system/service" +) - // LoginByUsername 登录生成token - LoginByUsername(username, password string) (vo.LoginUser, error) - - // UpdateLoginDateAndIP 更新登录时间和IP - UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool - - // ClearLoginRecordCache 清除错误记录次数 - ClearLoginRecordCache(username string) bool - - // RoleAndMenuPerms 角色和菜单数据权限 - RoleAndMenuPerms(userId string, isAdmin bool) ([]string, []string) - - // RouteMenus 前端路由所需要的菜单 - RouteMenus(userId string, isAdmin bool) []vo.Router +// 实例化服务层 Account 结构体 +var NewAccount = &Account{ + sysUserService: systemService.NewSysUserImpl, + sysConfigService: systemService.NewSysConfigImpl, + sysRoleService: systemService.NewSysRoleImpl, + sysMenuService: systemService.NewSysMenuImpl, +} + +// 账号身份操作服务 服务层处理 +type Account struct { + // 用户信息服务 + sysUserService systemService.ISysUser + // 参数配置服务 + sysConfigService systemService.ISysConfig + // 角色服务 + sysRoleService systemService.ISysRole + // 菜单服务 + sysMenuService systemService.ISysMenu +} + +// ValidateCaptcha 校验验证码 +func (s *Account) ValidateCaptcha(code, uuid string) error { + // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 + captchaEnabledStr := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaEnabled") + if !parse.Boolean(captchaEnabledStr) { + return nil + } + if code == "" || uuid == "" { + // 验证码信息错误 + return fmt.Errorf("captcha.err") + } + verifyKey := cachekey.CAPTCHA_CODE_KEY + uuid + captcha, _ := redis.Get("", verifyKey) + if captcha == "" { + // 验证码已失效 + return fmt.Errorf("captcha.errValid") + } + redis.Del("", verifyKey) + if captcha != code { + // 验证码错误 + return fmt.Errorf("captcha.err") + } + return nil +} + +// LoginByUsername 登录创建用户信息 +func (s *Account) LoginByUsername(username, password string) (vo.LoginUser, error) { + loginUser := vo.LoginUser{} + + // 检查密码重试次数 + retrykey, retryCount, lockTime, err := s.passwordRetryCount(username) + if err != nil { + return loginUser, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.SelectUserByUserName(username) + if sysUser.UserName != username { + return loginUser, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == common.STATUS_YES { + // 对不起,您的账号已被删除 + return loginUser, fmt.Errorf("login.errDelFlag") + } + if sysUser.Status == common.STATUS_NO { + return loginUser, fmt.Errorf("login.errStatus") + } + + // 检验用户密码 + compareBool := crypto.BcryptCompare(password, sysUser.Password) + if !compareBool { + redis.SetByExpire("", retrykey, retryCount+1, lockTime) + // 用户不存在或密码错误 + return loginUser, fmt.Errorf("login.errNameOrPasswd") + } else { + // 清除错误记录次数 + s.ClearLoginRecordCache(username) + } + + // 登录用户信息 + loginUser.UserID = sysUser.UserID + loginUser.DeptID = sysUser.DeptID + loginUser.User = sysUser + // 用户权限组标识 + isAdmin := config.IsAdmin(sysUser.UserID) + if isAdmin { + loginUser.Permissions = []string{adminConstants.PERMISSION} + } else { + perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID) + loginUser.Permissions = parse.RemoveDuplicates(perms) + } + return loginUser, nil +} + +// UpdateLoginDateAndIP 更新登录时间和IP +func (s *Account) UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool { + sysUser := loginUser.User + userInfo := model.SysUser{ + UserID: sysUser.UserID, + LoginIP: sysUser.LoginIP, + LoginDate: sysUser.LoginDate, + UpdateBy: sysUser.UserName, + Sex: sysUser.Sex, + PhoneNumber: sysUser.PhoneNumber, + Email: sysUser.Email, + Remark: sysUser.Remark, + } + rows := s.sysUserService.UpdateUser(userInfo) + return rows > 0 +} + +// ClearLoginRecordCache 清除错误记录次数 +func (s *Account) ClearLoginRecordCache(username string) bool { + cacheKey := cachekey.PWD_ERR_CNT_KEY + username + hasKey, _ := redis.Has("", cacheKey) + if hasKey { + delOk, _ := redis.Del("", cacheKey) + return delOk + } + return false +} + +// passwordRetryCount 密码重试次数 +func (s *Account) passwordRetryCount(username string) (string, int64, time.Duration, error) { + // 从数据库配置获取登录次数和错误锁定时间 + maxRetryCountStr := s.sysConfigService.SelectConfigValueByKey("sys.user.maxRetryCount") + lockTimeStr := s.sysConfigService.SelectConfigValueByKey("sys.user.lockTime") + + // 验证登录次数和错误锁定时间 + maxRetryCount := parse.Number(maxRetryCountStr) + lockTime := parse.Number(lockTimeStr) + // 验证缓存记录次数 + retrykey := cachekey.PWD_ERR_CNT_KEY + username + retryCount, err := redis.Get("", retrykey) + if retryCount == "" || err != nil { + retryCount = "0" + } + // 是否超过错误值 + retryCountInt64 := parse.Number(retryCount) + if retryCountInt64 >= maxRetryCount { + // 密码输入错误多次,帐户已被锁定 + errorMsg := fmt.Errorf("login.errRetryPasswd") + return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, errorMsg + } + return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil +} + +// RoleAndMenuPerms 角色和菜单数据权限 +func (s *Account) RoleAndMenuPerms(userId string, isAdmin bool) ([]string, []string) { + if isAdmin { + return []string{adminConstants.ROLE_KEY}, []string{adminConstants.PERMISSION} + } else { + // 角色key + roleGroup := []string{} + roles := s.sysRoleService.SelectRoleListByUserId(userId) + for _, role := range roles { + roleGroup = append(roleGroup, role.RoleKey) + } + // 菜单权限key + perms := s.sysMenuService.SelectMenuPermsByUserId(userId) + return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) + } +} + +// RouteMenus 前端路由所需要的菜单 +func (s *Account) RouteMenus(userId string, isAdmin bool) []vo.Router { + var buildMenus []vo.Router + if isAdmin { + menus := s.sysMenuService.SelectMenuTreeByUserId("*") + buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") + } else { + menus := s.sysMenuService.SelectMenuTreeByUserId(userId) + buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") + } + return buildMenus } diff --git a/src/modules/common/service/account.impl.go b/src/modules/common/service/account.impl.go deleted file mode 100644 index d9a1631..0000000 --- a/src/modules/common/service/account.impl.go +++ /dev/null @@ -1,190 +0,0 @@ -package service - -import ( - "fmt" - "time" - - "nms_cxy/src/framework/config" - adminConstants "nms_cxy/src/framework/constants/admin" - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/crypto" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo" - "nms_cxy/src/modules/system/model" - systemService "nms_cxy/src/modules/system/service" -) - -// 实例化服务层 AccountImpl 结构体 -var NewAccountImpl = &AccountImpl{ - sysUserService: systemService.NewSysUserImpl, - sysConfigService: systemService.NewSysConfigImpl, - sysRoleService: systemService.NewSysRoleImpl, - sysMenuService: systemService.NewSysMenuImpl, -} - -// 账号身份操作服务 服务层处理 -type AccountImpl struct { - // 用户信息服务 - sysUserService systemService.ISysUser - // 参数配置服务 - sysConfigService systemService.ISysConfig - // 角色服务 - sysRoleService systemService.ISysRole - // 菜单服务 - sysMenuService systemService.ISysMenu -} - -// ValidateCaptcha 校验验证码 -func (s *AccountImpl) ValidateCaptcha(code, uuid string) error { - // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 - captchaEnabledStr := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaEnabled") - if !parse.Boolean(captchaEnabledStr) { - return nil - } - if code == "" || uuid == "" { - // 验证码信息错误 - return fmt.Errorf("captcha.err") - } - verifyKey := cachekey.CAPTCHA_CODE_KEY + uuid - captcha, _ := redis.Get("", verifyKey) - if captcha == "" { - // 验证码已失效 - return fmt.Errorf("captcha.errValid") - } - redis.Del("", verifyKey) - if captcha != code { - // 验证码错误 - return fmt.Errorf("captcha.err") - } - return nil -} - -// LoginByUsername 登录创建用户信息 -func (s *AccountImpl) LoginByUsername(username, password string) (vo.LoginUser, error) { - loginUser := vo.LoginUser{} - - // 检查密码重试次数 - retrykey, retryCount, lockTime, err := s.passwordRetryCount(username) - if err != nil { - return loginUser, err - } - - // 查询用户登录账号 - sysUser := s.sysUserService.SelectUserByUserName(username) - if sysUser.UserName != username { - return loginUser, fmt.Errorf("login.errNameOrPasswd") - } - if sysUser.DelFlag == common.STATUS_YES { - // 对不起,您的账号已被删除 - return loginUser, fmt.Errorf("login.errDelFlag") - } - if sysUser.Status == common.STATUS_NO { - return loginUser, fmt.Errorf("login.errStatus") - } - - // 检验用户密码 - compareBool := crypto.BcryptCompare(password, sysUser.Password) - if !compareBool { - redis.SetByExpire("", retrykey, retryCount+1, lockTime) - // 用户不存在或密码错误 - return loginUser, fmt.Errorf("login.errNameOrPasswd") - } else { - // 清除错误记录次数 - s.ClearLoginRecordCache(username) - } - - // 登录用户信息 - loginUser.UserID = sysUser.UserID - loginUser.DeptID = sysUser.DeptID - loginUser.User = sysUser - // 用户权限组标识 - isAdmin := config.IsAdmin(sysUser.UserID) - if isAdmin { - loginUser.Permissions = []string{adminConstants.PERMISSION} - } else { - perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID) - loginUser.Permissions = parse.RemoveDuplicates(perms) - } - return loginUser, nil -} - -// UpdateLoginDateAndIP 更新登录时间和IP -func (s *AccountImpl) UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool { - sysUser := loginUser.User - userInfo := model.SysUser{ - UserID: sysUser.UserID, - LoginIP: sysUser.LoginIP, - LoginDate: sysUser.LoginDate, - UpdateBy: sysUser.UserName, - } - rows := s.sysUserService.UpdateUser(userInfo) - return rows > 0 -} - -// ClearLoginRecordCache 清除错误记录次数 -func (s *AccountImpl) ClearLoginRecordCache(username string) bool { - cacheKey := cachekey.PWD_ERR_CNT_KEY + username - hasKey, _ := redis.Has("", cacheKey) - if hasKey { - delOk, _ := redis.Del("", cacheKey) - return delOk - } - return false -} - -// passwordRetryCount 密码重试次数 -func (s *AccountImpl) passwordRetryCount(username string) (string, int64, time.Duration, error) { - // 从数据库配置获取登录次数和错误锁定时间 - maxRetryCountStr := s.sysConfigService.SelectConfigValueByKey("sys.user.maxRetryCount") - lockTimeStr := s.sysConfigService.SelectConfigValueByKey("sys.user.lockTime") - - // 验证登录次数和错误锁定时间 - maxRetryCount := parse.Number(maxRetryCountStr) - lockTime := parse.Number(lockTimeStr) - // 验证缓存记录次数 - retrykey := cachekey.PWD_ERR_CNT_KEY + username - retryCount, err := redis.Get("", retrykey) - if retryCount == "" || err != nil { - retryCount = "0" - } - // 是否超过错误值 - retryCountInt64 := parse.Number(retryCount) - if retryCountInt64 >= maxRetryCount { - // 密码输入错误多次,帐户已被锁定 - errorMsg := fmt.Errorf("login.errRetryPasswd") - return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, errorMsg - } - return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil -} - -// RoleAndMenuPerms 角色和菜单数据权限 -func (s *AccountImpl) RoleAndMenuPerms(userId string, isAdmin bool) ([]string, []string) { - if isAdmin { - return []string{adminConstants.ROLE_KEY}, []string{adminConstants.PERMISSION} - } else { - // 角色key - roleGroup := []string{} - roles := s.sysRoleService.SelectRoleListByUserId(userId) - for _, role := range roles { - roleGroup = append(roleGroup, role.RoleKey) - } - // 菜单权限key - perms := s.sysMenuService.SelectMenuPermsByUserId(userId) - return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) - } -} - -// RouteMenus 前端路由所需要的菜单 -func (s *AccountImpl) RouteMenus(userId string, isAdmin bool) []vo.Router { - var buildMenus []vo.Router - if isAdmin { - menus := s.sysMenuService.SelectMenuTreeByUserId("*") - buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") - } else { - menus := s.sysMenuService.SelectMenuTreeByUserId(userId) - buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") - } - return buildMenus -} diff --git a/src/modules/common/service/commont.impl.go b/src/modules/common/service/commont.impl.go index 34b7191..10ad3f8 100644 --- a/src/modules/common/service/commont.impl.go +++ b/src/modules/common/service/commont.impl.go @@ -3,11 +3,11 @@ package service import ( "fmt" - "nms_cxy/lib/global" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/utils/machine" - systemService "nms_cxy/src/modules/system/service" + "be.ems/lib/global" + "be.ems/src/framework/config" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/utils/machine" + systemService "be.ems/src/modules/system/service" ) // 实例化服务层 CommontImpl 结构体 diff --git a/src/modules/common/service/register.impl.go b/src/modules/common/service/register.impl.go index a292d1c..5f43d0a 100644 --- a/src/modules/common/service/register.impl.go +++ b/src/modules/common/service/register.impl.go @@ -3,12 +3,12 @@ package service import ( "fmt" - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/parse" - systemModel "nms_cxy/src/modules/system/model" - systemService "nms_cxy/src/modules/system/service" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/parse" + systemModel "be.ems/src/modules/system/model" + systemService "be.ems/src/modules/system/service" ) // 实例化服务层 RegisterImpl 结构体 diff --git a/src/modules/crontask/crontask.go b/src/modules/crontask/crontask.go index 2183908..0ee9d74 100644 --- a/src/modules/crontask/crontask.go +++ b/src/modules/crontask/crontask.go @@ -1,8 +1,8 @@ package crontask import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/modules/crontask/processor" + "be.ems/src/framework/logger" + "be.ems/src/modules/crontask/processor" "github.com/gin-gonic/gin" ) diff --git a/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go b/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go index 43354b7..10aa735 100644 --- a/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go +++ b/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go @@ -6,11 +6,11 @@ import ( "strings" "time" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/omc/config" - "nms_cxy/src/framework/cron" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/restagent/config" + "be.ems/src/framework/cron" ) var NewProcessor = &BarProcessor{ diff --git a/src/modules/crontask/processor/delExpiredNeBackup/delExpiredNeBackup.go b/src/modules/crontask/processor/delExpiredNeBackup/delExpiredNeBackup.go index a130344..c4b9c55 100644 --- a/src/modules/crontask/processor/delExpiredNeBackup/delExpiredNeBackup.go +++ b/src/modules/crontask/processor/delExpiredNeBackup/delExpiredNeBackup.go @@ -4,9 +4,9 @@ import ( "encoding/json" "fmt" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/src/framework/cron" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/src/framework/cron" ) var NewProcessor = &BarProcessor{ diff --git a/src/modules/crontask/processor/deleteExpiredRecord/deleteExpiredRecord.go b/src/modules/crontask/processor/deleteExpiredRecord/deleteExpiredRecord.go index fd83e2b..e9cd27a 100644 --- a/src/modules/crontask/processor/deleteExpiredRecord/deleteExpiredRecord.go +++ b/src/modules/crontask/processor/deleteExpiredRecord/deleteExpiredRecord.go @@ -4,9 +4,9 @@ import ( "encoding/json" "fmt" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/src/framework/cron" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/src/framework/cron" ) var NewProcessor = &BarProcessor{ diff --git a/src/modules/crontask/processor/exportTable/exportTable.go b/src/modules/crontask/processor/exportTable/exportTable.go new file mode 100644 index 0000000..e0f8a98 --- /dev/null +++ b/src/modules/crontask/processor/exportTable/exportTable.go @@ -0,0 +1,160 @@ +package exportTable + +import ( + "database/sql" + "encoding/csv" + "encoding/json" + "fmt" + "os" + "time" + + "be.ems/lib/dborm" + "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 { + Duration int `json:"duration"` + TableName string `json:"tableName"` + Columns string `json:"columns"` // exported column name of time string + TimeCol string `json:"timeCol"` // time stamp of column name + TimeUnit string `json:"timeUnit"` // timestamp unit: second/micro/milli + Extras string `json:"extras"` // extras condition for where + FilePath string `json:"filePath"` // file path +} + +func (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), ¶ms) + if err != nil { + return nil, err + } + + // mkdir if not exist + if _, err = os.Stat(params.FilePath); os.IsNotExist(err) { + err = os.MkdirAll(params.FilePath, os.ModePerm) + if err != nil { + log.Error("Failed to Mkdir:", err) + return nil, err + } + } + //duration = params.Duration + + now := time.Now() + end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) + start := end.Add(-time.Duration(params.Duration) * time.Hour) + + var startTime, endTime int64 + switch params.TimeUnit { + case "second": + // 格式化时间戳为秒级 + startTime = start.Unix() + endTime = end.Unix() + case "milli": + // 格式化时间戳为毫秒级 + startTime = start.UnixMilli() + endTime = end.UnixMilli() + case "micro": + // 格式化时间戳为微妙级 + startTime = start.UnixMicro() + endTime = end.UnixMicro() + default: + return nil, fmt.Errorf("error input parameter") + } + var query string + if params.Extras != "" { + query = fmt.Sprintf("SELECT %s FROM `%s` WHERE `%s` >= %d AND `%s` < %d AND %s", + params.Columns, params.TableName, params.TimeCol, startTime, params.TimeCol, endTime, params.Extras) + } else { + query = fmt.Sprintf("SELECT %s FROM `%s` WHERE `%s` >= %d AND `%s` < %d", + params.Columns, params.TableName, params.TimeCol, startTime, params.TimeCol, endTime) + } + log.Trace("query:", query) + filePath := fmt.Sprintf("%s/%s_export_%s.csv", params.FilePath, params.TableName, time.Now().Format("20060102150405")) + affected, err := s.exportData(query, filePath) + if err != nil { + return nil, err + } + + // 返回结果,用于记录执行结果 + return map[string]any{ + "msg": "sucess", + "filePath": filePath, + "affected": affected, + }, nil +} + +func (s *BarProcessor) exportData(query, filePath string) (int64, error) { + rows, err := dborm.XCoreDB().Query(query) + if err != nil { + return 0, err + } + defer rows.Close() + + // 创建 CSV 文件 + file, err := os.Create(filePath) + if err != nil { + return 0, err + } + defer file.Close() + + writer := csv.NewWriter(file) + defer writer.Flush() + + // 写入表头 + columns, _ := rows.ColumnTypes() + header := make([]string, len(columns)) + for i, col := range columns { + header[i] = col.Name() + } + if err := writer.Write(header); err != nil { + return 0, err + } + + // 写入数据 + var affected int64 = 0 + for rows.Next() { + values := make([]sql.RawBytes, len(columns)) + scanArgs := make([]interface{}, len(columns)) + for i := range values { + scanArgs[i] = &values[i] + } + + if err := rows.Scan(scanArgs...); err != nil { + return 0, err + } + + record := make([]string, len(columns)) + for i, val := range values { + if val == nil { + record[i] = "" + } else { + record[i] = string(val) + } + } + affected++ + if err := writer.Write(record); err != nil { + return affected, err + } + } + + return affected, nil +} diff --git a/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go b/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go index e853a30..443f554 100644 --- a/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go +++ b/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go @@ -8,13 +8,12 @@ import ( "strings" "time" - "nms_cxy/features/fm" - "nms_cxy/lib/dborm" - "nms_cxy/lib/global" - "nms_cxy/lib/log" - "nms_cxy/omc/config" - "nms_cxy/src/framework/cron" - + "be.ems/features/fm" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/restagent/config" + "be.ems/src/framework/cron" "github.com/go-resty/resty/v2" ) diff --git a/src/modules/crontask/processor/getStateFromNE/getStateFromNE.go b/src/modules/crontask/processor/getStateFromNE/getStateFromNE.go index 5525c07..98fe8f9 100644 --- a/src/modules/crontask/processor/getStateFromNE/getStateFromNE.go +++ b/src/modules/crontask/processor/getStateFromNE/getStateFromNE.go @@ -7,11 +7,10 @@ import ( "strings" "time" - "nms_cxy/lib/dborm" - "nms_cxy/lib/log" - "nms_cxy/omc/config" - "nms_cxy/src/framework/cron" - + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/restagent/config" + "be.ems/src/framework/cron" "github.com/go-resty/resty/v2" ) diff --git a/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go b/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go index 1b5bdf8..401d023 100644 --- a/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go +++ b/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go @@ -4,13 +4,13 @@ import ( "encoding/json" "fmt" - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/logger" - monitorService "nms_cxy/src/modules/monitor/service" + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" + monitorService "be.ems/src/modules/monitor/service" ) var NewProcessor = &MonitorSysResourceProcessor{ - monitorService: monitorService.NewMonitorImpl, + monitorService: monitorService.NewMonitor, count: 0, openDataCancel: false, } @@ -18,7 +18,7 @@ var NewProcessor = &MonitorSysResourceProcessor{ // MonitorSysResourceProcessor 系统资源CPU/IO/Netword收集 type MonitorSysResourceProcessor struct { // 服务器系统相关信息服务 - monitorService monitorService.IMonitor + monitorService *monitorService.Monitor // 执行次数 count int // 是否已经开启数据通道 diff --git a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go index ce846ee..bb36135 100644 --- a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go +++ b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go @@ -4,26 +4,23 @@ import ( "fmt" "path/filepath" - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/logger" - neModel "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" ) var NewProcessor = &NeConfigBackupProcessor{ - neConfigBackupService: neService.NewNeConfigBackupImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigBackupService: neService.NewNeConfigBackup, + neInfoService: neService.NewNeInfo, count: 0, } // NeConfigBackupProcessor 网元配置文件定期备份 type NeConfigBackupProcessor struct { - // 网元配置文件备份记录服务 - neConfigBackupService neService.INeConfigBackup - // 网元信息服务 - neInfoService neService.INeInfo - // 执行次数 - count int + neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 + neInfoService *neService.NeInfo // 网元信息服务 + count int // 执行次数 } func (s *NeConfigBackupProcessor) Execute(data any) (any, error) { diff --git a/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go b/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go new file mode 100644 index 0000000..ae583ae --- /dev/null +++ b/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go @@ -0,0 +1,45 @@ +package ne_data_udm + +import ( + "fmt" + + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" + neDataService "be.ems/src/modules/network_data/service" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" +) + +var NewProcessor = &NeDataUDM{ + udmAuthService: neDataService.NewUDMAuthUser, + udmSubService: neDataService.NewUDMSubUser, + neInfoService: neService.NewNeInfo, + count: 0, +} + +// NeDataUDM 网元配置文件定期备份 +type NeDataUDM struct { + udmAuthService *neDataService.UDMAuthUser // UDM鉴权信息 + udmSubService *neDataService.UDMSubUser // UDM签约信息 + neInfoService *neService.NeInfo // 网元信息服务 + count int // 执行次数 +} + +func (s *NeDataUDM) Execute(data any) (any, error) { + s.count++ // 执行次数加一 + options := data.(cron.JobData) + sysJob := options.SysJob + logger.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + // 返回结果,用于记录执行结果 + result := map[string]any{ + "count": s.count, + } + + neList := s.neInfoService.SelectList(neModel.NeInfo{NeType: "UDM"}, false, false) + for _, neInfo := range neList { + result[fmt.Sprintf("AuthNumber_%s", neInfo.NeId)] = s.udmAuthService.ResetData(neInfo.NeId) + result[fmt.Sprintf("SubNumber_%s", neInfo.NeId)] = s.udmSubService.ResetData(neInfo.NeId) + } + + return result, nil +} diff --git a/src/modules/crontask/processor/processor.go b/src/modules/crontask/processor/processor.go index b90a33c..9e41b04 100644 --- a/src/modules/crontask/processor/processor.go +++ b/src/modules/crontask/processor/processor.go @@ -1,14 +1,17 @@ package processor import ( - "nms_cxy/src/framework/cron" - "nms_cxy/src/modules/crontask/processor/backupEtcFromNE" - "nms_cxy/src/modules/crontask/processor/delExpiredNeBackup" - "nms_cxy/src/modules/crontask/processor/deleteExpiredRecord" - "nms_cxy/src/modules/crontask/processor/genNeStateAlarm" - "nms_cxy/src/modules/crontask/processor/getStateFromNE" - processorMonitorSysResource "nms_cxy/src/modules/crontask/processor/monitor_sys_resource" - processorNeConfigBackup "nms_cxy/src/modules/crontask/processor/ne_config_backup" + "be.ems/src/framework/cron" + "be.ems/src/modules/crontask/processor/backupEtcFromNE" + "be.ems/src/modules/crontask/processor/delExpiredNeBackup" + "be.ems/src/modules/crontask/processor/deleteExpiredRecord" + "be.ems/src/modules/crontask/processor/exportTable" + "be.ems/src/modules/crontask/processor/genNeStateAlarm" + "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" + processorNeDataUDM "be.ems/src/modules/crontask/processor/ne_data_udm" + "be.ems/src/modules/crontask/processor/removeFile" ) // InitCronQueue 初始定时任务队列 @@ -17,10 +20,14 @@ func InitCronQueue() { cron.CreateQueue("monitor_sys_resource", processorMonitorSysResource.NewProcessor) // 网元-网元配置文件定期备份 cron.CreateQueue("ne_config_backup", processorNeConfigBackup.NewProcessor) + // 网元数据-UDM数据刷新同步 + cron.CreateQueue("ne_data_udm", processorNeDataUDM.NewProcessor) // delete expired NE backup file cron.CreateQueue("delExpiredNeBackup", delExpiredNeBackup.NewProcessor) cron.CreateQueue("deleteExpiredRecord", deleteExpiredRecord.NewProcessor) cron.CreateQueue("backupEtcFromNE", backupEtcFromNE.NewProcessor) cron.CreateQueue("getStateFromNE", getStateFromNE.NewProcessor) cron.CreateQueue("genNeStateAlarm", genNeStateAlarm.NewProcessor) + cron.CreateQueue("exportTable", exportTable.NewProcessor) + cron.CreateQueue("removeFile", removeFile.NewProcessor) } diff --git a/src/modules/crontask/processor/removeFile/removeFile.go b/src/modules/crontask/processor/removeFile/removeFile.go new file mode 100644 index 0000000..5420b40 --- /dev/null +++ b/src/modules/crontask/processor/removeFile/removeFile.go @@ -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), ¶ms) + 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 +} diff --git a/src/modules/monitor/controller/monitor.go b/src/modules/monitor/controller/monitor.go index 9287aae..17f44dd 100644 --- a/src/modules/monitor/controller/monitor.go +++ b/src/modules/monitor/controller/monitor.go @@ -1,25 +1,24 @@ package controller import ( - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/monitor/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/monitor/service" "github.com/gin-gonic/gin" ) // 实例化控制层 MonitorInfoController 结构体 var NewMonitor = &MonitorController{ - monitorService: service.NewMonitorImpl, + monitorService: service.NewMonitor, } // 服务器资源监控信息 // // PATH /monitor type MonitorController struct { - // 服务器系统相关信息服务 - monitorService service.IMonitor + monitorService *service.Monitor // 服务器系统相关信息服务 } // 资源监控信息加载 diff --git a/src/modules/monitor/controller/sys_cache.go b/src/modules/monitor/controller/sys_cache.go index 036e58c..4baa442 100644 --- a/src/modules/monitor/controller/sys_cache.go +++ b/src/modules/monitor/controller/sys_cache.go @@ -1,12 +1,12 @@ package controller import ( - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/monitor/model" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/i18n" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/monitor/model" "github.com/gin-gonic/gin" ) diff --git a/src/modules/monitor/controller/sys_job.go b/src/modules/monitor/controller/sys_job.go index 333db6d..07868c8 100644 --- a/src/modules/monitor/controller/sys_job.go +++ b/src/modules/monitor/controller/sys_job.go @@ -7,14 +7,14 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/monitor/model" - "nms_cxy/src/modules/monitor/service" - systemService "nms_cxy/src/modules/system/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/service" + systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -22,18 +22,16 @@ import ( // 实例化控制层 SysJobLogController 结构体 var NewSysJob = &SysJobController{ - sysJobService: service.NewSysJobImpl, - sysDictDataService: systemService.NewSysDictDataImpl, + sysJobService: service.NewSysJob, + sysDictDataService: systemService.NewSysDictData, } // 调度任务信息 // // PATH /monitor/job type SysJobController struct { - // 调度任务服务 - sysJobService service.ISysJob - // 字典数据服务 - sysDictDataService systemService.ISysDictData + sysJobService *service.SysJob // 调度任务服务 + sysDictDataService *systemService.SysDictData // 字典数据服务 } // 调度任务列表 diff --git a/src/modules/monitor/controller/sys_job_log.go b/src/modules/monitor/controller/sys_job_log.go index c8897fd..9401a28 100644 --- a/src/modules/monitor/controller/sys_job_log.go +++ b/src/modules/monitor/controller/sys_job_log.go @@ -6,33 +6,31 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/monitor/model" - "nms_cxy/src/modules/monitor/service" - systemService "nms_cxy/src/modules/system/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/service" + systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) // 实例化控制层 SysJobLogController 结构体 var NewSysJobLog = &SysJobLogController{ - sysJobLogService: service.NewSysJobLogImpl, - sysDictDataService: systemService.NewSysDictDataImpl, + sysJobLogService: service.NewSysJobLog, + sysDictDataService: systemService.NewSysDictData, } // 调度任务日志信息 // // PATH /monitor/jobLog type SysJobLogController struct { - // 调度任务日志服务 - sysJobLogService service.ISysJobLog - // 字典数据服务 - sysDictDataService systemService.ISysDictData + sysJobLogService *service.SysJobLog // 调度任务日志服务 + sysDictDataService *systemService.SysDictData // 字典数据服务 } // 调度任务日志列表 @@ -44,7 +42,7 @@ func (s *SysJobLogController) List(c *gin.Context) { querys := ctx.QueryMap(c) // 任务ID优先级更高 if v, ok := querys["jobId"]; ok && v != nil { - jobInfo := service.NewSysJobImpl.SelectJobById(v.(string)) + jobInfo := service.NewSysJob.SelectJobById(v.(string)) querys["jobName"] = jobInfo.JobName querys["jobGroup"] = jobInfo.JobGroup } diff --git a/src/modules/monitor/controller/sys_user_online.go b/src/modules/monitor/controller/sys_user_online.go index 1b94ff9..072cad3 100644 --- a/src/modules/monitor/controller/sys_user_online.go +++ b/src/modules/monitor/controller/sys_user_online.go @@ -5,29 +5,28 @@ import ( "sort" "strings" - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/monitor/model" - "nms_cxy/src/modules/monitor/service" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/i18n" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/service" "github.com/gin-gonic/gin" ) // 实例化控制层 SysUserOnlineController 结构体 var NewSysUserOnline = &SysUserOnlineController{ - sysUserOnlineService: service.NewSysUserOnlineImpl, + sysUserOnlineService: service.NewSysUserOnline, } // 在线用户监控 // // PATH /monitor/online type SysUserOnlineController struct { - // 在线用户服务 - sysUserOnlineService service.ISysUserOnline + sysUserOnlineService *service.SysUserOnline // 在线用户服务 } // 在线用户列表 diff --git a/src/modules/monitor/controller/system_info.go b/src/modules/monitor/controller/system_info.go index c8f1473..14437dd 100644 --- a/src/modules/monitor/controller/system_info.go +++ b/src/modules/monitor/controller/system_info.go @@ -1,23 +1,22 @@ package controller import ( - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/monitor/service" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/monitor/service" "github.com/gin-gonic/gin" ) // 实例化控制层 SystemInfoController 结构体 var NewSystemInfo = &SystemInfoController{ - systemInfogService: service.NewSystemInfoImpl, + systemInfogService: service.NewSystemInfo, } // 服务器监控信息 // // PATH /monitor/system-info type SystemInfoController struct { - // 服务器系统相关信息服务 - systemInfogService service.ISystemInfo + systemInfogService *service.SystemInfo // 服务器系统相关信息服务 } // 服务器信息 diff --git a/src/modules/monitor/monitor.go b/src/modules/monitor/monitor.go index c604634..b71bbfa 100644 --- a/src/modules/monitor/monitor.go +++ b/src/modules/monitor/monitor.go @@ -1,13 +1,13 @@ package monitor import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/framework/middleware/collectlogs" - "nms_cxy/src/framework/middleware/repeat" - "nms_cxy/src/modules/monitor/controller" - "nms_cxy/src/modules/monitor/processor" - "nms_cxy/src/modules/monitor/service" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/framework/middleware/repeat" + "be.ems/src/modules/monitor/controller" + "be.ems/src/modules/monitor/processor" + "be.ems/src/modules/monitor/service" "github.com/gin-gonic/gin" ) @@ -165,5 +165,5 @@ func InitLoad() { // 初始化定时任务处理 processor.InitCronQueue() // 启动时,初始化调度任务 - service.NewSysJobImpl.ResetQueueJob() + service.NewSysJob.ResetQueueJob() } diff --git a/src/modules/monitor/processor/bar/bar.go b/src/modules/monitor/processor/bar/bar.go index df606c8..ce58cfe 100644 --- a/src/modules/monitor/processor/bar/bar.go +++ b/src/modules/monitor/processor/bar/bar.go @@ -3,8 +3,8 @@ package bar import ( "time" - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" ) var NewProcessor = &BarProcessor{ diff --git a/src/modules/monitor/processor/foo/foo.go b/src/modules/monitor/processor/foo/foo.go index 50dbab9..21380d4 100644 --- a/src/modules/monitor/processor/foo/foo.go +++ b/src/modules/monitor/processor/foo/foo.go @@ -3,8 +3,8 @@ package foo import ( "time" - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" ) var NewProcessor = &FooProcessor{ diff --git a/src/modules/monitor/processor/processor.go b/src/modules/monitor/processor/processor.go index afc86c0..d50b0e8 100644 --- a/src/modules/monitor/processor/processor.go +++ b/src/modules/monitor/processor/processor.go @@ -1,10 +1,10 @@ package processor import ( - "nms_cxy/src/framework/cron" - "nms_cxy/src/modules/monitor/processor/bar" - "nms_cxy/src/modules/monitor/processor/foo" - "nms_cxy/src/modules/monitor/processor/simple" + "be.ems/src/framework/cron" + "be.ems/src/modules/monitor/processor/bar" + "be.ems/src/modules/monitor/processor/foo" + "be.ems/src/modules/monitor/processor/simple" ) // InitCronQueue 初始定时任务队列 diff --git a/src/modules/monitor/processor/simple/simple.go b/src/modules/monitor/processor/simple/simple.go index 8d87e6e..4c2c08d 100644 --- a/src/modules/monitor/processor/simple/simple.go +++ b/src/modules/monitor/processor/simple/simple.go @@ -1,8 +1,8 @@ package simple import ( - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" ) var NewProcessor = &simpleProcessor{} diff --git a/src/modules/monitor/repository/monitor.go b/src/modules/monitor/repository/monitor.go index cba98cc..8a843df 100644 --- a/src/modules/monitor/repository/monitor.go +++ b/src/modules/monitor/repository/monitor.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/monitor/model" +import "be.ems/src/modules/monitor/model" // IMonitor 监控服务资源相关信息 数据接口 type IMonitor interface { diff --git a/src/modules/monitor/repository/monitor.impl.go b/src/modules/monitor/repository/monitor.impl.go index ba7ced3..9a47e58 100644 --- a/src/modules/monitor/repository/monitor.impl.go +++ b/src/modules/monitor/repository/monitor.impl.go @@ -1,10 +1,9 @@ package repository import ( - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/modules/monitor/model" - + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/modules/monitor/model" "gorm.io/gorm" ) diff --git a/src/modules/monitor/repository/sys_job.go b/src/modules/monitor/repository/sys_job.go index 5a9a6ff..89d50b0 100644 --- a/src/modules/monitor/repository/sys_job.go +++ b/src/modules/monitor/repository/sys_job.go @@ -1,7 +1,7 @@ package repository import ( - "nms_cxy/src/modules/monitor/model" + "be.ems/src/modules/monitor/model" ) // ISysJob 调度任务表 数据层接口 diff --git a/src/modules/monitor/repository/sys_job.impl.go b/src/modules/monitor/repository/sys_job.impl.go index 075a1e0..0f88a57 100644 --- a/src/modules/monitor/repository/sys_job.impl.go +++ b/src/modules/monitor/repository/sys_job.impl.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/monitor/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/monitor/model" ) // 实例化数据层 SysJobImpl 结构体 diff --git a/src/modules/monitor/repository/sys_job_log.go b/src/modules/monitor/repository/sys_job_log.go index 11ffa07..61375c1 100644 --- a/src/modules/monitor/repository/sys_job_log.go +++ b/src/modules/monitor/repository/sys_job_log.go @@ -1,7 +1,7 @@ package repository import ( - "nms_cxy/src/modules/monitor/model" + "be.ems/src/modules/monitor/model" ) // 调度任务日志表 数据层接口 diff --git a/src/modules/monitor/repository/sys_job_log.impl.go b/src/modules/monitor/repository/sys_job_log.impl.go index 7cf2b5c..1f8a0d9 100644 --- a/src/modules/monitor/repository/sys_job_log.impl.go +++ b/src/modules/monitor/repository/sys_job_log.impl.go @@ -4,11 +4,11 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/monitor/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/monitor/model" ) // 实例化数据层 SysJobLogImpl 结构体 diff --git a/src/modules/monitor/service/monitor.go b/src/modules/monitor/service/monitor.go index 5e836cc..285a265 100644 --- a/src/modules/monitor/service/monitor.go +++ b/src/modules/monitor/service/monitor.go @@ -1,14 +1,274 @@ package service -// IMonitor 服务器系统相关信息 服务层接口 -type IMonitor interface { - // RunMonitor 执行资源监控 - RunMonitor() +import ( + "context" + "strconv" + "time" - // RunMonitorDataCancel 启动资源监控数据存储io/network通道 移除之前的chan上下文后在设置新的均值 - // interval 采集的平均值(分钟) - RunMonitorDataCancel(removeBefore bool, interval float64) + "be.ems/src/framework/logger" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" + systemService "be.ems/src/modules/system/service" + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/disk" + "github.com/shirou/gopsutil/v4/load" + "github.com/shirou/gopsutil/v4/mem" + "github.com/shirou/gopsutil/v4/net" +) - // SelectMonitorInfo 查询监控资源信息 - SelectMonitorInfo(query map[string]any) map[string]any +// 实例化服务层 Monitor 结构体 +var NewMonitor = &Monitor{ + sysConfigService: systemService.NewSysConfigImpl, + monitorRepository: repository.NewMonitorImpl, + diskIO: make(chan []disk.IOCountersStat, 2), + netIO: make(chan []net.IOCountersStat, 2), +} + +// Monitor 服务器系统相关信息 服务层处理 +type Monitor struct { + // 参数配置服务 + sysConfigService systemService.ISysConfig + // 监控服务资源数据信息 + monitorRepository repository.IMonitor + // 磁盘网络IO 数据通道 + diskIO chan ([]disk.IOCountersStat) + netIO chan ([]net.IOCountersStat) +} + +// RunMonitor 执行资源监控 +func (s *Monitor) RunMonitor() { + var itemBase model.MonitorBase + itemBase.CreateTime = time.Now().UnixMilli() + itemBase.NeType = "#" + itemBase.NeID = "#" + loadInfo, _ := load.Avg() + itemBase.CPULoad1 = loadInfo.Load1 + itemBase.CPULoad5 = loadInfo.Load5 + itemBase.CPULoad15 = loadInfo.Load15 + totalPercent, _ := cpu.Percent(3*time.Second, false) + if len(totalPercent) > 0 { + itemBase.CPU = totalPercent[0] + } + cpuCount, _ := cpu.Counts(false) + cpuAvg := (float64(cpuCount*2) * 0.75) * 100 + itemBase.LoadUsage = 0 + if cpuAvg > 0 { + itemBase.LoadUsage = loadInfo.Load1 / cpuAvg + } + + memoryInfo, _ := mem.VirtualMemory() + itemBase.Memory = memoryInfo.UsedPercent + + if err := s.monitorRepository.CreateMonitorBase(itemBase); err != nil { + logger.Errorf("CreateMonitorBase err: %v", err) + } + + // 将当前资源发送到chan中处理保存 + s.loadDiskIO() + s.loadNetIO() + + // 监控系统资源-保留天数 + storeDays := s.sysConfigService.SelectConfigValueByKey("monitor.sysResource.storeDays") + if storeDays != "" { + storeDays, _ := strconv.Atoi(storeDays) + ltTime := time.Now().AddDate(0, 0, -storeDays).UnixMilli() + _ = s.monitorRepository.DelMonitorBase(ltTime) + _ = s.monitorRepository.DelMonitorIO(ltTime) + _ = s.monitorRepository.DelMonitorNet(ltTime) + } +} + +func (s *Monitor) loadDiskIO() { + ioStat, _ := disk.IOCounters() + var diskIOList []disk.IOCountersStat + for _, io := range ioStat { + diskIOList = append(diskIOList, io) + } + s.diskIO <- diskIOList +} + +func (s *Monitor) loadNetIO() { + netStat, _ := net.IOCounters(true) + netStatAll, _ := net.IOCounters(false) + var netList []net.IOCountersStat + netList = append(netList, netStat...) + netList = append(netList, netStatAll...) + s.netIO <- netList +} + +// monitorCancel 监控搜集IO/Network上下文 +var monitorCancel context.CancelFunc + +// RunMonitorDataCancel 启动资源监控数据存储io/network通道 移除之前的chan上下文后在设置新的均值 +// interval 采集的平均值(分钟) +func (s *Monitor) RunMonitorDataCancel(removeBefore bool, interval float64) { + // 是否取消之前的 + if removeBefore { + monitorCancel() + } + + // 上下文控制 + ctx, cancel := context.WithCancel(context.Background()) + monitorCancel = cancel + + // chanl 通道进行存储数据 + go s.saveIODataToDB(ctx, interval) + go s.saveNetDataToDB(ctx, interval) +} + +func (s *Monitor) saveIODataToDB(ctx context.Context, interval float64) { + defer close(s.diskIO) + for { + select { + case <-ctx.Done(): + return + case ioStat := <-s.diskIO: + select { + case <-ctx.Done(): + return + case ioStat2 := <-s.diskIO: + var ioList []model.MonitorIO + timeMilli := time.Now().UnixMilli() + for _, io2 := range ioStat2 { + for _, io1 := range ioStat { + if io2.Name == io1.Name { + var itemIO model.MonitorIO + itemIO.CreateTime = timeMilli + itemIO.NeType = "#" + itemIO.NeID = "#" + itemIO.Name = io1.Name + + if io2.ReadBytes != 0 && io1.ReadBytes != 0 && io2.ReadBytes > io1.ReadBytes { + itemIO.Read = int64(float64(io2.ReadBytes-io1.ReadBytes) / interval / 60) + } + if io2.WriteBytes != 0 && io1.WriteBytes != 0 && io2.WriteBytes > io1.WriteBytes { + itemIO.Write = int64(float64(io2.WriteBytes-io1.WriteBytes) / interval / 60) + } + + if io2.ReadCount != 0 && io1.ReadCount != 0 && io2.ReadCount > io1.ReadCount { + itemIO.Count = int64(float64(io2.ReadCount-io1.ReadCount) / interval / 60) + } + writeCount := int64(0) + if io2.WriteCount != 0 && io1.WriteCount != 0 && io2.WriteCount > io1.WriteCount { + writeCount = int64(float64(io2.WriteCount-io1.WriteCount) / interval * 60) + } + if writeCount > itemIO.Count { + itemIO.Count = writeCount + } + + if io2.ReadTime != 0 && io1.ReadTime != 0 && io2.ReadTime > io1.ReadTime { + itemIO.Time = int64(float64(io2.ReadTime-io1.ReadTime) / interval / 60) + } + writeTime := int64(0) + if io2.WriteTime != 0 && io1.WriteTime != 0 && io2.WriteTime > io1.WriteTime { + writeTime = int64(float64(io2.WriteTime-io1.WriteTime) / interval / 60) + } + if writeTime > itemIO.Time { + itemIO.Time = writeTime + } + ioList = append(ioList, itemIO) + break + } + } + } + if err := s.monitorRepository.BatchCreateMonitorIO(ioList); err != nil { + logger.Errorf("BatchCreateMonitorIO err: %v", err) + } + s.diskIO <- ioStat2 + } + } + } +} + +func (s *Monitor) saveNetDataToDB(ctx context.Context, interval float64) { + defer close(s.netIO) + for { + select { + case <-ctx.Done(): + return + case netStat := <-s.netIO: + select { + case <-ctx.Done(): + return + case netStat2 := <-s.netIO: + var netList []model.MonitorNetwork + timeMilli := time.Now().UnixMilli() + for _, net2 := range netStat2 { + for _, net1 := range netStat { + if net2.Name == net1.Name { + var itemNet model.MonitorNetwork + itemNet.CreateTime = timeMilli + itemNet.NeType = "#" + itemNet.NeID = "#" + itemNet.Name = net1.Name + + if net2.BytesSent != 0 && net1.BytesSent != 0 && net2.BytesSent > net1.BytesSent { + itemNet.Up = float64(net2.BytesSent-net1.BytesSent) / 1024 / interval / 60 + } + if net2.BytesRecv != 0 && net1.BytesRecv != 0 && net2.BytesRecv > net1.BytesRecv { + itemNet.Down = float64(net2.BytesRecv-net1.BytesRecv) / 1024 / interval / 60 + } + netList = append(netList, itemNet) + break + } + } + } + + if err := s.monitorRepository.BatchCreateMonitorNet(netList); err != nil { + logger.Errorf("BatchCreateMonitorNet err: %v", err) + } + s.netIO <- netStat2 + } + } + } +} + +// SelectMonitorInfo 查询监控资源信息 +func (s *Monitor) SelectMonitorInfo(query map[string]any) map[string]any { + infoType := query["type"] + startTimeMilli := query["startTime"] + endTimeMilli := query["endTime"] + neType := query["neType"] + neId := query["neId"] + name := query["name"] + + // 返回数据 + backDatas := map[string]any{} + + // 基本信息 + if infoType == "all" || infoType == "load" || infoType == "cpu" || infoType == "memory" { + rows := s.monitorRepository.SelectMonitorBase(map[string]any{ + "startTime": startTimeMilli, + "endTime": endTimeMilli, + "neType": neType, + "neId": neId, + }) + backDatas["base"] = rows + } + + // 磁盘IO + if infoType == "all" || infoType == "io" { + rows := s.monitorRepository.SelectMonitorIO(map[string]any{ + "startTime": startTimeMilli, + "endTime": endTimeMilli, + "neType": neType, + "neId": neId, + "name": name, + }) + backDatas["io"] = rows + } + + // 网络 + if infoType == "all" || infoType == "network" { + rows := s.monitorRepository.SelectMonitorNetwork(map[string]any{ + "startTime": startTimeMilli, + "endTime": endTimeMilli, + "neType": neType, + "neId": neId, + "name": name, + }) + backDatas["network"] = rows + } + + return backDatas } diff --git a/src/modules/monitor/service/monitor.impl.go b/src/modules/monitor/service/monitor.impl.go deleted file mode 100644 index cad338d..0000000 --- a/src/modules/monitor/service/monitor.impl.go +++ /dev/null @@ -1,275 +0,0 @@ -package service - -import ( - "context" - "strconv" - "time" - - "nms_cxy/src/framework/logger" - "nms_cxy/src/modules/monitor/model" - "nms_cxy/src/modules/monitor/repository" - systemService "nms_cxy/src/modules/system/service" - - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/disk" - "github.com/shirou/gopsutil/v4/load" - "github.com/shirou/gopsutil/v4/mem" - "github.com/shirou/gopsutil/v4/net" -) - -// 实例化服务层 MonitorImpl 结构体 -var NewMonitorImpl = &MonitorImpl{ - sysConfigService: systemService.NewSysConfigImpl, - monitorRepository: repository.NewMonitorImpl, - diskIO: make(chan []disk.IOCountersStat, 2), - netIO: make(chan []net.IOCountersStat, 2), -} - -// MonitorImpl 服务器系统相关信息 服务层处理 -type MonitorImpl struct { - // 参数配置服务 - sysConfigService systemService.ISysConfig - // 监控服务资源数据信息 - monitorRepository repository.IMonitor - // 磁盘网络IO 数据通道 - diskIO chan ([]disk.IOCountersStat) - netIO chan ([]net.IOCountersStat) -} - -// RunMonitor 执行资源监控 -func (s *MonitorImpl) RunMonitor() { - var itemBase model.MonitorBase - itemBase.CreateTime = time.Now().UnixMilli() - itemBase.NeType = "#" - itemBase.NeID = "#" - loadInfo, _ := load.Avg() - itemBase.CPULoad1 = loadInfo.Load1 - itemBase.CPULoad5 = loadInfo.Load5 - itemBase.CPULoad15 = loadInfo.Load15 - totalPercent, _ := cpu.Percent(3*time.Second, false) - if len(totalPercent) == 1 { - itemBase.CPU = totalPercent[0] - } - cpuCount, _ := cpu.Counts(false) - cpuAvg := (float64(cpuCount*2) * 0.75) * 100 - itemBase.LoadUsage = 0 - if cpuAvg > 0 { - itemBase.LoadUsage = loadInfo.Load1 / cpuAvg - } - - memoryInfo, _ := mem.VirtualMemory() - itemBase.Memory = memoryInfo.UsedPercent - - if err := s.monitorRepository.CreateMonitorBase(itemBase); err != nil { - logger.Errorf("CreateMonitorBase err: %v", err) - } - - // 将当前资源发送到chan中处理保存 - s.loadDiskIO() - s.loadNetIO() - - // 监控系统资源-保留天数 - storeDays := s.sysConfigService.SelectConfigValueByKey("monitor.sysResource.storeDays") - if storeDays != "" { - storeDays, _ := strconv.Atoi(storeDays) - ltTime := time.Now().AddDate(0, 0, -storeDays).UnixMilli() - _ = s.monitorRepository.DelMonitorBase(ltTime) - _ = s.monitorRepository.DelMonitorIO(ltTime) - _ = s.monitorRepository.DelMonitorNet(ltTime) - } -} - -func (s *MonitorImpl) loadDiskIO() { - ioStat, _ := disk.IOCounters() - var diskIOList []disk.IOCountersStat - for _, io := range ioStat { - diskIOList = append(diskIOList, io) - } - s.diskIO <- diskIOList -} - -func (s *MonitorImpl) loadNetIO() { - netStat, _ := net.IOCounters(true) - netStatAll, _ := net.IOCounters(false) - var netList []net.IOCountersStat - netList = append(netList, netStat...) - netList = append(netList, netStatAll...) - s.netIO <- netList -} - -// monitorCancel 监控搜集IO/Network上下文 -var monitorCancel context.CancelFunc - -// RunMonitorDataCancel 启动资源监控数据存储io/network通道 移除之前的chan上下文后在设置新的均值 -// interval 采集的平均值(分钟) -func (s *MonitorImpl) RunMonitorDataCancel(removeBefore bool, interval float64) { - // 是否取消之前的 - if removeBefore { - monitorCancel() - } - - // 上下文控制 - ctx, cancel := context.WithCancel(context.Background()) - monitorCancel = cancel - - // chanl 通道进行存储数据 - go s.saveIODataToDB(ctx, interval) - go s.saveNetDataToDB(ctx, interval) -} - -func (s *MonitorImpl) saveIODataToDB(ctx context.Context, interval float64) { - defer close(s.diskIO) - for { - select { - case <-ctx.Done(): - return - case ioStat := <-s.diskIO: - select { - case <-ctx.Done(): - return - case ioStat2 := <-s.diskIO: - var ioList []model.MonitorIO - timeMilli := time.Now().UnixMilli() - for _, io2 := range ioStat2 { - for _, io1 := range ioStat { - if io2.Name == io1.Name { - var itemIO model.MonitorIO - itemIO.CreateTime = timeMilli - itemIO.NeType = "#" - itemIO.NeID = "#" - itemIO.Name = io1.Name - - if io2.ReadBytes != 0 && io1.ReadBytes != 0 && io2.ReadBytes > io1.ReadBytes { - itemIO.Read = int64(float64(io2.ReadBytes-io1.ReadBytes) / interval / 60) - } - if io2.WriteBytes != 0 && io1.WriteBytes != 0 && io2.WriteBytes > io1.WriteBytes { - itemIO.Write = int64(float64(io2.WriteBytes-io1.WriteBytes) / interval / 60) - } - - if io2.ReadCount != 0 && io1.ReadCount != 0 && io2.ReadCount > io1.ReadCount { - itemIO.Count = int64(float64(io2.ReadCount-io1.ReadCount) / interval / 60) - } - writeCount := int64(0) - if io2.WriteCount != 0 && io1.WriteCount != 0 && io2.WriteCount > io1.WriteCount { - writeCount = int64(float64(io2.WriteCount-io1.WriteCount) / interval * 60) - } - if writeCount > itemIO.Count { - itemIO.Count = writeCount - } - - if io2.ReadTime != 0 && io1.ReadTime != 0 && io2.ReadTime > io1.ReadTime { - itemIO.Time = int64(float64(io2.ReadTime-io1.ReadTime) / interval / 60) - } - writeTime := int64(0) - if io2.WriteTime != 0 && io1.WriteTime != 0 && io2.WriteTime > io1.WriteTime { - writeTime = int64(float64(io2.WriteTime-io1.WriteTime) / interval / 60) - } - if writeTime > itemIO.Time { - itemIO.Time = writeTime - } - ioList = append(ioList, itemIO) - break - } - } - } - if err := s.monitorRepository.BatchCreateMonitorIO(ioList); err != nil { - logger.Errorf("BatchCreateMonitorIO err: %v", err) - } - s.diskIO <- ioStat2 - } - } - } -} - -func (s *MonitorImpl) saveNetDataToDB(ctx context.Context, interval float64) { - defer close(s.netIO) - for { - select { - case <-ctx.Done(): - return - case netStat := <-s.netIO: - select { - case <-ctx.Done(): - return - case netStat2 := <-s.netIO: - var netList []model.MonitorNetwork - timeMilli := time.Now().UnixMilli() - for _, net2 := range netStat2 { - for _, net1 := range netStat { - if net2.Name == net1.Name { - var itemNet model.MonitorNetwork - itemNet.CreateTime = timeMilli - itemNet.NeType = "#" - itemNet.NeID = "#" - itemNet.Name = net1.Name - - if net2.BytesSent != 0 && net1.BytesSent != 0 && net2.BytesSent > net1.BytesSent { - itemNet.Up = float64(net2.BytesSent-net1.BytesSent) / 1024 / interval / 60 - } - if net2.BytesRecv != 0 && net1.BytesRecv != 0 && net2.BytesRecv > net1.BytesRecv { - itemNet.Down = float64(net2.BytesRecv-net1.BytesRecv) / 1024 / interval / 60 - } - netList = append(netList, itemNet) - break - } - } - } - - if err := s.monitorRepository.BatchCreateMonitorNet(netList); err != nil { - logger.Errorf("BatchCreateMonitorNet err: %v", err) - } - s.netIO <- netStat2 - } - } - } -} - -// SelectMonitorInfo 查询监控资源信息 -func (s *MonitorImpl) SelectMonitorInfo(query map[string]any) map[string]any { - infoType := query["type"] - startTimeMilli := query["startTime"] - endTimeMilli := query["endTime"] - neType := query["neType"] - neId := query["neId"] - name := query["name"] - - // 返回数据 - backDatas := map[string]any{} - - // 基本信息 - if infoType == "all" || infoType == "load" || infoType == "cpu" || infoType == "memory" { - rows := s.monitorRepository.SelectMonitorBase(map[string]any{ - "startTime": startTimeMilli, - "endTime": endTimeMilli, - "neType": neType, - "neId": neId, - }) - backDatas["base"] = rows - } - - // 磁盘IO - if infoType == "all" || infoType == "io" { - rows := s.monitorRepository.SelectMonitorIO(map[string]any{ - "startTime": startTimeMilli, - "endTime": endTimeMilli, - "neType": neType, - "neId": neId, - "name": name, - }) - backDatas["io"] = rows - } - - // 网络 - if infoType == "all" || infoType == "network" { - rows := s.monitorRepository.SelectMonitorNetwork(map[string]any{ - "startTime": startTimeMilli, - "endTime": endTimeMilli, - "neType": neType, - "neId": neId, - "name": name, - }) - backDatas["network"] = rows - } - - return backDatas -} diff --git a/src/modules/monitor/service/monitor_test.go b/src/modules/monitor/service/monitor_test.go index 00ae73e..44dd2a7 100644 --- a/src/modules/monitor/service/monitor_test.go +++ b/src/modules/monitor/service/monitor_test.go @@ -12,10 +12,6 @@ import ( "github.com/shirou/gopsutil/v4/net" ) -func init() { - -} - func TestInfo(t *testing.T) { s := MonitorInfo{} s.load(0.5) // 0.5 半分钟 @@ -36,17 +32,21 @@ func (m *MonitorInfo) load(interval float64) { var itemBase MonitorBase itemBase.CreateTime = time.Now().UnixMilli() - totalPercent, _ := cpu.Percent(3*time.Second, false) - if len(totalPercent) == 1 { - itemBase.CPU = totalPercent[0] - } - cpuCount, _ := cpu.Counts(false) - loadInfo, _ := load.Avg() itemBase.CPULoad1 = loadInfo.Load1 itemBase.CPULoad5 = loadInfo.Load5 itemBase.CPULoad15 = loadInfo.Load15 - itemBase.LoadUsage = loadInfo.Load1 / (float64(cpuCount*2) * 0.75) * 100 + + totalPercent, _ := cpu.Percent(3*time.Second, false) + if len(totalPercent) > 0 { + itemBase.CPU = totalPercent[0] + } + cpuCount, _ := cpu.Counts(false) + cpuAvg := (float64(cpuCount*2) * 0.75) * 100 + itemBase.LoadUsage = 0 + if cpuAvg > 0 { + itemBase.LoadUsage = loadInfo.Load1 / cpuAvg + } memoryInfo, _ := mem.VirtualMemory() itemBase.Memory = memoryInfo.UsedPercent diff --git a/src/modules/monitor/service/sys_job.go b/src/modules/monitor/service/sys_job.go index 999da23..af1ca91 100644 --- a/src/modules/monitor/service/sys_job.go +++ b/src/modules/monitor/service/sys_job.go @@ -1,35 +1,169 @@ package service import ( - "nms_cxy/src/modules/monitor/model" + "fmt" + + "be.ems/src/framework/constants/common" + "be.ems/src/framework/cron" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" ) -// ISysJob 调度任务信息 服务层接口 -type ISysJob interface { - // SelectJobPage 分页查询调度任务集合 - SelectJobPage(query map[string]any) map[string]any - - // SelectJobList 查询调度任务集合 - SelectJobList(sysJob model.SysJob) []model.SysJob - - // SelectJobById 通过调度ID查询调度任务信息 - SelectJobById(jobId string) model.SysJob - - // CheckUniqueJobName 校验调度任务名称和组是否唯一 - CheckUniqueJobName(jobName, jobGroup, jobId string) bool - - // InsertJob 新增调度任务信息 - InsertJob(sysJob model.SysJob) string - - // UpdateJob 修改调度任务信息 - UpdateJob(sysJob model.SysJob) int64 - - // DeleteJobByIds 批量删除调度任务信息 - DeleteJobByIds(jobIds []string) (int64, error) - - // RunQueueJob 立即运行一次调度任务 - RunQueueJob(sysJob model.SysJob) bool - - // ResetQueueJob 重置初始调度任务 - ResetQueueJob() +// 实例化服务层 SysJob 结构体 +var NewSysJob = &SysJob{ + sysJobRepository: repository.NewSysJobImpl, +} + +// SysJob 调度任务 服务层处理 +type SysJob struct { + // 调度任务数据信息 + sysJobRepository repository.ISysJob +} + +// SelectJobPage 分页查询调度任务集合 +func (r *SysJob) SelectJobPage(query map[string]any) map[string]any { + return r.sysJobRepository.SelectJobPage(query) +} + +// SelectJobList 查询调度任务集合 +func (r *SysJob) SelectJobList(sysJob model.SysJob) []model.SysJob { + return r.sysJobRepository.SelectJobList(sysJob) +} + +// SelectJobById 通过调度ID查询调度任务信息 +func (r *SysJob) SelectJobById(jobId string) model.SysJob { + if jobId == "" { + return model.SysJob{} + } + jobs := r.sysJobRepository.SelectJobByIds([]string{jobId}) + if len(jobs) > 0 { + return jobs[0] + } + return model.SysJob{} +} + +// CheckUniqueJobName 校验调度任务名称和组是否唯一 +func (r *SysJob) CheckUniqueJobName(jobName, jobGroup, jobId string) bool { + uniqueId := r.sysJobRepository.CheckUniqueJob(model.SysJob{ + JobName: jobName, + JobGroup: jobGroup, + }) + if uniqueId == jobId { + return true + } + return uniqueId == "" +} + +// InsertJob 新增调度任务信息 +func (r *SysJob) InsertJob(sysJob model.SysJob) string { + insertId := r.sysJobRepository.InsertJob(sysJob) + if insertId == "" && sysJob.Status == common.STATUS_YES { + sysJob.JobID = insertId + r.insertQueueJob(sysJob, true) + } + return insertId +} + +// UpdateJob 修改调度任务信息 +func (r *SysJob) UpdateJob(sysJob model.SysJob) int64 { + rows := r.sysJobRepository.UpdateJob(sysJob) + if rows > 0 { + //状态正常添加队列任务 + if sysJob.Status == common.STATUS_YES { + r.insertQueueJob(sysJob, true) + } + // 状态禁用删除队列任务 + if sysJob.Status == common.STATUS_NO { + r.deleteQueueJob(sysJob) + } + } + return rows +} + +// DeleteJobByIds 批量删除调度任务信息 +func (r *SysJob) DeleteJobByIds(jobIds []string) (int64, error) { + // 检查是否存在 + jobs := r.sysJobRepository.SelectJobByIds(jobIds) + if len(jobs) <= 0 { + // 没有可访问调度任务数据! + return 0, fmt.Errorf("there is no accessible scheduling task data") + } + if len(jobs) == len(jobIds) { + // 清除任务 + for _, job := range jobs { + r.deleteQueueJob(job) + } + rows := r.sysJobRepository.DeleteJobByIds(jobIds) + return rows, nil + } + // 删除调度任务信息失败! + return 0, fmt.Errorf("failed to delete scheduling task information") +} + +// ResetQueueJob 重置初始调度任务 +func (r *SysJob) ResetQueueJob() { + // 获取注册的队列名称 + queueNames := cron.QueueNames() + if len(queueNames) == 0 { + return + } + // 查询系统中定义状态为正常启用的任务 + sysJobs := r.sysJobRepository.SelectJobList(model.SysJob{ + Status: common.STATUS_YES, + }) + for _, sysJob := range sysJobs { + for _, name := range queueNames { + if name == sysJob.InvokeTarget { + r.insertQueueJob(sysJob, true) + } + } + } +} + +// RunQueueJob 立即运行一次调度任务 +func (r *SysJob) RunQueueJob(sysJob model.SysJob) bool { + return r.insertQueueJob(sysJob, false) +} + +// insertQueueJob 添加调度任务 +func (r *SysJob) insertQueueJob(sysJob model.SysJob, repeat bool) bool { + // 获取队列 Processor + queue := cron.GetQueue(sysJob.InvokeTarget) + if queue.Name != sysJob.InvokeTarget { + return false + } + + // 给执行任务数据参数 + options := cron.JobData{ + Repeat: repeat, + SysJob: sysJob, + } + + // 不是重复任务的情况,立即执行一次 + if !repeat { + // 执行单次任务 + status := queue.RunJob(options, cron.JobOptions{ + JobId: sysJob.JobID, + }) + // 执行中或等待中的都返回正常 + return status == cron.Active || status == cron.Waiting + } + + // 执行重复任务 + queue.RunJob(options, cron.JobOptions{ + JobId: sysJob.JobID, + Cron: sysJob.CronExpression, + }) + + return true +} + +// deleteQueueJob 删除调度任务 +func (r *SysJob) deleteQueueJob(sysJob model.SysJob) bool { + // 获取队列 Processor + queue := cron.GetQueue(sysJob.InvokeTarget) + if queue.Name != sysJob.InvokeTarget { + return false + } + return queue.RemoveJob(sysJob.JobID) } diff --git a/src/modules/monitor/service/sys_job.impl.go b/src/modules/monitor/service/sys_job.impl.go deleted file mode 100644 index c590155..0000000 --- a/src/modules/monitor/service/sys_job.impl.go +++ /dev/null @@ -1,169 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/cron" - "nms_cxy/src/modules/monitor/model" - "nms_cxy/src/modules/monitor/repository" -) - -// 实例化服务层 SysJobImpl 结构体 -var NewSysJobImpl = &SysJobImpl{ - sysJobRepository: repository.NewSysJobImpl, -} - -// SysJobImpl 调度任务 服务层处理 -type SysJobImpl struct { - // 调度任务数据信息 - sysJobRepository repository.ISysJob -} - -// SelectJobPage 分页查询调度任务集合 -func (r *SysJobImpl) SelectJobPage(query map[string]any) map[string]any { - return r.sysJobRepository.SelectJobPage(query) -} - -// SelectJobList 查询调度任务集合 -func (r *SysJobImpl) SelectJobList(sysJob model.SysJob) []model.SysJob { - return r.sysJobRepository.SelectJobList(sysJob) -} - -// SelectJobById 通过调度ID查询调度任务信息 -func (r *SysJobImpl) SelectJobById(jobId string) model.SysJob { - if jobId == "" { - return model.SysJob{} - } - jobs := r.sysJobRepository.SelectJobByIds([]string{jobId}) - if len(jobs) > 0 { - return jobs[0] - } - return model.SysJob{} -} - -// CheckUniqueJobName 校验调度任务名称和组是否唯一 -func (r *SysJobImpl) CheckUniqueJobName(jobName, jobGroup, jobId string) bool { - uniqueId := r.sysJobRepository.CheckUniqueJob(model.SysJob{ - JobName: jobName, - JobGroup: jobGroup, - }) - if uniqueId == jobId { - return true - } - return uniqueId == "" -} - -// InsertJob 新增调度任务信息 -func (r *SysJobImpl) InsertJob(sysJob model.SysJob) string { - insertId := r.sysJobRepository.InsertJob(sysJob) - if insertId == "" && sysJob.Status == common.STATUS_YES { - sysJob.JobID = insertId - r.insertQueueJob(sysJob, true) - } - return insertId -} - -// UpdateJob 修改调度任务信息 -func (r *SysJobImpl) UpdateJob(sysJob model.SysJob) int64 { - rows := r.sysJobRepository.UpdateJob(sysJob) - if rows > 0 { - //状态正常添加队列任务 - if sysJob.Status == common.STATUS_YES { - r.insertQueueJob(sysJob, true) - } - // 状态禁用删除队列任务 - if sysJob.Status == common.STATUS_NO { - r.deleteQueueJob(sysJob) - } - } - return rows -} - -// DeleteJobByIds 批量删除调度任务信息 -func (r *SysJobImpl) DeleteJobByIds(jobIds []string) (int64, error) { - // 检查是否存在 - jobs := r.sysJobRepository.SelectJobByIds(jobIds) - if len(jobs) <= 0 { - // 没有可访问调度任务数据! - return 0, fmt.Errorf("there is no accessible scheduling task data") - } - if len(jobs) == len(jobIds) { - // 清除任务 - for _, job := range jobs { - r.deleteQueueJob(job) - } - rows := r.sysJobRepository.DeleteJobByIds(jobIds) - return rows, nil - } - // 删除调度任务信息失败! - return 0, fmt.Errorf("failed to delete scheduling task information") -} - -// ResetQueueJob 重置初始调度任务 -func (r *SysJobImpl) ResetQueueJob() { - // 获取注册的队列名称 - queueNames := cron.QueueNames() - if len(queueNames) == 0 { - return - } - // 查询系统中定义状态为正常启用的任务 - sysJobs := r.sysJobRepository.SelectJobList(model.SysJob{ - Status: common.STATUS_YES, - }) - for _, sysJob := range sysJobs { - for _, name := range queueNames { - if name == sysJob.InvokeTarget { - r.insertQueueJob(sysJob, true) - } - } - } -} - -// RunQueueJob 立即运行一次调度任务 -func (r *SysJobImpl) RunQueueJob(sysJob model.SysJob) bool { - return r.insertQueueJob(sysJob, false) -} - -// insertQueueJob 添加调度任务 -func (r *SysJobImpl) insertQueueJob(sysJob model.SysJob, repeat bool) bool { - // 获取队列 Processor - queue := cron.GetQueue(sysJob.InvokeTarget) - if queue.Name != sysJob.InvokeTarget { - return false - } - - // 给执行任务数据参数 - options := cron.JobData{ - Repeat: repeat, - SysJob: sysJob, - } - - // 不是重复任务的情况,立即执行一次 - if !repeat { - // 执行单次任务 - status := queue.RunJob(options, cron.JobOptions{ - JobId: sysJob.JobID, - }) - // 执行中或等待中的都返回正常 - return status == cron.Active || status == cron.Waiting - } - - // 执行重复任务 - queue.RunJob(options, cron.JobOptions{ - JobId: sysJob.JobID, - Cron: sysJob.CronExpression, - }) - - return true -} - -// deleteQueueJob 删除调度任务 -func (r *SysJobImpl) deleteQueueJob(sysJob model.SysJob) bool { - // 获取队列 Processor - queue := cron.GetQueue(sysJob.InvokeTarget) - if queue.Name != sysJob.InvokeTarget { - return false - } - return queue.RemoveJob(sysJob.JobID) -} diff --git a/src/modules/monitor/service/sys_job_log.go b/src/modules/monitor/service/sys_job_log.go index 734a52d..185c17a 100644 --- a/src/modules/monitor/service/sys_job_log.go +++ b/src/modules/monitor/service/sys_job_log.go @@ -1,23 +1,42 @@ package service import ( - "nms_cxy/src/modules/monitor/model" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" ) -// ISysJobLog 调度任务日志 服务层接口 -type ISysJobLog interface { - // SelectJobLogPage 分页查询调度任务日志集合 - SelectJobLogPage(query map[string]any) map[string]any - - // SelectJobLogList 查询调度任务日志集合 - SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog - - // SelectJobLogById 通过调度ID查询调度任务日志信息 - SelectJobLogById(jobLogId string) model.SysJobLog - - // DeleteJobLogByIds 批量删除调度任务日志信息 - DeleteJobLogByIds(jobLogIds []string) int64 - - // CleanJobLog 清空调度任务日志 - CleanJobLog() error +// 实例化服务层 SysJobLog 结构体 +var NewSysJobLog = &SysJobLog{ + sysJobLogRepository: repository.NewSysJobLogImpl, +} + +// SysJobLog 调度任务日志 服务层处理 +type SysJobLog struct { + // 调度任务日志数据信息 + sysJobLogRepository repository.ISysJobLog +} + +// SelectJobLogPage 分页查询调度任务日志集合 +func (s *SysJobLog) SelectJobLogPage(query map[string]any) map[string]any { + return s.sysJobLogRepository.SelectJobLogPage(query) +} + +// SelectJobLogList 查询调度任务日志集合 +func (s *SysJobLog) SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog { + return s.sysJobLogRepository.SelectJobLogList(sysJobLog) +} + +// SelectJobLogById 通过调度ID查询调度任务日志信息 +func (s *SysJobLog) SelectJobLogById(jobLogId string) model.SysJobLog { + return s.sysJobLogRepository.SelectJobLogById(jobLogId) +} + +// DeleteJobLogByIds 批量删除调度任务日志信息 +func (s *SysJobLog) DeleteJobLogByIds(jobLogIds []string) int64 { + return s.sysJobLogRepository.DeleteJobLogByIds(jobLogIds) +} + +// CleanJobLog 清空调度任务日志 +func (s *SysJobLog) CleanJobLog() error { + return s.sysJobLogRepository.CleanJobLog() } diff --git a/src/modules/monitor/service/sys_job_log.impl.go b/src/modules/monitor/service/sys_job_log.impl.go deleted file mode 100644 index 37fb299..0000000 --- a/src/modules/monitor/service/sys_job_log.impl.go +++ /dev/null @@ -1,42 +0,0 @@ -package service - -import ( - "nms_cxy/src/modules/monitor/model" - "nms_cxy/src/modules/monitor/repository" -) - -// 实例化服务层 SysJobLogImpl 结构体 -var NewSysJobLogImpl = &SysJobLogImpl{ - sysJobLogRepository: repository.NewSysJobLogImpl, -} - -// SysJobLogImpl 调度任务日志 服务层处理 -type SysJobLogImpl struct { - // 调度任务日志数据信息 - sysJobLogRepository repository.ISysJobLog -} - -// SelectJobLogPage 分页查询调度任务日志集合 -func (s *SysJobLogImpl) SelectJobLogPage(query map[string]any) map[string]any { - return s.sysJobLogRepository.SelectJobLogPage(query) -} - -// SelectJobLogList 查询调度任务日志集合 -func (s *SysJobLogImpl) SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog { - return s.sysJobLogRepository.SelectJobLogList(sysJobLog) -} - -// SelectJobLogById 通过调度ID查询调度任务日志信息 -func (s *SysJobLogImpl) SelectJobLogById(jobLogId string) model.SysJobLog { - return s.sysJobLogRepository.SelectJobLogById(jobLogId) -} - -// DeleteJobLogByIds 批量删除调度任务日志信息 -func (s *SysJobLogImpl) DeleteJobLogByIds(jobLogIds []string) int64 { - return s.sysJobLogRepository.DeleteJobLogByIds(jobLogIds) -} - -// CleanJobLog 清空调度任务日志 -func (s *SysJobLogImpl) CleanJobLog() error { - return s.sysJobLogRepository.CleanJobLog() -} diff --git a/src/modules/monitor/service/sys_user_online.go b/src/modules/monitor/service/sys_user_online.go index 12fa956..1d7115d 100644 --- a/src/modules/monitor/service/sys_user_online.go +++ b/src/modules/monitor/service/sys_user_online.go @@ -1,12 +1,33 @@ package service import ( - "nms_cxy/src/framework/vo" - "nms_cxy/src/modules/monitor/model" + "be.ems/src/framework/vo" + "be.ems/src/modules/monitor/model" ) -// ISysUserOnline 在线用户 服务层接口 -type ISysUserOnline interface { - // LoginUserToUserOnline 设置在线用户信息 - LoginUserToUserOnline(loginUser vo.LoginUser) model.SysUserOnline +// 实例化服务层 SysUserOnline 结构体 +var NewSysUserOnline = &SysUserOnline{} + +// SysUserOnline 在线用户 服务层处理 +type SysUserOnline struct{} + +// LoginUserToUserOnline 设置在线用户信息 +func (r *SysUserOnline) LoginUserToUserOnline(loginUser vo.LoginUser) model.SysUserOnline { + if loginUser.UserID == "" { + return model.SysUserOnline{} + } + + sysUserOnline := model.SysUserOnline{ + TokenID: loginUser.UUID, + UserName: loginUser.User.UserName, + IPAddr: loginUser.IPAddr, + LoginLocation: loginUser.LoginLocation, + Browser: loginUser.Browser, + OS: loginUser.OS, + LoginTime: loginUser.LoginTime, + } + if loginUser.User.DeptID != "" { + sysUserOnline.DeptName = loginUser.User.Dept.DeptName + } + return sysUserOnline } diff --git a/src/modules/monitor/service/sys_user_online.impl.go b/src/modules/monitor/service/sys_user_online.impl.go deleted file mode 100644 index c90f61b..0000000 --- a/src/modules/monitor/service/sys_user_online.impl.go +++ /dev/null @@ -1,33 +0,0 @@ -package service - -import ( - "nms_cxy/src/framework/vo" - "nms_cxy/src/modules/monitor/model" -) - -// 实例化服务层 SysUserOnlineImpl 结构体 -var NewSysUserOnlineImpl = &SysUserOnlineImpl{} - -// SysUserOnlineImpl 在线用户 服务层处理 -type SysUserOnlineImpl struct{} - -// LoginUserToUserOnline 设置在线用户信息 -func (r *SysUserOnlineImpl) LoginUserToUserOnline(loginUser vo.LoginUser) model.SysUserOnline { - if loginUser.UserID == "" { - return model.SysUserOnline{} - } - - sysUserOnline := model.SysUserOnline{ - TokenID: loginUser.UUID, - UserName: loginUser.User.UserName, - IPAddr: loginUser.IPAddr, - LoginLocation: loginUser.LoginLocation, - Browser: loginUser.Browser, - OS: loginUser.OS, - LoginTime: loginUser.LoginTime, - } - if loginUser.User.DeptID != "" { - sysUserOnline.DeptName = loginUser.User.Dept.DeptName - } - return sysUserOnline -} diff --git a/src/modules/monitor/service/system_info.go b/src/modules/monitor/service/system_info.go index a6e9a51..3fda7b7 100644 --- a/src/modules/monitor/service/system_info.go +++ b/src/modules/monitor/service/system_info.go @@ -1,22 +1,177 @@ package service -// ISystemInfo 服务器系统相关信息 服务层接口 -type ISystemInfo interface { - // SystemInfo 系统信息 - SystemInfo() map[string]any +import ( + "context" + "fmt" + "os" + "runtime" + "strings" + "time" - // TimeInfo 系统时间信息 - TimeInfo() map[string]string + "be.ems/src/framework/config" + "be.ems/src/framework/utils/parse" - // MemoryInfo 内存信息 - MemoryInfo() map[string]any + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/disk" + "github.com/shirou/gopsutil/v4/host" + "github.com/shirou/gopsutil/v4/mem" + "github.com/shirou/gopsutil/v4/net" +) - // CPUInfo CPU信息 - CPUInfo() map[string]any +// 实例化服务层 SystemInfo 结构体 +var NewSystemInfo = &SystemInfo{} - // NetworkInfo 网络信息 - NetworkInfo() map[string]string +// SystemInfo 服务器系统相关信息 服务层处理 +type SystemInfo struct{} - // DiskInfo 磁盘信息 - DiskInfo() []map[string]string +// SystemInfo 系统信息 +func (s *SystemInfo) SystemInfo() map[string]any { + info, err := host.Info() + if err != nil { + info.Platform = err.Error() + } + // 获取主机运行时间 + bootTime := time.Since(time.Unix(int64(info.BootTime), 0)).Seconds() + // 获取程序运行时间 + runTime := time.Since(config.RunTime()).Abs().Seconds() + return map[string]any{ + "platform": info.Platform, + "platformVersion": info.PlatformVersion, + "arch": info.KernelArch, + "archVersion": info.KernelVersion, + "os": info.OS, + "hostname": info.Hostname, + "bootTime": int64(bootTime), + "processId": os.Getpid(), + "runArch": runtime.GOARCH, + "runVersion": runtime.Version(), + "runTime": int64(runTime), + } +} + +// TimeInfo 系统时间信息 +func (s *SystemInfo) TimeInfo() map[string]string { + now := time.Now() + // 获取当前时间 + current := now.Format("2006-01-02 15:04:05") + // 获取时区 + timezone := now.Format("-0700 MST") + // 获取时区名称 + timezoneName := now.Format("MST") + + return map[string]string{ + "current": current, + "timezone": timezone, + "timezoneName": timezoneName, + } +} + +// MemoryInfo 内存信息 +func (s *SystemInfo) MemoryInfo() map[string]any { + memInfo, err := mem.VirtualMemory() + if err != nil { + memInfo.UsedPercent = 0 + memInfo.Available = 0 + memInfo.Total = 0 + } + + var memStats runtime.MemStats + runtime.ReadMemStats(&memStats) + + return map[string]any{ + "usage": fmt.Sprintf("%.2f", memInfo.UsedPercent), // 内存利用率 + "freemem": parse.Bit(float64(memInfo.Available)), // 可用内存大小(GB) + "totalmem": parse.Bit(float64(memInfo.Total)), // 总内存大小(GB) + "rss": parse.Bit(float64(memStats.Sys)), // 常驻内存大小(RSS) + "heapTotal": parse.Bit(float64(memStats.HeapSys)), // 堆总大小 + "heapUsed": parse.Bit(float64(memStats.HeapAlloc)), // 堆已使用大小 + "external": parse.Bit(float64(memStats.Sys - memStats.HeapSys)), // 外部内存大小(非堆) + } +} + +// CPUInfo CPU信息 +func (s *SystemInfo) CPUInfo() map[string]any { + var core int = 0 + var speed string = "未知" + var model string = "未知" + cpuInfo, err := cpu.Info() + if err == nil { + core = runtime.NumCPU() + speed = fmt.Sprintf("%.0fMHz", cpuInfo[0].Mhz) + model = strings.TrimSpace(cpuInfo[0].ModelName) + } + + useds := []string{} + cpuPercent, err := cpu.Percent(0, true) + if err == nil { + for _, v := range cpuPercent { + useds = append(useds, fmt.Sprintf("%.2f", v)) + } + } + + return map[string]any{ + "model": model, + "speed": speed, + "core": core, + "coreUsed": useds, + } +} + +// NetworkInfo 网络信息 +func (s *SystemInfo) NetworkInfo() map[string]string { + ipAddrs := make(map[string]string) + interfaces, err := net.Interfaces() + if err == nil { + for _, iface := range interfaces { + name := iface.Name + if name[len(name)-1] == '0' { + name = name[0 : len(name)-1] + name = strings.Trim(name, "") + } + // ignore localhost + if name == "lo" { + continue + } + var addrs []string + for _, v := range iface.Addrs { + prefix := strings.Split(v.Addr, "/")[0] + if strings.Contains(prefix, "::") { + addrs = append(addrs, fmt.Sprintf("IPv6 %s", prefix)) + } + if strings.Contains(prefix, ".") { + addrs = append(addrs, fmt.Sprintf("IPv4 %s", prefix)) + } + } + ipAddrs[name] = strings.Join(addrs, " / ") + } + } + return ipAddrs +} + +// DiskInfo 磁盘信息 +func (s *SystemInfo) DiskInfo() []map[string]string { + disks := make([]map[string]string, 0) + ctx := context.Background() + ctx, cancel := context.WithTimeout(ctx, 2*time.Second) + defer cancel() + + partitions, err := disk.PartitionsWithContext(ctx, false) + if err != nil && err != context.DeadlineExceeded { + return disks + } + + for _, partition := range partitions { + usage, err := disk.Usage(partition.Mountpoint) + if err != nil { + continue + } + disks = append(disks, map[string]string{ + "size": parse.Bit(float64(usage.Total)), + "used": parse.Bit(float64(usage.Used)), + "avail": parse.Bit(float64(usage.Free)), + "pcent": fmt.Sprintf("%.1f%%", usage.UsedPercent), + "target": partition.Device, + }) + } + return disks } diff --git a/src/modules/monitor/service/system_info.impl.go b/src/modules/monitor/service/system_info.impl.go deleted file mode 100644 index 4ed6241..0000000 --- a/src/modules/monitor/service/system_info.impl.go +++ /dev/null @@ -1,177 +0,0 @@ -package service - -import ( - "context" - "fmt" - "os" - "runtime" - "strings" - "time" - - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/utils/parse" - - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/disk" - "github.com/shirou/gopsutil/v4/host" - "github.com/shirou/gopsutil/v4/mem" - "github.com/shirou/gopsutil/v4/net" -) - -// 实例化服务层 SystemInfoImpl 结构体 -var NewSystemInfoImpl = &SystemInfoImpl{} - -// SystemInfoImpl 服务器系统相关信息 服务层处理 -type SystemInfoImpl struct{} - -// SystemInfo 系统信息 -func (s *SystemInfoImpl) SystemInfo() map[string]any { - info, err := host.Info() - if err != nil { - info.Platform = err.Error() - } - // 获取主机运行时间 - bootTime := time.Since(time.Unix(int64(info.BootTime), 0)).Seconds() - // 获取程序运行时间 - runTime := time.Since(config.RunTime()).Abs().Seconds() - return map[string]any{ - "platform": info.Platform, - "platformVersion": info.PlatformVersion, - "arch": info.KernelArch, - "archVersion": info.KernelVersion, - "os": info.OS, - "hostname": info.Hostname, - "bootTime": int64(bootTime), - "processId": os.Getpid(), - "runArch": runtime.GOARCH, - "runVersion": runtime.Version(), - "runTime": int64(runTime), - } -} - -// TimeInfo 系统时间信息 -func (s *SystemInfoImpl) TimeInfo() map[string]string { - now := time.Now() - // 获取当前时间 - current := now.Format("2006-01-02 15:04:05") - // 获取时区 - timezone := now.Format("-0700 MST") - // 获取时区名称 - timezoneName := now.Format("MST") - - return map[string]string{ - "current": current, - "timezone": timezone, - "timezoneName": timezoneName, - } -} - -// MemoryInfo 内存信息 -func (s *SystemInfoImpl) MemoryInfo() map[string]any { - memInfo, err := mem.VirtualMemory() - if err != nil { - memInfo.UsedPercent = 0 - memInfo.Available = 0 - memInfo.Total = 0 - } - - var memStats runtime.MemStats - runtime.ReadMemStats(&memStats) - - return map[string]any{ - "usage": fmt.Sprintf("%.2f", memInfo.UsedPercent), // 内存利用率 - "freemem": parse.Bit(float64(memInfo.Available)), // 可用内存大小(GB) - "totalmem": parse.Bit(float64(memInfo.Total)), // 总内存大小(GB) - "rss": parse.Bit(float64(memStats.Sys)), // 常驻内存大小(RSS) - "heapTotal": parse.Bit(float64(memStats.HeapSys)), // 堆总大小 - "heapUsed": parse.Bit(float64(memStats.HeapAlloc)), // 堆已使用大小 - "external": parse.Bit(float64(memStats.Sys - memStats.HeapSys)), // 外部内存大小(非堆) - } -} - -// CPUInfo CPU信息 -func (s *SystemInfoImpl) CPUInfo() map[string]any { - var core int = 0 - var speed string = "未知" - var model string = "未知" - cpuInfo, err := cpu.Info() - if err == nil { - core = runtime.NumCPU() - speed = fmt.Sprintf("%.0fMHz", cpuInfo[0].Mhz) - model = strings.TrimSpace(cpuInfo[0].ModelName) - } - - useds := []string{} - cpuPercent, err := cpu.Percent(0, true) - if err == nil { - for _, v := range cpuPercent { - useds = append(useds, fmt.Sprintf("%.2f", v)) - } - } - - return map[string]any{ - "model": model, - "speed": speed, - "core": core, - "coreUsed": useds, - } -} - -// NetworkInfo 网络信息 -func (s *SystemInfoImpl) NetworkInfo() map[string]string { - ipAddrs := make(map[string]string) - interfaces, err := net.Interfaces() - if err == nil { - for _, iface := range interfaces { - name := iface.Name - if name[len(name)-1] == '0' { - name = name[0 : len(name)-1] - name = strings.Trim(name, "") - } - // ignore localhost - if name == "lo" { - continue - } - var addrs []string - for _, v := range iface.Addrs { - prefix := strings.Split(v.Addr, "/")[0] - if strings.Contains(prefix, "::") { - addrs = append(addrs, fmt.Sprintf("IPv6 %s", prefix)) - } - if strings.Contains(prefix, ".") { - addrs = append(addrs, fmt.Sprintf("IPv4 %s", prefix)) - } - } - ipAddrs[name] = strings.Join(addrs, " / ") - } - } - return ipAddrs -} - -// DiskInfo 磁盘信息 -func (s *SystemInfoImpl) DiskInfo() []map[string]string { - disks := make([]map[string]string, 0) - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 2*time.Second) - defer cancel() - - partitions, err := disk.PartitionsWithContext(ctx, false) - if err != nil && err != context.DeadlineExceeded { - return disks - } - - for _, partition := range partitions { - usage, err := disk.Usage(partition.Mountpoint) - if err != nil { - continue - } - disks = append(disks, map[string]string{ - "size": parse.Bit(float64(usage.Total)), - "used": parse.Bit(float64(usage.Used)), - "avail": parse.Bit(float64(usage.Free)), - "pcent": fmt.Sprintf("%.1f%%", usage.UsedPercent), - "target": partition.Device, - }) - } - return disks -} diff --git a/src/modules/network_data/controller/all_alarm.go b/src/modules/network_data/controller/all_alarm.go index 8e8212c..2372de9 100644 --- a/src/modules/network_data/controller/all_alarm.go +++ b/src/modules/network_data/controller/all_alarm.go @@ -3,31 +3,29 @@ package controller import ( "strings" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" ) // 实例化控制层 AlarmController 结构体 -var NewAlarmController = &AlarmController{ - neInfoService: neService.NewNeInfoImpl, - alarmService: neDataService.NewAlarmImpl, +var NewAlarm = &AlarmController{ + neInfoService: neService.NewNeInfo, + alarmService: neDataService.NewAlarm, } // 告警数据 // // PATH /alarm type AlarmController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 告警信息服务 - alarmService neDataService.IAlarm + neInfoService *neService.NeInfo // 网元信息服务 + alarmService *neDataService.Alarm // 告警信息服务 } // 告警列表 diff --git a/src/modules/network_data/controller/all_kpi.go b/src/modules/network_data/controller/all_kpi.go index 0dfc34a..e3dbc72 100644 --- a/src/modules/network_data/controller/all_kpi.go +++ b/src/modules/network_data/controller/all_kpi.go @@ -1,30 +1,27 @@ package controller import ( - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" ) // 实例化控制层 PerfKPIController 结构体 -var NewPerfKPIController = &PerfKPIController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, +var NewPerfKPI = &PerfKPIController{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, } // 性能统计 // // PATH /kpi type PerfKPIController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 } // 获取统计数据 diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index b95c824..cc78b1e 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -7,35 +7,32 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - sysService "nms_cxy/src/modules/system/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + sysService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 AMFController 结构体 -var NewAMFController = &AMFController{ - neInfoService: neService.NewNeInfoImpl, - ueEventService: neDataService.NewUEEventAMFImpl, +var NewAMF = &AMFController{ + neInfoService: neService.NewNeInfo, + ueEventService: neDataService.NewUEEventAMF, } // 网元AMF // // PATH /amf type AMFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // UE会话事件服务 - ueEventService neDataService.IUEEventAMF + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEventAMF // UE会话事件服务 } // UE会话列表 @@ -122,11 +119,11 @@ func (s *AMFController) UEExport(c *gin.Context) { "E1": "Time", } // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_event_type") + dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_auth_code") + dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_event_cm_state") + dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { @@ -181,7 +178,7 @@ func (s *AMFController) UEExport(c *gin.Context) { timeStr = v.(string) } if v, ok := eventJSON["status"]; ok && v != nil { - eventResult = v.(string) + eventResult = fmt.Sprint(v) for _, v := range dictUEEventCmState { if eventResult == v.DictValue { eventResult = i18n.TKey(language, v.DictLabel) diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 4f6833c..60aff2b 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -7,36 +7,33 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - sysService "nms_cxy/src/modules/system/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + sysService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 IMSController 结构体 -var NewIMSController = &IMSController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventIMSImpl, +var NewIMS = &IMSController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventIMS, } // 网元IMS // // PATH /ims type IMSController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventIMS + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventIMS // CDR会话事件服务 } // CDR会话列表 @@ -133,9 +130,9 @@ func (s *IMSController) CDRExport(c *gin.Context) { "H1": "Time", } // 读取字典数据 CDR SIP响应代码类别类型 - dictCDRSipCode := sysService.NewSysDictDataImpl.SelectDictDataByType("cdr_sip_code") + dictCDRSipCode := sysService.NewSysDictData.SelectDictDataByType("cdr_sip_code") // 读取字典数据 CDR 呼叫类型 - dictCDRCallType := sysService.NewSysDictDataImpl.SelectDictDataByType("cdr_call_type") + dictCDRCallType := sysService.NewSysDictData.SelectDictDataByType("cdr_call_type") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index 8911f46..ac26d60 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -7,36 +7,33 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - sysService "nms_cxy/src/modules/system/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + sysService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 MMEController 结构体 -var NewMMEController = &MMEController{ - neInfoService: neService.NewNeInfoImpl, - ueEventService: neDataService.NewUEEventMMEImpl, +var NewMME = &MMEController{ + neInfoService: neService.NewNeInfo, + ueEventService: neDataService.NewUEEventMME, } // 网元MME // // PATH /mme type MMEController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // UE会话事件服务 - ueEventService neDataService.IUEEventMME + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEventMME // UE会话事件服务 } // UE会话列表 @@ -123,11 +120,11 @@ func (s *MMEController) UEExport(c *gin.Context) { "E1": "Time", } // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_event_type") + dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_auth_code") + dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_event_cm_state") + dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index a318433..094b484 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -7,34 +7,34 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SMFController 结构体 -var NewSMFController = &SMFController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventSMFImpl, +var NewSMF = &SMFController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMF, + udmUserInfoService: neDataService.NewUDMUserInfo, } // 网元SMF // // PATH /smf type SMFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventSMF + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMF // CDR会话事件服务 + udmUserInfoService *neDataService.UDMUserInfo // UDM用户信息服务 } // CDR会话列表 @@ -123,17 +123,30 @@ func (s *SMFController) CDRExport(c *gin.Context) { headerCells := map[string]string{ "A1": "ID", "B1": "Charging ID", - "C1": "Subscriber ID Data", - "D1": "Subscriber ID Type", - "E1": "Data Volume Uplink", - "F1": "Data Volume Downlink", - "G1": "Data Total Volume", - "H1": "Duration", - "I1": "Invocation Time", - "J1": "PDU Session Charging Information", + "C1": "NE Name", + "D1": "Resource Unique ID", + "E1": "Subscriber ID Data", + "F1": "Subscriber ID Type", + "G1": "Data Volume Uplink", + "H1": "Data Volume Downlink", + "I1": "Data Total Volume", + "J1": "Duration", + "K1": "Invocation Time", + "L1": "User Identifier", + "M1": "SSC Mode", + "N1": "DNN ID", + "O1": "PDU Type", + "P1": "RAT Type", + "Q1": "PDU IPv4 Address", + "R1": "Network Function IPv4", + "S1": "PDU IPv6 Address Swith Prefix", + "T1": "Record Network Function ID", + "U1": "Record Type", + "V1": "Record Opening Time", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) + for i, row := range rows { idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map @@ -158,12 +171,22 @@ func (s *SMFController) CDRExport(c *gin.Context) { subscriptionIDData = sub["subscriptionIDData"].(string) } } + + // 网络功能 IPv4 地址 + networkFunctionIPv4Address := "" + if v, ok := cdrJSON["nFunctionConsumerInformation"]; ok && v != nil { + if conInfo, conInfoOk := v.(map[string]any); conInfoOk && conInfo != nil { + networkFunctionIPv4Address = conInfo["networkFunctionIPv4Address"].(string) + } + } + // 数据量上行链路 dataVolumeUplink := []string{} // 数据量下行链路 dataVolumeDownlink := []string{} // 数据总量 dataTotalVolume := []string{} + if v, ok := cdrJSON["listOfMultipleUnitUsage"]; ok && v != nil { usageList := v.([]any) if len(usageList) > 0 { @@ -198,32 +221,31 @@ func (s *SMFController) CDRExport(c *gin.Context) { invocationTimestamp = v.(string) } // 记录打开时间 - pduSessionChargingInformation := "" + User_Identifier := "" + SSC_Mode := "" + RAT_Type := "" + DNN_ID := "" + PDU_Type := "" + PDU_IPv4 := "" + PDU_IPv6 := "" if v, ok := cdrJSON["pDUSessionChargingInformation"]; ok && v != nil { pduInfo := v.(map[string]any) - User_Identifier := "" if v, ok := pduInfo["userIdentifier"]; ok && v != nil { User_Identifier = v.(string) } - SSC_Mode := "" if v, ok := pduInfo["sSCMode"]; ok && v != nil { SSC_Mode = v.(string) } - RAT_Type := "" if v, ok := pduInfo["rATType"]; ok && v != nil { RAT_Type = v.(string) } - DNN_ID := "" if v, ok := pduInfo["dNNID"]; ok && v != nil { DNN_ID = v.(string) } - PDU_Type := "" if v, ok := pduInfo["pDUType"]; ok && v != nil { PDU_Type = v.(string) } - PDU_IPv4 := "" - PDU_IPv6 := "" if v, ok := pduInfo["pDUAddress"]; ok && v != nil { pDUAddress := v.(map[string]any) if addr, ok := pDUAddress["pDUIPv4Address"]; ok && addr != nil { @@ -234,24 +256,54 @@ func (s *SMFController) CDRExport(c *gin.Context) { } } - pduSessionChargingInformation = fmt.Sprintf(`User Identifier: %s -SSC Mode: %s RAT Type: %s DNN ID: %s -PDU Type: %s -PDU IPv4 Address: %s -PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, PDU_Type, PDU_IPv4, PDU_IPv6) + // pduSessionChargingInformation = fmt.Sprintf(`User Identifier: %s + // SSC Mode: %s RAT Type: %s DNN ID: %s + // PDU Type: %s + // PDU IPv4 Address: %s + // PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, PDU_Type, PDU_IPv4, PDU_IPv6) + } + + // 记录网络参数ID + recordNFID := "" + if v, ok := cdrJSON["recordingNetworkFunctionID"]; ok && v != nil { + recordNFID = v.(string) + } + + //记录开始时间 + recordOpeningTime := "" + if v, ok := cdrJSON["recordOpeningTime"]; ok && v != nil { + recordOpeningTime = v.(string) + } + + //记录类型 + recordType := "" + if v, ok := cdrJSON["recordType"]; ok && v != nil { + recordType = v.(string) } dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, "B" + idx: chargingID, - "C" + idx: subscriptionIDData, - "D" + idx: subscriptionIDType, - "E" + idx: strings.Join(dataVolumeUplink, ","), - "F" + idx: strings.Join(dataVolumeDownlink, ","), - "G" + idx: strings.Join(dataTotalVolume, ","), - "H" + idx: duration, - "I" + idx: invocationTimestamp, - "J" + idx: pduSessionChargingInformation, + "C" + idx: row.NeName, + "D" + idx: row.RmUID, + "E" + idx: subscriptionIDData, + "F" + idx: subscriptionIDType, + "G" + idx: strings.Join(dataVolumeUplink, ","), + "H" + idx: strings.Join(dataVolumeDownlink, ","), + "I" + idx: strings.Join(dataTotalVolume, ","), + "J" + idx: duration, + "K" + idx: invocationTimestamp, + "L" + idx: User_Identifier, + "M" + idx: SSC_Mode, + "N" + idx: DNN_ID, + "O" + idx: PDU_Type, + "P" + idx: RAT_Type, + "Q" + idx: PDU_IPv4, + "R" + idx: networkFunctionIPv4Address, + "S" + idx: PDU_IPv6, + "T" + idx: recordNFID, + "U" + idx: recordType, + "V" + idx: recordOpeningTime, }) } @@ -264,3 +316,62 @@ PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, c.FileAttachment(saveFilePath, fileName) } + +// 在线订阅用户列表信息 +// +// GET /subscribers +func (s *SMFController) SubUserList(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeId string `form:"neId" binding:"required"` + IMSI string `form:"imsi"` + MSISDN string `form:"msisdn"` + Upstate string `form:"upstate"` + PageNum string `form:"pageNum"` + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元信息 rmUID + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("SMF", query.NeId) + if neInfo.NeId != query.NeId || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元直连 + data, err := neFetchlink.SMFSubInfoList(neInfo, map[string]string{ + "imsi": query.IMSI, + "msisdn": query.MSISDN, + "upstate": query.Upstate, + "pageNum": query.PageNum, + }) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + // 对数据进行处理,去掉前缀,并加入imsi拓展信息 + rows := data["rows"].([]any) + if len(rows) > 0 { + arr := &rows + for i := range *arr { + item := (*arr)[i].(map[string]any) + if v, ok := item["imsi"]; ok && v != nil { + imsiStr := v.(string) + imsiStr = strings.TrimPrefix(imsiStr, "imsi-") + item["imsi"] = imsiStr + // 查UDM拓展信息 + info := s.udmUserInfoService.SelectByIMSIAndNeID(imsiStr, "") + item["remark"] = info.Remark + } + if v, ok := item["msisdn"]; ok && v != nil { + item["msisdn"] = strings.TrimPrefix(v.(string), "msisdn-") + } + } + } + + c.JSON(200, result.Ok(data)) +} diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index 4dbb507..167d097 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -7,35 +7,32 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SMSCController 结构体 -var NewSMSCController = &SMSCController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventSMSCImpl, +var NewSMSC = &SMSCController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMSC, } // 网元SMSC // // PATH /smsc type SMSCController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventSMSC + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMSC // CDR会话事件服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index 36de76f..90ee876 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -6,36 +6,33 @@ import ( "strings" "time" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/telnet" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neFetchlink "nms_cxy/src/modules/network_element/fetch_link" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/i18n" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 UDMAuthController 结构体 var NewUDMAuth = &UDMAuthController{ - udmAuthService: neDataService.NewUDMAuthImpl, - neInfoService: neService.NewNeInfoImpl, + udmAuthService: neDataService.NewUDMAuthUser, + neInfoService: neService.NewNeInfo, } // UDM鉴权用户 // // PATH /udm/auth type UDMAuthController struct { - // UDM鉴权信息服务 - udmAuthService neDataService.IUDMAuth - // 网元信息服务 - neInfoService neService.INeInfo + udmAuthService *neDataService.UDMAuthUser // UDM鉴权信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // UDM鉴权用户重载数据 @@ -49,7 +46,6 @@ func (s *UDMAuthController) ResetData(c *gin.Context) { return } - neId = "" data := s.udmAuthService.ResetData(neId) c.JSON(200, result.OkData(data)) } @@ -59,9 +55,8 @@ func (s *UDMAuthController) ResetData(c *gin.Context) { // GET /list func (s *UDMAuthController) List(c *gin.Context) { querys := ctx.QueryMap(c) - querys["neId"] = "" - data := s.udmAuthService.SelectPage(querys) - c.JSON(200, result.Ok(data)) + total, rows := s.udmAuthService.SelectPage(querys) + c.JSON(200, result.Ok(map[string]any{"total": total, "rows": rows})) } // UDM鉴权用户信息 @@ -103,27 +98,9 @@ func (s *UDMAuthController) Info(c *gin.Context) { return } - neId = "" - u := model.UDMAuth{ - IMSI: imsi, - Amf: data["amf"], - Status: "1", - Ki: data["ki"], - AlgoIndex: data["algo"], - Opc: data["opc"], - NeId: neId, - } - - // 查询imsi存在赋予id用于更新 - list := s.udmAuthService.SelectList(u) - if len(list) > 0 { - item := list[0] - if item.ID != "" { - u.ID = item.ID - } - } - go s.udmAuthService.Insert(neId, u) - + // 解析返回的数据 + u := s.udmAuthService.ParseInfo(imsi, neId, data) + s.udmAuthService.Insert(neId, u) c.JSON(200, result.OkData(u)) } @@ -138,7 +115,7 @@ func (s *UDMAuthController) Add(c *gin.Context) { return } - var body model.UDMAuth + var body model.UDMAuthUser err := c.ShouldBindBodyWith(&body, binding.JSON) if err != nil || body.IMSI == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) @@ -160,7 +137,8 @@ func (s *UDMAuthController) Add(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("add authdat:imsi=%s,ki=%s,amf=%s,algo=%s,opc=%s", body.IMSI, body.Ki, body.Amf, body.AlgoIndex, body.Opc) + cmd := fmt.Sprintf("add authdat:imsi=%s,", body.IMSI) + cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -169,8 +147,7 @@ func (s *UDMAuthController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmAuthService.Insert(neId, body) + s.udmAuthService.Insert(neId, body) } c.JSON(200, result.OkData(data)) } @@ -187,7 +164,7 @@ func (s *UDMAuthController) Adds(c *gin.Context) { return } - var body model.UDMAuth + var body model.UDMAuthUser err := c.ShouldBindBodyWith(&body, binding.JSON) if err != nil || body.IMSI == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) @@ -209,7 +186,8 @@ func (s *UDMAuthController) Adds(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("baa authdat:start_imsi=%s,sub_num=%s,ki=%s,amf=%s,algo=%s,opc=%s", body.IMSI, num, body.Ki, body.Amf, body.AlgoIndex, body.Opc) + cmd := fmt.Sprintf("baa authdat:start_imsi=%s,sub_num=%s,", body.IMSI, num) + cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -218,8 +196,7 @@ func (s *UDMAuthController) Adds(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmAuthService.LoadData(neId, body.IMSI, num) + s.udmAuthService.LoadData(neId, body.IMSI, num) } c.JSON(200, result.OkData(data)) } @@ -235,7 +212,7 @@ func (s *UDMAuthController) Edit(c *gin.Context) { return } - var body model.UDMAuth + var body model.UDMAuthUser err := c.ShouldBindBodyWith(&body, binding.JSON) if err != nil || body.IMSI == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) @@ -257,20 +234,8 @@ func (s *UDMAuthController) Edit(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("mod authdata:imsi=%s", body.IMSI) - // 修改的参数名称 - if body.Ki != "" { - cmd += fmt.Sprintf(",ki=%s", body.Ki) - } - if body.Amf != "" { - cmd += fmt.Sprintf(",amf=%s", body.Amf) - } - if body.AlgoIndex != "" { - cmd += fmt.Sprintf(",algo=%s", body.AlgoIndex) - } - if body.Opc != "" { - cmd += fmt.Sprintf(",opc=%s", body.Opc) - } + cmd := fmt.Sprintf("mod authdata:imsi=%s,", body.IMSI) + cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -279,8 +244,7 @@ func (s *UDMAuthController) Edit(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmAuthService.Insert(neId, body) + s.udmAuthService.Insert(neId, body) } c.JSON(200, result.OkData(data)) } @@ -330,8 +294,7 @@ func (s *UDMAuthController) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmAuthService.Delete(neId, imsi) + s.udmAuthService.Delete(imsi, neId) } resultData[imsi] = data } @@ -376,8 +339,7 @@ func (s *UDMAuthController) Removes(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmAuthService.LoadData(neId, imsi, num) + s.udmAuthService.LoadData(neId, imsi, num) } c.JSON(200, result.OkData(data)) } @@ -387,32 +349,44 @@ func (s *UDMAuthController) Removes(c *gin.Context) { // POST /export func (s *UDMAuthController) Export(c *gin.Context) { language := ctx.AcceptLanguage(c) - var body struct { - NeId string `json:"neId" binding:"required"` - Type string `json:"type" binding:"required"` - } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { + // 查询结果,根据查询条件结果,单页最大值限制 + querys := ctx.BodyJSONMap(c) + neId := querys["neId"].(string) + fileType := querys["type"].(string) + if neId == "" || fileType == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - - if !(body.Type == "csv" || body.Type == "txt") { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errExportType"))) + if !(fileType == "csv" || fileType == "txt") { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) return } - neId := "" - list := s.udmAuthService.SelectList(model.UDMAuth{NeId: neId}) - // 文件名 - fileName := fmt.Sprintf("udm_auth_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type) - filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + querys["pageNum"] = 1 + querys["pageSize"] = 10000 + total, rows := s.udmAuthService.SelectPage(querys) + if total == 0 { + // 导出数据记录为空 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } - if body.Type == "csv" { + // rows := s.udmAuthService.SelectList(model.UDMAuthUser{NeId: neId}) + if len(rows) <= 0 { + // 导出数据记录为空 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + + // 文件名 + fileName := fmt.Sprintf("udm_auth_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), fileType) + filePath := filepath.Join(file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + + if fileType == "csv" { // 转换数据 data := [][]string{} data = append(data, []string{"imsi", "ki", "algo", "amf", "opc"}) - for _, v := range list { + for _, v := range rows { opc := v.Opc if opc == "-" { opc = "" @@ -427,10 +401,10 @@ func (s *UDMAuthController) Export(c *gin.Context) { } } - if body.Type == "txt" { + if fileType == "txt" { // 转换数据 data := [][]string{} - for _, v := range list { + for _, v := range rows { opc := v.Opc if opc == "-" { opc = "" @@ -438,8 +412,8 @@ func (s *UDMAuthController) Export(c *gin.Context) { data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, opc}) } // 输出到文件 - err = file.WriterFileTXT(data, ",", filePath) - if err != nil { + + if err := file.WriterFileTXT(data, ",", filePath); err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } @@ -535,13 +509,11 @@ func (s *UDMAuthController) Import(c *gin.Context) { if strings.Contains(resultMsg, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - neId := "" - go s.udmAuthService.InsertData(neId, "csv", data) + go s.udmAuthService.InsertData(neInfo.NeId, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXT(",", localFilePath) - neId := "" - go s.udmAuthService.InsertData(neId, "txt", data) + go s.udmAuthService.InsertData(neInfo.NeId, "txt", data) } } c.JSON(200, result.OkMsg(resultMsg)) diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 2b7a82e..1c61117 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -3,39 +3,35 @@ package controller import ( "fmt" "path/filepath" - "strconv" "strings" "time" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/telnet" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/i18n" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 UDMSubController 结构体 var NewUDMSub = &UDMSubController{ - udmSubService: neDataService.NewUDMSubImpl, - neInfoService: neService.NewNeInfoImpl, + udmSubService: neDataService.NewUDMSubUser, + neInfoService: neService.NewNeInfo, } // UDM签约用户 // // PATH /udm/sub type UDMSubController struct { - // UDM签约信息服务 - udmSubService neDataService.IUDMSub - // 网元信息服务 - neInfoService neService.INeInfo + udmSubService *neDataService.UDMSubUser // UDM签约信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // UDM签约用户重载数据 @@ -49,7 +45,6 @@ func (s *UDMSubController) ResetData(c *gin.Context) { return } - neId = "" data := s.udmSubService.ResetData(neId) c.JSON(200, result.OkData(data)) } @@ -59,9 +54,8 @@ func (s *UDMSubController) ResetData(c *gin.Context) { // GET /list func (s *UDMSubController) List(c *gin.Context) { querys := ctx.QueryMap(c) - querys["neId"] = "" - data := s.udmSubService.SelectPage(querys) - c.JSON(200, result.Ok(data)) + total, rows := s.udmSubService.SelectPage(querys) + c.JSON(200, result.Ok(map[string]any{"total": total, "rows": rows})) } // UDM签约用户信息 @@ -104,52 +98,8 @@ func (s *UDMSubController) Info(c *gin.Context) { } // 解析返回的数据 - cnType, _ := strconv.ParseInt(data["CNType"][:4], 0, 64) - rat, _ := strconv.ParseInt(data["RAT"][:4], 0, 64) - msisdn := data["MSISDN"] - imsMsisdnLen := strings.Index(msisdn, ",") - if imsMsisdnLen != -1 { - msisdn = msisdn[:imsMsisdnLen] - } - neId = "" - u := model.UDMSub{ - IMSI: imsi, - Msisdn: msisdn, - Ambr: data["AMBR"], - Arfb: data["AreaForbidden"], - Cn: fmt.Sprint(cnType), - SmData: data["SM-Data(snssai+dnn[1..n])"], - Sar: data["ServiceAreaRestriction"], - Nssai: data["NSSAI"], - SmfSel: data["Smf-Selection"], - Rat: fmt.Sprint(rat), - NeId: neId, - } - // 1,64,24,65,def_eps,1,2,010200000000,- - if v, ok := data["EPS-Data"]; ok { - u.EpsDat = v - arr := strings.Split(v, ",") - u.EpsFlag = arr[0] - u.EpsOdb = arr[1] - u.HplmnOdb = arr[2] - u.Ard = arr[3] - u.Epstpl = arr[4] - u.ContextId = arr[5] - u.ApnContext = arr[7] - // [6] 是不要的,导入和导出不用 - u.StaticIp = arr[8] - } - - // 查询imsi存在赋予id用于更新 - list := s.udmSubService.SelectList(u) - if len(list) > 0 { - item := list[0] - if item.ID != "" { - u.ID = item.ID - } - } - go s.udmSubService.Insert(neId, u) - + u := s.udmSubService.ParseInfo(imsi, neId, data) + s.udmSubService.Insert(neId, u) c.JSON(200, result.OkData(u)) } @@ -164,9 +114,9 @@ func (s *UDMSubController) Add(c *gin.Context) { return } - var body model.UDMSub + var body model.UDMSubUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.IMSI == "" { + if err != nil || len(body.IMSI) < 15 { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -186,12 +136,8 @@ func (s *UDMSubController) Add(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("add udmuser:imsi=%s,msisdn=%s,ambr=%s,nssai=%s,arfb=%s,sar=%s,rat=%s,cn=%s,smf_sel=%s,sm_data=%s,eps_flag=%s,eps_odb=%s,hplmn_odb=%s,ard=%s,epstpl=%s,context_id=%s,apn_context=%s", - body.IMSI, body.Msisdn, body.Ambr, body.Nssai, body.Arfb, body.Sar, body.Rat, body.Cn, body.SmfSel, body.SmData, body.EpsFlag, body.EpsOdb, body.HplmnOdb, body.Ard, body.Epstpl, body.ContextId, body.ApnContext) - // static_ip指给4G UE分配的静态IP,没有可不带此字段名,批量添加IP会自动递增 - if body.StaticIp != "" { - cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp) - } + cmd := fmt.Sprintf("add udmuser:imsi=%s,", body.IMSI) + cmd += s.udmSubService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -200,8 +146,8 @@ func (s *UDMSubController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmSubService.Insert(neId, body) + body.NeId = neId + s.udmSubService.Insert(neId, body) } c.JSON(200, result.OkData(data)) } @@ -218,9 +164,9 @@ func (s *UDMSubController) Adds(c *gin.Context) { return } - var body model.UDMSub + var body model.UDMSubUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.IMSI == "" { + if err != nil || len(body.IMSI) < 15 { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -240,8 +186,8 @@ func (s *UDMSubController) Adds(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("baa udmuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,ambr=%s,nssai=%s,arfb=%s,sar=%s,rat=%s,cn=%s,smf_sel=%s,sm_data=%s,eps_flag=%s,eps_odb=%s,hplmn_odb=%s,ard=%s,epstpl=%s,context_id=%s,apn_context=%s", - body.IMSI, body.Msisdn, num, body.Ambr, body.Nssai, body.Arfb, body.Sar, body.Rat, body.Cn, body.SmfSel, body.SmData, body.EpsFlag, body.EpsOdb, body.HplmnOdb, body.Ard, body.Epstpl, body.ContextId, body.ApnContext) + cmd := fmt.Sprintf("baa udmuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,", body.IMSI, body.MSISDN, num) + cmd += s.udmSubService.ParseCommandParams(body) // static_ip指给4G UE分配的静态IP,没有可不带此字段名,批量添加IP会自动递增 if body.StaticIp != "" { cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp) @@ -254,8 +200,7 @@ func (s *UDMSubController) Adds(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmSubService.LoadData(neId, body.IMSI, num) + s.udmSubService.LoadData(neId, body.IMSI, num, body.Remark) } c.JSON(200, result.OkData(data)) } @@ -271,9 +216,9 @@ func (s *UDMSubController) Edit(c *gin.Context) { return } - var body model.UDMSub + var body model.UDMSubUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.IMSI == "" { + if err != nil || len(body.IMSI) < 15 { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -293,62 +238,8 @@ func (s *UDMSubController) Edit(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("mod udmuser:imsi=%s", body.IMSI) - // 修改的参数名称 - if body.Msisdn != "" { - cmd += fmt.Sprintf(",msisdn=%s", body.Msisdn) - } - if body.Ambr != "" { - cmd += fmt.Sprintf(",ambr=%s", body.Ambr) - } - if body.Nssai != "" { - cmd += fmt.Sprintf(",nssai=%s", body.Nssai) - } - if body.Arfb != "" { - cmd += fmt.Sprintf(",arfb=%s", body.Arfb) - } - if body.Sar != "" { - cmd += fmt.Sprintf(",sar=%s", body.Sar) - } - if body.Rat != "" { - cmd += fmt.Sprintf(",rat=%s", body.Rat) - } - if body.Cn != "" { - cmd += fmt.Sprintf(",cn=%s", body.Cn) - } - if body.SmfSel != "" { - cmd += fmt.Sprintf(",smf_sel=%s", body.SmfSel) - } - if body.SmData != "" { - cmd += fmt.Sprintf(",sm_data=%s", body.SmData) - } - if body.EpsDat != "" { - cmd += fmt.Sprintf(",eps_dat=%s", body.EpsDat) - } - if body.EpsFlag != "" { - cmd += fmt.Sprintf(",eps_flag=%s", body.EpsFlag) - } - if body.EpsOdb != "" { - cmd += fmt.Sprintf(",eps_odb=%s", body.EpsOdb) - } - if body.HplmnOdb != "" { - cmd += fmt.Sprintf(",hplmn_odb=%s", body.HplmnOdb) - } - if body.Epstpl != "" { - cmd += fmt.Sprintf(",epstpl=%s", body.Epstpl) - } - if body.Ard != "" { - cmd += fmt.Sprintf(",ard=%s", body.Ard) - } - if body.ContextId != "" { - cmd += fmt.Sprintf(",context_id=%s", body.ContextId) - } - if body.ApnContext != "" { - cmd += fmt.Sprintf(",apn_context=%s", body.ApnContext) - } - if body.StaticIp != "" { - cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp) - } + cmd := fmt.Sprintf("mod udmuser:imsi=%s,", body.IMSI) + cmd += s.udmSubService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -357,8 +248,8 @@ func (s *UDMSubController) Edit(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmSubService.Insert(neId, body) + body.NeId = neId + s.udmSubService.Insert(neId, body) } c.JSON(200, result.OkData(data)) } @@ -370,7 +261,7 @@ func (s *UDMSubController) Remove(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") - if neId == "" || imsi == "" { + if neId == "" || len(imsi) < 15 { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -408,8 +299,7 @@ func (s *UDMSubController) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmSubService.Delete(neId, imsi) + s.udmSubService.Delete(neId, imsi) } resultData[imsi] = data } @@ -425,7 +315,7 @@ func (s *UDMSubController) Removes(c *gin.Context) { neId := c.Param("neId") imsi := c.Param("imsi") num := c.Param("num") - if neId == "" || imsi == "" || num == "" { + if neId == "" || len(imsi) < 15 || num == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -454,8 +344,7 @@ func (s *UDMSubController) Removes(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmSubService.LoadData(neId, imsi, num) + s.udmSubService.LoadData(neId, imsi, num, "-(Deleted)-") } c.JSON(200, result.OkData(data)) } @@ -465,53 +354,63 @@ func (s *UDMSubController) Removes(c *gin.Context) { // POST /export func (s *UDMSubController) Export(c *gin.Context) { language := ctx.AcceptLanguage(c) - var body struct { - NeId string `json:"neId" binding:"required"` - Type string `json:"type" binding:"required"` - } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { + // 查询结果,根据查询条件结果,单页最大值限制 + querys := ctx.BodyJSONMap(c) + neId := querys["neId"].(string) + fileType := querys["type"].(string) + if neId == "" || fileType == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - - if !(body.Type == "csv" || body.Type == "txt") { + if !(fileType == "csv" || fileType == "txt") { c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) return } - neId := "" - list := s.udmSubService.SelectList(model.UDMSub{NeId: neId}) - // 文件名 - fileName := fmt.Sprintf("udm_sub_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type) - filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + querys["pageNum"] = 1 + querys["pageSize"] = 10000 + total, rows := s.udmSubService.SelectPage(querys) + if total == 0 { + // 导出数据记录为空 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } - if body.Type == "csv" { + // rows := s.udmSubService.SelectList(model.UDMSubUser{NeId: neId}) + if len(rows) <= 0 { + // 导出数据记录为空 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + + // 文件名 + fileName := fmt.Sprintf("udm_sub_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), fileType) + filePath := filepath.Join(file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + + if fileType == "csv" { // 转换数据 data := [][]string{} - data = append(data, []string{"imsi", "msisdn", "ambr", "nssai", "arfb", "sar", "rat", "cn", "smf_sel", "sm_dat", "eps_dat"}) - for _, v := range list { + data = append(data, []string{"IMSI", "MSISDN", "UeAmbrTpl", "NssaiTpl", "AreaForbiddenTpl", "ServiceAreaRestrictionTpl", "RatRestrictions", "CnTypeRestrictions", "SmfSel", "SmData", "EPSDat"}) + for _, v := range rows { epsDat := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s", v.EpsFlag, v.EpsOdb, v.HplmnOdb, v.Ard, v.Epstpl, v.ContextId, v.ApnContext, v.StaticIp) - data = append(data, []string{v.IMSI, v.Msisdn, v.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat}) + data = append(data, []string{v.IMSI, v.MSISDN, v.UeAmbrTpl, v.NssaiTpl, v.AreaForbiddenTpl, v.ServiceAreaRestrictionTpl, v.RatRestrictions, v.CnTypeRestrictions, v.SmfSel, v.SmData, epsDat}) } // 输出到文件 - err = file.WriterFileCSV(data, filePath) - if err != nil { + if err := file.WriterFileCSV(data, filePath); err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } } - if body.Type == "txt" { + if fileType == "txt" { // 转换数据 data := [][]string{} - for _, v := range list { + for _, v := range rows { epsDat := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s", v.EpsFlag, v.EpsOdb, v.HplmnOdb, v.Ard, v.Epstpl, v.ContextId, v.ApnContext, v.StaticIp) - data = append(data, []string{v.IMSI, v.Msisdn, v.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat}) + data = append(data, []string{v.IMSI, v.MSISDN, v.UeAmbrTpl, v.NssaiTpl, v.AreaForbiddenTpl, v.ServiceAreaRestrictionTpl, v.RatRestrictions, v.CnTypeRestrictions, v.SmfSel, v.SmData, epsDat}) } // 输出到文件 - err = file.WriterFileTXT(data, ",", filePath) - if err != nil { + if err := file.WriterFileTXT(data, ",", filePath); err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } @@ -591,13 +490,11 @@ func (s *UDMSubController) Import(c *gin.Context) { if strings.Contains(data, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - neId := "" - go s.udmSubService.InsertData(neId, "csv", data) + go s.udmSubService.InsertData(neInfo.NeId, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXT(",", localFilePath) - neId := "" - go s.udmSubService.InsertData(neId, "txt", data) + go s.udmSubService.InsertData(neInfo.NeId, "txt", data) } } c.JSON(200, result.OkMsg(data)) diff --git a/src/modules/network_data/controller/upf.go b/src/modules/network_data/controller/upf.go index cc5005f..0d0acd5 100644 --- a/src/modules/network_data/controller/upf.go +++ b/src/modules/network_data/controller/upf.go @@ -1,29 +1,26 @@ package controller import ( - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" ) // 实例化控制层 UPFController 结构体 -var NewUPFController = &UPFController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, +var NewUPF = &UPFController{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, } // 网元UPF // // PATH /upf type UPFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 } // 总流量数 N3上行 N6下行 @@ -33,9 +30,8 @@ type UPFController struct { func (s *UPFController) TotalFlow(c *gin.Context) { language := ctx.AcceptLanguage(c) var querys struct { - NeType string `json:"neType" form:"neType" binding:"required"` - NeID string `form:"neId" binding:"required"` - Day int `form:"day" binding:"required"` + NeID string `form:"neId" binding:"required"` + Day int `form:"day" binding:"required"` } if err := c.ShouldBindQuery(&querys); querys.Day < 0 || err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) @@ -43,7 +39,7 @@ func (s *UPFController) TotalFlow(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UPF", querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return diff --git a/src/modules/network_data/model/cdr_event_ims.go b/src/modules/network_data/model/cdr_event_ims.go index ffe280c..60973fa 100644 --- a/src/modules/network_data/model/cdr_event_ims.go +++ b/src/modules/network_data/model/cdr_event_ims.go @@ -7,7 +7,7 @@ type CDREventIMS struct { ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` NeType string `json:"neType" gorm:"column:ne_type"` NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 + RmUID string `json:"rmUID" gorm:"column:rm_uid"` Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` CDRJSONStr string `json:"cdrJSON" gorm:"column:cdr_json"` CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` @@ -18,7 +18,7 @@ type CDREventIMSQuery struct { NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型IMS NeID string `json:"neId" form:"neId" binding:"required"` RmUID string `json:"rmUID" form:"rmUID"` - RecordType string `json:"recordType" form:"recordType"` // 记录行为 MOC MTC MOSM MTSM + RecordType string `json:"recordType" form:"recordType"` // 记录行为 MOC MTC CallerParty string `json:"callerParty" form:"callerParty"` // 主叫号码 CalledParty string `json:"calledParty" form:"calledParty"` // 被叫号码 StartTime string `json:"startTime" form:"startTime"` diff --git a/src/modules/network_data/model/udm_auth.go b/src/modules/network_data/model/udm_auth.go index 6f7c1d1..f22e52b 100644 --- a/src/modules/network_data/model/udm_auth.go +++ b/src/modules/network_data/model/udm_auth.go @@ -1,17 +1,18 @@ package model -// UDMAuth UDM鉴权用户对象 u_auth_user -type UDMAuth struct { +// UDMAuthUser UDM鉴权用户 u_auth_user +type UDMAuthUser struct { ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 默认ID - IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡号 - Amf string `json:"amf" gorm:"column:amf"` // ANF - Status string `json:"status" gorm:"column:status"` // 状态 默认给1 + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识 + Amf string `json:"amf" gorm:"column:amf"` // AMF + Status string `json:"status" gorm:"column:status"` // 状态 Ki string `json:"ki" gorm:"column:ki"` // ki - AlgoIndex string `json:"algoIndex" gorm:"column:algo_index"` // AlgoIndex - Opc string `json:"opc" gorm:"column:opc"` // opc - NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识-子系统 + AlgoIndex string `json:"algoIndex" gorm:"column:algo_index"` // algoIndex + Opc string `json:"opc" gorm:"column:opc"` // OPC } -func (UDMAuth) TableName() string { +// TableName 表名称 +func (*UDMAuthUser) TableName() string { return "u_auth_user" } diff --git a/src/modules/network_data/model/udm_sub.go b/src/modules/network_data/model/udm_sub.go index a4f3acd..96342f9 100644 --- a/src/modules/network_data/model/udm_sub.go +++ b/src/modules/network_data/model/udm_sub.go @@ -1,34 +1,48 @@ package model -// UDMSub UDM签约用户对象 u_sub_user -type UDMSub struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - Msisdn string `json:"msisdn" gorm:"column:msisdn"` // 相当手机号 - IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡号 - Ambr string `json:"ambr" gorm:"column:ambr"` - Nssai string `json:"nssai" gorm:"column:nssai"` - Rat string `json:"rat" gorm:"column:rat"` - Arfb string `json:"arfb" gorm:"column:arfb"` - Sar string `json:"sar" gorm:"column:sar"` - Cn string `json:"cn" gorm:"column:cn"` - SmData string `json:"smData" gorm:"column:sm_data"` - SmfSel string `json:"smfSel" gorm:"column:smf_sel"` - EpsDat string `json:"epsDat" gorm:"column:eps_dat"` - NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识-子系统 +// UDMSubUser UDM签约用户 u_sub_user +type UDMSubUser struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 + NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识 - EpsFlag string `json:"epsFlag" gorm:"column:eps_flag"` - EpsOdb string `json:"epsOdb" gorm:"column:eps_odb"` - HplmnOdb string `json:"hplmnOdb" gorm:"column:hplmn_odb"` - Ard string `json:"ard" gorm:"column:ard"` - Epstpl string `json:"epstpl" gorm:"column:epstpl"` - ContextId string `json:"contextId" gorm:"column:context_id"` - ApnContext string `json:"apnContext" gorm:"column:apn_context"` - StaticIp string `json:"staticIp" gorm:"column:static_ip"` + AmDat string `json:"amDat" gorm:"column:am_dat"` // AmData + UeAmbrTpl string `json:"ambr" gorm:"column:ambr"` // AmData SubUeAMBRTemp + NssaiTpl string `json:"nssai" gorm:"column:nssai"` // AmData SubSNSSAITemp + RatRestrictions string `json:"rat" gorm:"column:rat"` // AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR + AreaForbiddenTpl string `json:"arfb" gorm:"column:arfb"` // AmData AreaForbidden + ServiceAreaRestrictionTpl string `json:"sar" gorm:"column:sar"` // AmData serviceAreaRestrictTemp + CnTypeRestrictions string `json:"cnType" gorm:"column:cn_type"` // AmData CNType 0x00:EPC和5GC 0x01:5GC 0x02:EPC 0x03:EPC+5GC + RfspIndex string `json:"rfspIndex" gorm:"column:rfsp_index"` // AmData RfspIndex + SubsRegTime string `json:"regTimer" gorm:"column:reg_timer"` // AmData RegTimer + UeUsageType string `json:"ueUsageType" gorm:"column:ue_usage_type"` // AmData UEUsageType + ActiveTime string `json:"activeTime" gorm:"column:active_time"` // AmData ActiveTime + MicoAllowed string `json:"mico" gorm:"column:mico"` // AmData MICO + OdbPs string `json:"odbPs" gorm:"column:odb_ps"` // AmData ODB_PS 0-all,1-hplmn,2-vplmn + GroupId string `json:"groupId" gorm:"column:group_id"` // AmData GroupId + + EpsDat string `json:"epsDat" gorm:"column:eps_dat"` // EpsDat + EpsFlag string `json:"epsFlag" gorm:"column:eps_flag"` // EpsDat epsFlag + EpsOdb string `json:"epsOdb" gorm:"column:eps_odb"` // EpsDat epsOdb + HplmnOdb string `json:"hplmnOdb" gorm:"column:hplmn_odb"` // EpsDat hplmnOdb + Ard string `json:"ard" gorm:"column:ard"` // EpsDat Ard + Epstpl string `json:"epstpl" gorm:"column:epstpl"` // EpsDat Epstpl + ContextId string `json:"contextId" gorm:"column:context_id"` // EpsDat ContextId + ApnNum string `json:"apnNum" gorm:"column:apn_mum"` // EpsDat apnNum + ApnContext string `json:"apnContext" gorm:"column:apn_context"` // EpsDat apnContext + StaticIp string `json:"staticIp" gorm:"column:static_ip"` // EpsDat staticIp 指给4G UE分配的静态IP,没有可不带此字段名 + + SmData string `json:"smData" gorm:"column:sm_data"` // smData + SmfSel string `json:"smfSel" gorm:"column:smf_sel"` // smfSel + Cag string `json:"cag" gorm:"column:cag"` // CAG // ====== 非数据库字段属性 ====== + Remark string `json:"remark,omitempty" gorm:"-"` // 备注 } -func (UDMSub) TableName() string { +// TableName 表名称 +func (*UDMSubUser) TableName() string { return "u_sub_user" } diff --git a/src/modules/network_data/model/udm_user_info.go b/src/modules/network_data/model/udm_user_info.go new file mode 100644 index 0000000..470a9ab --- /dev/null +++ b/src/modules/network_data/model/udm_user_info.go @@ -0,0 +1,15 @@ +package model + +// UDMUserInfo UDM用户IMSI扩展信息 u_user_info +type UDMUserInfo struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 默认ID + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 + NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识-子系统 + Remark string `json:"remark" gorm:"remark"` // 备注 +} + +// TableName 表名称 +func (*UDMUserInfo) TableName() string { + return "u_user_info" +} diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index eecf700..a114f75 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -1,11 +1,11 @@ package networkdata import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/framework/middleware/collectlogs" - "nms_cxy/src/framework/middleware/repeat" - "nms_cxy/src/modules/network_data/controller" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/framework/middleware/repeat" + "be.ems/src/modules/network_data/controller" "github.com/gin-gonic/gin" ) @@ -21,11 +21,11 @@ func Setup(router *gin.Engine) { { kpiGroup.GET("/title", middleware.PreAuthorize(nil), - controller.NewPerfKPIController.Title, + controller.NewPerfKPI.Title, ) kpiGroup.GET("/data", middleware.PreAuthorize(nil), - controller.NewPerfKPIController.GoldKPI, + controller.NewPerfKPI.GoldKPI, ) } @@ -34,11 +34,11 @@ func Setup(router *gin.Engine) { { alarmGroup.GET("/list", middleware.PreAuthorize(nil), - controller.NewAlarmController.List, + controller.NewAlarm.List, ) alarmGroup.DELETE("/:alarmIds", middleware.PreAuthorize(nil), - controller.NewAlarmController.Remove, + controller.NewAlarm.Remove, ) } @@ -47,17 +47,17 @@ func Setup(router *gin.Engine) { { imsGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewIMSController.CDRList, + controller.NewIMS.CDRList, ) imsGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewIMSController.CDRRemove, + controller.NewIMS.CDRRemove, ) imsGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewIMSController.CDRExport, + controller.NewIMS.CDRExport, ) } @@ -66,17 +66,17 @@ func Setup(router *gin.Engine) { { smscGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewSMSCController.CDRList, + controller.NewSMSC.CDRList, ) smscGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSMSCController.CDRRemove, + controller.NewSMSC.CDRRemove, ) smscGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSMSCController.CDRExport, + controller.NewSMSC.CDRExport, ) } @@ -85,17 +85,21 @@ func Setup(router *gin.Engine) { { smfGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewSMFController.CDRList, + controller.NewSMF.CDRList, ) smfGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSMFController.CDRRemove, + controller.NewSMF.CDRRemove, ) smfGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSMFController.CDRExport, + controller.NewSMF.CDRExport, + ) + smfGroup.GET("/subscribers", + middleware.PreAuthorize(nil), + controller.NewSMF.SubUserList, ) } @@ -104,17 +108,17 @@ func Setup(router *gin.Engine) { { amfGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewAMFController.UEList, + controller.NewAMF.UEList, ) amfGroup.DELETE("/ue/:ueIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewAMFController.UERemove, + controller.NewAMF.UERemove, ) amfGroup.POST("/ue/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewAMFController.UEExport, + controller.NewAMF.UEExport, ) } @@ -123,7 +127,7 @@ func Setup(router *gin.Engine) { { upfGroup.GET("/totalFlow", middleware.PreAuthorize(nil), - controller.NewUPFController.TotalFlow, + controller.NewUPF.TotalFlow, ) } @@ -240,17 +244,17 @@ func Setup(router *gin.Engine) { { mmeGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewMMEController.UEList, + controller.NewMME.UEList, ) mmeGroup.DELETE("/ue/:ueIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewMMEController.UERemove, + controller.NewMME.UERemove, ) mmeGroup.POST("/ue/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewMMEController.UEExport, + controller.NewMME.UEExport, ) } } diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go index 7d3e324..41d5032 100644 --- a/src/modules/network_data/repository/alarm.go +++ b/src/modules/network_data/repository/alarm.go @@ -1,15 +1,194 @@ package repository -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strings" -// 告警 数据层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.AlarmQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.Alarm +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + selectSql: `select + id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, + alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, + object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, + add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, + clear_time, clear_user, timestamp + from alarm`, - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "alarm_seq": "AlarmSeq", + "alarm_id": "AlarmId", + "alarm_title": "AlarmTitle", + "ne_type": "NeType", + "ne_id": "NeId", + "alarm_code": "AlarmCode", + "event_time": "EventTime", + "alarm_type": "AlarmType", + "orig_severity": "OrigSeverity", + "perceived_severity": "PerceivedSeverity", + "pv_flag": "PvFlag", + "ne_name": "NeName", + "object_uid": "ObjectUid", + "object_name": "ObjectName", + "object_type": "ObjectType", + "location_info": "LocationInfo", + "province": "Province", + "alarm_status": "AlarmStatus", + "specific_problem": "SpecificProblem", + "specific_problem_id": "SpecificProblemId", + "add_info": "AddInfo", + "counter": "Counter", + "latest_event_time": "LatestEventTime", + "ack_state": "AckState", + "ack_time": "AckTime", + "ack_user": "AckUser", + "clear_type": "ClearType", + "clear_time": "ClearTime", + "clear_user": "ClearUser", + "timestamp": "Timestamp", + }, +} + +// Alarm 告警 数据层处理 +type Alarm struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *Alarm) convertResultRows(rows []map[string]any) []model.Alarm { + arr := make([]model.Alarm, 0) + for _, row := range rows { + item := model.Alarm{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "object_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + params = append(params, querys.EndTime) + } + if querys.OrigSeverity != "" { + eventTypes := strings.Split(querys.OrigSeverity, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.Alarm{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from alarm" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *Alarm) SelectByIds(ids []string) []model.Alarm { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.Alarm{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *Alarm) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from alarm where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/alarm.impl.go b/src/modules/network_data/repository/alarm.impl.go deleted file mode 100644 index 7343396..0000000 --- a/src/modules/network_data/repository/alarm.impl.go +++ /dev/null @@ -1,194 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_data/model" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - selectSql: `select - id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, - alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, - object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, - add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, - clear_time, clear_user, timestamp - from alarm`, - - resultMap: map[string]string{ - "id": "ID", - "alarm_seq": "AlarmSeq", - "alarm_id": "AlarmId", - "alarm_title": "AlarmTitle", - "ne_type": "NeType", - "ne_id": "NeId", - "alarm_code": "AlarmCode", - "event_time": "EventTime", - "alarm_type": "AlarmType", - "orig_severity": "OrigSeverity", - "perceived_severity": "PerceivedSeverity", - "pv_flag": "PvFlag", - "ne_name": "NeName", - "object_uid": "ObjectUid", - "object_name": "ObjectName", - "object_type": "ObjectType", - "location_info": "LocationInfo", - "province": "Province", - "alarm_status": "AlarmStatus", - "specific_problem": "SpecificProblem", - "specific_problem_id": "SpecificProblemId", - "add_info": "AddInfo", - "counter": "Counter", - "latest_event_time": "LatestEventTime", - "ack_state": "AckState", - "ack_time": "AckTime", - "ack_user": "AckUser", - "clear_type": "ClearType", - "clear_time": "ClearTime", - "clear_user": "ClearUser", - "timestamp": "Timestamp", - }, -} - -// AlarmImpl 告警 数据层处理 -type AlarmImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *AlarmImpl) convertResultRows(rows []map[string]any) []model.Alarm { - arr := make([]model.Alarm, 0) - for _, row := range rows { - item := model.Alarm{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "object_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - params = append(params, querys.EndTime) - } - if querys.OrigSeverity != "" { - eventTypes := strings.Split(querys.OrigSeverity, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.Alarm{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from alarm" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *AlarmImpl) SelectByIds(ids []string) []model.Alarm { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.Alarm{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *AlarmImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from alarm where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_ims.go b/src/modules/network_data/repository/cdr_event_ims.go index dd68b11..598e848 100644 --- a/src/modules/network_data/repository/cdr_event_ims.go +++ b/src/modules/network_data/repository/cdr_event_ims.go @@ -1,15 +1,189 @@ package repository -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件IMS 数据层接口 -type ICDREventIMS interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventIMSQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventIMS +// 实例化数据层 CDREventIMS 结构体 +var NewCDREventIMS = &CDREventIMS{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventIMS CDR会话事件IMS 数据层处理 +type CDREventIMS struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventIMS) convertResultRows(rows []map[string]any) []model.CDREventIMS { + arr := make([]model.CDREventIMS, 0) + for _, row := range rows { + item := model.CDREventIMS{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.CallerParty != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") + params = append(params, querys.CallerParty) + } + if querys.CalledParty != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") + params = append(params, querys.CalledParty) + } + // MySQL8支持的 + // if querys.RecordType != "" { + // recordTypes := strings.Split(querys.RecordType, ",") + // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) + // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) + // for _, recordType := range recordTypes { + // params = append(params, recordType) + // } + // } + // Mariadb不支持json in查询改or + if querys.RecordType != "" { + recordTypes := strings.Split(querys.RecordType, ",") + var queryStrArr []string + for _, recordType := range recordTypes { + queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, recordType) + } + conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventIMS{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_ims" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventIMS) SelectByIds(cdrIds []string) []model.CDREventIMS { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventIMS{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventIMS) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_ims where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_ims.impl.go b/src/modules/network_data/repository/cdr_event_ims.impl.go deleted file mode 100644 index cc6813a..0000000 --- a/src/modules/network_data/repository/cdr_event_ims.impl.go +++ /dev/null @@ -1,189 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_data/model" -) - -// 实例化数据层 CDREventImpl 结构体 -var NewCDREventIMSImpl = &CDREventIMSImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventIMSImpl CDR会话事件IMS 数据层处理 -type CDREventIMSImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventIMSImpl) convertResultRows(rows []map[string]any) []model.CDREventIMS { - arr := make([]model.CDREventIMS, 0) - for _, row := range rows { - item := model.CDREventIMS{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.CallerParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") - params = append(params, querys.CallerParty) - } - if querys.CalledParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") - params = append(params, querys.CalledParty) - } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string - for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) - } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventIMS{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_ims" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventIMSImpl) SelectByIds(cdrIds []string) []model.CDREventIMS { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventIMS{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMSImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_ims where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_smf.go b/src/modules/network_data/repository/cdr_event_smf.go index 69c188c..14f49cf 100644 --- a/src/modules/network_data/repository/cdr_event_smf.go +++ b/src/modules/network_data/repository/cdr_event_smf.go @@ -1,15 +1,170 @@ package repository -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件SMF 数据层接口 -type ICDREventSMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMFQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventSMF +// 实例化数据层 CDREventSMF 结构体 +var NewCDREventSMF = &CDREventSMF{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventSMF CDR会话事件 数据层处理 +type CDREventSMF struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventSMF) convertResultRows(rows []map[string]any) []model.CDREventSMF { + arr := make([]model.CDREventSMF, 0) + for _, row := range rows { + item := model.CDREventSMF{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.RecordType != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, querys.RecordType) + } + if querys.SubscriberID != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") + params = append(params, querys.SubscriberID) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventSMF{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_smf" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventSMF) SelectByIds(cdrIds []string) []model.CDREventSMF { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventSMF{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMF) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_smf where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_smf.impl.go b/src/modules/network_data/repository/cdr_event_smf.impl.go deleted file mode 100644 index abc71ac..0000000 --- a/src/modules/network_data/repository/cdr_event_smf.impl.go +++ /dev/null @@ -1,170 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMFImpl 结构体 -var NewCDREventSMFImpl = &CDREventSMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventSMFImpl CDR会话事件 数据层处理 -type CDREventSMFImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMFImpl) convertResultRows(rows []map[string]any) []model.CDREventSMF { - arr := make([]model.CDREventSMF, 0) - for _, row := range rows { - item := model.CDREventSMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.RecordType != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, querys.RecordType) - } - if querys.SubscriberID != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") - params = append(params, querys.SubscriberID) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMF{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMFImpl) SelectByIds(cdrIds []string) []model.CDREventSMF { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMF{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMFImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_smsc.go b/src/modules/network_data/repository/cdr_event_smsc.go index 6950a00..7673e7b 100644 --- a/src/modules/network_data/repository/cdr_event_smsc.go +++ b/src/modules/network_data/repository/cdr_event_smsc.go @@ -1,15 +1,181 @@ package repository -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件SMSC 数据层接口 -type ICDREventSMSC interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMSCQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventSMSC +// 实例化数据层 CDREventSMSC 结构体 +var NewCDREventSMSC = &CDREventSMSC{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventSMSC CDR会话事件 数据层处理 +type CDREventSMSC struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventSMSC) convertResultRows(rows []map[string]any) []model.CDREventSMSC { + arr := make([]model.CDREventSMSC, 0) + for _, row := range rows { + item := model.CDREventSMSC{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + // MySQL8支持的 + // if querys.RecordType != "" { + // recordTypes := strings.Split(querys.RecordType, ",") + // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) + // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) + // for _, recordType := range recordTypes { + // params = append(params, recordType) + // } + // } + // Mariadb不支持json in查询改or + if querys.RecordType != "" { + recordTypes := strings.Split(querys.RecordType, ",") + var queryStrArr []string + for _, recordType := range recordTypes { + queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, recordType) + } + conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventSMSC{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_smsc" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventSMSC) SelectByIds(cdrIds []string) []model.CDREventSMSC { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventSMSC{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMSC) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_smsc.impl.go b/src/modules/network_data/repository/cdr_event_smsc.impl.go deleted file mode 100644 index 9f955d5..0000000 --- a/src/modules/network_data/repository/cdr_event_smsc.impl.go +++ /dev/null @@ -1,181 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMSCImpl 结构体 -var NewCDREventSMSCImpl = &CDREventSMSCImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventSMSCImpl CDR会话事件 数据层处理 -type CDREventSMSCImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMSCImpl) convertResultRows(rows []map[string]any) []model.CDREventSMSC { - arr := make([]model.CDREventSMSC, 0) - for _, row := range rows { - item := model.CDREventSMSC{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMSCImpl) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string - for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) - } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMSC{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smsc" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMSCImpl) SelectByIds(cdrIds []string) []model.CDREventSMSC { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMSC{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSCImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/perf_kpi.go b/src/modules/network_data/repository/perf_kpi.go index ec2e302..e757fe0 100644 --- a/src/modules/network_data/repository/perf_kpi.go +++ b/src/modules/network_data/repository/perf_kpi.go @@ -1,15 +1,131 @@ package repository -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strings" -// 性能统计 数据层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) - // SelectGoldKPITitle 网元对应的指标名称 - SelectGoldKPITitle(neType string) []model.GoldKPITitle +// 实例化数据层 PerfKPI 结构体 +var NewPerfKPI = &PerfKPI{} - // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 - SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any +// PerfKPI 性能统计 数据层处理 +type PerfKPI struct{} + +// SelectGoldKPI 通过网元指标数据信息 +func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + var tableName string = "kpi_report_" + if query.RmUID != "" { + conditions = append(conditions, "gk.rm_uid = ?") + params = append(params, query.RmUID) + } + if query.NeType != "" { + //conditions = append(conditions, "gk.ne_type = ?") + // params = append(params, query.NeType) + tableName += strings.ToLower(query.NeType) + } + if query.StartTime != "" { + conditions = append(conditions, "gk.created_at >= ?") + params = append(params, query.StartTime) + } + if query.EndTime != "" { + conditions = append(conditions, "gk.created_at <= ?") + params = append(params, query.EndTime) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询字段列 + var fields = []string{ + // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), + fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 + "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", + "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", + "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", + } + for i, kid := range kpiIds { + // 特殊字段,只取最后一次收到的非0值 + if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { + str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) + fields = append(fields, str) + } else { + str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) + fields = append(fields, str) + } + } + fieldsSql := strings.Join(fields, ",") + + // 查询数据 + if query.SortField == "" { + query.SortField = "timeGroup" + } + if query.SortOrder == "" { + query.SortOrder = "desc" + } + orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) + querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results +} + +// SelectGoldKPITitle 网元对应的指标名称 +func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { + result := []model.GoldKPITitle{} + tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) + if err := tx.Error; err != nil { + logger.Errorf("Find err => %v", err) + } + return result +} + +// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if neType != "" { + conditions = append(conditions, "kupf.ne_type = ?") + params = append(params, neType) + } + if rmUID != "" { + conditions = append(conditions, "kupf.rm_uid = ?") + params = append(params, rmUID) + } + if startDate != "" { + conditions = append(conditions, "kupf.created_at >= ?") + params = append(params, startDate) + } + if endDate != "" { + conditions = append(conditions, "kupf.created_at <= ?") + params = append(params, endDate) + } + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := `SELECT + sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', + sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' + FROM kpi_report_upf kupf` + results, err := datasource.RawDB("", querySql+whereSql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results[0] } diff --git a/src/modules/network_data/repository/perf_kpi.impl.go b/src/modules/network_data/repository/perf_kpi.impl.go deleted file mode 100644 index 6f4423b..0000000 --- a/src/modules/network_data/repository/perf_kpi.impl.go +++ /dev/null @@ -1,131 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/modules/network_data/model" -) - -// 实例化数据层 PerfKPIImpl 结构体 -var NewPerfKPIImpl = &PerfKPIImpl{} - -// PerfKPIImpl 性能统计 数据层处理 -type PerfKPIImpl struct{} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - var tableName string = "kpi_report_" - if query.RmUID != "" { - conditions = append(conditions, "gk.rm_uid = ?") - params = append(params, query.RmUID) - } - if query.NeType != "" { - //conditions = append(conditions, "gk.ne_type = ?") - // params = append(params, query.NeType) - tableName += strings.ToLower(query.NeType) - } - if query.StartTime != "" { - conditions = append(conditions, "gk.created_at >= ?") - params = append(params, query.StartTime) - } - if query.EndTime != "" { - conditions = append(conditions, "gk.created_at <= ?") - params = append(params, query.EndTime) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询字段列 - var fields = []string{ - // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), - fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 - "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", - "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", - "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", - } - for i, kid := range kpiIds { - // 特殊字段,只取最后一次收到的非0值 - if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { - str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } else { - str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } - } - fieldsSql := strings.Join(fields, ",") - - // 查询数据 - if query.SortField == "" { - query.SortField = "timeGroup" - } - if query.SortOrder == "" { - query.SortOrder = "desc" - } - orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) - querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - result := []model.GoldKPITitle{} - tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) - if err := tx.Error; err != nil { - logger.Errorf("Find err => %v", err) - } - return result -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if neType != "" { - conditions = append(conditions, "kupf.ne_type = ?") - params = append(params, neType) - } - if rmUID != "" { - conditions = append(conditions, "kupf.rm_uid = ?") - params = append(params, rmUID) - } - if startDate != "" { - conditions = append(conditions, "kupf.created_at >= ?") - params = append(params, startDate) - } - if endDate != "" { - conditions = append(conditions, "kupf.created_at <= ?") - params = append(params, endDate) - } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := `SELECT - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' - FROM kpi_report_upf kupf` - results, err := datasource.RawDB("", querySql+whereSql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results[0] -} diff --git a/src/modules/network_data/repository/udm_auth.go b/src/modules/network_data/repository/udm_auth.go index 1f3610b..980ef00 100644 --- a/src/modules/network_data/repository/udm_auth.go +++ b/src/modules/network_data/repository/udm_auth.go @@ -1,26 +1,132 @@ package repository import ( - "nms_cxy/src/modules/network_data/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" ) -// UDM鉴权信息 数据层接口 -type IUDMAuth interface { - // ClearAndInsert 清空ne_id后新增实体 - ClearAndInsert(neId string, uArr []model.UDMAuth) int64 +// 实例化数据层 UDMAuthUser 结构体 +var NewUDMAuthUser = &UDMAuthUser{} - // SelectPage 根据条件分页查询 - SelectPage(query map[string]any) map[string]any +// UDMAuthUser UDM鉴权信息表 数据层处理 +type UDMAuthUser struct{} - // SelectList 根据实体查询 - SelectList(u model.UDMAuth) []model.UDMAuth - - // Insert 批量添加 - Inserts(uArr []model.UDMAuth) int64 - - // Delete 删除实体 - Delete(neId, imsi string) int64 - - // DeletePrefixByIMSI 删除前缀匹配的实体 - DeletePrefixByIMSI(neId, imsi string) int64 +// ClearAndInsert 清空ne_id后新增实体 +func (r *UDMAuthUser) ClearAndInsert(neId string, uArr []model.UDMAuthUser) int64 { + // 不指定neID时,用 TRUNCATE 清空表快 + // _, err := datasource.ExecDB("", "TRUNCATE TABLE u_auth_user", nil) + result := datasource.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMAuthUser{}) + if result.Error != nil { + logger.Errorf("Delete err => %v", result.Error) + } + return r.Inserts(uArr) +} + +// SelectPage 根据条件分页查询 +func (r *UDMAuthUser) SelectPage(query map[string]any) (int64, []model.UDMAuthUser) { + tx := datasource.DB("").Model(&model.UDMAuthUser{}) + // 查询条件拼接 + if v, ok := query["imsi"]; ok && v != "" { + tx = tx.Where("imsi like concat(concat('%',?), '%')", v) + } + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id =?", v) + } + if v, ok := query["imsis"]; ok && v != "" { + tx = tx.Where("imsi in ?", v) + } + + var total int64 = 0 + rows := []model.UDMAuthUser{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + logger.Errorf("total err => %v", err) + return total, rows + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v.(string) + if o, ok := query["sortOrder"]; ok && o != nil && v != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return total, rows +} + +// SelectList 根据实体查询 +func (r *UDMAuthUser) SelectList(u model.UDMAuthUser) []model.UDMAuthUser { + tx := datasource.DB("").Model(&model.UDMAuthUser{}) + // 查询条件拼接 + if u.IMSI != "" { + tx = tx.Where("imsi = ?", u.IMSI) + } + if u.NeId != "" { + tx = tx.Where("ne_id = ?", u.NeId) + } + + // 查询数据 + arr := []model.UDMAuthUser{} + if err := tx.Order("imsi asc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// SelectByIMSIAndNeID 通过imsi和ne_id查询 +func (r *UDMAuthUser) SelectByIMSIAndNeID(imsi, neId string) model.UDMAuthUser { + tx := datasource.DB("").Model(&model.UDMAuthUser{}) + item := model.UDMAuthUser{} + // 查询条件拼接 + tx = tx.Where("imsi = ? and ne_id = ?", imsi, neId) + // 查询数据 + if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return item +} + +// Insert 批量添加 +func (r *UDMAuthUser) Inserts(uArr []model.UDMAuthUser) int64 { + tx := datasource.DB("").CreateInBatches(uArr, 3000) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return tx.RowsAffected +} + +// Delete 删除实体 +func (r *UDMAuthUser) Delete(imsi, neId string) int64 { + tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMAuthUser{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected +} + +// DeletePrefixByIMSI 删除前缀匹配的实体 +func (r *UDMAuthUser) DeletePrefixByIMSI(neId, imsi string) int64 { + tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsi, neId).Delete(&model.UDMAuthUser{}) + if err := tx.Error; err != nil { + logger.Errorf("DeletePrefixByIMSI err => %v", err) + } + return tx.RowsAffected } diff --git a/src/modules/network_data/repository/udm_sub.go b/src/modules/network_data/repository/udm_sub.go index 2f5e410..7f57dc5 100644 --- a/src/modules/network_data/repository/udm_sub.go +++ b/src/modules/network_data/repository/udm_sub.go @@ -1,26 +1,135 @@ package repository import ( - "nms_cxy/src/modules/network_data/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" ) -// UDM签约信息 数据层接口 -type IUDMSub interface { - // ClearAndInsert 清空ne_id后新增实体 - ClearAndInsert(neId string, uArr []model.UDMSub) int64 +// 实例化数据层 UDMSubUser 结构体 +var NewUDMSub = &UDMSubUser{} - // SelectPage 根据条件分页查询 - SelectPage(query map[string]any) map[string]any +// UDMSubUser UDM签约信息表 数据层处理 +type UDMSubUser struct{} - // SelectList 根据实体查询 - SelectList(u model.UDMSub) []model.UDMSub - - // Insert 批量添加 - Inserts(uArr []model.UDMSub) int64 - - // Delete 删除实体 - Delete(neId, imsi string) int64 - - // DeletePrefixByIMSI 删除前缀匹配的实体 - DeletePrefixByIMSI(neId, imsi string) int64 +// ClearAndInsert 清空ne_id后新增实体 +func (r *UDMSubUser) ClearAndInsert(neId string, u []model.UDMSubUser) int64 { + // 不指定neID时,用 TRUNCATE 清空表快 + // _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil) + result := datasource.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMSubUser{}) + if result.Error != nil { + logger.Errorf("Delete err => %v", result.Error) + } + return r.Inserts(u) +} + +// SelectPage 根据条件分页查询字典类型 +func (r *UDMSubUser) SelectPage(query map[string]any) (int64, []model.UDMSubUser) { + tx := datasource.DB("").Model(&model.UDMSubUser{}) + // 查询条件拼接 + if v, ok := query["imsi"]; ok && v != "" { + tx = tx.Where("imsi like concat(concat('%', ?), '%')", v) + } + if v, ok := query["msisdn"]; ok && v != "" { + tx = tx.Where("msisdn like concat(concat('%', ?), '%')", v) + } + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id =?", v) + } + if v, ok := query["imsis"]; ok && v != "" { + tx = tx.Where("imsi in ?", v) + } + + var total int64 = 0 + rows := []model.UDMSubUser{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + logger.Errorf("total err => %v", err) + return total, rows + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v.(string) + if o, ok := query["sortOrder"]; ok && o != nil && v != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return total, rows +} + +// SelectList 根据实体查询 +func (r *UDMSubUser) SelectList(u model.UDMSubUser) []model.UDMSubUser { + tx := datasource.DB("").Model(&model.UDMSubUser{}) + // 查询条件拼接 + if u.IMSI != "" { + tx = tx.Where("imsi = ?", u.IMSI) + } + if u.NeId != "" { + tx = tx.Where("ne_id = ?", u.NeId) + } + + // 查询数据 + arr := []model.UDMSubUser{} + if err := tx.Order("imsi asc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// SelectByIMSIAndNeID 通过imsi和ne_id查询 +func (r *UDMSubUser) SelectByIMSIAndNeID(imsi, neId string) model.UDMSubUser { + tx := datasource.DB("").Model(&model.UDMSubUser{}) + item := model.UDMSubUser{} + // 查询条件拼接 + tx = tx.Where("imsi = ? and ne_id = ?", imsi, neId) + // 查询数据 + if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return item +} + +// Insert 批量添加 +func (r *UDMSubUser) Inserts(uArr []model.UDMSubUser) int64 { + tx := datasource.DB("").CreateInBatches(uArr, 2000) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return tx.RowsAffected +} + +// Delete 删除实体 +func (r *UDMSubUser) Delete(imsi, neId string) int64 { + tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMSubUser{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected +} + +// DeletePrefixByIMSI 删除前缀匹配的实体 +func (r *UDMSubUser) DeletePrefixByIMSI(imsiPrefix, neId string) int64 { + tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsiPrefix, neId).Delete(&model.UDMSubUser{}) + if err := tx.Error; err != nil { + logger.Errorf("DeletePrefixByIMSI err => %v", err) + } + return tx.RowsAffected } diff --git a/src/modules/network_data/repository/udm_sub.impl.go b/src/modules/network_data/repository/udm_sub.impl.go deleted file mode 100644 index 5c87af5..0000000 --- a/src/modules/network_data/repository/udm_sub.impl.go +++ /dev/null @@ -1,211 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_data/model" -) - -// 实例化数据层 UDMSubImpl 结构体 -var NewUDMSubImpl = &UDMSubImpl{ - selectSql: `select - id, msisdn, imsi, ambr, nssai, rat, arfb, sar, cn, sm_data, smf_sel, eps_dat, ne_id, eps_flag, eps_odb, hplmn_odb, ard, epstpl, context_id, apn_context, static_ip - from u_sub_user`, - - resultMap: map[string]string{ - "id": "ID", - "msisdn": "Msisdn", - "imsi": "IMSI", - "ambr": "Ambr", - "nssai": "Nssai", - "rat": "Rat", - "arfb": "Arfb", - "sar": "Sar", - "cn": "Cn", - "sm_data": "SmData", - "smf_sel": "SmfSel", - "eps_dat": "EpsDat", - "ne_id": "NeId", - "eps_flag": "EpsFlag", - "eps_odb": "EpsOdb", - "hplmn_odb": "HplmnOdb", - "ard": "Ard", - "epstpl": "Epstpl", - "context_id": "ContextId", - "apn_context": "ApnContext", - "static_ip": "StaticIp", - }, -} - -// UDMSubImpl UDM签约信息表 数据层处理 -type UDMSubImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UDMSubImpl) convertResultRows(rows []map[string]any) []model.UDMSub { - arr := make([]model.UDMSub, 0) - for _, row := range rows { - item := model.UDMSub{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// ClearAndInsert 清空ne_id后新增实体 -func (r *UDMSubImpl) ClearAndInsert(neID string, u []model.UDMSub) int64 { - // 不指定neID时,用 TRUNCATE 清空表快 - _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil) - if err != nil { - logger.Errorf("TRUNCATE err => %v", err) - } - - return r.Inserts(u) -} - -// SelectPage 根据条件分页查询字典类型 -func (r *UDMSubImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["msisdn"]; ok && v != "" { - conditions = append(conditions, "msisdn like concat(concat('%', ?), '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["imsi"]; ok && v != "" { - conditions = append(conditions, "imsi like concat(concat('%', ?), '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UDMSub{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from u_sub_user" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if v, ok := query["sortField"]; ok && v != "" { - sortSql := v.(string) - if o, ok := query["sortOrder"]; ok && o != nil && v != "" { - if o == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *UDMSubImpl) SelectList(u model.UDMSub) []model.UDMSub { - // 查询条件拼接 - var conditions []string - var params []any - if u.IMSI != "" { - conditions = append(conditions, "imsi = ?") - params = append(params, u.IMSI) - } - if u.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, u.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by imsi asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 批量添加 -func (r *UDMSubImpl) Inserts(uArr []model.UDMSub) int64 { - tx := datasource.DefaultDB().CreateInBatches(uArr, 2000) - if err := tx.Error; err != nil { - logger.Errorf("CreateInBatches err => %v", err) - } - return tx.RowsAffected -} - -// Delete 删除实体 -func (r *UDMSubImpl) Delete(neId, imsi string) int64 { - tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMSub{}) - if err := tx.Error; err != nil { - logger.Errorf("Delete err => %v", err) - } - return tx.RowsAffected -} - -// DeletePrefixByIMSI 删除前缀匹配的实体 -func (r *UDMSubImpl) DeletePrefixByIMSI(neId, imsi string) int64 { - tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsi, neId).Delete(&model.UDMSub{}) - if err := tx.Error; err != nil { - logger.Errorf("DeletePrefixByIMSI err => %v", err) - } - return tx.RowsAffected -} diff --git a/src/modules/network_data/repository/udm_auth.impl.go b/src/modules/network_data/repository/udm_user_info.go similarity index 67% rename from src/modules/network_data/repository/udm_auth.impl.go rename to src/modules/network_data/repository/udm_user_info.go index 69968a9..c7aead4 100644 --- a/src/modules/network_data/repository/udm_auth.impl.go +++ b/src/modules/network_data/repository/udm_user_info.go @@ -4,31 +4,28 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_data/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" ) -// 实例化数据层 UDMAuthImpl 结构体 -var NewUDMAuthImpl = &UDMAuthImpl{ - selectSql: `select id, imsi, amf, status, ki, algo_index, opc, ne_id from u_auth_user`, +// 实例化数据层 UDMUserInfo 结构体 +var NewUDMUserInfo = &UDMUserInfo{ + selectSql: `select id, imsi, msisdn, ne_id, remark from u_user_info`, resultMap: map[string]string{ - "id": "ID", - "imsi": "IMSI", - "amf": "Amf", - "status": "Status", - "ki": "Ki", - "algo_index": "AlgoIndex", - "opc": "Opc", - "ne_id": "NeId", + "id": "ID", + "imsi": "IMSI", + "msisdn": "MSISDN", + "ne_id": "NeId", + "remark": "Remark", }, } -// UDMAuthImpl UDM鉴权信息表 数据层处理 -type UDMAuthImpl struct { +// UDMUserInfo UDM鉴权信息表 数据层处理 +type UDMUserInfo struct { // 查询视图对象SQL selectSql string // 结果字段与实体映射 @@ -36,10 +33,10 @@ type UDMAuthImpl struct { } // convertResultRows 将结果记录转实体结果组 -func (r *UDMAuthImpl) convertResultRows(rows []map[string]any) []model.UDMAuth { - arr := make([]model.UDMAuth, 0) +func (r *UDMUserInfo) convertResultRows(rows []map[string]any) []model.UDMUserInfo { + arr := make([]model.UDMUserInfo, 0) for _, row := range rows { - item := model.UDMAuth{} + item := model.UDMUserInfo{} for key, value := range row { if keyMapper, ok := r.resultMap[key]; ok { repo.SetFieldValue(&item, keyMapper, value) @@ -50,18 +47,8 @@ func (r *UDMAuthImpl) convertResultRows(rows []map[string]any) []model.UDMAuth { return arr } -// ClearAndInsert 清空ne_id后新增实体 -func (r *UDMAuthImpl) ClearAndInsert(neId string, uArr []model.UDMAuth) int64 { - // 不指定neID时,用 TRUNCATE 清空表快 - _, err := datasource.ExecDB("", "TRUNCATE TABLE u_auth_user", nil) - if err != nil { - logger.Errorf("TRUNCATE err => %v", err) - } - return r.Inserts(uArr) -} - // SelectPage 根据条件分页查询 -func (r *UDMAuthImpl) SelectPage(query map[string]any) map[string]any { +func (r *UDMUserInfo) SelectPage(query map[string]any) map[string]any { // 查询条件拼接 var conditions []string var params []any @@ -82,11 +69,11 @@ func (r *UDMAuthImpl) SelectPage(query map[string]any) map[string]any { result := map[string]any{ "total": 0, - "rows": []model.UDMAuth{}, + "rows": []model.UDMUserInfo{}, } // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from u_auth_user" + totalSql := "select count(1) as 'total' from u_user_info" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { logger.Errorf("total err => %v", err) @@ -132,7 +119,7 @@ func (r *UDMAuthImpl) SelectPage(query map[string]any) map[string]any { } // SelectList 根据实体查询 -func (r *UDMAuthImpl) SelectList(u model.UDMAuth) []model.UDMAuth { +func (r *UDMUserInfo) SelectList(u model.UDMUserInfo) []model.UDMUserInfo { // 查询条件拼接 var conditions []string var params []any @@ -162,8 +149,24 @@ func (r *UDMAuthImpl) SelectList(u model.UDMAuth) []model.UDMAuth { return r.convertResultRows(results) } +// SelectByIMSIAndNeID 通过imsi和ne_id查询 +func (r *UDMUserInfo) SelectByIMSIAndNeID(imsi, neId string) model.UDMUserInfo { + querySql := r.selectSql + " where imsi = ? and ne_id = ?" + results, err := datasource.RawDB("", querySql, []any{imsi, neId}) + if err != nil { + logger.Errorf("query err => %v", err) + return model.UDMUserInfo{} + } + // 转换实体 + rows := r.convertResultRows(results) + if len(rows) > 0 { + return rows[0] + } + return model.UDMUserInfo{} +} + // Insert 批量添加 -func (r *UDMAuthImpl) Inserts(uArr []model.UDMAuth) int64 { +func (r *UDMUserInfo) Inserts(uArr []model.UDMUserInfo) int64 { tx := datasource.DefaultDB().CreateInBatches(uArr, 3000) if err := tx.Error; err != nil { logger.Errorf("CreateInBatches err => %v", err) @@ -172,8 +175,8 @@ func (r *UDMAuthImpl) Inserts(uArr []model.UDMAuth) int64 { } // Delete 删除实体 -func (r *UDMAuthImpl) Delete(neId, imsi string) int64 { - tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMAuth{}) +func (r *UDMUserInfo) Delete(imsi, neId string) int64 { + tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMUserInfo{}) if err := tx.Error; err != nil { logger.Errorf("Delete err => %v", err) } @@ -181,8 +184,8 @@ func (r *UDMAuthImpl) Delete(neId, imsi string) int64 { } // DeletePrefixByIMSI 删除前缀匹配的实体 -func (r *UDMAuthImpl) DeletePrefixByIMSI(neId, imsi string) int64 { - tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsi, neId).Delete(&model.UDMAuth{}) +func (r *UDMUserInfo) DeletePrefixByIMSI(imsiPrefix, neId string) int64 { + tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsiPrefix, neId).Delete(&model.UDMUserInfo{}) if err := tx.Error; err != nil { logger.Errorf("DeletePrefixByIMSI err => %v", err) } diff --git a/src/modules/network_data/repository/ue_event_amf.go b/src/modules/network_data/repository/ue_event_amf.go index 5608b9f..76442b8 100644 --- a/src/modules/network_data/repository/ue_event_amf.go +++ b/src/modules/network_data/repository/ue_event_amf.go @@ -1,15 +1,175 @@ package repository -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strings" -// UE会话事件AMF 数据层接口 -type IUEEventAMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventAMFQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ueIds []string) []model.UEEventAMF +// 实例化数据层 UEEventAMF 结构体 +var NewUEEventAMF = &UEEventAMF{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + }, +} + +// UEEventAMF UE会话事件 数据层处理 +type UEEventAMF struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *UEEventAMF) convertResultRows(rows []map[string]any) []model.UEEventAMF { + arr := make([]model.UEEventAMF, 0) + for _, row := range rows { + item := model.UEEventAMF{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.EventType != "" { + eventTypes := strings.Split(querys.EventType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + if querys.IMSI != "" { + conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") + params = append(params, querys.IMSI) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.UEEventAMF{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ue_event_amf" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *UEEventAMF) SelectByIds(ueIds []string) []model.UEEventAMF { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.UEEventAMF{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventAMF) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event_amf where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/ue_event_amf.impl.go b/src/modules/network_data/repository/ue_event_amf.impl.go deleted file mode 100644 index 2643cb2..0000000 --- a/src/modules/network_data/repository/ue_event_amf.impl.go +++ /dev/null @@ -1,175 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_data/model" -) - -// 实例化数据层 UEEventAMFImpl 结构体 -var NewUEEventAMFImpl = &UEEventAMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", - }, -} - -// UEEventAMFImpl UE会话事件 数据层处理 -type UEEventAMFImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UEEventAMFImpl) convertResultRows(rows []map[string]any) []model.UEEventAMF { - arr := make([]model.UEEventAMF, 0) - for _, row := range rows { - item := model.UEEventAMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - if querys.IMSI != "" { - conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") - params = append(params, querys.IMSI) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UEEventAMF{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_amf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *UEEventAMFImpl) SelectByIds(ueIds []string) []model.UEEventAMF { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.UEEventAMF{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMFImpl) DeleteByIds(ueIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - sql := "delete from ue_event_amf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/ue_event_mme.go b/src/modules/network_data/repository/ue_event_mme.go index 6b9c5ce..a035f5a 100644 --- a/src/modules/network_data/repository/ue_event_mme.go +++ b/src/modules/network_data/repository/ue_event_mme.go @@ -1,15 +1,175 @@ package repository -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strings" -// UE会话事件MME 数据层接口 -type IUEEventMME interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventMMEQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ueIds []string) []model.UEEventMME +// 实例化数据层 UEEventMME 结构体 +var NewUEEventMME = &UEEventMME{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + }, +} + +// UEEventMME UE会话事件 数据层处理 +type UEEventMME struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *UEEventMME) convertResultRows(rows []map[string]any) []model.UEEventMME { + arr := make([]model.UEEventMME, 0) + for _, row := range rows { + item := model.UEEventMME{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.EventType != "" { + eventTypes := strings.Split(querys.EventType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + if querys.IMSI != "" { + conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") + params = append(params, querys.IMSI) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.UEEventMME{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ue_event_mme" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *UEEventMME) SelectByIds(ueIds []string) []model.UEEventMME { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.UEEventMME{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventMME) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event_mme where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/ue_event_mme.impl.go b/src/modules/network_data/repository/ue_event_mme.impl.go deleted file mode 100644 index 4dbe7bf..0000000 --- a/src/modules/network_data/repository/ue_event_mme.impl.go +++ /dev/null @@ -1,175 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_data/model" -) - -// 实例化数据层 UEEventMMEImpl 结构体 -var NewUEEventMMEImpl = &UEEventMMEImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", - }, -} - -// UEEventMMEImpl UE会话事件 数据层处理 -type UEEventMMEImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UEEventMMEImpl) convertResultRows(rows []map[string]any) []model.UEEventMME { - arr := make([]model.UEEventMME, 0) - for _, row := range rows { - item := model.UEEventMME{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - if querys.IMSI != "" { - conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") - params = append(params, querys.IMSI) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UEEventMME{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_mme" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *UEEventMMEImpl) SelectByIds(ueIds []string) []model.UEEventMME { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.UEEventMME{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMMEImpl) DeleteByIds(ueIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - sql := "delete from ue_event_mme where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/service/alarm.go b/src/modules/network_data/service/alarm.go index 8ff85be..3df04ea 100644 --- a/src/modules/network_data/service/alarm.go +++ b/src/modules/network_data/service/alarm.go @@ -1,12 +1,39 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" -// 告警 服务层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.AlarmQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + alarmRepository: repository.NewAlarm, +} + +// Alarm 告警 服务层处理 +type Alarm struct { + alarmRepository *repository.Alarm // 告警数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { + return r.alarmRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *Alarm) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.alarmRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(data) == len(ids) { + rows := r.alarmRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/alarm.impl.go b/src/modules/network_data/service/alarm.impl.go deleted file mode 100644 index 90c4e01..0000000 --- a/src/modules/network_data/service/alarm.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - alarmRepository: repository.NewAlarmImpl, -} - -// AlarmImpl 告警 服务层处理 -type AlarmImpl struct { - // 告警数据信息 - alarmRepository repository.IAlarm -} - -// SelectPage 根据条件分页查询 -func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { - return r.alarmRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *AlarmImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.alarmRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(data) == len(ids) { - rows := r.alarmRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_ims.go b/src/modules/network_data/service/cdr_event_ims.go index 9cba9df..922fb02 100644 --- a/src/modules/network_data/service/cdr_event_ims.go +++ b/src/modules/network_data/service/cdr_event_ims.go @@ -1,12 +1,39 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件IMS 服务层接口 -type ICDREventIMS interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventIMSQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventIMS 结构体 +var NewCDREventIMS = &CDREventIMS{ + cdrEventIMSRepository: repository.NewCDREventIMS, +} + +// CDREventImpl CDR会话事件IMS 服务层处理 +type CDREventIMS struct { + cdrEventIMSRepository *repository.CDREventIMS // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { + return r.cdrEventIMSRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventIMS) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_ims.impl.go b/src/modules/network_data/service/cdr_event_ims.impl.go deleted file mode 100644 index 5a661b6..0000000 --- a/src/modules/network_data/service/cdr_event_ims.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -// 实例化数据层 NewCDREventIMSImpl 结构体 -var NewCDREventIMSImpl = &CDREventIMSImpl{ - cdrEventIMSRepository: repository.NewCDREventIMSImpl, -} - -// CDREventImpl CDR会话事件IMS 服务层处理 -type CDREventIMSImpl struct { - // CDR会话事件数据信息 - cdrEventIMSRepository repository.ICDREventIMS -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]any { - return r.cdrEventIMSRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMSImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_smf.go b/src/modules/network_data/service/cdr_event_smf.go index fa8fcc4..abd30a8 100644 --- a/src/modules/network_data/service/cdr_event_smf.go +++ b/src/modules/network_data/service/cdr_event_smf.go @@ -1,12 +1,39 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件SMF 服务层接口 -type ICDREventSMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMFQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventSMF 结构体 +var NewCDREventSMF = &CDREventSMF{ + cdrEventRepository: repository.NewCDREventSMF, +} + +// CDREventSMF CDR会话事件SMF 服务层处理 +type CDREventSMF struct { + cdrEventRepository *repository.CDREventSMF // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { + return r.cdrEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMF) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_smf.impl.go b/src/modules/network_data/service/cdr_event_smf.impl.go deleted file mode 100644 index e6d9743..0000000 --- a/src/modules/network_data/service/cdr_event_smf.impl.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -var NewCDREventSMFImpl = &CDREventSMFImpl{ - cdrEventRepository: repository.NewCDREventSMFImpl, -} - -type CDREventSMFImpl struct { - // CDR会话事件数据信息 - cdrEventRepository repository.ICDREventSMF -} - -func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMFImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_smsc.go b/src/modules/network_data/service/cdr_event_smsc.go index ab43f21..3944887 100644 --- a/src/modules/network_data/service/cdr_event_smsc.go +++ b/src/modules/network_data/service/cdr_event_smsc.go @@ -1,12 +1,39 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件SMSC 服务层接口 -type ICDREventSMSC interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMSCQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventSMSC 结构体 +var NewCDREventSMSC = &CDREventSMSC{ + cdrEventRepository: repository.NewCDREventSMSC, +} + +// CDREventSMSC CDR会话事件SMSC 服务层处理 +type CDREventSMSC struct { + cdrEventRepository *repository.CDREventSMSC // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { + return r.cdrEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMSC) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_smsc.impl.go b/src/modules/network_data/service/cdr_event_smsc.impl.go deleted file mode 100644 index 582f7f2..0000000 --- a/src/modules/network_data/service/cdr_event_smsc.impl.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -var NewCDREventSMSCImpl = &CDREventSMSCImpl{ - cdrEventRepository: repository.NewCDREventSMSCImpl, -} - -type CDREventSMSCImpl struct { - // CDR会话事件数据信息 - cdrEventRepository repository.ICDREventSMSC -} - -func (r *CDREventSMSCImpl) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSCImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/perf_kpi.go b/src/modules/network_data/service/perf_kpi.go index 00fbe35..b4aef0c 100644 --- a/src/modules/network_data/service/perf_kpi.go +++ b/src/modules/network_data/service/perf_kpi.go @@ -1,15 +1,79 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "encoding/json" + "fmt" + "time" -// 性能统计 服务层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery) []map[string]any + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // SelectGoldKPITitle 网元对应的指标名称 - SelectGoldKPITitle(neType string) []model.GoldKPITitle - - // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 - SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any +// 实例化数据层 PerfKPI 结构体 +var NewPerfKPI = &PerfKPI{ + perfKPIRepository: repository.NewPerfKPI, +} + +// PerfKPI 性能统计 服务层处理 +type PerfKPI struct { + perfKPIRepository *repository.PerfKPI // 性能统计数据信息 +} + +// SelectGoldKPI 通过网元指标数据信息 +func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { + // 获取数据指标id + var kpiIds []string + kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) + for _, kpiId := range kpiTitles { + kpiIds = append(kpiIds, kpiId.KPIID) + } + + data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) + if data == nil { + return []map[string]any{} + } + return data +} + +// SelectGoldKPITitle 网元对应的指标名称 +func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { + return r.perfKPIRepository.SelectGoldKPITitle(neType) +} + +// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { + now := time.Now() + // 获取当前日期 + endDate := fmt.Sprint(now.UnixMilli()) + // 将当前日期前几天数 + startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) + + var info map[string]any + + // 读取缓存数据 小于2分钟重新缓存 + key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) + infoStr, _ := redis.Get("", key) + if infoStr != "" { + json.Unmarshal([]byte(infoStr), &info) + expireSecond, _ := redis.GetExpire("", key) + if expireSecond > 120 { + return info + } + } + // down * 8 / 1000 / 1000 单位M + info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) + if v, ok := info["up"]; ok && v == nil { + info["up"] = 0 + } + if v, ok := info["down"]; ok && v == nil { + info["down"] = 0 + } + + // 保存到缓存 + infoJSON, _ := json.Marshal(info) + redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) + + return info } diff --git a/src/modules/network_data/service/perf_kpi.impl.go b/src/modules/network_data/service/perf_kpi.impl.go deleted file mode 100644 index d06a32c..0000000 --- a/src/modules/network_data/service/perf_kpi.impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "time" - - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/redis" - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -// 实例化数据层 PerfKPIImpl 结构体 -var NewPerfKPIImpl = &PerfKPIImpl{ - perfKPIRepository: repository.NewPerfKPIImpl, -} - -// PerfKPIImpl 性能统计 服务层处理 -type PerfKPIImpl struct { - // 性能统计数据信息 - perfKPIRepository repository.IPerfKPI -} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { - // 获取数据指标id - var kpiIds []string - kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) - for _, kpiId := range kpiTitles { - kpiIds = append(kpiIds, kpiId.KPIID) - } - - data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) - if data == nil { - return []map[string]any{} - } - return data -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - return r.perfKPIRepository.SelectGoldKPITitle(neType) -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { - now := time.Now() - // 获取当前日期 - endDate := fmt.Sprint(now.UnixMilli()) - // 将当前日期前几天数 - startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) - - var info map[string]any - - // 读取缓存数据 小于2分钟重新缓存 - key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) - infoStr, _ := redis.Get("", key) - if infoStr != "" { - json.Unmarshal([]byte(infoStr), &info) - expireSecond, _ := redis.GetExpire("", key) - if expireSecond > 120 { - return info - } - } - - info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) - if v, ok := info["up"]; ok && v == nil { - info["up"] = 0 - } - if v, ok := info["down"]; ok && v == nil { - info["down"] = 0 - } - - // 保存到缓存 - infoJSON, _ := json.Marshal(info) - redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) - - return info -} diff --git a/src/modules/network_data/service/udm_auth.go b/src/modules/network_data/service/udm_auth.go index f2cbadb..807b8be 100644 --- a/src/modules/network_data/service/udm_auth.go +++ b/src/modules/network_data/service/udm_auth.go @@ -1,28 +1,204 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strconv" + "strings" -// UDM鉴权信息 服务层接口 -type IUDMAuth interface { - // ResetData 重置鉴权用户数据,清空数据库重新同步Redis数据 - ResetData(neId string) int64 + "be.ems/src/framework/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" + neService "be.ems/src/modules/network_element/service" +) - // SelectPage 分页查询数据库 - SelectPage(query map[string]any) map[string]any - - // SelectList 查询数据库 - SelectList(u model.UDMAuth) []model.UDMAuth - - // Insert 从数据中读取后删除imsi再存入数据库 - // imsi长度15,ki长度32,opc长度0或者32 - Insert(neId string, u model.UDMAuth) int64 - - // InsertData 导入文件数据 dataType目前两种:txt/csv - InsertData(neId, dataType string, data any) int64 - - // Delete 删除单个不重新加载 - Delete(neID, imsi string) int64 - - // LoadData 删除范围后重新加载 num表示imsi后几位 - LoadData(neID, imsi, num string) int64 +// 实例化服务层 UDMAuthUser 结构体 +var NewUDMAuthUser = &UDMAuthUser{ + udmAuthRepository: repository.NewUDMAuthUser, +} + +// UDM鉴权信息 服务层处理 +type UDMAuthUser struct { + // UDM鉴权信息数据信息 + udmAuthRepository *repository.UDMAuthUser +} + +// dataByRedis UDM鉴权用户 db:0 中 ausf:* +func (r *UDMAuthUser) dataByRedis(imsi, neId string) []model.UDMAuthUser { + arr := []model.UDMAuthUser{} + key := fmt.Sprintf("ausf:%s", imsi) + source := fmt.Sprintf("UDM_%s", neId) + + // 网元主机的Redis客户端 + redisClient, err := neService.NewNeInfo.NeRunRedisClient("UDM", neId) + if err != nil { + return arr + } + defer func() { + redisClient.Close() + redis.ConnectPush(source, nil) + }() + redis.ConnectPush(source, redisClient.Client) + + ausfArr, err := redis.GetKeys(source, key) + if err != nil { + return arr + } + mkv, err := redis.GetHashBatch(source, ausfArr) + if err != nil { + return arr + } + + for k, m := range mkv { + if k == "-" { + continue + } + + // 跳过-号数据 ausf:360000100000130 + imsi := k[5:] + if strings.Contains(imsi, "-") { + continue + } + + amf := "" + if v, ok := m["amf"]; ok { + amf = strings.Replace(v, "\r\n", "", 1) + } + a := model.UDMAuthUser{ + IMSI: imsi, + Amf: amf, + Status: "1", // 默认给1 + Ki: m["ki"], + AlgoIndex: m["algo"], + Opc: m["opc"], + NeId: neId, + } + arr = append(arr, a) + } + return arr +} + +// ResetData 重置鉴权用户数据,清空数据库重新同步Redis数据 +func (r *UDMAuthUser) ResetData(neId string) int64 { + authArr := r.dataByRedis("*", neId) + // 数据清空后添加 + go r.udmAuthRepository.ClearAndInsert(neId, authArr) + return int64(len(authArr)) +} + +// ParseInfo 解析单个用户imsi鉴权信息 data从命令MML得到的结果 +func (r *UDMAuthUser) ParseInfo(imsi, neId string, data map[string]string) model.UDMAuthUser { + u := r.udmAuthRepository.SelectByIMSIAndNeID(imsi, neId) + + // 用于更新 + u.IMSI = imsi + u.NeId = neId + u.Amf = data["amf"] + u.Ki = data["ki"] + u.AlgoIndex = data["algo"] + u.Opc = data["opc"] + u.Status = "1" + return u +} + +// SelectPage 分页查询数据库 +func (r *UDMAuthUser) SelectPage(query map[string]any) (int64, []model.UDMAuthUser) { + return r.udmAuthRepository.SelectPage(query) +} + +// SelectList 查询数据库 +func (r *UDMAuthUser) SelectList(u model.UDMAuthUser) []model.UDMAuthUser { + return r.udmAuthRepository.SelectList(u) +} + +// Insert 从数据中读取后删除imsi再存入数据库 +// imsi长度15,ki长度32,opc长度0或者32 +func (r *UDMAuthUser) Insert(neId string, u model.UDMAuthUser) int64 { + uArr := r.dataByRedis(u.IMSI, neId) + if len(uArr) > 0 { + r.udmAuthRepository.Delete(u.IMSI, neId) + return r.udmAuthRepository.Inserts(uArr) + } + return 0 +} + +// InsertData 导入文件数据 dataType目前两种:txt/csv +func (r *UDMAuthUser) InsertData(neId, dataType string, data any) int64 { + // imsi截取前缀,重新获取部分数据 + prefixes := make(map[string]struct{}) + + if dataType == "csv" { + for _, v := range data.([]map[string]string) { + imsi := v["imsi"] + if len(imsi) < 6 { + continue + } + prefix := imsi[:len(imsi)-4] + prefixes[prefix] = struct{}{} + } + } + if dataType == "txt" { + for _, v := range data.([][]string) { + imsi := v[0] + if len(imsi) < 6 { + continue + } + prefix := imsi[:len(imsi)-4] + prefixes[prefix] = struct{}{} + } + } + + // 根据前缀重新加载插入 + var num int64 = 0 + for prefix := range prefixes { + // 直接删除前缀的记录 + r.udmAuthRepository.DeletePrefixByIMSI(neId, prefix) + // keys ausf:4600001000004* + arr := r.dataByRedis(prefix+"*", neId) + if len(arr) > 0 { + num += r.udmAuthRepository.Inserts(arr) + } + } + return num +} + +// Delete 删除单个不重新加载 +func (r *UDMAuthUser) Delete(imsi, neId string) int64 { + return r.udmAuthRepository.Delete(imsi, neId) +} + +// LoadData 重新加载从imsi开始num的数据 +func (r *UDMAuthUser) LoadData(neId, imsi, num string) { + startIMSI, _ := strconv.ParseInt(imsi, 10, 64) + subNum, _ := strconv.ParseInt(num, 10, 64) + var i int64 + for i = 0; i < subNum; i++ { + keyIMSI := fmt.Sprintf("%015d", startIMSI+i) + // 删除原数据 + r.udmAuthRepository.Delete(keyIMSI, neId) + // 加载数据 + arr := r.dataByRedis(keyIMSI, neId) + if len(arr) < 1 { + continue + } + r.udmAuthRepository.Inserts(arr) + } +} + +// ParseCommandParams 解析数据组成命令参数 ki=xx,xx=xx,... +func (r *UDMAuthUser) ParseCommandParams(item model.UDMAuthUser) string { + var conditions []string + if item.Ki != "" { + conditions = append(conditions, fmt.Sprintf("ki=%s", item.Ki)) + } + + if item.Amf != "" { + conditions = append(conditions, fmt.Sprintf("amf=%s", item.Amf)) + } + if item.AlgoIndex != "" { + conditions = append(conditions, fmt.Sprintf("algo=%s", item.AlgoIndex)) + } + if item.Opc != "" { + conditions = append(conditions, fmt.Sprintf("opc=%s", item.Opc)) + } + return strings.Join(conditions, ",") } diff --git a/src/modules/network_data/service/udm_auth.impl.go b/src/modules/network_data/service/udm_auth.impl.go deleted file mode 100644 index 1ec7df9..0000000 --- a/src/modules/network_data/service/udm_auth.impl.go +++ /dev/null @@ -1,146 +0,0 @@ -package service - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/redis" - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -// 实例化服务层 UDMAuthImpl 结构体 -var NewUDMAuthImpl = &UDMAuthImpl{ - udmAuthRepository: repository.NewUDMAuthImpl, -} - -// UDM鉴权信息 服务层处理 -type UDMAuthImpl struct { - // UDM鉴权信息数据信息 - udmAuthRepository repository.IUDMAuth -} - -// dataByRedis UDM鉴权用户 db:0 中 ausf:* -func (r *UDMAuthImpl) dataByRedis(imsi, neId string) []model.UDMAuth { - arr := []model.UDMAuth{} - key := fmt.Sprintf("ausf:%s", imsi) - ausfArr, err := redis.GetKeys("udmuser", key) - if err != nil { - return arr - } - for _, key := range ausfArr { - m, err := redis.GetHash("udmuser", key) - if err != nil { - continue - } - - // 跳过-号数据 - imsi := key[5:] - if strings.Contains(imsi, "-") { - continue - } - - amf := "" - if v, ok := m["amf"]; ok { - amf = strings.Replace(v, "\r\n", "", 1) - } - a := model.UDMAuth{ - IMSI: imsi, - Amf: amf, - Status: "1", // 默认给1 - Ki: m["ki"], - AlgoIndex: m["algo"], - Opc: m["opc"], - NeId: neId, - } - arr = append(arr, a) - } - return arr -} - -// ResetData 重置鉴权用户数据,清空数据库重新同步Redis数据 -func (r *UDMAuthImpl) ResetData(neId string) int64 { - authArr := r.dataByRedis("*", neId) - // 数据清空后添加 - go r.udmAuthRepository.ClearAndInsert(neId, authArr) - return int64(len(authArr)) -} - -// SelectPage 分页查询数据库 -func (r *UDMAuthImpl) SelectPage(query map[string]any) map[string]any { - return r.udmAuthRepository.SelectPage(query) -} - -// SelectList 查询数据库 -func (r *UDMAuthImpl) SelectList(u model.UDMAuth) []model.UDMAuth { - return r.udmAuthRepository.SelectList(u) -} - -// Insert 从数据中读取后删除imsi再存入数据库 -// imsi长度15,ki长度32,opc长度0或者32 -func (r *UDMAuthImpl) Insert(neId string, u model.UDMAuth) int64 { - uArr := r.dataByRedis(u.IMSI, neId) - if len(uArr) > 0 { - r.udmAuthRepository.Delete(neId, u.IMSI) - return r.udmAuthRepository.Inserts(uArr) - } - return 0 -} - -// InsertData 导入文件数据 dataType目前两种:txt/csv -func (r *UDMAuthImpl) InsertData(neId, dataType string, data any) int64 { - // imsi截取前缀,重新获取部分数据 - prefixes := make(map[string]struct{}) - - if dataType == "csv" { - for _, v := range data.([]map[string]string) { - imsi := v["imsi"] - if len(imsi) < 6 { - continue - } - prefix := imsi[:len(imsi)-4] - prefixes[prefix] = struct{}{} - } - } - if dataType == "txt" { - for _, v := range data.([][]string) { - imsi := v[0] - if len(imsi) < 6 { - continue - } - prefix := imsi[:len(imsi)-4] - prefixes[prefix] = struct{}{} - } - } - - // 根据前缀重新加载插入 - var num int64 = 0 - for prefix := range prefixes { - // 直接删除前缀的记录 - r.udmAuthRepository.DeletePrefixByIMSI(neId, prefix) - // keys ausf:4600001000004* - authArr := r.dataByRedis(prefix+"*", neId) - if len(authArr) > 0 { - num += r.udmAuthRepository.Inserts(authArr) - } - } - return num -} - -// Delete 删除单个不重新加载 -func (r *UDMAuthImpl) Delete(neId, imsi string) int64 { - return r.udmAuthRepository.Delete(neId, imsi) -} - -// LoadData 删除范围后重新加载 num表示imsi后几位 -func (r *UDMAuthImpl) LoadData(neId, imsi, num string) int64 { - prefix := imsi[:len(imsi)-len(num)-1] - // 直接删除前缀的记录 - delNum := r.udmAuthRepository.DeletePrefixByIMSI(neId, prefix) - // keys ausf:4600001000004* - authArr := r.dataByRedis(prefix+"*", neId) - if len(authArr) > 0 { - return r.udmAuthRepository.Inserts(authArr) - } - return delNum -} diff --git a/src/modules/network_data/service/udm_sub.go b/src/modules/network_data/service/udm_sub.go index 9c480b4..7288c10 100644 --- a/src/modules/network_data/service/udm_sub.go +++ b/src/modules/network_data/service/udm_sub.go @@ -1,28 +1,365 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" + "strconv" + "strings" -// UDM签约用户信息 服务层接口 -type IUDMSub interface { - // ResetData 重置鉴权用户数据,清空数据库重新同步Redis数据 - ResetData(neId string) int64 + "be.ems/src/framework/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" + neService "be.ems/src/modules/network_element/service" +) - // SelectPage 分页查询数据库 - SelectPage(query map[string]any) map[string]any - - // SelectList 查询数据库 - SelectList(u model.UDMSub) []model.UDMSub - - // Insert 从数据中读取后删除imsi再存入数据库 - // imsi长度15,ki长度32,opc长度0或者32 - Insert(neId string, u model.UDMSub) int64 - - // InsertData 导入文件数据 dataType目前两种:txt/csv - InsertData(neId, dataType string, data any) int64 - - // Delete 删除单个不重新加载 - Delete(neId, imsi string) int64 - - // LoadData 删除范围后重新加载 num表示imsi后几位 - LoadData(neId, imsi, num string) int64 +// 实例化服务层 UDMSubUser 结构体 +var NewUDMSubUser = &UDMSubUser{ + udmSubRepository: repository.NewUDMSub, + udmUserInfoRepository: repository.NewUDMUserInfo, +} + +// UDM签约信息 服务层处理 +type UDMSubUser struct { + udmSubRepository *repository.UDMSubUser // UDM签约信息数据信息 + udmUserInfoRepository *repository.UDMUserInfo // UDM用户IMSI信息数据信息 +} + +// dataByRedis UDM签约用户 db:0 中 udm-sd:* +func (r *UDMSubUser) dataByRedis(imsi, neId string) []model.UDMSubUser { + arr := []model.UDMSubUser{} + key := fmt.Sprintf("udm-sd:%s", imsi) + source := fmt.Sprintf("UDM_%s", neId) + + // 网元主机的Redis客户端 + redisClient, err := neService.NewNeInfo.NeRunRedisClient("UDM", neId) + if err != nil { + return arr + } + defer func() { + redisClient.Close() + redis.ConnectPush(source, nil) + }() + redis.ConnectPush(source, redisClient.Client) + + udmsdArr, err := redis.GetKeys(source, key) + if err != nil { + return arr + } + mkv, err := redis.GetHashBatch(source, udmsdArr) + if err != nil { + return arr + } + + for k, m := range mkv { + if k == "-" { + continue + } + + // 跳过-号数据 udm-sd:360000100000130 + imsi := k[7:] + if strings.Contains(imsi, "-") { + continue + } + + a := model.UDMSubUser{ + IMSI: imsi, // udm-sd:360000100000130 + MSISDN: m["gpsi"], // 8612300000130 + NeId: neId, + SmfSel: m["smf-sel"], // def_snssai + SmData: m["sm-dat"], // 1-000001&cmnet&ims&3gnet + Cag: m["cag"], // def_cag + } + + // def_ambr,def_nssai,0,def_arfb,def_sar,3,1,12000,1,1000,0,1,- + if v, ok := m["am-dat"]; ok { + arr := strings.Split(v, ",") + a.AmDat = v + a.UeAmbrTpl = arr[0] + a.NssaiTpl = arr[1] + a.RatRestrictions = arr[2] + a.AreaForbiddenTpl = arr[3] + a.ServiceAreaRestrictionTpl = arr[4] + a.CnTypeRestrictions = arr[5] + a.RfspIndex = arr[6] + a.SubsRegTime = arr[7] + a.UeUsageType = arr[8] + a.ActiveTime = arr[9] + a.MicoAllowed = "0" // arr[10] + a.OdbPs = "1" // arr[11] + a.GroupId = "-" // arr[12] + if len(arr) > 10 { + a.MicoAllowed = arr[10] + } + if len(arr) > 11 { + a.OdbPs = arr[11] + } + if len(arr) > 12 && arr[12] != "-" { + a.GroupId = arr[12] + } + } + // 1,64,24,65,def_eps,1,2,010200000000,- + if v, ok := m["eps-dat"]; ok { + arr := strings.Split(v, ",") + // 跳过非常规数据 + if len(arr) > 9 { + continue + } + a.EpsDat = v + a.EpsFlag = arr[0] + a.EpsOdb = arr[1] + a.HplmnOdb = arr[2] + a.Ard = arr[3] + a.Epstpl = arr[4] + a.ContextId = arr[5] + a.ApnNum = arr[6] // 导入和导出不用 + a.ApnContext = arr[7] + if len(arr) >= 9 { + a.StaticIp = arr[8] + } + } + + arr = append(arr, a) + } + return arr +} + +// ResetData 重置鉴权用户数据,清空数据库重新同步Redis数据 +func (r *UDMSubUser) ResetData(neId string) int64 { + subArr := r.dataByRedis("*", neId) + // 数据清空后添加 + go r.udmSubRepository.ClearAndInsert(neId, subArr) + return int64(len(subArr)) +} + +// ParseInfo 解析单个用户imsi签约信息 data从命令MML得到的结果 +func (r *UDMSubUser) ParseInfo(imsi, neId string, data map[string]string) model.UDMSubUser { + u := r.udmSubRepository.SelectByIMSIAndNeID(imsi, neId) + + cnType, _ := strconv.ParseInt(data["CNType"][:4], 0, 64) // 0x03(EPC|5GC) + rat, _ := strconv.ParseInt(data["RAT"][:4], 0, 64) // 0x00(VIRTUAL|WLAN|EUTRA|NR) + msisdn := data["MSISDN"] + if imsMsisdnLen := strings.Index(msisdn, ","); imsMsisdnLen != -1 { + msisdn = msisdn[:imsMsisdnLen] + } + + // 用于更新 + u.IMSI = imsi + u.MSISDN = msisdn + u.NeId = neId + u.UeAmbrTpl = data["AMBR"] + u.NssaiTpl = data["NSSAI"] + u.AreaForbiddenTpl = data["AreaForbidden"] + u.ServiceAreaRestrictionTpl = data["ServiceAreaRestriction"] + u.CnTypeRestrictions = fmt.Sprint(cnType) + u.RatRestrictions = fmt.Sprint(rat) + u.MicoAllowed = data["MICO"] + u.SmData = data["SM-Data(snssai+dnn[1..n])"] + u.SmfSel = data["Smf-Selection"] + u.Cag = data["cag"] + + // 1,64,24,65,def_eps,1,2,010200000000,- + if v, ok := data["EPS-Data"]; ok { + u.EpsDat = v + arr := strings.Split(v, ",") + u.EpsFlag = arr[0] + u.EpsOdb = arr[1] + u.HplmnOdb = arr[2] + u.Ard = arr[3] + u.Epstpl = arr[4] + u.ContextId = arr[5] + u.ApnNum = arr[6] // 导入和导出不用 + u.ApnContext = arr[7] + u.StaticIp = arr[8] + } + + // 补充用户拓展信息 + info := r.udmUserInfoRepository.SelectByIMSIAndNeID(imsi, neId) + if info.IMSI == imsi { + u.Remark = info.Remark + } + return u +} + +// SelectPage 分页查询数据库 +func (r *UDMSubUser) SelectPage(query map[string]any) (int64, []model.UDMSubUser) { + return r.udmSubRepository.SelectPage(query) +} + +// SelectList 查询数据库 +func (r *UDMSubUser) SelectList(u model.UDMSubUser) []model.UDMSubUser { + return r.udmSubRepository.SelectList(u) +} + +// Insert 从数据中读取后删除imsi再存入数据库 +// imsi长度15,ki长度32,opc长度0或者32 +func (r *UDMSubUser) Insert(neId string, u model.UDMSubUser) int64 { + uArr := r.dataByRedis(u.IMSI, neId) + if len(uArr) > 0 { + r.udmSubRepository.Delete(u.IMSI, neId) + // 新增到拓展信息 + if u.Remark != "" { + r.udmUserInfoRepository.Delete(u.IMSI, neId) + r.udmUserInfoRepository.Inserts([]model.UDMUserInfo{{ + IMSI: u.IMSI, + MSISDN: u.MSISDN, + NeId: u.NeId, + Remark: u.Remark, + }}) + } + return r.udmSubRepository.Inserts(uArr) + } + return 0 +} + +// InsertData 导入文件数据 dataType目前两种:txt/csv +func (r *UDMSubUser) InsertData(neId, dataType string, data any) int64 { + // imsi截取前缀,重新获取部分数据 + prefixes := make(map[string]struct{}) + + if dataType == "csv" { + for _, v := range data.([]map[string]string) { + imsi := v["imsi"] + if len(imsi) < 6 { + continue + } + prefix := imsi[:len(imsi)-4] + prefixes[prefix] = struct{}{} + } + } + if dataType == "txt" { + for _, v := range data.([][]string) { + imsi := v[0] + if len(imsi) < 6 { + continue + } + prefix := imsi[:len(imsi)-4] + prefixes[prefix] = struct{}{} + } + } + + // 根据前缀重新加载插入 + var num int64 = 0 + for prefix := range prefixes { + // keys udm-sd:4600001000004* + arr := r.dataByRedis(prefix+"*", neId) + if len(arr) > 0 { + r.udmSubRepository.DeletePrefixByIMSI(prefix, neId) + num += r.udmSubRepository.Inserts(arr) + } + } + return num +} + +// Delete 删除单个不重新加载 +func (r *UDMSubUser) Delete(neId, imsi string) int64 { + // 删除拓展信息 + r.udmUserInfoRepository.Delete(imsi, neId) + return r.udmSubRepository.Delete(imsi, neId) +} + +// LoadData 重新加载从imsi开始num的数据 +// remark不为空,则新增到拓展信息,删除标记为-(Deleted)- +func (r *UDMSubUser) LoadData(neId, imsi, num, remark string) { + startIMSI, _ := strconv.ParseInt(imsi, 10, 64) + subNum, _ := strconv.ParseInt(num, 10, 64) + var i int64 + for i = 0; i < subNum; i++ { + keyIMSI := fmt.Sprintf("%015d", startIMSI+i) + // 删除原数据 + r.udmSubRepository.Delete(keyIMSI, neId) + if remark == "-(Deleted)-" { + r.udmUserInfoRepository.Delete(keyIMSI, neId) + } + // 加载数据 + arr := r.dataByRedis(keyIMSI, neId) + if len(arr) < 1 { + continue + } + r.udmSubRepository.Inserts(arr) + // 拓展信息 + if remark != "" { + uarr := make([]model.UDMUserInfo, 0, len(arr)) + for _, v := range arr { + uarr = append(uarr, model.UDMUserInfo{ + IMSI: v.IMSI, + MSISDN: v.MSISDN, + NeId: v.NeId, + Remark: remark, + }) + } + r.udmUserInfoRepository.Delete(keyIMSI, neId) + r.udmUserInfoRepository.Inserts(uarr) + } + } +} + +// ParseCommandParams 解析数据组成命令参数 msisdn=xx,xx=xx,... +func (r *UDMSubUser) ParseCommandParams(item model.UDMSubUser) string { + var conditions []string + if item.MSISDN != "" { + conditions = append(conditions, fmt.Sprintf("msisdn=%s", item.MSISDN)) + } + + // AmData + if item.UeAmbrTpl != "" { + conditions = append(conditions, fmt.Sprintf("ambr=%s", item.UeAmbrTpl)) + } + if item.NssaiTpl != "" { + conditions = append(conditions, fmt.Sprintf("nssai=%s", item.NssaiTpl)) + } + if item.AreaForbiddenTpl != "" { + conditions = append(conditions, fmt.Sprintf("arfb=%s", item.AreaForbiddenTpl)) + } + if item.ServiceAreaRestrictionTpl != "" { + conditions = append(conditions, fmt.Sprintf("sar=%s", item.ServiceAreaRestrictionTpl)) + } + if item.RatRestrictions != "" { + conditions = append(conditions, fmt.Sprintf("rat=%s", item.RatRestrictions)) + } + if item.CnTypeRestrictions != "" { + conditions = append(conditions, fmt.Sprintf("cn=%s", item.CnTypeRestrictions)) + } + if item.MicoAllowed != "" { + conditions = append(conditions, fmt.Sprintf("mico=%s", item.MicoAllowed)) + } + + // EpsDat + // if item.EpsDat != "" { + // conditions = append(conditions, fmt.Sprintf("eps_dat=%s", item.EpsDat)) + // } + if item.EpsFlag != "" { + conditions = append(conditions, fmt.Sprintf("eps_flag=%s", item.EpsFlag)) + } + if item.EpsOdb != "" { + conditions = append(conditions, fmt.Sprintf("eps_odb=%s", item.EpsOdb)) + } + if item.HplmnOdb != "" { + conditions = append(conditions, fmt.Sprintf("hplmn_odb=%s", item.HplmnOdb)) + } + if item.Epstpl != "" { + conditions = append(conditions, fmt.Sprintf("epstpl=%s", item.Epstpl)) + } + if item.Ard != "" { + conditions = append(conditions, fmt.Sprintf("ard=%s", item.Ard)) + } + if item.ContextId != "" { + conditions = append(conditions, fmt.Sprintf("context_id=%s", item.ContextId)) + } + if item.ApnContext != "" { + conditions = append(conditions, fmt.Sprintf("apn_context=%s", item.ApnContext)) + } + if item.StaticIp != "" { + conditions = append(conditions, fmt.Sprintf("static_ip=%s", item.StaticIp)) + } + + // 其他 + if item.SmfSel != "" { + conditions = append(conditions, fmt.Sprintf("smf_sel=%s", item.SmfSel)) + } + if item.SmData != "" { + conditions = append(conditions, fmt.Sprintf("sm_data=%s", item.SmData)) + } + if item.Cag != "" { + conditions = append(conditions, fmt.Sprintf("cag=%s", item.Cag)) + } + return strings.Join(conditions, ",") } diff --git a/src/modules/network_data/service/udm_sub.impl.go b/src/modules/network_data/service/udm_sub.impl.go deleted file mode 100644 index 2cf48a8..0000000 --- a/src/modules/network_data/service/udm_sub.impl.go +++ /dev/null @@ -1,164 +0,0 @@ -package service - -import ( - "fmt" - "strings" - - "nms_cxy/src/framework/redis" - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -// 实例化服务层 UDMSubImpl 结构体 -var NewUDMSubImpl = &UDMSubImpl{ - udmSubRepository: repository.NewUDMSubImpl, -} - -// UDM签约信息 服务层处理 -type UDMSubImpl struct { - // UDM签约信息数据信息 - udmSubRepository repository.IUDMSub -} - -// dataByRedis UDM签约用户 db:0 中 udm-sd:* -func (r *UDMSubImpl) dataByRedis(imsi, neId string) []model.UDMSub { - arr := []model.UDMSub{} - key := fmt.Sprintf("udm-sd:%s", imsi) - udmsdArr, err := redis.GetKeys("udmuser", key) - if err != nil { - return arr - } - for _, key := range udmsdArr { - m, err := redis.GetHash("udmuser", key) - if err != nil { - continue - } - - a := model.UDMSub{ - IMSI: key[7:], - Msisdn: m["gpsi"], // 46003550072 - SmfSel: m["smf-sel"], - SmData: m["sm-dat"], // 1-000001&cmnet&ims&3gnet - NeId: neId, - } - - // def_ambr,def_nssai,0,def_arfb,def_sar,3,1,12000,1,1000,0,1,- - if v, ok := m["am-dat"]; ok { - arr := strings.Split(v, ",") - a.Ambr = arr[0] - a.Nssai = arr[1] - a.Rat = arr[2] - a.Arfb = arr[3] - a.Sar = arr[4] - a.Cn = arr[5] - } - // 1,64,24,65,def_eps,1,2,010200000000,- - if v, ok := m["eps-dat"]; ok { - arr := strings.Split(v, ",") - // 跳过非常规数据 - if len(arr) > 9 { - continue - } - a.EpsDat = v - a.EpsFlag = arr[0] - a.EpsOdb = arr[1] - a.HplmnOdb = arr[2] - a.Ard = arr[3] - a.Epstpl = arr[4] - a.ContextId = arr[5] - a.ApnContext = arr[7] - // [6] 是不要的,导入和导出不用 - a.StaticIp = arr[8] - } - - arr = append(arr, a) - } - return arr -} - -// ResetData 重置鉴权用户数据,清空数据库重新同步Redis数据 -func (r *UDMSubImpl) ResetData(neId string) int64 { - subArr := r.dataByRedis("*", neId) - // 数据清空后添加 - go r.udmSubRepository.ClearAndInsert(neId, subArr) - return int64(len(subArr)) -} - -// SelectPage 分页查询数据库 -func (r *UDMSubImpl) SelectPage(query map[string]any) map[string]any { - return r.udmSubRepository.SelectPage(query) -} - -// SelectList 查询数据库 -func (r *UDMSubImpl) SelectList(u model.UDMSub) []model.UDMSub { - return r.udmSubRepository.SelectList(u) -} - -// Insert 从数据中读取后删除imsi再存入数据库 -// imsi长度15,ki长度32,opc长度0或者32 -func (r *UDMSubImpl) Insert(neId string, u model.UDMSub) int64 { - uArr := r.dataByRedis(u.IMSI, neId) - if len(uArr) > 0 { - r.udmSubRepository.Delete(neId, u.IMSI) - return r.udmSubRepository.Inserts(uArr) - } - return 0 -} - -// InsertData 导入文件数据 dataType目前两种:txt/csv -func (r *UDMSubImpl) InsertData(neId, dataType string, data any) int64 { - // imsi截取前缀,重新获取部分数据 - prefixes := make(map[string]struct{}) - - if dataType == "csv" { - for _, v := range data.([]map[string]string) { - imsi := v["imsi"] - if len(imsi) < 6 { - continue - } - prefix := imsi[:len(imsi)-4] - prefixes[prefix] = struct{}{} - } - } - if dataType == "txt" { - for _, v := range data.([][]string) { - imsi := v[0] - if len(imsi) < 6 { - continue - } - prefix := imsi[:len(imsi)-4] - prefixes[prefix] = struct{}{} - } - } - - // 根据前缀重新加载插入 - var num int64 = 0 - for prefix := range prefixes { - // 直接删除前缀的记录 - r.udmSubRepository.DeletePrefixByIMSI(neId, prefix) - // keys udm-sd:4600001000004* - subArr := r.dataByRedis(prefix+"*", neId) - if len(subArr) > 0 { - num += r.udmSubRepository.Inserts(subArr) - } - } - return num -} - -// Delete 删除单个不重新加载 -func (r *UDMSubImpl) Delete(neId, imsi string) int64 { - return r.udmSubRepository.Delete(neId, imsi) -} - -// LoadData 删除范围后重新加载 num表示imsi后几位 -func (r *UDMSubImpl) LoadData(neId, imsi, num string) int64 { - prefix := imsi[:len(imsi)-len(num)-1] - // 直接删除前缀的记录 - delNum := r.udmSubRepository.DeletePrefixByIMSI(neId, prefix) - // keys udm-sd:4600001000004* - authArr := r.dataByRedis(prefix+"*", neId) - if len(authArr) > 0 { - return r.udmSubRepository.Inserts(authArr) - } - return delNum -} diff --git a/src/modules/network_data/service/udm_user_info.go b/src/modules/network_data/service/udm_user_info.go new file mode 100644 index 0000000..da61072 --- /dev/null +++ b/src/modules/network_data/service/udm_user_info.go @@ -0,0 +1,33 @@ +package service + +import ( + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化服务层 UDMUserInfo 结构体 +var NewUDMUserInfo = &UDMUserInfo{ + udmUserInfoRepository: repository.NewUDMUserInfo, +} + +// UDM用户IMSI拓展信息 服务层处理 +type UDMUserInfo struct { + // UDM用户IMSI信息数据信息 + udmUserInfoRepository *repository.UDMUserInfo +} + +// SelectByIMSIAndNeID 通过IMSI和网元标识查询信息 +func (r *UDMUserInfo) SelectByIMSIAndNeID(imsi, neId string) model.UDMUserInfo { + return r.udmUserInfoRepository.SelectByIMSIAndNeID(imsi, neId) +} + +// Save 新增或修改信息 +func (r *UDMUserInfo) Save(u model.UDMUserInfo) bool { + r.udmUserInfoRepository.Delete(u.IMSI, u.NeId) + return r.udmUserInfoRepository.Inserts([]model.UDMUserInfo{u}) > 0 +} + +// Delete 删除信息 +func (r *UDMUserInfo) Delete(imsi, neId string) int64 { + return r.udmUserInfoRepository.Delete(imsi, neId) +} diff --git a/src/modules/network_data/service/ue_event_amf.go b/src/modules/network_data/service/ue_event_amf.go index b780c5c..29fdec2 100644 --- a/src/modules/network_data/service/ue_event_amf.go +++ b/src/modules/network_data/service/ue_event_amf.go @@ -1,12 +1,40 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" -// UE会话事件AMF 服务层接口 -type IUEEventAMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventAMFQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) (int64, error) +// 实例化数据层 UEEventAMF 结构体 +var NewUEEventAMF = &UEEventAMF{ + ueEventRepository: repository.NewUEEventAMF, +} + +// UEEventAMF UE会话事件AMF 服务层处理 +type UEEventAMF struct { + // UE会话事件数据信息 + ueEventRepository *repository.UEEventAMF +} + +// SelectPage 根据条件分页查询 +func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { + return r.ueEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventAMF) DeleteByIds(ueIds []string) (int64, error) { + // 检查是否存在 + ids := r.ueEventRepository.SelectByIds(ueIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(ids) == len(ueIds) { + rows := r.ueEventRepository.DeleteByIds(ueIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/ue_event_amf.impl.go b/src/modules/network_data/service/ue_event_amf.impl.go deleted file mode 100644 index 96e4960..0000000 --- a/src/modules/network_data/service/ue_event_amf.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -// 实例化数据层 UEEventMMEImpl 结构体 -var NewUEEventMMEImpl = &UEEventMMEImpl{ - ueEventRepository: repository.NewUEEventMMEImpl, -} - -// UEEventMMEImpl UE会话事件MME 服务层处理 -type UEEventMMEImpl struct { - // UE会话事件数据信息 - ueEventRepository repository.IUEEventMME -} - -// SelectPage 根据条件分页查询 -func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any { - return r.ueEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMMEImpl) DeleteByIds(ueIds []string) (int64, error) { - // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/ue_event_mme.go b/src/modules/network_data/service/ue_event_mme.go index da415fb..dd034b2 100644 --- a/src/modules/network_data/service/ue_event_mme.go +++ b/src/modules/network_data/service/ue_event_mme.go @@ -1,12 +1,39 @@ package service -import "nms_cxy/src/modules/network_data/model" +import ( + "fmt" -// UE会话事件MME 服务层接口 -type IUEEventMME interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventMMEQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) (int64, error) +// 实例化数据层 UEEventMME 结构体 +var NewUEEventMME = &UEEventMME{ + ueEventRepository: repository.NewUEEventMME, +} + +// UEEventMME UE会话事件MME 服务层处理 +type UEEventMME struct { + ueEventRepository *repository.UEEventMME // UE会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { + return r.ueEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventMME) DeleteByIds(ueIds []string) (int64, error) { + // 检查是否存在 + ids := r.ueEventRepository.SelectByIds(ueIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(ids) == len(ueIds) { + rows := r.ueEventRepository.DeleteByIds(ueIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/ue_event_mme.impl.go b/src/modules/network_data/service/ue_event_mme.impl.go deleted file mode 100644 index aee4c67..0000000 --- a/src/modules/network_data/service/ue_event_mme.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/network_data/repository" -) - -// 实例化数据层 UEEventAMFImpl 结构体 -var NewUEEventAMFImpl = &UEEventAMFImpl{ - ueEventRepository: repository.NewUEEventAMFImpl, -} - -// UEEventAMFImpl UE会话事件AMF 服务层处理 -type UEEventAMFImpl struct { - // UE会话事件数据信息 - ueEventRepository repository.IUEEventAMF -} - -// SelectPage 根据条件分页查询 -func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any { - return r.ueEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMFImpl) DeleteByIds(ueIds []string) (int64, error) { - // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_element/controller/action.go b/src/modules/network_element/controller/action.go index 44483a9..6e24c7a 100644 --- a/src/modules/network_element/controller/action.go +++ b/src/modules/network_element/controller/action.go @@ -7,21 +7,20 @@ import ( "runtime" "strings" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/generate" - "nms_cxy/src/framework/utils/ssh" - "nms_cxy/src/framework/vo/result" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/generate" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeActionController 结构体 var NewNeAction = &NeActionController{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 网元处理请求 @@ -29,10 +28,10 @@ var NewNeAction = &NeActionController{ // PATH /action type NeActionController struct { // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo } -// 发送文件从本地到网元 +// 从本地到网元发送文件 // // POST /pushFile func (s *NeActionController) PushFile(c *gin.Context) { @@ -89,7 +88,7 @@ func (s *NeActionController) PushFile(c *gin.Context) { c.JSON(200, result.OkData(filepath.ToSlash(neFilePath))) } -// 获取文件从网元到本地 +// 从网元到本地获取文件 // // GET /pullFile func (s *NeActionController) PullFile(c *gin.Context) { @@ -148,6 +147,116 @@ func (s *NeActionController) PullFile(c *gin.Context) { c.FileAttachment(localFilePath, fileName) } +// 从网元到本地获取目录压缩为ZIP +// +// GET /pullDirZip +func (s *NeActionController) PullDirZip(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys struct { + NeType string `form:"neType" binding:"required"` + NeID string `form:"neId" binding:"required"` + Path string `form:"path" binding:"required"` + DelTemp bool `form:"delTemp"` // 删除本地临时文件 + } + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sftpClient.Close() + + nePath := querys.Path + dirName := generate.Code(6) + localFilePath := filepath.Join("/tmp/omc/pull/", dirName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + // 复制到本地 + localDirFilePath := filepath.Join(localFilePath, "zip") + if err = sftpClient.CopyDirRemoteToLocal(nePath, localDirFilePath); err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + // 压缩zip文件名 + zipFileName := fmt.Sprintf("%s-%s-%s.zip", neInfo.NeType, neInfo.NeId, dirName) + zipFilePath := filepath.Join(localFilePath, zipFileName) + if err := file.CompressZipByDir(zipFilePath, localDirFilePath); err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + defer func() { + if querys.DelTemp { + _ = os.RemoveAll(localFilePath) + } + }() + c.FileAttachment(zipFilePath, zipFileName) +} + +// 查看网元端文件内容 +// +// GET /viewFile +func (s *NeActionController) ViewFile(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys struct { + NeType string `form:"neType" binding:"required"` + NeID string `form:"neId" binding:"required"` + Path string `form:"path" binding:"required"` + FileName string `form:"fileName" binding:"required"` + } + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + + // 网元端文件 + nePath := filepath.ToSlash(filepath.Join(querys.Path, querys.FileName)) + // 网元端临时目录 + output, err := sshClient.RunCMD(fmt.Sprintf("cat %s", nePath)) + output = strings.TrimSpace(output) + if err != nil || strings.HasPrefix(output, "ls: ") { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "file view cat error"))) + return + } + c.JSON(200, result.OkData(output)) +} + // 网元端文件列表 // // GET /files @@ -182,13 +291,12 @@ func (s *NeActionController) Files(c *gin.Context) { defer sshClient.Close() // 获取文件列表 - totalSize, rows, err := ssh.FileList(sshClient, querys.Path, querys.Search) + rows, err := ssh.FileList(sshClient, querys.Path, querys.Search) if err != nil { c.JSON(200, result.Ok(map[string]any{ - "path": querys.Path, - "totalSize": totalSize, - "total": len(rows), - "rows": []ssh.FileListRow{}, + "path": querys.Path, + "total": len(rows), + "rows": []ssh.FileListRow{}, })) return } @@ -207,10 +315,9 @@ func (s *NeActionController) Files(c *gin.Context) { } c.JSON(200, result.Ok(map[string]any{ - "path": querys.Path, - "totalSize": totalSize, - "total": lenNum, - "rows": splitRows, + "path": querys.Path, + "total": lenNum, + "rows": splitRows, })) } @@ -239,7 +346,7 @@ func (s *NeActionController) Service(c *gin.Context) { neTypeLower := strings.ToLower(neInfo.NeType) cmdStr := fmt.Sprintf("sudo service %s %s", neTypeLower, body.Action) if neTypeLower == "omc" { - cmdStr = fmt.Sprintf("nohup sh -c \"sudo systemctl stop omc && sleep 5s && sudo systemctl %s omc\" > /dev/null 2>&1 &", body.Action) + cmdStr = fmt.Sprintf("nohup sh -c \"sudo systemctl stop restagent && sleep 5s && sudo systemctl %s restagent\" > /dev/null 2>&1 &", body.Action) } else if neTypeLower == "ims" { if body.Action == "restart" { cmdStr = "ims-stop || true && ims-start" diff --git a/src/modules/network_element/controller/ne_config.go b/src/modules/network_element/controller/ne_config.go index d42c234..c6c25be 100644 --- a/src/modules/network_element/controller/ne_config.go +++ b/src/modules/network_element/controller/ne_config.go @@ -4,32 +4,30 @@ import ( "encoding/json" "strings" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - neFetchlink "nms_cxy/src/modules/network_element/fetch_link" - "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - + cm_omc "be.ems/features/cm/omc" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // NewNeConfig 网元参数配置 实例化控制层 var NewNeConfig = &NeConfigController{ - neConfigService: neService.NewNeConfigImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigService: neService.NewNeConfig, + neInfoService: neService.NewNeInfo, } // 网元参数配置 // // PATH /config type NeConfigController struct { - // 网元参数配置可用属性值服务 - neConfigService neService.INeConfig - // 网元信息服务 - neInfoService neService.INeInfo + neConfigService *neService.NeConfig // 网元参数配置可用属性值服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元参数配置可用属性值列表 @@ -192,14 +190,25 @@ func (s *NeConfigController) DataInfo(c *gin.Context) { return } - // 网元直连 - resData, err := neFetchlink.NeConfigInfo(neInfo, query.ParamName) - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + if query.NeType == "OMC" { + var o *cm_omc.ConfigOMC + resData, err := o.Query(query.ParamName) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.OkData(resData)) return - } + } else { + // 网元直连 + resData, err := neFetchlink.NeConfigInfo(neInfo, query.ParamName) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } - c.JSON(200, result.Ok(resData)) + c.JSON(200, result.Ok(resData)) + } } // 网元参数配置数据修改 @@ -224,14 +233,24 @@ func (s *NeConfigController) DataEdit(c *gin.Context) { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - - // 网元直连 - resData, err := neFetchlink.NeConfigUpdate(neInfo, body.ParamName, body.Loc, body.ParamData) - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + if body.NeType == "OMC" { + var o *cm_omc.ConfigOMC + resData, err := o.Modify(body.ParamName, body.ParamData) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.OkData(resData)) return + } else { + // 网元直连 + resData, err := neFetchlink.NeConfigUpdate(neInfo, body.ParamName, body.Loc, body.ParamData) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.OkData(resData)) } - c.JSON(200, result.OkData(resData)) } // 网元参数配置数据新增(array) diff --git a/src/modules/network_element/controller/ne_config_backup.go b/src/modules/network_element/controller/ne_config_backup.go index 2e49698..90937dc 100644 --- a/src/modules/network_element/controller/ne_config_backup.go +++ b/src/modules/network_element/controller/ne_config_backup.go @@ -5,32 +5,29 @@ import ( "path/filepath" "strings" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // NewNeConfigBackup 实例化控制层 NeConfigBackupController 结构体 var NewNeConfigBackup = &NeConfigBackupController{ - neConfigBackupService: neService.NewNeConfigBackupImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigBackupService: neService.NewNeConfigBackup, + neInfoService: neService.NewNeInfo, } // 网元配置文件备份记录 // // PATH /config/backup type NeConfigBackupController struct { - // 网元配置文件备份记录服务 - neConfigBackupService neService.INeConfigBackup - // 网元信息服务 - neInfoService neService.INeInfo + neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元配置文件备份记录列表 diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go index 7255e1f..e4719bc 100644 --- a/src/modules/network_element/controller/ne_host.go +++ b/src/modules/network_element/controller/ne_host.go @@ -3,30 +3,29 @@ package controller import ( "strings" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/ssh" - "nms_cxy/src/framework/utils/telnet" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/redis" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeHostController 结构体 var NewNeHost = &NeHostController{ - neHostService: neService.NewNeHostImpl, + neHostService: neService.NewNeHost, } // 网元主机连接请求 // // PATH /host type NeHostController struct { - // 网元主机连接服务 - neHostService neService.INeHost + neHostService *neService.NeHost // 网元主机连接服务 } // 网元主机列表 @@ -80,6 +79,13 @@ func (s *NeHostController) Add(c *gin.Context) { return } + if body.GroupID == "1" { + // 主机信息操作【%s】失败,禁止操作网元 + msg := i18n.TKey(language, "neHost.banNE") + c.JSON(200, result.ErrMsg(msg)) + return + } + // 检查属性值唯一 uniqueHost := s.neHostService.CheckUniqueHostTitle(body.GroupID, body.Title, body.HostType, "") if !uniqueHost { @@ -213,6 +219,21 @@ func (s *NeHostController) Test(c *gin.Context) { } return } + + if body.HostType == "redis" { + var connRedis redis.ConnRedis + body.CopyTo(&connRedis) + + client, err := connRedis.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + c.JSON(200, result.Ok(nil)) + return + } } // 网元主机发送命令 diff --git a/src/modules/network_element/controller/ne_host_cmd.go b/src/modules/network_element/controller/ne_host_cmd.go index 884e224..31031da 100644 --- a/src/modules/network_element/controller/ne_host_cmd.go +++ b/src/modules/network_element/controller/ne_host_cmd.go @@ -3,28 +3,26 @@ package controller import ( "strings" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeHostCmdController 结构体 var NewNeHostCmd = &NeHostCmdController{ - neHostCmdService: neService.NewNeHostCmdImpl, + neHostCmdService: neService.NewNeHostCmd, } // 网元主机命令请求 // // PATH /hostCmd type NeHostCmdController struct { - // 网元主机命令服务 - neHostCmdService neService.INeHostCmd + neHostCmdService *neService.NeHostCmd // 网元主机命令服务 } // 网元主机命令列表 diff --git a/src/modules/network_element/controller/ne_info.go b/src/modules/network_element/controller/ne_info.go index 747828e..c2ce7ab 100644 --- a/src/modules/network_element/controller/ne_info.go +++ b/src/modules/network_element/controller/ne_info.go @@ -5,35 +5,31 @@ import ( "strings" "sync" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - neFetchlink "nms_cxy/src/modules/network_element/fetch_link" - "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeInfoController 结构体 var NewNeInfo = &NeInfoController{ - neInfoService: neService.NewNeInfoImpl, - neLicenseService: neService.NewNeLicenseImpl, - neVersionService: neService.NewNeVersionImpl, + neInfoService: neService.NewNeInfo, + neLicenseService: neService.NewNeLicense, + neVersionService: neService.NewNeVersion, } // 网元信息请求 // // PATH /info type NeInfoController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 网元授权激活信息服务 - neLicenseService neService.INeLicense - // 网元版本信息服务 - neVersionService neService.INeVersion + neInfoService *neService.NeInfo // 网元信息服务 + neLicenseService *neService.NeLicense // 网元授权激活信息服务 + neVersionService *neService.NeVersion // 网元版本信息服务 } // neStateCacheMap 网元状态缓存最后一次成功的信息 @@ -194,7 +190,7 @@ func (s *NeInfoController) OAMFileRead(c *gin.Context) { return } - data, err := s.neInfoService.NeConfOAMRead(querys.NeType, querys.NeID) + data, err := s.neInfoService.NeConfOAMReadSync(querys.NeType, querys.NeID) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return @@ -225,7 +221,7 @@ func (s *NeInfoController) OAMFileWrite(c *gin.Context) { return } - err := s.neInfoService.NeConfOAMSync(neInfo, body.Content, body.Sync) + err := s.neInfoService.NeConfOAMWirteSync(neInfo, body.Content, body.Sync) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return @@ -319,6 +315,8 @@ func (s *NeInfoController) Add(c *gin.Context) { // 已有网元可获取的信息 if body.ServerState != nil { if v, ok := body.ServerState["version"]; ok && v != nil { + neVersion.Name = "-" + neVersion.Path = "-" neVersion.Version = v.(string) } if v, ok := body.ServerState["sn"]; ok && v != nil { @@ -398,6 +396,8 @@ func (s *NeInfoController) Edit(c *gin.Context) { // 已有网元可获取的信息 if body.ServerState != nil { if v, ok := body.ServerState["version"]; ok && v != nil { + neVersion.Name = "-" + neVersion.Path = "-" neVersion.Version = v.(string) neVersion.UpdateBy = loginUserName } diff --git a/src/modules/network_element/controller/ne_license.go b/src/modules/network_element/controller/ne_license.go index 9a25c7f..4ddf1ed 100644 --- a/src/modules/network_element/controller/ne_license.go +++ b/src/modules/network_element/controller/ne_license.go @@ -3,31 +3,28 @@ package controller import ( "fmt" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - neFetchlink "nms_cxy/src/modules/network_element/fetch_link" - "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeLicenseController 结构体 var NewNeLicense = &NeLicenseController{ - neLicenseService: neService.NewNeLicenseImpl, - neInfoService: neService.NewNeInfoImpl, + neLicenseService: neService.NewNeLicense, + neInfoService: neService.NewNeInfo, } // 网元授权激活请求 // // PATH /license type NeLicenseController struct { - // 网元授权激活服务 - neLicenseService neService.INeLicense - // 网元信息服务 - neInfoService neService.INeInfo + neLicenseService *neService.NeLicense // 网元授权激活服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元授权激活列表 diff --git a/src/modules/network_element/controller/ne_software.go b/src/modules/network_element/controller/ne_software.go index 9d73cce..25c0580 100644 --- a/src/modules/network_element/controller/ne_software.go +++ b/src/modules/network_element/controller/ne_software.go @@ -3,28 +3,26 @@ package controller import ( "strings" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeSoftwareController 结构体 var NewNeSoftware = &NeSoftwareController{ - neSoftwareService: neService.NewNeSoftwareImpl, + neSoftwareService: neService.NewNeSoftware, } // 网元软件包请求 // // PATH /software type NeSoftwareController struct { - // 网元软件包服务 - neSoftwareService neService.INeSoftware + neSoftwareService *neService.NeSoftware // 网元软件包服务 } // 网元软件包列表 diff --git a/src/modules/network_element/controller/ne_version.go b/src/modules/network_element/controller/ne_version.go index 2d6064c..366c989 100644 --- a/src/modules/network_element/controller/ne_version.go +++ b/src/modules/network_element/controller/ne_version.go @@ -1,26 +1,24 @@ package controller import ( - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - neService "nms_cxy/src/modules/network_element/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeVersionController 结构体 var NewNeVersion = &NeVersionController{ - neVersionService: neService.NewNeVersionImpl, + neVersionService: neService.NewNeVersion, } // 网元版本请求 // // PATH /version type NeVersionController struct { - // 网元版本服务 - neVersionService neService.INeVersion + neVersionService *neService.NeVersion // 网元版本服务 } // 网元版本列表 @@ -28,7 +26,7 @@ type NeVersionController struct { // GET /list func (s *NeVersionController) List(c *gin.Context) { querys := ctx.QueryMap(c) - data := s.neVersionService.SelectPage(querys) + data := s.neVersionService.SelectPage(querys, true) c.JSON(200, result.Ok(data)) } diff --git a/src/modules/network_element/fetch_link/hlr.go b/src/modules/network_element/fetch_link/hlr.go new file mode 100644 index 0000000..8a4c119 --- /dev/null +++ b/src/modules/network_element/fetch_link/hlr.go @@ -0,0 +1,68 @@ +// 网元HLR服务8080端口。 +// 融合到UDM网元,也许是UDM的HLR服务。 + +package fetchlink + +import ( + "encoding/json" + "fmt" + "strings" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" +) + +// HLRTraceStart HLR跟踪任务开始 +// +// data参数 {traceID:"跟踪任务ID", imsi:"IMSI和MSISDN必填一个,都带的话以IMSI为准", msisdn:""} +func HLRTraceStart(neInfo model.NeInfo, data map[string]any) (string, error) { + // 网元参数配置新增(array) + neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/add-task", neInfo.IP, neInfo.Port) + resBytes, err := fetch.PostJSON(neUrl, data, nil) + var resData map[string]string + if err != nil { + errStr := err.Error() + logger.Warnf("HLRTraceStart Post \"%s\"", neUrl) + logger.Errorf("HLRTraceStart %s", errStr) + return "", fmt.Errorf("NeService HLR API Error") + } + + // 序列化结果 + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("HLRTraceStart Unmarshal %s", err.Error()) + return "", err + } + if v, ok := resData["code"]; ok && v == "0" { + return strings.TrimSpace(strings.ToLower(resData["message"])), nil + } + return "", fmt.Errorf(resData["message"]) +} + +// HLRTraceStop HLR跟踪任务停止 +// +// data参数 {traceIDArray: ["跟踪任务ID数组"]} +func HLRTraceStop(neInfo model.NeInfo, data map[string]any) (string, error) { + // 网元参数配置新增(array) + neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/delete-task", neInfo.IP, neInfo.Port) + resBytes, err := fetch.PostJSON(neUrl, data, nil) + var resData map[string]string + if err != nil { + errStr := err.Error() + logger.Warnf("HLRTraceStop Post \"%s\"", neUrl) + logger.Errorf("HLRTraceStop %s", errStr) + return "", fmt.Errorf("NeService HLR API Error") + } + + // 序列化结果 + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("HLRTraceStop Unmarshal %s", err.Error()) + return "", err + } + if v, ok := resData["code"]; ok && v == "0" { + return strings.TrimSpace(strings.ToLower(resData["message"])), nil + } + return "", fmt.Errorf(resData["message"]) +} diff --git a/src/modules/network_element/fetch_link/ne_config.go b/src/modules/network_element/fetch_link/ne_config.go index cab5850..4695351 100644 --- a/src/modules/network_element/fetch_link/ne_config.go +++ b/src/modules/network_element/fetch_link/ne_config.go @@ -5,9 +5,9 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/fetch" - "nms_cxy/src/modules/network_element/model" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" ) // NeConfigOMC 网元配置对端网管信息 @@ -52,9 +52,9 @@ func NeConfigOMC(neInfo model.NeInfo) (map[string]any, error) { // NeConfigInfo 网元配置信息 func NeConfigInfo(neInfo model.NeInfo, paramName string) (map[string]any, error) { - // 网元配置对端网管信息 + // 网元参数配置信息 neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s", neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType), paramName) - resBytes, err := fetch.Get(neUrl, nil, 60_000) + resBytes, err := fetch.Get(neUrl, nil, 30_000) if err != nil { logger.Warnf("NeConfigInfo Get \"%s\"", neUrl) logger.Errorf("NeConfigInfo %s", err.Error()) diff --git a/src/modules/network_element/fetch_link/ne_state.go b/src/modules/network_element/fetch_link/ne_state.go index d15f5b2..9da0547 100644 --- a/src/modules/network_element/fetch_link/ne_state.go +++ b/src/modules/network_element/fetch_link/ne_state.go @@ -6,9 +6,9 @@ import ( "strings" "time" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/fetch" - "nms_cxy/src/modules/network_element/model" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" ) // NeState 获取网元端服务状态 @@ -49,6 +49,8 @@ func NeState(neInfo model.NeInfo) (map[string]any, error) { "capability": resData["capability"], "sn": resData["serialNum"], "expire": resData["expiryDate"], + "hostname": resData["hostName"], + "os": resData["osInfo"], "cpu": resData["cpuUsage"], "mem": resData["memUsage"], "disk": resData["diskSpace"], diff --git a/src/modules/network_element/fetch_link/ne_trace.go b/src/modules/network_element/fetch_link/ne_trace.go new file mode 100644 index 0000000..387633f --- /dev/null +++ b/src/modules/network_element/fetch_link/ne_trace.go @@ -0,0 +1,121 @@ +package fetchlink + +import ( + "encoding/json" + "fmt" + "strings" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" +) + +// NeTraceInfo 网元跟踪任务信息 +func NeTraceInfo(neInfo model.NeInfo, traceId string) (map[string]any, error) { + // 跟踪任务信息 + neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v1/subscriptions?id=%s", neInfo.IP, neInfo.Port, traceId) + resBytes, err := fetch.Get(neUrl, nil, 30_000) + if err != nil { + logger.Warnf("NeTraceInfo Get \"%s\"", neUrl) + logger.Errorf("NeTraceInfo %s", err.Error()) + return nil, fmt.Errorf("NeService Trace Info API Error") + } + + // 序列化结果 + var resData map[string]any + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("NeTraceInfo Unmarshal %s", err.Error()) + return nil, err + } + return resData, nil +} + +// NeTraceAdd 网元跟踪任务新增 +func NeTraceAdd(neInfo model.NeInfo, data map[string]any) (map[string]any, error) { + // 跟踪任务创建 + neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v1/subscriptions", neInfo.IP, neInfo.Port) + resBytes, err := fetch.PostJSON(neUrl, data, nil) + var resData map[string]any + if err != nil { + errStr := err.Error() + logger.Warnf("NeTraceAdd POST \"%s\"", neUrl) + if !(strings.HasPrefix(errStr, "201") || strings.HasPrefix(errStr, "400")) { + logger.Errorf("NeTraceAdd %s", errStr) + return nil, fmt.Errorf("NeService Trace Add API Error") + } + } + + // 200 成功无数据时 + if len(resBytes) == 0 { + return resData, nil + } + + // 序列化结果 + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("NeTraceAdd Unmarshal %s", err.Error()) + return nil, err + } + return resData, nil +} + +// NeTraceEdit 网元跟踪任务编辑 +func NeTraceEdit(neInfo model.NeInfo, data map[string]any) (map[string]any, error) { + // 网元参数配置新增(array) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v1/subscriptions", neInfo.IP, neInfo.Port) + resBytes, err := fetch.PutJSON(neUrl, data, nil) + var resData map[string]any + if err != nil { + errStr := err.Error() + logger.Warnf("NeTraceEdit PUT \"%s\"", neUrl) + if strings.HasPrefix(errStr, "201") || strings.HasPrefix(errStr, "204") { + return resData, nil + } + logger.Errorf("NeTraceEdit %s", errStr) + return nil, fmt.Errorf("NeService Trace Edit API Error") + } + + // 200 成功无数据时 + if len(resBytes) == 0 { + return resData, nil + } + + // 序列化结果 + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("NeTraceEdit Unmarshal %s", err.Error()) + return nil, err + } + return resData, nil +} + +// NeTraceDelete 网元跟踪任务删除 +func NeTraceDelete(neInfo model.NeInfo, traceId string) (map[string]any, error) { + // 网元参数配置删除(array) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v1/subscriptions?id=%s", neInfo.IP, neInfo.Port, traceId) + resBytes, err := fetch.Delete(neUrl, nil) + var resData map[string]any + if err != nil { + errStr := err.Error() + logger.Warnf("NeTraceDelete Delete \"%s\"", neUrl) + if strings.HasPrefix(errStr, "201") || strings.HasPrefix(errStr, "204") { + return resData, nil + } + logger.Errorf("NeTraceDelete %s", errStr) + return nil, fmt.Errorf("NeService Trace Delete API Error") + } + + // 200 成功无数据时 + if len(resBytes) == 0 { + return resData, nil + } + + // 序列化结果 + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("NeTraceDelete Unmarshal %s", err.Error()) + return nil, err + } + return resData, nil +} diff --git a/src/modules/network_element/fetch_link/smf.go b/src/modules/network_element/fetch_link/smf.go new file mode 100644 index 0000000..bbbb0ee --- /dev/null +++ b/src/modules/network_element/fetch_link/smf.go @@ -0,0 +1,66 @@ +package fetchlink + +import ( + "encoding/json" + "fmt" + "strings" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" +) + +// SMFSubInfoList SMF在线订阅用户列表信息 +// +// 查询参数 {"imsi":"360000100000130","msisdn":"8612300000130","upstate":"Inactive","pageNum":"1"} +// +// 返回结果 {"rows":[],"total":0} +func SMFSubInfoList(neInfo model.NeInfo, data map[string]string) (map[string]any, error) { + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueInfo", neInfo.IP, neInfo.Port) + // 查询参数拼接 + query := []string{} + if v, ok := data["imsi"]; ok && v != "" { + query = append(query, fmt.Sprintf("imsi=%s", v)) + } + if v, ok := data["msisdn"]; ok && v != "" { + query = append(query, fmt.Sprintf("msisdn=%s", v)) + } + if v, ok := data["upstate"]; ok && v != "" { + query = append(query, fmt.Sprintf("upstate=%s", v)) + } + // 固定页数量50条 + if v, ok := data["pageNum"]; ok && v != "" { + query = append(query, fmt.Sprintf("pageNum=%s", v)) + } + + if len(query) > 0 { + neUrl = fmt.Sprintf("%s?%s", neUrl, strings.Join(query, "&")) + } + + resBytes, err := fetch.Get(neUrl, nil, 60_000) + if err != nil { + logger.Warnf("SMFSubInfo Get \"%s\"", neUrl) + logger.Errorf("SMFSubInfo %s", err.Error()) + return nil, fmt.Errorf("NeService SMF API Error") + } + + // 序列化结果 {"data":[],"total":0} + var resData map[string]any + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("SMFSubInfo Unmarshal %s", err.Error()) + return nil, err + } + + // 固定返回字段,方便前端解析 + if v, ok := resData["data"]; ok && v != nil { + resData["rows"] = v.([]any) + delete(resData, "data") + } else { + resData["rows"] = []any{} + } + if v, ok := resData["total"]; !ok || v == nil { + resData["total"] = 0 + } + return resData, nil +} diff --git a/src/modules/network_element/fetch_link/udm.go b/src/modules/network_element/fetch_link/udm.go index d3f13bd..d027f9f 100644 --- a/src/modules/network_element/fetch_link/udm.go +++ b/src/modules/network_element/fetch_link/udm.go @@ -1,3 +1,6 @@ +// 网元UDM服务,可能是8080、33030端口服务 +// 融合的UDM网元视情况调整。 + package fetchlink import ( @@ -5,8 +8,8 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/fetch" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" ) // UDMImportAuth UDM导入鉴权数据 @@ -25,8 +28,7 @@ func UDMImportAuth(udmIP string, data map[string]any) (string, error) { } // 序列化结果 - err = json.Unmarshal(resBytes, &resData) - if err != nil { + if err = json.Unmarshal(resBytes, &resData); err != nil { logger.Errorf("UDMImportAuth Unmarshal %s", err.Error()) return "", err } diff --git a/src/modules/network_element/model/ne_host.go b/src/modules/network_element/model/ne_host.go index ba7362b..1ff3db0 100644 --- a/src/modules/network_element/model/ne_host.go +++ b/src/modules/network_element/model/ne_host.go @@ -5,16 +5,17 @@ import "encoding/json" // NeHost 网元主机表 ne_host type NeHost struct { HostID string `json:"hostId" gorm:"column:host_id"` // 主机主键 - HostType string `json:"hostType" gorm:"column:host_type" binding:"oneof=ssh telnet"` // 主机类型 ssh telnet + HostType string `json:"hostType" gorm:"column:host_type" binding:"oneof=ssh telnet redis"` // 连接类型 ssh telnet redis GroupID string `json:"groupId" gorm:"column:group_id"` // 分组(0默认 1网元 2系统) Title string `json:"title" gorm:"column:title"` // 标题名称 Addr string `json:"addr" gorm:"column:addr" binding:"required"` // 主机地址 - Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // SSH端口 - User string `json:"user" gorm:"column:user" binding:"required"` // 主机用户名 + Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // 端口 22 4100 6379 + User string `json:"user" gorm:"column:user" binding:"required"` // 认证用户名 AuthMode string `json:"authMode" gorm:"column:auth_mode" binding:"oneof=0 1 2"` // 认证模式(0密码 1主机私钥 2已免密) Password string `json:"password" gorm:"column:password"` // 认证密码 PrivateKey string `json:"privateKey" gorm:"column:private_key"` // 认证私钥 PassPhrase string `json:"passPhrase" gorm:"column:pass_phrase"` // 认证私钥密码 + DBName string `json:"dbName" gorm:"column:db_name"` // 数据库名称 Remark string `json:"remark" gorm:"column:remark"` // 备注 CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 @@ -23,7 +24,7 @@ type NeHost struct { } // TableName 表名称 -func (NeHost) TableName() string { +func (*NeHost) TableName() string { return "ne_host" } diff --git a/src/modules/network_element/model/ne_info.go b/src/modules/network_element/model/ne_info.go index 373df59..71a1a75 100644 --- a/src/modules/network_element/model/ne_info.go +++ b/src/modules/network_element/model/ne_info.go @@ -14,7 +14,7 @@ type NeInfo struct { VendorName string `json:"vendorName" gorm:"vendor_name"` Dn string `json:"dn" gorm:"dn"` NeAddress string `json:"neAddress" gorm:"ne_address"` // MAC地址 - HostIDs string `json:"hostIds" gorm:"host_ids"` // 网元主机ID组 数据格式(ssh,telnet,telnet) + HostIDs string `json:"hostIds" gorm:"host_ids"` // 网元主机ID组 数据格式(ssh,telnet) UDM(ssh,telnet,redis) UPF(ssh,telnet,telnet) Status string `json:"status" gorm:"status"` // 0离线 1在线 2配置待下发 Remark string `json:"remark" gorm:"remark"` // 备注 CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 diff --git a/src/modules/network_element/ne_config_test.go b/src/modules/network_element/ne_config_test.go index ad23ed9..6e80c9f 100644 --- a/src/modules/network_element/ne_config_test.go +++ b/src/modules/network_element/ne_config_test.go @@ -12,8 +12,7 @@ import ( "testing" "time" - "nms_cxy/src/modules/network_element/model" - + "be.ems/src/modules/network_element/model" "gopkg.in/yaml.v3" "gorm.io/driver/mysql" "gorm.io/gorm" @@ -22,18 +21,18 @@ import ( const ( // 数据库 - DbHost = "192.168.8.58" - DbPort = 33066 + DbHost = "192.168.9.58" + DbPort = 13306 DbUser = "root" DbPassswd = "1000omc@kp!" DbName = "omc_db" // 配置文件路径 configParamDir = "../../../config/param" // configParamFile = "*" // 目录下全部更新 - configParamFile = "cbc_param_config.yaml" // 单文件更新 + configParamFile = "smf_param_config.yaml" // 单文件更新 ) -func TestEncrypt(t *testing.T) { +func TestConfig(t *testing.T) { fileNameList, err := getDirFileNameList(configParamDir) if err != nil { log.Fatal(err) diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index 9772a35..88e2806 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -1,11 +1,11 @@ package networkelement import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/framework/middleware/collectlogs" - "nms_cxy/src/modules/network_element/controller" - "nms_cxy/src/modules/network_element/service" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/modules/network_element/controller" + "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" ) @@ -17,10 +17,8 @@ func Setup(router *gin.Engine) { // 启动时需要的初始参数 InitLoad() - neGroup := router.Group("/ne") - // 网元操作处理 - neActionGroup := neGroup.Group("/action") + neActionGroup := router.Group("/ne/action") { neActionGroup.GET("/files", middleware.PreAuthorize(nil), @@ -35,6 +33,14 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neAction", collectlogs.BUSINESS_TYPE_IMPORT)), controller.NewNeAction.PushFile, ) + neActionGroup.GET("/pullDirZip", + middleware.PreAuthorize(nil), + controller.NewNeAction.PullDirZip, + ) + neActionGroup.GET("/viewFile", + middleware.PreAuthorize(nil), + controller.NewNeAction.ViewFile, + ) neActionGroup.PUT("/service", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neAction", collectlogs.BUSINESS_TYPE_OTHER)), @@ -43,7 +49,7 @@ func Setup(router *gin.Engine) { } // 网元信息 - neInfoGroup := neGroup.Group("/info") + neInfoGroup := router.Group("/ne/info") { neInfoGroup.GET("/state", middleware.PreAuthorize(nil), @@ -104,7 +110,7 @@ func Setup(router *gin.Engine) { } // 网元主机 - neHostGroup := neGroup.Group("/host") + neHostGroup := router.Group("/ne/host") { neHostGroup.GET("/list", middleware.PreAuthorize(nil), @@ -153,7 +159,7 @@ func Setup(router *gin.Engine) { } // 网元主机命令 - neHostCmdGroup := neGroup.Group("/hostCmd") + neHostCmdGroup := router.Group("/ne/hostCmd") { neHostCmdGroup.GET("/list", middleware.PreAuthorize(nil), @@ -181,7 +187,7 @@ func Setup(router *gin.Engine) { } // 网元版本信息 - neVersionGroup := neGroup.Group("/version") + neVersionGroup := router.Group("/ne/version") { neVersionGroup.GET("/list", middleware.PreAuthorize(nil), @@ -199,7 +205,7 @@ func Setup(router *gin.Engine) { } // 网元软件包信息 - neSoftwareGroup := neGroup.Group("/software") + neSoftwareGroup := router.Group("/ne/software") { neSoftwareGroup.GET("/list", middleware.PreAuthorize(nil), @@ -232,7 +238,7 @@ func Setup(router *gin.Engine) { } // 网元授权激活信息 - neLicenseGroup := neGroup.Group("/license") + neLicenseGroup := router.Group("/ne/license") { neLicenseGroup.GET("/list", middleware.PreAuthorize(nil), @@ -262,7 +268,7 @@ func Setup(router *gin.Engine) { } // 网元参数配置 - neConfigGroup := neGroup.Group("/config") + neConfigGroup := router.Group("/ne/config") { // 网元参数配置可用属性值 neConfigGroup.GET("/list", @@ -315,7 +321,7 @@ func Setup(router *gin.Engine) { } // 网元配置文件备份记录 - neConfigBackupGroup := neGroup.Group("/config/backup") + neConfigBackupGroup := router.Group("/ne/config/backup") { neConfigBackupGroup.GET("/list", middleware.PreAuthorize(nil), @@ -351,13 +357,13 @@ func Setup(router *gin.Engine) { // InitLoad 初始参数 func InitLoad() { // 启动时,清除缓存-网元类型 - service.NewNeInfoImpl.ClearNeCacheByNeType("*") - service.NewNeInfoImpl.SelectNeInfoByRmuid("") + service.NewNeInfo.ClearNeCacheByNeType("*") + service.NewNeInfo.SelectNeInfoByRmuid("") // 启动时,网元公共参数数据记录到全局变量 - if para5GMap, err := service.NewNeInfoImpl.NeConfPara5GRead(); para5GMap != nil && err == nil { - service.NewNeInfoImpl.NeConfPara5GWirte(para5GMap, nil) + if para5GMap, err := service.NewNeInfo.NeConfPara5GRead(); para5GMap != nil && err == nil { + service.NewNeInfo.NeConfPara5GWirte(para5GMap, nil) } // 启动时,清除缓存-网元参数配置可用属性值 - service.NewNeConfigImpl.ClearNeCacheByNeType("*") - service.NewNeConfigImpl.RefreshByNeTypeAndNeID("*") + service.NewNeConfig.ClearNeCacheByNeType("*") + service.NewNeConfig.RefreshByNeTypeAndNeID("*") } diff --git a/src/modules/network_element/repository/ne_config.go b/src/modules/network_element/repository/ne_config.go index b5abcac..29ea68f 100644 --- a/src/modules/network_element/repository/ne_config.go +++ b/src/modules/network_element/repository/ne_config.go @@ -1,24 +1,259 @@ package repository -import "nms_cxy/src/modules/network_element/model" +import ( + "strings" + "time" -// INeConfig 网元参数配置可用属性值 数据层接口 -type INeConfig interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(param model.NeConfig) []model.NeConfig +// 实例化数据层 NeConfig 结构体 +var NewNeConfig = &NeConfig{ + selectSql: `select id, ne_type, param_name, param_display, param_type, param_json, param_sort, param_perms, update_time from ne_config`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeConfig - - // Insert 新增信息 - Insert(param model.NeConfig) string - - // Update 修改信息 - Update(param model.NeConfig) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "param_name": "ParamName", + "param_display": "ParamDisplay", + "param_type": "ParamType", + "param_json": "ParamJson", + "param_sort": "ParamSort", + "param_perms": "ParamPerms", + "update_time": "UpdateTime", + }, +} + +// NeConfig 网元参数配置可用属性值 数据层处理 +type NeConfig struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeConfig) convertResultRows(rows []map[string]any) []model.NeConfig { + arr := make([]model.NeConfig, 0) + for _, row := range rows { + item := model.NeConfig{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeConfig) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, v) + } + if v, ok := query["paramName"]; ok && v != "" { + conditions = append(conditions, "param_name = ?") + params = append(params, v) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(id) as 'total' from ne_config" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { + // 查询条件拼接 + var conditions []string + var params []any + if param.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, param.NeType) + } + if param.ParamName != "" { + conditions = append(conditions, "param_name = ?") + params = append(params, param.ParamName) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by param_sort asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeConfig) SelectByIds(ids []string) []model.NeConfig { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeConfig{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeConfig) Insert(param model.NeConfig) string { + // 参数拼接 + params := make(map[string]any) + if param.NeType != "" { + params["ne_type"] = param.NeType + } + if param.ParamName != "" { + params["param_name"] = param.ParamName + } + if param.ParamDisplay != "" { + params["param_display"] = param.ParamDisplay + } + if param.ParamType != "" { + params["param_type"] = param.ParamType + } + if param.ParamJson != "" { + params["param_json"] = param.ParamJson + } + params["param_sort"] = param.ParamSort + if param.ParamPerms != "" { + params["param_perms"] = param.ParamPerms + } + params["update_time"] = time.Now().UnixMilli() + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeConfig) Update(param model.NeConfig) int64 { + // 参数拼接 + params := make(map[string]any) + if param.NeType != "" { + params["ne_type"] = param.NeType + } + if param.ParamName != "" { + params["param_name"] = param.ParamName + } + if param.ParamDisplay != "" { + params["param_display"] = param.ParamDisplay + } + if param.ParamType != "" { + params["param_type"] = param.ParamType + } + if param.ParamJson != "" { + params["param_json"] = param.ParamJson + } + params["param_sort"] = param.ParamSort + if param.ParamPerms != "" { + params["param_perms"] = param.ParamPerms + } + params["update_time"] = time.Now().UnixMilli() + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_config set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, param.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeConfig) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from ne_config where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_config.impl.go b/src/modules/network_element/repository/ne_config.impl.go deleted file mode 100644 index bbac241..0000000 --- a/src/modules/network_element/repository/ne_config.impl.go +++ /dev/null @@ -1,259 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_element/model" -) - -// NewNeConfigImpl 网元参数配置可用属性值 实例化数据层 -var NewNeConfigImpl = &NeConfigImpl{ - selectSql: `select id, ne_type, param_name, param_display, param_type, param_json, param_sort, param_perms, update_time from ne_config`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "param_name": "ParamName", - "param_display": "ParamDisplay", - "param_type": "ParamType", - "param_json": "ParamJson", - "param_sort": "ParamSort", - "param_perms": "ParamPerms", - "update_time": "UpdateTime", - }, -} - -// NeConfigImpl 网元参数配置可用属性值 数据层处理 -type NeConfigImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigImpl) convertResultRows(rows []map[string]any) []model.NeConfig { - arr := make([]model.NeConfig, 0) - for _, row := range rows { - item := model.NeConfig{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, v) - } - if v, ok := query["paramName"]; ok && v != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(id) as 'total' from ne_config" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeConfigImpl) SelectList(param model.NeConfig) []model.NeConfig { - // 查询条件拼接 - var conditions []string - var params []any - if param.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, param.NeType) - } - if param.ParamName != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, param.ParamName) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by param_sort asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigImpl) SelectByIds(ids []string) []model.NeConfig { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfig{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigImpl) Insert(param model.NeConfig) string { - // 参数拼接 - params := make(map[string]any) - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - params["param_sort"] = param.ParamSort - if param.ParamPerms != "" { - params["param_perms"] = param.ParamPerms - } - params["update_time"] = time.Now().UnixMilli() - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigImpl) Update(param model.NeConfig) int64 { - // 参数拼接 - params := make(map[string]any) - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - params["param_sort"] = param.ParamSort - if param.ParamPerms != "" { - params["param_perms"] = param.ParamPerms - } - params["update_time"] = time.Now().UnixMilli() - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, param.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_config_backup.go b/src/modules/network_element/repository/ne_config_backup.go index 83e4b1d..3354034 100644 --- a/src/modules/network_element/repository/ne_config_backup.go +++ b/src/modules/network_element/repository/ne_config_backup.go @@ -1,24 +1,262 @@ package repository -import "nms_cxy/src/modules/network_element/model" +import ( + "strings" + "time" -// INeConfigBackup 网元配置文件备份记录 数据层接口 -type INeConfigBackup interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(item model.NeConfigBackup) []model.NeConfigBackup +// 实例化数据层 NeConfigBackup 结构体 +var NewNeConfigBackup = &NeConfigBackup{ + selectSql: `select + id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time + from ne_config_backup`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeConfigBackup - - // Insert 新增信息 - Insert(item model.NeConfigBackup) string - - // Update 修改信息 - Update(item model.NeConfigBackup) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "name": "Name", + "path": "Path", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeConfigBackup 网元配置文件备份记录 数据层处理 +type NeConfigBackup struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeConfigBackup) convertResultRows(rows []map[string]any) []model.NeConfigBackup { + arr := make([]model.NeConfigBackup, 0) + for _, row := range rows { + item := model.NeConfigBackup{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["name"]; ok && v != "" { + conditions = append(conditions, "name like concat(concat('%', ?), '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_config_backup" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by id desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { + // 查询条件拼接 + var conditions []string + var params []any + if item.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, item.NeType) + } + if item.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, item.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeConfigBackup) SelectByIds(cmdIds []string) []model.NeConfigBackup { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeConfigBackup{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { + // 参数拼接 + params := make(map[string]any) + if item.NeType != "" { + params["ne_type"] = item.NeType + } + if item.NeId != "" { + params["ne_id"] = item.NeId + } + if item.Name != "" { + params["name"] = item.Name + } + if item.Path != "" { + params["path"] = item.Path + } + if item.Remark != "" { + params["remark"] = item.Remark + } + if item.CreateBy != "" { + params["create_by"] = item.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { + // 参数拼接 + params := make(map[string]any) + if item.NeType != "" { + params["ne_type"] = item.NeType + } + if item.NeId != "" { + params["ne_id"] = item.NeId + } + if item.Name != "" { + params["name"] = item.Name + } + if item.Path != "" { + params["path"] = item.Path + } + params["remark"] = item.Remark + if item.UpdateBy != "" { + params["update_by"] = item.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, item.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeConfigBackup) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from ne_config_backup where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_config_backup.impl.go b/src/modules/network_element/repository/ne_config_backup.impl.go deleted file mode 100644 index 941cb75..0000000 --- a/src/modules/network_element/repository/ne_config_backup.impl.go +++ /dev/null @@ -1,262 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_element/model" -) - -// 实例化数据层 NewNeConfigBackupImpl 结构体 -var NewNeConfigBackupImpl = &NeConfigBackupImpl{ - selectSql: `select - id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time - from ne_config_backup`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "name": "Name", - "path": "Path", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeConfigBackupImpl 网元配置文件备份记录 数据层处理 -type NeConfigBackupImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigBackupImpl) convertResultRows(rows []map[string]any) []model.NeConfigBackup { - arr := make([]model.NeConfigBackup, 0) - for _, row := range rows { - item := model.NeConfigBackup{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(concat('%', ?), '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_config_backup" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - // 查询条件拼接 - var conditions []string - var params []any - if item.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, item.NeType) - } - if item.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, item.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackupImpl) SelectByIds(cmdIds []string) []model.NeConfigBackup { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfigBackup{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - if item.Remark != "" { - params["remark"] = item.Remark - } - if item.CreateBy != "" { - params["create_by"] = item.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - params["remark"] = item.Remark - if item.UpdateBy != "" { - params["update_by"] = item.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, item.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigBackupImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config_backup where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_host.go b/src/modules/network_element/repository/ne_host.go index a519d9b..7079466 100644 --- a/src/modules/network_element/repository/ne_host.go +++ b/src/modules/network_element/repository/ne_host.go @@ -1,27 +1,403 @@ package repository -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeHost 网元主机连接 数据层接口 -type INeHost interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neHost model.NeHost) []model.NeHost +// 实例化数据层 NeHost 结构体 +var NewNeHost = &NeHost{ + selectSql: `select + host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, db_name, remark, create_by, create_time, update_by, update_time + from ne_host`, - // SelectByIds 通过ID查询 - SelectByIds(hostIds []string) []model.NeHost - - // Insert 新增信息 - Insert(neHost model.NeHost) string - - // Update 修改信息 - Update(neHost model.NeHost) int64 - - // DeleteByIds 批量删除网元主机连接信息 - DeleteByIds(hostIds []string) int64 - - // CheckUniqueNeHost 校验主机是否唯一 - CheckUniqueNeHost(neHost model.NeHost) string + resultMap: map[string]string{ + "host_id": "HostID", + "host_type": "HostType", + "group_id": "GroupID", + "title": "Title", + "addr": "Addr", + "port": "Port", + "user": "User", + "auth_mode": "AuthMode", + "password": "Password", + "private_key": "PrivateKey", + "private_password": "PassPhrase", + "db_name": "DBName", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHost 网元主机连接 数据层处理 +type NeHost struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHost) convertResultRows(rows []map[string]any) []model.NeHost { + arr := make([]model.NeHost, 0) + for _, row := range rows { + item := model.NeHost{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHost) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["hostType"]; ok && v != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if sv, ok := query["sortField"]; ok && sv != "" { + sortSql := fmt.Sprint(sv) + if sortSql == "updateTime" { + sortSql = "update_time" + } + if sortSql == "createTime" { + sortSql = "create_time" + } + if ov, ok := query["sortOrder"]; ok && ov != "" { + if fmt.Sprint(ov) == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { + // 查询条件拼接 + var conditions []string + var params []any + if neHost.HostType != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, neHost.HostType) + } + if neHost.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHost.GroupID) + } + if neHost.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHost.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHost) SelectByIds(hostIds []string) []model.NeHost { + placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) + querySql := r.selectSql + " where host_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(hostIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHost{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueNeHost 校验主机是否唯一 +func (r *NeHost) CheckUniqueNeHost(neHost model.NeHost) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHost.HostType != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, neHost.HostType) + } + if neHost.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHost.GroupID) + } + if neHost.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHost.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHost) Insert(neHost model.NeHost) string { + // 参数拼接 + params := make(map[string]any) + if neHost.HostType != "" { + params["host_type"] = neHost.HostType + } + if neHost.GroupID != "" { + params["group_id"] = neHost.GroupID + } + if neHost.Title != "" { + params["title"] = neHost.Title + } + if neHost.Addr != "" { + params["addr"] = neHost.Addr + } + if neHost.Port > 0 { + params["port"] = neHost.Port + } + if neHost.User != "" { + params["user"] = neHost.User + } + if neHost.AuthMode != "" { + params["auth_mode"] = neHost.AuthMode + } + if neHost.Password != "" { + params["password"] = neHost.Password + } + if neHost.PrivateKey != "" { + params["private_key"] = neHost.PrivateKey + } + if neHost.PassPhrase != "" { + params["pass_phrase"] = neHost.PassPhrase + } + if neHost.DBName != "" { + params["db_name"] = neHost.DBName + } + if neHost.Remark != "" { + params["remark"] = neHost.Remark + } + if neHost.CreateBy != "" { + params["create_by"] = neHost.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 根据认证模式清除不必要的信息 + if neHost.AuthMode == "0" { + params["private_key"] = "" + params["pass_phrase"] = "" + } + if neHost.AuthMode == "1" { + params["password"] = "" + } + if neHost.AuthMode == "2" { + params["password"] = "" + params["private_key"] = "" + params["pass_phrase"] = "" + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHost) Update(neHost model.NeHost) int64 { + // 参数拼接 + params := make(map[string]any) + if neHost.HostType != "" { + params["host_type"] = neHost.HostType + } + if neHost.GroupID != "" { + params["group_id"] = neHost.GroupID + } + if neHost.Title != "" { + params["title"] = neHost.Title + } + if neHost.Addr != "" { + params["addr"] = neHost.Addr + } + if neHost.Port > 0 { + params["port"] = neHost.Port + } + if neHost.User != "" { + params["user"] = neHost.User + } + if neHost.AuthMode != "" { + params["auth_mode"] = neHost.AuthMode + } + if neHost.Password != "" { + params["password"] = neHost.Password + } + if neHost.PrivateKey != "" { + params["private_key"] = neHost.PrivateKey + } + if neHost.PassPhrase != "" { + params["pass_phrase"] = neHost.PassPhrase + } + if neHost.DBName != "" { + params["db_name"] = neHost.DBName + } + params["remark"] = neHost.Remark + if neHost.UpdateBy != "" { + params["update_by"] = neHost.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 根据认证模式清除不必要的信息 + if neHost.AuthMode == "0" { + params["private_key"] = "" + params["pass_phrase"] = "" + } + if neHost.AuthMode == "1" { + params["password"] = "" + } + if neHost.AuthMode == "2" { + params["password"] = "" + params["private_key"] = "" + params["pass_phrase"] = "" + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" + + // 执行更新 + values = append(values, neHost.HostID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除网元主机连接信息 +func (r *NeHost) DeleteByIds(hostIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) + sql := "delete from ne_host where host_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(hostIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_host.impl.go b/src/modules/network_element/repository/ne_host.impl.go deleted file mode 100644 index adae7b4..0000000 --- a/src/modules/network_element/repository/ne_host.impl.go +++ /dev/null @@ -1,376 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_element/model" -) - -// 实例化数据层 NewNeHostImpl 结构体 -var NewNeHostImpl = &NeHostImpl{ - selectSql: `select - host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, remark, create_by, create_time, update_by, update_time - from ne_host`, - - resultMap: map[string]string{ - "host_id": "HostID", - "host_type": "HostType", - "group_id": "GroupID", - "title": "Title", - "addr": "Addr", - "port": "Port", - "user": "User", - "auth_mode": "AuthMode", - "password": "Password", - "private_key": "PrivateKey", - "private_password": "PassPhrase", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeHostImpl 网元主机连接 数据层处理 -type NeHostImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostImpl) convertResultRows(rows []map[string]any) []model.NeHost { - arr := make([]model.NeHost, 0) - for _, row := range rows { - item := model.NeHost{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["hostType"]; ok && v != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeHostImpl) SelectByIds(hostIds []string) []model.NeHost { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - querySql := r.selectSql + " where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHost{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeHost 校验主机是否唯一 -func (r *NeHostImpl) CheckUniqueNeHost(neHost model.NeHost) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostImpl) Insert(neHost model.NeHost) string { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - if neHost.Remark != "" { - params["remark"] = neHost.Remark - } - if neHost.CreateBy != "" { - params["create_by"] = neHost.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostImpl) Update(neHost model.NeHost) int64 { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - params["remark"] = neHost.Remark - if neHost.UpdateBy != "" { - params["update_by"] = neHost.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" - - // 执行更新 - values = append(values, neHost.HostID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHostImpl) DeleteByIds(hostIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - sql := "delete from ne_host where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_host_cmd.go b/src/modules/network_element/repository/ne_host_cmd.go index 18245ba..4ef5707 100644 --- a/src/modules/network_element/repository/ne_host_cmd.go +++ b/src/modules/network_element/repository/ne_host_cmd.go @@ -1,27 +1,306 @@ package repository -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeHostCmd 网元主机命令 数据层接口 -type INeHostCmd interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd +// 实例化数据层 NeHostCmd 结构体 +var NewNeHostCmd = &NeHostCmd{ + selectSql: `select + cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time + from ne_host_cmd`, - // SelectByIds 通过ID查询 - SelectByIds(cmdIds []string) []model.NeHostCmd - - // Insert 新增信息 - Insert(neHostCmd model.NeHostCmd) string - - // Update 修改信息 - Update(neHostCmd model.NeHostCmd) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(cmdIds []string) int64 - - // CheckUniqueGroupTitle 校验同类型组内是否唯一 - CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string + resultMap: map[string]string{ + "cmd_id": "CmdID", + "cmd_type": "CmdType", + "group_id": "GroupID", + "title": "Title", + "command": "Command", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHostCmd 网元主机连接 数据层处理 +type NeHostCmd struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHostCmd) convertResultRows(rows []map[string]any) []model.NeHostCmd { + arr := make([]model.NeHostCmd, 0) + for _, row := range rows { + item := model.NeHostCmd{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["cmdType"]; ok && v != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host_cmd" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmd) SelectByIds(cmdIds []string) []model.NeHostCmd { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHostCmd{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmd) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + if neHostCmd.Remark != "" { + params["remark"] = neHostCmd.Remark + } + if neHostCmd.CreateBy != "" { + params["create_by"] = neHostCmd.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + params["remark"] = neHostCmd.Remark + if neHostCmd.UpdateBy != "" { + params["update_by"] = neHostCmd.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" + + // 执行更新 + values = append(values, neHostCmd.CmdID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmd) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_host_cmd.impl.go b/src/modules/network_element/repository/ne_host_cmd.impl.go deleted file mode 100644 index 4e0e1a5..0000000 --- a/src/modules/network_element/repository/ne_host_cmd.impl.go +++ /dev/null @@ -1,306 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_element/model" -) - -// 实例化数据层 NewNeHostCmdImpl 结构体 -var NewNeHostCmdImpl = &NeHostCmdImpl{ - selectSql: `select - cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time - from ne_host_cmd`, - - resultMap: map[string]string{ - "cmd_id": "CmdID", - "cmd_type": "CmdType", - "group_id": "GroupID", - "title": "Title", - "command": "Command", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeHostCmdImpl 网元主机连接 数据层处理 -type NeHostCmdImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostCmdImpl) convertResultRows(rows []map[string]any) []model.NeHostCmd { - arr := make([]model.NeHostCmd, 0) - for _, row := range rows { - item := model.NeHostCmd{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["cmdType"]; ok && v != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host_cmd" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmdImpl) SelectByIds(cmdIds []string) []model.NeHostCmd { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHostCmd{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmdImpl) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - if neHostCmd.Remark != "" { - params["remark"] = neHostCmd.Remark - } - if neHostCmd.CreateBy != "" { - params["create_by"] = neHostCmd.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - params["remark"] = neHostCmd.Remark - if neHostCmd.UpdateBy != "" { - params["update_by"] = neHostCmd.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" - - // 执行更新 - values = append(values, neHostCmd.CmdID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index 0b90832..6e2a5cc 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -1,32 +1,408 @@ package repository import ( - "nms_cxy/src/modules/network_element/model" + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" ) -// 网元信息 数据层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - - // SelectPage 根据条件分页查询 - SelectPage(query map[string]any) map[string]any - - // SelectList 查询列表 - SelectList(neInfo model.NeInfo) []model.NeInfo - - // SelectByIds 通过ID查询 - SelectByIds(infoIds []string) []model.NeInfo - - // Insert 新增信息 - Insert(neInfo model.NeInfo) string - - // Update 修改信息 - Update(neInfo model.NeInfo) int64 - - // DeleteByIds 批量删除网元信息 - DeleteByIds(infoIds []string) int64 - - // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 - CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string +// neListSort 网元列表预设排序 +var neListSort = []string{ + "OMC", + "IMS", + "AMF", + "AUSF", + "UDR", + "UDM", + "SMF", + "PCF", + "NSSF", + "NRF", + "UPF", + "LMF", + "NEF", + "MME", + "N3IWF", + "MOCNGW", + "SMSC", + "SMSF", + "CBC", + "CHF", +} + +// 实例化数据层 NeInfo 结构体 +var NewNeInfo = &NeInfo{ + selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, host_ids, status, remark, create_by, create_time, update_by, update_time from ne_info`, + + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "rm_uid": "RmUID", + "ne_name": "NeName", + "ip": "IP", + "port": "Port", + "pv_flag": "PvFlag", + "province": "Province", + "vendor_name": "VendorName", + "dn": "Dn", + "ne_address": "NeAddress", + "host_ids": "HostIDs", + "status": "Status", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeInfo 网元信息表 数据层处理 +type NeInfo struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeInfo) convertResultRows(rows []map[string]any) []model.NeInfo { + arr := make([]model.NeInfo, 0) + for _, row := range rows { + item := model.NeInfo{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + + // 创建优先级映射 + priority := make(map[string]int) + for i, v := range neListSort { + priority[v] = i + } + // 冒泡排序 + n := len(arr) + for i := 0; i < n-1; i++ { + for j := 0; j < n-i-1; j++ { + if priority[arr[j].NeType] > priority[arr[j+1].NeType] { + // 交换元素 + arr[j], arr[j+1] = arr[j+1], arr[j] + } + } + } + + return arr +} + +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + querySql := r.selectSql + " where ne_type = ? and ne_id = ?" + results, err := datasource.RawDB("", querySql, []any{neType, neID}) + if err != nil { + logger.Errorf("query err => %v", err) + return model.NeInfo{} + } + // 转换实体 + rows := r.convertResultRows(results) + if len(rows) > 0 { + return rows[0] + } + return model.NeInfo{} +} + +// SelectPage 根据条件分页查询 +func (r *NeInfo) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["rmUid"]; ok && v != "" { + conditions = append(conditions, "rmUid like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeInfo{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_info" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 查询列表 +func (r *NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo { + // 查询条件拼接 + var conditions []string + var params []any + if neInfo.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neInfo.NeType) + } + if neInfo.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neInfo.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeInfo) SelectByIds(infoIds []string) []model.NeInfo { + placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(infoIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeInfo{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfo) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { + // 查询条件拼接 + var conditions []string + var params []any + if neInfo.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neInfo.NeType) + } + if neInfo.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neInfo.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_info " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeInfo) Insert(neInfo model.NeInfo) string { + // 参数拼接 + params := make(map[string]any) + if neInfo.NeType != "" { + params["ne_type"] = neInfo.NeType + } + if neInfo.NeId != "" { + params["ne_id"] = neInfo.NeId + } + if neInfo.RmUID != "" { + params["rm_uid"] = neInfo.RmUID + } + if neInfo.NeName != "" { + params["ne_name"] = neInfo.NeName + } + if neInfo.IP != "" { + params["ip"] = neInfo.IP + } + if neInfo.Port > 0 { + params["port"] = neInfo.Port + } + if neInfo.PvFlag != "" { + params["pv_flag"] = neInfo.PvFlag + } + if neInfo.Province != "" { + params["province"] = neInfo.Province + } + if neInfo.VendorName != "" { + params["vendor_name"] = neInfo.VendorName + } + if neInfo.Dn != "" { + params["dn"] = neInfo.Dn + } + if neInfo.NeAddress != "" { + params["ne_address"] = neInfo.NeAddress + } + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + if neInfo.Status != "" { + params["status"] = neInfo.Status + } + if neInfo.Remark != "" { + params["remark"] = neInfo.Remark + } + if neInfo.CreateBy != "" { + params["create_by"] = neInfo.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_info (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeInfo) Update(neInfo model.NeInfo) int64 { + // 参数拼接 + params := make(map[string]any) + if neInfo.NeType != "" { + params["ne_type"] = neInfo.NeType + } + if neInfo.NeId != "" { + params["ne_id"] = neInfo.NeId + } + if neInfo.RmUID != "" { + params["rm_uid"] = neInfo.RmUID + } + if neInfo.NeName != "" { + params["ne_name"] = neInfo.NeName + } + if neInfo.IP != "" { + params["ip"] = neInfo.IP + } + if neInfo.Port > 0 { + params["port"] = neInfo.Port + } + if neInfo.PvFlag != "" { + params["pv_flag"] = neInfo.PvFlag + } + params["province"] = neInfo.Province + params["vendor_name"] = neInfo.VendorName + params["dn"] = neInfo.Dn + params["ne_address"] = neInfo.NeAddress + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + params["remark"] = neInfo.Remark + if neInfo.Status != "" { + params["status"] = neInfo.Status + } + if neInfo.UpdateBy != "" { + params["update_by"] = neInfo.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_info set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neInfo.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除网元信息 +func (r *NeInfo) DeleteByIds(infoIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) + sql := "delete from ne_info where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(infoIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_info.impl.go b/src/modules/network_element/repository/ne_info.impl.go deleted file mode 100644 index b470441..0000000 --- a/src/modules/network_element/repository/ne_info.impl.go +++ /dev/null @@ -1,414 +0,0 @@ -package repository - -import ( - "fmt" - "sort" - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_element/model" -) - -// neListSort 网元列表预设排序 -var neListSort = []string{ - "OMC", - "IMS", - "AMF", - "AUSF", - "UDM", - "SMF", - "PCF", - "NSSF", - "NRF", - "UPF", - "LMF", - "NEF", - "MME", - "N3IWF", - "MOCNGW", - "SMSC", - "CBC", -} - -// 实例化数据层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, host_ids, status, remark, create_by, create_time, update_by, update_time from ne_info`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "rm_uid": "RmUID", - "ne_name": "NeName", - "ip": "IP", - "port": "Port", - "pv_flag": "PvFlag", - "province": "Province", - "vendor_name": "VendorName", - "dn": "Dn", - "ne_address": "NeAddress", - "host_ids": "HostIDs", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeInfoImpl 网元信息表 数据层处理 -type NeInfoImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeInfoImpl) convertResultRows(rows []map[string]any) []model.NeInfo { - arr := make([]model.NeInfo, 0) - for _, row := range rows { - item := model.NeInfo{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - - // 排序 - sort.Slice(arr, func(i, j int) bool { - // 前一个 - after := arr[i] - afterIndex := 0 - for i, v := range neListSort { - if after.NeType == v { - afterIndex = i - break - } - } - // 后一个 - befter := arr[j] - befterIndex := 0 - for i, v := range neListSort { - if befter.NeType == v { - befterIndex = i - break - } - } - // 升序 - return afterIndex < befterIndex - }) - - return arr -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - querySql := r.selectSql + " where ne_type = ? and ne_id = ?" - results, err := datasource.RawDB("", querySql, []any{neType, neID}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.NeInfo{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.NeInfo{} -} - -// SelectPage 根据条件分页查询 -func (r *NeInfoImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["rmUid"]; ok && v != "" { - conditions = append(conditions, "rmUid like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeInfo{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_info" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id desc " + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 查询列表 -func (r *NeInfoImpl) SelectList(neInfo model.NeInfo) []model.NeInfo { - // 查询条件拼接 - var conditions []string - var params []any - if neInfo.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neInfo.NeType) - } - if neInfo.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neInfo.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeInfoImpl) SelectByIds(infoIds []string) []model.NeInfo { - placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(infoIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeInfo{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { - // 查询条件拼接 - var conditions []string - var params []any - if neInfo.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neInfo.NeType) - } - if neInfo.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neInfo.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_info " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeInfoImpl) Insert(neInfo model.NeInfo) string { - // 参数拼接 - params := make(map[string]any) - if neInfo.NeType != "" { - params["ne_type"] = neInfo.NeType - } - if neInfo.NeId != "" { - params["ne_id"] = neInfo.NeId - } - if neInfo.RmUID != "" { - params["rm_uid"] = neInfo.RmUID - } - if neInfo.NeName != "" { - params["ne_name"] = neInfo.NeName - } - if neInfo.IP != "" { - params["ip"] = neInfo.IP - } - if neInfo.Port > 0 { - params["port"] = neInfo.Port - } - if neInfo.PvFlag != "" { - params["pv_flag"] = neInfo.PvFlag - } - if neInfo.Province != "" { - params["province"] = neInfo.Province - } - if neInfo.VendorName != "" { - params["vendor_name"] = neInfo.VendorName - } - if neInfo.Dn != "" { - params["dn"] = neInfo.Dn - } - if neInfo.NeAddress != "" { - params["ne_address"] = neInfo.NeAddress - } - if neInfo.HostIDs != "" { - params["host_ids"] = neInfo.HostIDs - } - if neInfo.Status != "" { - params["status"] = neInfo.Status - } - if neInfo.Remark != "" { - params["remark"] = neInfo.Remark - } - if neInfo.CreateBy != "" { - params["create_by"] = neInfo.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_info (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeInfoImpl) Update(neInfo model.NeInfo) int64 { - // 参数拼接 - params := make(map[string]any) - if neInfo.NeType != "" { - params["ne_type"] = neInfo.NeType - } - if neInfo.NeId != "" { - params["ne_id"] = neInfo.NeId - } - if neInfo.RmUID != "" { - params["rm_uid"] = neInfo.RmUID - } - if neInfo.NeName != "" { - params["ne_name"] = neInfo.NeName - } - if neInfo.IP != "" { - params["ip"] = neInfo.IP - } - if neInfo.Port > 0 { - params["port"] = neInfo.Port - } - if neInfo.PvFlag != "" { - params["pv_flag"] = neInfo.PvFlag - } - params["province"] = neInfo.Province - params["vendor_name"] = neInfo.VendorName - params["dn"] = neInfo.Dn - params["ne_address"] = neInfo.NeAddress - if neInfo.HostIDs != "" { - params["host_ids"] = neInfo.HostIDs - } - params["remark"] = neInfo.Remark - if neInfo.Status != "" { - params["status"] = neInfo.Status - } - if neInfo.UpdateBy != "" { - params["update_by"] = neInfo.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_info set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neInfo.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除网元信息 -func (r *NeInfoImpl) DeleteByIds(infoIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) - sql := "delete from ne_info where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(infoIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_license.go b/src/modules/network_element/repository/ne_license.go index 4c56803..5aad6b3 100644 --- a/src/modules/network_element/repository/ne_license.go +++ b/src/modules/network_element/repository/ne_license.go @@ -1,24 +1,297 @@ package repository -import "nms_cxy/src/modules/network_element/model" +import ( + "strings" + "time" -// INeLicense 网元授权激活信息 数据层接口 -type INeLicense interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neLicense model.NeLicense) []model.NeLicense +// 实例化数据层 NeLicense 结构体 +var NewNeLicense = &NeLicense{ + selectSql: `select + id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time + from ne_license`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeLicense - - // Insert 新增信息 - Insert(neLicense model.NeLicense) string - - // Update 修改信息 - Update(neLicense model.NeLicense) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "activation_request_code": "ActivationRequestCode", + "license_path": "LicensePath", + "serial_num": "SerialNum", + "expiry_date": "ExpiryDate", + "status": "Status", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeLicense 网元授权激活信息 数据层处理 +type NeLicense struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeLicense) convertResultRows(rows []map[string]any) []model.NeLicense { + arr := make([]model.NeLicense, 0) + for _, row := range rows { + item := model.NeLicense{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeLicense) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["expiryDate"]; ok && v != "" { + conditions = append(conditions, "expiry_date = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["createBy"]; ok && v != "" { + conditions = append(conditions, "create_by like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_license" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { + // 查询条件拼接 + var conditions []string + var params []any + if neLicense.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neLicense.NeType) + } + if neLicense.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neLicense.NeId) + } + if neLicense.ExpiryDate != "" { + conditions = append(conditions, "expiry_date = ?") + params = append(params, neLicense.ExpiryDate) + } + if neLicense.CreateBy != "" { + conditions = append(conditions, "create_by like concat(?, '%')") + params = append(params, neLicense.CreateBy) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeLicense) SelectByIds(cmdIds []string) []model.NeLicense { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeLicense{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeLicense) Insert(neLicense model.NeLicense) string { + // 参数拼接 + params := make(map[string]any) + if neLicense.NeType != "" { + params["ne_type"] = neLicense.NeType + } + if neLicense.NeId != "" { + params["ne_id"] = neLicense.NeId + } + if neLicense.ActivationRequestCode != "" { + params["activation_request_code"] = neLicense.ActivationRequestCode + } + if neLicense.LicensePath != "" { + params["license_path"] = neLicense.LicensePath + } + if neLicense.SerialNum != "" { + params["serial_num"] = neLicense.SerialNum + } + if neLicense.ExpiryDate != "" { + params["expiry_date"] = neLicense.ExpiryDate + } + if neLicense.Status != "" { + params["status"] = neLicense.Status + } + if neLicense.Remark != "" { + params["remark"] = neLicense.Remark + } + if neLicense.CreateBy != "" { + params["create_by"] = neLicense.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeLicense) Update(neLicense model.NeLicense) int64 { + // 参数拼接 + params := make(map[string]any) + if neLicense.NeType != "" { + params["ne_type"] = neLicense.NeType + } + if neLicense.NeId != "" { + params["ne_id"] = neLicense.NeId + } + if neLicense.ActivationRequestCode != "" { + params["activation_request_code"] = neLicense.ActivationRequestCode + } + if neLicense.LicensePath != "" { + params["license_path"] = neLicense.LicensePath + } + if neLicense.SerialNum != "" { + params["serial_num"] = neLicense.SerialNum + } + if neLicense.ExpiryDate != "" { + params["expiry_date"] = neLicense.ExpiryDate + } + if neLicense.Status != "" { + params["status"] = neLicense.Status + } + if neLicense.Remark != "" { + params["remark"] = neLicense.Remark + } + if neLicense.UpdateBy != "" { + params["update_by"] = neLicense.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neLicense.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeLicense) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_license where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_license.impl.go b/src/modules/network_element/repository/ne_license.impl.go deleted file mode 100644 index 099a801..0000000 --- a/src/modules/network_element/repository/ne_license.impl.go +++ /dev/null @@ -1,297 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_element/model" -) - -// 实例化数据层 NewNeLicense 结构体 -var NewNeLicenseImpl = &NeLicenseImpl{ - selectSql: `select - id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time - from ne_license`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "activation_request_code": "ActivationRequestCode", - "license_path": "LicensePath", - "serial_num": "SerialNum", - "expiry_date": "ExpiryDate", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeLicenseImpl 网元授权激活信息 数据层处理 -type NeLicenseImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeLicenseImpl) convertResultRows(rows []map[string]any) []model.NeLicense { - arr := make([]model.NeLicense, 0) - for _, row := range rows { - item := model.NeLicense{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeLicenseImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["expiryDate"]; ok && v != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["createBy"]; ok && v != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_license" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeLicenseImpl) SelectList(neLicense model.NeLicense) []model.NeLicense { - // 查询条件拼接 - var conditions []string - var params []any - if neLicense.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neLicense.NeType) - } - if neLicense.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neLicense.NeId) - } - if neLicense.ExpiryDate != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, neLicense.ExpiryDate) - } - if neLicense.CreateBy != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, neLicense.CreateBy) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeLicenseImpl) SelectByIds(cmdIds []string) []model.NeLicense { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeLicense{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeLicenseImpl) Insert(neLicense model.NeLicense) string { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.CreateBy != "" { - params["create_by"] = neLicense.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeLicenseImpl) Update(neLicense model.NeLicense) int64 { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.UpdateBy != "" { - params["update_by"] = neLicense.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neLicense.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeLicenseImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_license where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_software.go b/src/modules/network_element/repository/ne_software.go index 317a948..d039ec6 100644 --- a/src/modules/network_element/repository/ne_software.go +++ b/src/modules/network_element/repository/ne_software.go @@ -1,27 +1,317 @@ package repository -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeSoftware 网元软件包信息 数据层接口 -type INeSoftware interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neSoftware model.NeSoftware) []model.NeSoftware +// 实例化数据层 NeSoftware 结构体 +var NewNeSoftware = &NeSoftware{ + selectSql: `select + id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time + from ne_software`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeSoftware - - // Insert 新增信息 - Insert(neSoftware model.NeSoftware) string - - // Update 修改信息 - Update(neSoftware model.NeSoftware) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 - - // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 - CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "name": "Name", + "path": "Path", + "version": "Version", + "description": "Description", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeSoftware 网元软件包信息 数据层处理 +type NeSoftware struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeSoftware) convertResultRows(rows []map[string]any) []model.NeSoftware { + arr := make([]model.NeSoftware, 0) + for _, row := range rows { + item := model.NeSoftware{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + softwareType := v.(string) + if strings.Contains(softwareType, ",") { + softwareTypeArr := strings.Split(softwareType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) + conditions = append(conditions, "ne_type in ("+placeholder+")") + parameters := repo.ConvertIdsSlice(softwareTypeArr) + params = append(params, parameters...) + } else { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(softwareType, " ")) + } + } + if v, ok := query["name"]; ok && v != "" { + conditions = append(conditions, "name like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["version"]; ok && v != "" { + conditions = append(conditions, "version like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_software" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by id desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + // 查询条件拼接 + var conditions []string + var params []any + if neSoftware.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neSoftware.NeType) + } + if neSoftware.Path != "" { + conditions = append(conditions, "path = ?") + params = append(params, neSoftware.Path) + } + if neSoftware.Version != "" { + conditions = append(conditions, "version = ?") + params = append(params, neSoftware.Version) + } + if neSoftware.Name != "" { + conditions = append(conditions, "name like concat(?, '%')") + params = append(params, neSoftware.Name) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftware) SelectByIds(cmdIds []string) []model.NeSoftware { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeSoftware{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { + // 查询条件拼接 + var conditions []string + var params []any + if neSoftware.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neSoftware.NeType) + } + if neSoftware.Version != "" { + conditions = append(conditions, "version = ?") + params = append(params, neSoftware.Version) + } + if neSoftware.Name != "" { + conditions = append(conditions, "name = ?") + params = append(params, neSoftware.Name) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { + // 参数拼接 + params := make(map[string]any) + if neSoftware.NeType != "" { + params["ne_type"] = neSoftware.NeType + } + if neSoftware.Name != "" { + params["name"] = neSoftware.Name + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + params["description"] = neSoftware.Description + if neSoftware.CreateBy != "" { + params["create_by"] = neSoftware.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { + // 参数拼接 + params := make(map[string]any) + if neSoftware.NeType != "" { + params["ne_type"] = neSoftware.NeType + } + if neSoftware.Name != "" { + params["name"] = neSoftware.Name + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + params["description"] = neSoftware.Description + if neSoftware.UpdateBy != "" { + params["update_by"] = neSoftware.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neSoftware.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftware) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_software where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_software.impl.go b/src/modules/network_element/repository/ne_software.impl.go deleted file mode 100644 index 3b20f84..0000000 --- a/src/modules/network_element/repository/ne_software.impl.go +++ /dev/null @@ -1,317 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_element/model" -) - -// 实例化数据层 NewNeSoftware 结构体 -var NewNeSoftwareImpl = &NeSoftwareImpl{ - selectSql: `select - id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time - from ne_software`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "name": "Name", - "path": "Path", - "version": "Version", - "description": "Description", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeSoftwareImpl 网元软件包信息 数据层处理 -type NeSoftwareImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeSoftwareImpl) convertResultRows(rows []map[string]any) []model.NeSoftware { - arr := make([]model.NeSoftware, 0) - for _, row := range rows { - item := model.NeSoftware{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - softwareType := v.(string) - if strings.Contains(softwareType, ",") { - softwareTypeArr := strings.Split(softwareType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) - conditions = append(conditions, "ne_type in ("+placeholder+")") - parameters := repo.ConvertIdsSlice(softwareTypeArr) - params = append(params, parameters...) - } else { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(softwareType, " ")) - } - } - if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["version"]; ok && v != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_software" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Path != "" { - conditions = append(conditions, "path = ?") - params = append(params, neSoftware.Path) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftwareImpl) SelectByIds(cmdIds []string) []model.NeSoftware { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeSoftware{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftwareImpl) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name = ?") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.CreateBy != "" { - params["create_by"] = neSoftware.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.UpdateBy != "" { - params["update_by"] = neSoftware.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neSoftware.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeSoftwareImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_software where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_version.go b/src/modules/network_element/repository/ne_version.go index 5c0db16..e02466b 100644 --- a/src/modules/network_element/repository/ne_version.go +++ b/src/modules/network_element/repository/ne_version.go @@ -1,24 +1,329 @@ package repository -import "nms_cxy/src/modules/network_element/model" +import ( + "strings" + "time" -// INeVersion 网元版本信息 数据层接口 -type INeVersion interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neVersion model.NeVersion) []model.NeVersion +// 实例化数据层 NeVersion 结构体 +var NewNeVersion = &NeVersion{ + selectSql: `select + id, ne_type, ne_id, name, version, path, pre_name, pre_version, pre_path, new_name, new_version, new_path, status, create_by, create_time, update_by, update_time + from ne_version`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeVersion - - // Insert 新增信息 - Insert(neVersion model.NeVersion) string - - // Update 修改信息 - Update(neVersion model.NeVersion) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "name": "name", + "version": "Version", + "path": "Path", + "pre_name": "preName", + "pre_version": "PreVersion", + "pre_path": "PrePath", + "new_name": "NewName", + "new_version": "NewVersion", + "new_path": "NewPath", + "status": "Status", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeVersion 网元版本信息 数据层处理 +type NeVersion struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeVersion) convertResultRows(rows []map[string]any) []model.NeVersion { + arr := make([]model.NeVersion, 0) + for _, row := range rows { + item := model.NeVersion{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeVersion) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["version"]; ok && v != "" { + conditions = append(conditions, "version like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["path"]; ok && v != "" { + conditions = append(conditions, "path like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_version" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by update_time desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeVersion) SelectList(neVersion model.NeVersion) []model.NeVersion { + // 查询条件拼接 + var conditions []string + var params []any + if neVersion.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neVersion.NeType) + } + if neVersion.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neVersion.NeId) + } + if neVersion.Version != "" { + conditions = append(conditions, "version like concat(?, '%')") + params = append(params, neVersion.Version) + } + if neVersion.Path != "" { + conditions = append(conditions, "path like concat(?, '%')") + params = append(params, neVersion.Path) + } + if neVersion.Status != "" { + conditions = append(conditions, "status = ?") + params = append(params, neVersion.Status) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeVersion) SelectByIds(cmdIds []string) []model.NeVersion { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeVersion{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeVersion) Insert(neVersion model.NeVersion) string { + // 参数拼接 + params := make(map[string]any) + if neVersion.NeType != "" { + params["ne_type"] = neVersion.NeType + } + if neVersion.NeId != "" { + params["ne_id"] = neVersion.NeId + } + if neVersion.Name != "" { + params["name"] = neVersion.Name + } + if neVersion.Version != "" { + params["version"] = neVersion.Version + } + if neVersion.Path != "" { + params["path"] = neVersion.Path + } + if neVersion.PreName != "" { + params["pre_name"] = neVersion.PreName + } + if neVersion.PreVersion != "" { + params["pre_version"] = neVersion.PreVersion + } + if neVersion.PrePath != "" { + params["pre_path"] = neVersion.PrePath + } + if neVersion.NewName != "" { + params["new_name"] = neVersion.NewName + } + if neVersion.NewVersion != "" { + params["new_version"] = neVersion.NewVersion + } + if neVersion.NewPath != "" { + params["new_path"] = neVersion.NewPath + } + if neVersion.Status != "" { + params["status"] = neVersion.Status + } + if neVersion.CreateBy != "" { + params["create_by"] = neVersion.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_version (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeVersion) Update(neVersion model.NeVersion) int64 { + // 参数拼接 + params := make(map[string]any) + if neVersion.NeType != "" { + params["ne_type"] = neVersion.NeType + } + if neVersion.NeId != "" { + params["ne_id"] = neVersion.NeId + } + if neVersion.Name != "" { + params["name"] = neVersion.Name + } + if neVersion.Version != "" { + params["version"] = neVersion.Version + } + if neVersion.Path != "" { + params["path"] = neVersion.Path + } + if neVersion.PreName != "" { + params["pre_name"] = neVersion.PreName + } + if neVersion.PreVersion != "" { + params["pre_version"] = neVersion.PreVersion + } + if neVersion.PrePath != "" { + params["pre_path"] = neVersion.PrePath + } + if neVersion.NewName != "" { + params["new_name"] = neVersion.NewName + } + if neVersion.NewVersion != "" { + params["new_version"] = neVersion.NewVersion + } + if neVersion.NewPath != "" { + params["new_path"] = neVersion.NewPath + } + if neVersion.Status != "" { + params["status"] = neVersion.Status + } + if neVersion.UpdateBy != "" { + params["update_by"] = neVersion.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_version set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neVersion.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeVersion) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_version where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_version.impl.go b/src/modules/network_element/repository/ne_version.impl.go deleted file mode 100644 index ab91056..0000000 --- a/src/modules/network_element/repository/ne_version.impl.go +++ /dev/null @@ -1,329 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/network_element/model" -) - -// 实例化数据层 NewNeVersion 结构体 -var NewNeVersionImpl = &NeVersionImpl{ - selectSql: `select - id, ne_type, ne_id, name, version, path, pre_name, pre_version, pre_path, new_name, new_version, new_path, status, create_by, create_time, update_by, update_time - from ne_version`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "name": "name", - "version": "Version", - "path": "Path", - "pre_name": "preName", - "pre_version": "PreVersion", - "pre_path": "PrePath", - "new_name": "NewName", - "new_version": "NewVersion", - "new_path": "NewPath", - "status": "Status", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeVersionImpl 网元版本信息 数据层处理 -type NeVersionImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeVersionImpl) convertResultRows(rows []map[string]any) []model.NeVersion { - arr := make([]model.NeVersion, 0) - for _, row := range rows { - item := model.NeVersion{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeVersionImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["version"]; ok && v != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["path"]; ok && v != "" { - conditions = append(conditions, "path like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_version" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by update_time desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeVersionImpl) SelectList(neVersion model.NeVersion) []model.NeVersion { - // 查询条件拼接 - var conditions []string - var params []any - if neVersion.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neVersion.NeType) - } - if neVersion.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neVersion.NeId) - } - if neVersion.Version != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, neVersion.Version) - } - if neVersion.Path != "" { - conditions = append(conditions, "path like concat(?, '%')") - params = append(params, neVersion.Path) - } - if neVersion.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, neVersion.Status) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeVersionImpl) SelectByIds(cmdIds []string) []model.NeVersion { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeVersion{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeVersionImpl) Insert(neVersion model.NeVersion) string { - // 参数拼接 - params := make(map[string]any) - if neVersion.NeType != "" { - params["ne_type"] = neVersion.NeType - } - if neVersion.NeId != "" { - params["ne_id"] = neVersion.NeId - } - if neVersion.Name != "" { - params["name"] = neVersion.Name - } - if neVersion.Version != "" { - params["version"] = neVersion.Version - } - if neVersion.Path != "" { - params["path"] = neVersion.Path - } - if neVersion.PreName != "" { - params["pre_name"] = neVersion.PreName - } - if neVersion.PreVersion != "" { - params["pre_version"] = neVersion.PreVersion - } - if neVersion.PrePath != "" { - params["pre_path"] = neVersion.PrePath - } - if neVersion.NewName != "" { - params["new_name"] = neVersion.NewName - } - if neVersion.NewVersion != "" { - params["new_version"] = neVersion.NewVersion - } - if neVersion.NewPath != "" { - params["new_path"] = neVersion.NewPath - } - if neVersion.Status != "" { - params["status"] = neVersion.Status - } - if neVersion.CreateBy != "" { - params["create_by"] = neVersion.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_version (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeVersionImpl) Update(neVersion model.NeVersion) int64 { - // 参数拼接 - params := make(map[string]any) - if neVersion.NeType != "" { - params["ne_type"] = neVersion.NeType - } - if neVersion.NeId != "" { - params["ne_id"] = neVersion.NeId - } - if neVersion.Name != "" { - params["name"] = neVersion.Name - } - if neVersion.Version != "" { - params["version"] = neVersion.Version - } - if neVersion.Path != "" { - params["path"] = neVersion.Path - } - if neVersion.PreName != "" { - params["pre_name"] = neVersion.PreName - } - if neVersion.PreVersion != "" { - params["pre_version"] = neVersion.PreVersion - } - if neVersion.PrePath != "" { - params["pre_path"] = neVersion.PrePath - } - if neVersion.NewName != "" { - params["new_name"] = neVersion.NewName - } - if neVersion.NewVersion != "" { - params["new_version"] = neVersion.NewVersion - } - if neVersion.NewPath != "" { - params["new_path"] = neVersion.NewPath - } - if neVersion.Status != "" { - params["status"] = neVersion.Status - } - if neVersion.UpdateBy != "" { - params["update_by"] = neVersion.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_version set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neVersion.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeVersionImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_version where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/service/ne_config.go b/src/modules/network_element/service/ne_config.go index 2c31659..f607c0a 100644 --- a/src/modules/network_element/service/ne_config.go +++ b/src/modules/network_element/service/ne_config.go @@ -1,36 +1,163 @@ package service -import "nms_cxy/src/modules/network_element/model" +import ( + "encoding/json" + "fmt" + "strings" -// INeConfig 网元参数配置可用属性值 服务层接口 -type INeConfig interface { - // RefreshByNeType 通过ne_type刷新redis中的缓存 - RefreshByNeTypeAndNeID(neType string) []model.NeConfig + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // ClearNeCacheByNeType 清除网元类型参数配置缓存 - ClearNeCacheByNeType(neType string) bool - - // SelectNeConfigByNeType 查询网元类型参数配置 - SelectNeConfigByNeType(neType string) []model.NeConfig - - // SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 - SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig - - // SelectNeHostPage 分页查询列表数据 - SelectPage(query map[string]any) map[string]any - - // SelectList 根据实体查询 - SelectList(param model.NeConfig) []model.NeConfig - - // SelectByIds 通过ID查询 - SelectById(id string) model.NeConfig - - // Insert 新增信息 - Insert(param model.NeConfig) string - - // Update 修改信息 - Update(param model.NeConfig) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) +// 实例化服务层 NeConfig 结构体 +var NewNeConfig = &NeConfig{ + neConfigRepository: repository.NewNeConfig, +} + +// NeConfig 网元参数配置可用属性值 服务层处理 +type NeConfig struct { + neConfigRepository *repository.NeConfig // 网元参数配置可用属性值表 +} + +// RefreshByNeType 通过ne_type刷新redis中的缓存 +func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { + // 多个 + if neType == "" || neType == "*" { + neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) + if len(neConfigList) > 0 { + neConfigGroup := map[string][]model.NeConfig{} + for _, v := range neConfigList { + if item, ok := neConfigGroup[v.NeType]; ok { + neConfigGroup[v.NeType] = append(item, v) + } else { + neConfigGroup[v.NeType] = []model.NeConfig{v} + } + } + for k, v := range neConfigGroup { + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) + redis.Del("", key) + if len(v) > 0 { + for i, item := range v { + if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { + continue + } + v[i] = item + } + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + } + } + } + return neConfigList + } + // 单个 + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + redis.Del("", key) + neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ + NeType: neType, + }) + if len(neConfigList) > 0 { + for i, v := range neConfigList { + if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { + continue + } + neConfigList[i] = v + } + values, _ := json.Marshal(neConfigList) + redis.Set("", key, string(values)) + } + return neConfigList +} + +// ClearNeCacheByNeType 清除网元类型参数配置缓存 +func (r *NeConfig) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) + if neType == "*" { + key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) + } + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// SelectNeConfigByNeType 查询网元类型参数配置 +func (r *NeConfig) SelectNeConfigByNeType(neType string) []model.NeConfig { + var neConfigList []model.NeConfig + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &neConfigList) + if err != nil { + neConfigList = []model.NeConfig{} + } + } else { + neConfigList = r.RefreshByNeTypeAndNeID(neType) + } + return neConfigList +} + +// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 +func (r *NeConfig) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { + neConfigList := r.SelectNeConfigByNeType(neType) + var neConfig model.NeConfig + for _, v := range neConfigList { + if v.ParamName == paramName { + neConfig = v + break + } + } + return neConfig +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeConfig) SelectPage(query map[string]any) map[string]any { + return r.neConfigRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { + return r.neConfigRepository.SelectList(param) +} + +// SelectByIds 通过ID查询 +func (r *NeConfig) SelectById(id string) model.NeConfig { + if id == "" { + return model.NeConfig{} + } + neHosts := r.neConfigRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeConfig{} +} + +// Insert 新增信息 +func (r *NeConfig) Insert(param model.NeConfig) string { + return r.neConfigRepository.Insert(param) +} + +// Update 修改信息 +func (r *NeConfig) Update(param model.NeConfig) int64 { + return r.neConfigRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (r *NeConfig) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.neConfigRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("param.noData") + } + + if len(data) == len(ids) { + rows := r.neConfigRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_element/service/ne_config.impl.go b/src/modules/network_element/service/ne_config.impl.go deleted file mode 100644 index 453a2dd..0000000 --- a/src/modules/network_element/service/ne_config.impl.go +++ /dev/null @@ -1,164 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strings" - - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/redis" - "nms_cxy/src/modules/network_element/model" - "nms_cxy/src/modules/network_element/repository" -) - -// NewNeConfigImpl 网元参数配置可用属性值 实例化服务层 -var NewNeConfigImpl = &NeConfigImpl{ - neConfigRepository: repository.NewNeConfigImpl, -} - -// NeConfigImpl 网元参数配置可用属性值 服务层处理 -type NeConfigImpl struct { - // 网元参数配置可用属性值表 - neConfigRepository repository.INeConfig -} - -// RefreshByNeType 通过ne_type刷新redis中的缓存 -func (r *NeConfigImpl) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { - // 多个 - if neType == "" || neType == "*" { - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) - if len(neConfigList) > 0 { - neConfigGroup := map[string][]model.NeConfig{} - for _, v := range neConfigList { - if item, ok := neConfigGroup[v.NeType]; ok { - neConfigGroup[v.NeType] = append(item, v) - } else { - neConfigGroup[v.NeType] = []model.NeConfig{v} - } - } - for k, v := range neConfigGroup { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) - redis.Del("", key) - if len(v) > 0 { - for i, item := range v { - if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { - continue - } - v[i] = item - } - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - } - } - } - return neConfigList - } - // 单个 - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) - redis.Del("", key) - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ - NeType: neType, - }) - if len(neConfigList) > 0 { - for i, v := range neConfigList { - if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { - continue - } - neConfigList[i] = v - } - values, _ := json.Marshal(neConfigList) - redis.Set("", key, string(values)) - } - return neConfigList -} - -// ClearNeCacheByNeType 清除网元类型参数配置缓存 -func (r *NeConfigImpl) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) - if neType == "*" { - key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) - } - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectNeConfigByNeType 查询网元类型参数配置 -func (r *NeConfigImpl) SelectNeConfigByNeType(neType string) []model.NeConfig { - var neConfigList []model.NeConfig - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neConfigList) - if err != nil { - neConfigList = []model.NeConfig{} - } - } else { - neConfigList = r.RefreshByNeTypeAndNeID(neType) - } - return neConfigList -} - -// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 -func (r *NeConfigImpl) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { - neConfigList := r.SelectNeConfigByNeType(neType) - var neConfig model.NeConfig - for _, v := range neConfigList { - if v.ParamName == paramName { - neConfig = v - break - } - } - return neConfig -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigImpl) SelectPage(query map[string]any) map[string]any { - return r.neConfigRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeConfigImpl) SelectList(param model.NeConfig) []model.NeConfig { - return r.neConfigRepository.SelectList(param) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigImpl) SelectById(id string) model.NeConfig { - if id == "" { - return model.NeConfig{} - } - neHosts := r.neConfigRepository.SelectByIds([]string{id}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeConfig{} -} - -// Insert 新增信息 -func (r *NeConfigImpl) Insert(param model.NeConfig) string { - return r.neConfigRepository.Insert(param) -} - -// Update 修改信息 -func (r *NeConfigImpl) Update(param model.NeConfig) int64 { - return r.neConfigRepository.Update(param) -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.neConfigRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("param.noData") - } - - if len(data) == len(ids) { - rows := r.neConfigRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_element/service/ne_config_backup.go b/src/modules/network_element/service/ne_config_backup.go index 64d8eb3..9c2d6ba 100644 --- a/src/modules/network_element/service/ne_config_backup.go +++ b/src/modules/network_element/service/ne_config_backup.go @@ -1,30 +1,201 @@ package service -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" + "os" + "runtime" + "strings" + "time" -// INeConfigBackup 网元配置文件备份记录 服务层接口 -type INeConfigBackup interface { - // SelectNeHostPage 分页查询列表数据 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(item model.NeConfigBackup) []model.NeConfigBackup - - // SelectByIds 通过ID查询 - SelectById(id string) model.NeConfigBackup - - // Insert 新增信息 - Insert(item model.NeConfigBackup) string - - // Update 修改信息 - Update(item model.NeConfigBackup) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // NeConfigLocalToNe 网元配置文件复制到网元端覆盖 - NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error - - // NeConfigNeToLocal 网元备份文件网元端复制到本地 - NeConfigNeToLocal(neInfo model.NeInfo) (string, error) +// 实例化服务层 NeConfigBackup 结构体 +var NewNeConfigBackup = &NeConfigBackup{ + neConfigBackupRepository: repository.NewNeConfigBackup, +} + +// NeConfigBackup 网元配置文件备份记录 服务层处理 +type NeConfigBackup struct { + neConfigBackupRepository *repository.NeConfigBackup // 网元配置文件备份记录 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { + return r.neConfigBackupRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { + return r.neConfigBackupRepository.SelectList(item) +} + +// SelectByIds 通过ID查询 +func (r *NeConfigBackup) SelectById(id string) model.NeConfigBackup { + if id == "" { + return model.NeConfigBackup{} + } + arr := r.neConfigBackupRepository.SelectByIds([]string{id}) + if len(arr) > 0 { + return arr[0] + } + return model.NeConfigBackup{} +} + +// Insert 新增信息 +func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { + return r.neConfigBackupRepository.Insert(item) +} + +// Update 修改信息 +func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { + return r.neConfigBackupRepository.Update(item) +} + +// DeleteByIds 批量删除信息 +func (r *NeConfigBackup) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.neConfigBackupRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("neConfigBackup.noData") + } + + if len(data) == len(ids) { + rows := r.neConfigBackupRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 +func (r *NeConfigBackup) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) + if err := file.UnZip(localFile, localDirPath); err != nil { + return fmt.Errorf("unzip err") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + // 网元配置端上的临时目录 + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) + sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) + // 复制到网元端 + if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { + return fmt.Errorf("copy config to ne err") + } + + // 配置复制到网元内 + if neTypeLower == "ims" { + // ims目录 + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + for _, v := range imsDirArr { + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) + } + // mf目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) + // rtproxy目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) + // iwf目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) + } else if neTypeLower == "omc" { + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) + } else { + neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) + chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) + if neTypeLower == "mme" { + chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) + } + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) + } + + _ = os.RemoveAll(localDirPath) // 删除本地临时目录 + sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 + return nil +} + +// NeConfigNeToLocal 网元备份文件网元端复制到本地 +func (r *NeConfigBackup) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) + + // 网元配置文件先复制到临时目录 + sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) + if neTypeLower == "ims" { + // ims目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + for _, v := range imsDirArr { + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) + } + // mf目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) + // rtproxy目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) + // iwf目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) + } else if neTypeLower == "omc" { + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) + } else { + nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) + if neTypeLower == "mme" { + nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) + } + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) + } + + // 网元端复制到本地 + if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { + return "", fmt.Errorf("copy config err") + } + + // 压缩zip文件名 + zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) + zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) + if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { + return "", fmt.Errorf("compress zip err") + } + + _ = os.RemoveAll(localDirPath) // 删除本地临时目录 + sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 + return zipFilePath, nil } diff --git a/src/modules/network_element/service/ne_config_backup.impl.go b/src/modules/network_element/service/ne_config_backup.impl.go deleted file mode 100644 index edcccc1..0000000 --- a/src/modules/network_element/service/ne_config_backup.impl.go +++ /dev/null @@ -1,202 +0,0 @@ -package service - -import ( - "fmt" - "os" - "runtime" - "strings" - "time" - - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/modules/network_element/model" - "nms_cxy/src/modules/network_element/repository" -) - -// NewNeConfigBackupImpl 网元配置文件备份记录 实例化服务层 -var NewNeConfigBackupImpl = &NeConfigBackupImpl{ - neConfigBackupRepository: repository.NewNeConfigBackupImpl, -} - -// NeConfigBackupImpl 网元配置文件备份记录 服务层处理 -type NeConfigBackupImpl struct { - // 网元配置文件备份记录 - neConfigBackupRepository repository.INeConfigBackup -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { - return r.neConfigBackupRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - return r.neConfigBackupRepository.SelectList(item) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackupImpl) SelectById(id string) model.NeConfigBackup { - if id == "" { - return model.NeConfigBackup{} - } - arr := r.neConfigBackupRepository.SelectByIds([]string{id}) - if len(arr) > 0 { - return arr[0] - } - return model.NeConfigBackup{} -} - -// Insert 新增信息 -func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { - return r.neConfigBackupRepository.Insert(item) -} - -// Update 修改信息 -func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { - return r.neConfigBackupRepository.Update(item) -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigBackupImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.neConfigBackupRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("neConfigBackup.noData") - } - - if len(data) == len(ids) { - rows := r.neConfigBackupRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 -func (r *NeConfigBackupImpl) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) - if err := file.UnZip(localFile, localDirPath); err != nil { - return fmt.Errorf("unzip err") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - // 网元配置端上的临时目录 - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) - sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) - // 复制到网元端 - if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { - return fmt.Errorf("copy config to ne err") - } - - // 配置复制到网元内 - if neTypeLower == "ims" { - // ims目录 - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} - for _, v := range imsDirArr { - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) - } - // mf目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) - // rtproxy目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) - // iwf目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) - } else if neTypeLower == "omc" { - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) - } else { - neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) - chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) - if neTypeLower == "mme" { - chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) - } - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) - } - - _ = os.RemoveAll(localDirPath) // 删除本地临时目录 - sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 - return nil -} - -// NeConfigNeToLocal 网元备份文件网元端复制到本地 -func (r *NeConfigBackupImpl) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) - - // 网元配置文件先复制到临时目录 - sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) - if neTypeLower == "ims" { - // ims目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} - for _, v := range imsDirArr { - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) - } - // mf目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) - // rtproxy目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) - // iwf目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) - } else if neTypeLower == "omc" { - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) - } else { - nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) - if neTypeLower == "mme" { - nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) - } - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) - } - - // 网元端复制到本地 - if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { - return "", fmt.Errorf("copy config err") - } - - // 压缩zip文件名 - zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) - zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) - if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { - return "", fmt.Errorf("compress zip err") - } - - _ = os.RemoveAll(localDirPath) // 删除本地临时目录 - sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 - return zipFilePath, nil -} diff --git a/src/modules/network_element/service/ne_host.go b/src/modules/network_element/service/ne_host.go index 6ce4b6c..fbedaa1 100644 --- a/src/modules/network_element/service/ne_host.go +++ b/src/modules/network_element/service/ne_host.go @@ -1,30 +1,178 @@ package service -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" -// INeHost 网元主机连接 服务层接口 -type INeHost interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/crypto" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neHost model.NeHost) []model.NeHost - - // SelectByIds 通过ID查询 - SelectById(hostId string) model.NeHost - - // CheckUniqueHostTitle 校验分组组和主机名称是否唯一 - CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool - - // Insert 新增信息 - Insert(neHost model.NeHost) string - - // Update 修改信息 - Update(neHost model.NeHost) int64 - - // Insert 批量添加 - Inserts(neHosts []model.NeHost) int64 - - // DeleteByIds 批量删除网元主机连接信息 - DeleteByIds(hostIds []string) (int64, error) +// 实例化服务层 NeHost 结构体 +var NewNeHost = &NeHost{ + neHostRepository: repository.NewNeHost, +} + +// NeHost 网元主机连接 服务层处理 +type NeHost struct { + neHostRepository *repository.NeHost // 网元主机连接表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHost) SelectPage(query map[string]any) map[string]any { + return r.neHostRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { + return r.neHostRepository.SelectList(neHost) +} + +// SelectByIds 通过ID查询 +func (r *NeHost) SelectById(hostId string) model.NeHost { + neHost := model.NeHost{} + if hostId == "" { + return neHost + } + neHosts := r.neHostRepository.SelectByIds([]string{hostId}) + if len(neHosts) > 0 { + neHost := neHosts[0] + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordDe, err := crypto.AESDecryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.Password = passwordDe + } + if neHost.PrivateKey != "" { + privateKeyDe, err := crypto.AESDecryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.PrivateKey = privateKeyDe + } + if neHost.PassPhrase != "" { + passPhraseDe, err := crypto.AESDecryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.PassPhrase = passPhraseDe + } + return neHost + } + return model.NeHost{} +} + +// Insert 批量添加 +func (r *NeHost) Inserts(neHosts []model.NeHost) int64 { + var num int64 = 0 + for _, v := range neHosts { + hostId := r.neHostRepository.Insert(v) + if hostId != "" { + num += 1 + } + } + return num +} + +// Insert 新增信息 +func (r *NeHost) Insert(neHost model.NeHost) string { + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.Password = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.PrivateKey = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.PassPhrase = passPhraseEn + } + return r.neHostRepository.Insert(neHost) +} + +// Update 修改信息 +func (r *NeHost) Update(neHost model.NeHost) int64 { + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("update password encrypt: %v", err.Error()) + return 0 + } + neHost.Password = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("update private key encrypt: %v", err.Error()) + return 0 + } + neHost.PrivateKey = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("update pass phrase encrypt: %v", err.Error()) + return 0 + } + neHost.PassPhrase = passPhraseEn + } + return r.neHostRepository.Update(neHost) +} + +// DeleteByIds 批量删除网元主机连接信息 +func (r *NeHost) DeleteByIds(hostIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostRepository.SelectByIds(hostIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHost.noData") + } + + for _, v := range ids { + if v.GroupID == "1" { + // 主机信息操作【%s】失败,禁止操作网元 + return 0, fmt.Errorf("neHost.banNE") + } + } + + if len(ids) == len(hostIds) { + rows := r.neHostRepository.DeleteByIds(hostIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueHostTitle 校验分组组和主机名称是否唯一 +func (r *NeHost) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { + uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ + HostType: hostType, + GroupID: groupId, + Title: title, + }) + if uniqueId == hostId { + return true + } + return uniqueId == "" } diff --git a/src/modules/network_element/service/ne_host.impl.go b/src/modules/network_element/service/ne_host.impl.go deleted file mode 100644 index 84d47e0..0000000 --- a/src/modules/network_element/service/ne_host.impl.go +++ /dev/null @@ -1,172 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/crypto" - "nms_cxy/src/modules/network_element/model" - "nms_cxy/src/modules/network_element/repository" -) - -// 实例化服务层 NeHostImpl 结构体 -var NewNeHostImpl = &NeHostImpl{ - neHostRepository: repository.NewNeHostImpl, -} - -// NeHostImpl 网元主机连接 服务层处理 -type NeHostImpl struct { - // 网元主机连接表 - neHostRepository repository.INeHost -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { - return r.neHostRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { - return r.neHostRepository.SelectList(neHost) -} - -// SelectByIds 通过ID查询 -func (r *NeHostImpl) SelectById(hostId string) model.NeHost { - neHost := model.NeHost{} - if hostId == "" { - return neHost - } - neHosts := r.neHostRepository.SelectByIds([]string{hostId}) - if len(neHosts) > 0 { - neHost := neHosts[0] - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordDe, err := crypto.AESDecryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.Password = passwordDe - } - if neHost.PrivateKey != "" { - privateKeyDe, err := crypto.AESDecryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.PrivateKey = privateKeyDe - } - if neHost.PassPhrase != "" { - passPhraseDe, err := crypto.AESDecryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.PassPhrase = passPhraseDe - } - return neHost - } - return model.NeHost{} -} - -// Insert 批量添加 -func (r *NeHostImpl) Inserts(neHosts []model.NeHost) int64 { - var num int64 = 0 - for _, v := range neHosts { - hostId := r.neHostRepository.Insert(v) - if hostId != "" { - num += 1 - } - } - return num -} - -// Insert 新增信息 -func (r *NeHostImpl) Insert(neHost model.NeHost) string { - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.Password = passwordEn - } - if neHost.PrivateKey != "" { - privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.PrivateKey = privateKeyEn - } - if neHost.PassPhrase != "" { - passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.PassPhrase = passPhraseEn - } - return r.neHostRepository.Insert(neHost) -} - -// Update 修改信息 -func (r *NeHostImpl) Update(neHost model.NeHost) int64 { - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("update password encrypt: %v", err.Error()) - return 0 - } - neHost.Password = passwordEn - } - if neHost.PrivateKey != "" { - privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("update private key encrypt: %v", err.Error()) - return 0 - } - neHost.PrivateKey = privateKeyEn - } - if neHost.PassPhrase != "" { - passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("update pass phrase encrypt: %v", err.Error()) - return 0 - } - neHost.PassPhrase = passPhraseEn - } - return r.neHostRepository.Update(neHost) -} - -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHostImpl) DeleteByIds(hostIds []string) (int64, error) { - // 检查是否存在 - ids := r.neHostRepository.SelectByIds(hostIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("neHost.noData") - } - - if len(ids) == len(hostIds) { - rows := r.neHostRepository.DeleteByIds(hostIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueHostTitle 校验分组组和主机名称是否唯一 -func (r *NeHostImpl) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { - uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ - HostType: hostType, - GroupID: groupId, - Title: title, - }) - if uniqueId == hostId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/network_element/service/ne_host_cmd.go b/src/modules/network_element/service/ne_host_cmd.go index fecf1ab..1936848 100644 --- a/src/modules/network_element/service/ne_host_cmd.go +++ b/src/modules/network_element/service/ne_host_cmd.go @@ -1,27 +1,79 @@ package service -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" -// INeHostCmd 网元主机命令 服务层接口 -type INeHostCmd interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd - - // SelectByIds 通过ID查询 - SelectById(cmdId string) model.NeHostCmd - - // Insert 新增信息 - Insert(neHostCmd model.NeHostCmd) string - - // Update 修改信息 - Update(neHostCmd model.NeHostCmd) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(cmdIds []string) (int64, error) - - // CheckUniqueGroupTitle 校验同类型组内是否唯一 - CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool +// 实例化服务层 NeHostCmd 结构体 +var NewNeHostCmd = &NeHostCmd{ + neHostCmdRepository: repository.NewNeHostCmd, +} + +// NeHostCmd 网元主机命令 服务层处理 +type NeHostCmd struct { + neHostCmdRepository *repository.NeHostCmd // 网元主机命令表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { + return r.neHostCmdRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + return r.neHostCmdRepository.SelectList(neHostCmd) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmd) SelectById(cmdId string) model.NeHostCmd { + if cmdId == "" { + return model.NeHostCmd{} + } + neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeHostCmd{} +} + +// Insert 新增信息 +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { + return r.neHostCmdRepository.Insert(neHostCmd) +} + +// Update 修改信息 +func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { + return r.neHostCmdRepository.Update(neHostCmd) +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmd) DeleteByIds(cmdIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostCmdRepository.SelectByIds(cmdIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(ids) == len(cmdIds) { + rows := r.neHostCmdRepository.DeleteByIds(cmdIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmd) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { + uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ + CmdType: cmdType, + GroupID: groupId, + Title: title, + }) + if uniqueId == cmdId { + return true + } + return uniqueId == "" } diff --git a/src/modules/network_element/service/ne_host_cmd.impl.go b/src/modules/network_element/service/ne_host_cmd.impl.go deleted file mode 100644 index 884d096..0000000 --- a/src/modules/network_element/service/ne_host_cmd.impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/modules/network_element/model" - "nms_cxy/src/modules/network_element/repository" -) - -// 实例化服务层 NeHostCmdImpl 结构体 -var NewNeHostCmdImpl = &NeHostCmdImpl{ - neHostCmdRepository: repository.NewNeHostCmdImpl, -} - -// NeHostCmdImpl 网元主机命令 服务层处理 -type NeHostCmdImpl struct { - // 网元主机命令表 - neHostCmdRepository repository.INeHostCmd -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { - return r.neHostCmdRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - return r.neHostCmdRepository.SelectList(neHostCmd) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmdImpl) SelectById(cmdId string) model.NeHostCmd { - if cmdId == "" { - return model.NeHostCmd{} - } - neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeHostCmd{} -} - -// Insert 新增信息 -func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { - return r.neHostCmdRepository.Insert(neHostCmd) -} - -// Update 修改信息 -func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { - return r.neHostCmdRepository.Update(neHostCmd) -} - -// DeleteByIds 批量删除信息 -func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) (int64, error) { - // 检查是否存在 - ids := r.neHostCmdRepository.SelectByIds(cmdIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("neHostCmd.noData") - } - - if len(ids) == len(cmdIds) { - rows := r.neHostCmdRepository.DeleteByIds(cmdIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmdImpl) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { - uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ - CmdType: cmdType, - GroupID: groupId, - Title: title, - }) - if uniqueId == cmdId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index fa152b0..9acd717 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -1,72 +1,957 @@ package service import ( - "nms_cxy/src/framework/utils/ssh" - "nms_cxy/src/framework/utils/telnet" - "nms_cxy/src/modules/network_element/model" + "encoding/json" + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/ssh" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" ) -// 网元信息 服务层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - - // RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 - RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo - - // ClearNeCacheByNeType 清除网元类型缓存 - ClearNeCacheByNeType(neType string) bool - - // SelectNeInfoByRmuid 通过rmUID查询网元信息 - SelectNeInfoByRmuid(rmUid string) model.NeInfo - - // SelectPage 根据条件分页查询 - // - // bandStatus 带状态信息 - SelectPage(query map[string]any, bandStatus bool) map[string]any - - // SelectList 查询列表 - // - // bandStatus 带状态信息 - // bandHost 带主机信息 - SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo - - // SelectByIds 通过ID查询 - // - // bandStatus 带主机信息 - SelectById(infoId string, bandHost bool) model.NeInfo - - // Insert 新增信息 - Insert(neInfo model.NeInfo) string - - // Update 修改信息 - Update(neInfo model.NeInfo) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(infoIds []string) (int64, error) - - // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 - CheckUniqueNeTypeAndNeId(neType, neId, id string) bool - - // NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() - NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) - - // NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 - NeRunSSHCmd(neType, neId, cmd string) (string, error) - - // NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() - // num 是网元主机telnet 1:4100 2:5200 - NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) - - // neConfOAMRead 网元OAM配置文件读取 - NeConfOAMRead(neType, neId string) (map[string]any, error) - - // NeConfOAMSync 网元OAM配置文件生成并同步 - NeConfOAMSync(neInfo model.NeInfo, content map[string]any, sync bool) error - - // NeConfPara5GRead 网元公共配置文件读取 - NeConfPara5GRead() (map[string]any, error) - - // NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId - NeConfPara5GWirte(content map[string]any, syncNE []string) error +// 实例化服务层 NeInfo 结构体 +var NewNeInfo = &NeInfo{ + neInfoRepository: repository.NewNeInfo, + Para5GData: map[string]string{}, +} + +// 网元信息 服务层处理 +type NeInfo struct { + neInfoRepository *repository.NeInfo // 网元信息数据信息 + Para5GData map[string]string +} + +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + var neInfo model.NeInfo + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &neInfo) + if err != nil { + neInfo = model.NeInfo{} + } + } else { + neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) + if neInfo.ID != "" && neInfo.NeId == neID { + redis.Del("", key) + values, _ := json.Marshal(neInfo) + redis.Set("", key, string(values)) + } + } + return neInfo +} + +// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 +func (r *NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { + var neInfo model.NeInfo + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + redis.Del("", key) + neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) + if neInfo.ID != "" && neInfo.NeId == neID { + values, _ := json.Marshal(neInfo) + redis.Set("", key, string(values)) + } + return neInfo +} + +// ClearNeCacheByNeType 清除网元类型缓存 +func (r *NeInfo) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%s*", cachekey.NE_KEY) + if neType != "*" { + key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) + } + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// SelectNeInfoByRmuid 通过rmUID查询网元信息 +func (r *NeInfo) SelectNeInfoByRmuid(rmUid string) model.NeInfo { + var neInfo model.NeInfo + cacheKeys, _ := redis.GetKeys("", cachekey.NE_KEY+"*") + if len(cacheKeys) > 0 { + for _, key := range cacheKeys { + var v model.NeInfo + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + json.Unmarshal([]byte(jsonStr), &v) + } + if v.RmUID == rmUid { + neInfo = v + break + } + } + } else { + neInfos := r.SelectList(neInfo, false, false) + for _, v := range neInfos { + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) + redis.Del("", key) + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + if v.RmUID == rmUid { + neInfo = v + } + } + } + return neInfo +} + +// SelectPage 根据条件分页查询 +// +// bandStatus 带状态信息 +func (r *NeInfo) SelectPage(query map[string]any, bandStatus bool) map[string]any { + data := r.neInfoRepository.SelectPage(query) + + // 网元直连读取网元服务状态 + if bandStatus { + rows := data["rows"].([]model.NeInfo) + r.bandNeStatus(&rows) + } + + return data +} + +// SelectList 查询列表 +// +// bandStatus 带状态信息 +// bandHost 带主机信息 +func (r *NeInfo) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { + list := r.neInfoRepository.SelectList(ne) + + // 网元直连读取网元服务状态 + if bandStatus { + r.bandNeStatus(&list) + } + + // 网元主机信息 + if bandHost { + r.bandNeHosts(&list) + } + + return list +} + +// bandNeStatus 网元列表项数据带网元服务状态 +func (r *NeInfo) bandNeStatus(arr *[]model.NeInfo) { + for i := range *arr { + v := (*arr)[i] + result, err := neFetchlink.NeState(v) + if err != nil { + (*arr)[i].ServerState = map[string]any{ + "online": false, + } + // 网元状态设置为离线 + if v.Status != "0" { + v.Status = "0" + (*arr)[i].Status = v.Status + r.neInfoRepository.Update(v) + } + continue + } + result["online"] = true + (*arr)[i].ServerState = result + // 网元状态设置为在线 + if v.Status != "1" { + // 下发网管配置信息给网元 + _, err = neFetchlink.NeConfigOMC(v) + if err == nil { + v.Status = "1" + } else { + v.Status = "2" + } + (*arr)[i].Status = v.Status + r.neInfoRepository.Update(v) + } + } +} + +// bandNeHosts 网元列表项数据带网元主机信息 +func (r *NeInfo) bandNeHosts(arr *[]model.NeInfo) { + for i := range *arr { + v := (*arr)[i] + if v.HostIDs != "" { + hostIds := strings.Split(v.HostIDs, ",") + if len(hostIds) <= 1 { + continue + } + for _, hostId := range hostIds { + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + continue + } + (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) + } + } + } +} + +// SelectByIds 通过ID查询 +// +// bandHost 带主机信息 +func (r *NeInfo) SelectById(infoId string, bandHost bool) model.NeInfo { + if infoId == "" { + return model.NeInfo{} + } + neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) + if len(neInfos) > 0 { + // 带主机信息 + if neInfos[0].HostIDs != "" && bandHost { + r.bandNeHosts(&neInfos) + } + return neInfos[0] + } + return model.NeInfo{} +} + +// Insert 新增信息 +func (r *NeInfo) Insert(neInfo model.NeInfo) string { + // 主机信息新增 + if neInfo.Hosts != nil { + var hostIDs []string + for _, host := range neInfo.Hosts { + host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) + host.GroupID = "1" + host.CreateBy = neInfo.CreateBy + hostId := NewNeHost.Insert(host) + if hostId != "" { + hostIDs = append(hostIDs, hostId) + } + } + neInfo.HostIDs = strings.Join(hostIDs, ",") + } + + insertId := r.neInfoRepository.Insert(neInfo) + if insertId != "" { + // 刷新缓存 + r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + } + return insertId +} + +// Update 修改信息 +func (r *NeInfo) Update(neInfo model.NeInfo) int64 { + // 主机信息更新 + if neInfo.Hosts != nil { + for _, host := range neInfo.Hosts { + if host.HostID != "" { + host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) + host.GroupID = "1" + host.UpdateBy = neInfo.UpdateBy + NewNeHost.Update(host) + } + } + } + + num := r.neInfoRepository.Update(neInfo) + if num > 0 { + // 刷新缓存 + r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + } + return num +} + +// DeleteByIds 批量删除信息 +func (r *NeInfo) DeleteByIds(infoIds []string) (int64, error) { + // 检查是否存在 + infos := r.neInfoRepository.SelectByIds(infoIds) + if len(infos) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(infos) == len(infoIds) { + for _, v := range infos { + // 主机信息删除 + if v.HostIDs != "" { + NewNeHost.DeleteByIds(strings.Split(v.HostIDs, ",")) + } + // 删除License + neLicense := NewNeLicense.SelectByNeTypeAndNeID(v.NeType, v.NeId) + if neLicense.NeId == v.NeId { + NewNeLicense.DeleteByIds([]string{neLicense.ID}) + } + // 删除Version + neVersion := NewNeVersion.SelectByNeTypeAndNeID(v.NeType, v.NeId) + if neVersion.NeId == v.NeId { + NewNeVersion.DeleteByIds([]string{neVersion.ID}) + } + // 缓存信息删除 + redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) + } + rows := r.neInfoRepository.DeleteByIds(infoIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfo) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { + uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ + NeType: neType, + NeId: neId, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() +func (r *NeInfo) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunSSHClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[0] // 网元主机ssh 0:22 + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + if neHost.HostType != "ssh" { + logger.Errorf("NeRunSSHClient Hosts first HostType %s not ssh", neHost.HostType) + return nil, fmt.Errorf("neinfo host type not ssh") + } + + var connSSH ssh.ConnSSH + neHost.CopyTo(&connSSH) + var client *ssh.ConnSSH + var err error + if neHost.AuthMode == "2" { + client, err = connSSH.NewClientByLocalPrivate() + } else { + client, err = connSSH.NewClient() + } + if err != nil { + logger.Errorf("NeRunSSHClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo ssh client new err") + } + return client, nil +} + +// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 +func (r *NeInfo) NeRunSSHCmd(neType, neId, cmd string) (string, error) { + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return "", err + } + defer sshClient.Close() + + // 执行命令 + output, err := sshClient.RunCMD(cmd) + if err != nil { + logger.Errorf("NeRunSSHCmd RunCMD %s err => %s", output, err.Error()) + return "", fmt.Errorf("neinfo ssh run cmd err") + } + return output, nil +} + +// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() +// num 是网元主机telnet 1:4100 2:5200(UPF标准版) +func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + + // 创建链接Telnet客户端 + var connTelnet telnet.ConnTelnet + neHost.CopyTo(&connTelnet) + telnetClient, err := connTelnet.NewClient() + if err != nil { + logger.Errorf("NeRunTelnetClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo telnet client new err") + } + return telnetClient, nil +} + +// NeRunRedisClient 网元主机的Redis客户端-为创建相关连接,注意结束后 Close() +// 暂时只有UDM有Redis配置项 +func (r *NeInfo) NeRunRedisClient(neType, neId string) (*redis.ConnRedis, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunRedisClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunRedisClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 2 { + logger.Errorf("NeRunRedisClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[2] + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunRedisClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + + // 创建链接Redis客户端 + var connRedis redis.ConnRedis + neHost.CopyTo(&connRedis) + redisClient, err := connRedis.NewClient() + if err != nil { + logger.Errorf("NeRunRedisClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo redis client new err") + } + return redisClient, nil +} + +// NeConfOAMReadSync 网元OAM配置文件读取 +func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { + oamData, err := r.neConfOAMRead(neType, neId, true) + if err != nil { + return nil, err + } + + // UPF和SMF 全小写的key + if _, ok := oamData["httpmanagecfg"]; ok { + content := map[string]any{} + // 网元HTTP服务 + // if v, ok := oamData["httpmanagecfg"]; ok { + // item := v.(map[string]any) + // } + // 对网管HTTP配置 + if v, ok := oamData["oamconfig"]; ok { + item := v.(map[string]any) + if v, ok := item["iptype"]; ok && v != "" && v != nil { + ipType := v.(string) + if ipType == "ipv6" { + content["omcIP"] = item["ipv6"] + } + if ipType == "ipv4" { + content["omcIP"] = item["ipv4"] + } + } + content["oamEnable"] = item["enable"] + content["oamPort"] = item["port"] + } + // 对网管SNMP配置 + if v, ok := oamData["snmpconfig"]; ok { + item := v.(map[string]any) + content["snmpEnable"] = item["enable"] + content["snmpPort"] = item["port"] + } + // 对网管KPI上报配置 + if v, ok := oamData["kpiconfig"]; ok { + item := v.(map[string]any) + content["kpiEnable"] = item["enable"] + content["kpiTimer"] = item["timer"] + } + + oamData := r.neConfOAMData() + r.neConfOAMWirte(neType, neId, oamData, false) + r.NeConfOAMWirteSync(model.NeInfo{ + NeType: neType, + NeId: neId, + }, content, false) + return r.neConfOAMRead(neType, neId, false) + } + + // NSSF和MME 配置KPIconfig名不一致时 + if v, ok := oamData["KPIconfig"]; ok && v != nil { + item := v.(map[string]any) + oamData["kpiConfig"] = item + delete(oamData, "KPIconfig") + r.neConfOAMWirte(neType, neId, oamData, false) + } + + return oamData, nil +} + +// neConfOAMData 网元OAM配置文件默认格式数据 +func (r *NeInfo) neConfOAMData() map[string]any { + return map[string]any{ + "httpManageCfg": map[string]any{ + "ipType": "ipv4", + "ipv4": "172.16.5.1", // 必改 + "ipv6": "", + "port": 33030, + "scheme": "http", + }, + "oamConfig": map[string]any{ + "enable": true, + "ipType": "ipv4", + "ipv4": "172.16.5.100", // 必改 + "ipv6": "", + "port": 33030, + "scheme": "http", + // 必改 + "neConfig": map[string]any{ + "neId": "001", + "rmUid": "4400HX1XXX001", + "neName": "XXX_001", + "dn": "-", + "vendorName": "GD", + "province": "-", + "pvFlag": "PNF", + }, + }, + "snmpConfig": map[string]any{ + "enable": false, + "ipType": "ipv4", + "ipv4": "172.16.5.1", // 必改 + "ipv6": "", + "port": 4957, + }, + "kpiConfig": map[string]any{ + "enable": true, + "timer": 60, // 必改 + }, + // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", // 网元只会读一次后续会置空,建议不放 + } +} + +// neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 +func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { + neTypeLower := strings.ToLower(neType) + fileName := "oam_manager.yaml" + // 网管本地路径 + localFilePath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/%s/%s", neTypeLower, neId, fileName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + + // 从网元端同步到本地 + if sync { + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return nil, fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return nil, fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + // 网元端文件路径 + neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo touch %s && sudo chmod o+rw %s", neFilePath, neFilePath)) + // 网元端复制到本地 + if err = sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil { + return nil, fmt.Errorf("copy oam config err") + } + } + + // 读取文件内容 + bytes, err := os.ReadFile(localFilePath) + if err != nil { + // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) + // return nil, fmt.Errorf("read file error") + // 无保留文件时返回默认文件数据 + oamData := r.neConfOAMData() + r.neConfOAMWirte(neType, neId, oamData, false) + return oamData, nil + } + content := string(bytes) + + // 序列化Map + mapData, err := parse.ConvertConfigToMap("yaml", content) + if err != nil { + logger.Warnf("NeConfOAMRead ConvertConfigToMap => %s", err.Error()) + return nil, fmt.Errorf("content convert type error") + } + return mapData, nil +} + +// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 +func (r *NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) error { + neTypeLower := strings.ToLower(neType) + fileName := "oam_manager.yaml" + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, fileName) + + // 写入文件 + if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { + return fmt.Errorf("please check if the file exists or write permissions") + } + + // 同步到网元端 + if sync { + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端配置路径 + neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) + neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) + // 复制到网元进行覆盖 + if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + } + + return nil +} + +// NeConfOAMWirteSync 网元OAM配置文件生成并同步 +func (r *NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { + oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) + if oamData == nil || err != nil { + return fmt.Errorf("error read OAM file info") + } + // 网元HTTP服务 + if v, ok := oamData["httpManageCfg"]; ok { + item := v.(map[string]any) + item["port"] = neInfo.Port + if strings.Contains(neInfo.IP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = neInfo.IP + } + if strings.Contains(neInfo.IP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = neInfo.IP + } + + oamData["httpManageCfg"] = item + } + // 对网管HTTP配置 + if v, ok := oamData["oamConfig"]; ok { + item := v.(map[string]any) + item["neConfig"] = map[string]string{ + "neId": neInfo.NeId, + "rmUid": neInfo.RmUID, + "neName": neInfo.NeName, + "dn": neInfo.Dn, + "vendorName": neInfo.VendorName, + "province": neInfo.Province, + "pvFlag": neInfo.PvFlag, + } + + // 公共参数指定的OMC + if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" { + if strings.Contains(omcIP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = omcIP + } + if strings.Contains(omcIP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = omcIP + } + } + + if v, ok := content["omcIP"]; ok && v != "" && v != nil { + omcIP := v.(string) + if strings.Contains(omcIP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = omcIP + } + if strings.Contains(omcIP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = omcIP + } + } + if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil { + item["enable"] = parse.Boolean(oamEnable) + } + if oamPort, ok := content["oamPort"]; ok && oamPort != nil { + item["port"] = parse.Number(oamPort) + } + oamData["oamConfig"] = item + } + // 对网管SNMP配置 + if v, ok := oamData["snmpConfig"]; ok { + item := v.(map[string]any) + if strings.Contains(neInfo.IP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = neInfo.IP + } + if strings.Contains(neInfo.IP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = neInfo.IP + } + + if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil { + item["enable"] = parse.Boolean(snmpEnable) + } + if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil { + item["port"] = parse.Number(snmpPort) + } + oamData["snmpConfig"] = item + } + // 对网管KPI上报配置 + if v, ok := oamData["kpiConfig"]; ok { + item := v.(map[string]any) + if neInfo.NeType == "UPF" { + item["timer"] = 5 + } else { + item["timer"] = 60 + } + + if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil { + item["enable"] = parse.Boolean(kpiEnable) + } + if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil { + item["timer"] = parse.Number(kpiTimer) + } + oamData["kpiConfig"] = item + } + if err := r.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { + return fmt.Errorf("error wirte OAM file info") + } + return nil +} + +// NeConfPara5GRead 网元公共配置文件读取 +func (r *NeInfo) NeConfPara5GRead() (map[string]any, error) { + // 网管本地路径 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + // 读取文件内容 + bytes, err := os.ReadFile(omcFilePath) + if err != nil { + logger.Warnf("NeConfPara5GRead ReadFile => %s", err.Error()) + return nil, fmt.Errorf("read file error") + } + content := string(bytes) + + // 序列化Map + mapData, err := parse.ConvertConfigToMap("yaml", content) + if err != nil { + logger.Warnf("NeConfPara5GRead ConvertConfigToMap => %s", err.Error()) + return nil, fmt.Errorf("content convert type error") + } + return mapData, nil +} + +// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId +func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) error { + // 网管本地路径 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + + if err := parse.ConvertConfigToFile("yaml", omcFilePath, content); err != nil { + return fmt.Errorf("please check if the file exists or write permissions") + } + + // 同步到网元端 + if len(syncNE) > 0 { + errMsg := []string{} + for _, neTI := range syncNE { + ti := strings.SplitN(neTI, "@", 2) + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) + if err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + continue + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + continue + } + defer sftpClient.Close() + + // 网元端配置路径 + neFilePath := "/usr/local/etc/conf/para5G.yaml" + neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) + // 复制到网元进行覆盖 + if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti)) + continue + } + } + if len(errMsg) > 0 { + return fmt.Errorf("%s", strings.Join(errMsg, "\r\n")) + } + } + + // 转换一份数据到全局 + r.Para5GData = r.neConfPara5GDataConvert(content) + return nil +} + +// NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 +func (r *NeInfo) neConfPara5GDataConvert(content map[string]any) map[string]string { + defer func() { + if err := recover(); err != nil { + logger.Errorf("NeConfPara5GDataConvert panic: %v", err) + // 文件异常就删除配置 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + os.Remove(omcFilePath) + } + }() + + basic := content["basic"].(map[string]any) + external := content["external"].(map[string]any) + sbi := content["sbi"].(map[string]any) + + mcc := "460" + mnc := "01" + mncDomain := "001" + if plmnId, plmnIdOk := basic["plmnId"].(map[string]any); plmnIdOk { + mcc = plmnId["mcc"].(string) + mnc = plmnId["mnc"].(string) + // If a user input two digit MNC, add a leading zero + if len(mnc) == 2 { + mncDomain = fmt.Sprintf("0%s", mnc) + } else { + mncDomain = mnc + } + } + + sst := "1" + sd := "000001" + if plmnId, plmnIdOk := basic["snssai"].(map[string]any); plmnIdOk { + sst = plmnId["sst"].(string) + sd = plmnId["sd"].(string) + } + + n3IPAmdMask := external["upfn3_ip"].(string) + n3Arr := strings.SplitN(n3IPAmdMask, "/", 2) + n3IP := n3Arr[0] + n3Mask := "255.255.255.0" + if len(n3Arr) > 1 { + n3Mask = parse.ConvertIPMask(parse.Number(n3Arr[1])) + } + + n6IPAmdMask := external["upfn6_ip"].(string) + n6Arr := strings.SplitN(n6IPAmdMask, "/", 2) + n6IP := n6Arr[0] + n6Mask := "255.255.255.0" + if len(n6Arr) > 1 { + n6Mask = parse.ConvertIPMask(parse.Number(n6Arr[1])) + } + + ueIPAmdMask := external["ue_pool"].(string) + ueArr := strings.SplitN(ueIPAmdMask, "/", 2) + ueIP := ueArr[0] + ueCicr := "24" + ueMask := "255.255.255.0" + if len(ueArr) > 1 { + ueCicr = ueArr[1] + ueMask = parse.ConvertIPMask(parse.Number(ueArr[1])) + } + + return map[string]string{ + // basic + "TAC": basic["tac"].(string), + "MCC": mcc, + "MNC": mnc, + "MNC_DOMAIN": mncDomain, + "SST": sst, + "SD": sd, + "DNN_DATA": basic["dnn_data"].(string), + "DNN_IMS": basic["dnn_ims"].(string), + + // external + "N2_IP": external["amfn2_ip"].(string), + "UE_POOL": external["ue_pool"].(string), + "UE_IP": ueIP, + "UE_MASK": ueMask, + "UE_CIDR": ueCicr, + "UPF_TYPE": external["upf_type"].(string), // 类型 StandardUPF LightUPF + "UPF_DRIVER_TYPE": external["upf_driver_type"].(string), // 网卡驱动 vmxnet3 host dpdk + "UPF_NIC_NAME": external["upf_card_name"].(string), // 网卡名 eth0 + "N3_IP": n3IP, + "N3_MASK": n3Mask, + "N3_GW": external["upfn3_gw"].(string), + "N3_PCI": external["upfn3_pci"].(string), + "N3_MAC": external["upfn3_mac"].(string), + "N6_IP": n6IP, + "N6_MASK": n6Mask, + "N6_GW": external["upfn6_gw"].(string), + "N6_PCI": external["upfn6_pci"].(string), + "N6_MAC": external["upfn6_mac"].(string), + + "SIP_IP": external["ims_sip_ip"].(string), + + "S1_MMEIP": external["mmes1_ip"].(string), + "S11_MMEIP": external["mmes11_ip"].(string), + "S10_MMEIP": external["mmes10_ip"].(string), + + // sbi + "OMC_IP": sbi["omc_ip"].(string), + "IMS_IP": sbi["ims_ip"].(string), + "AMF_IP": sbi["amf_ip"].(string), + "AUSF_IP": sbi["ausf_ip"].(string), + "UDM_IP": sbi["udm_ip"].(string), + "SMF_IP": sbi["smf_ip"].(string), + "PCF_IP": sbi["pcf_ip"].(string), + "NSSF_IP": sbi["nssf_ip"].(string), + "NRF_IP": sbi["nrf_ip"].(string), + "UPF_IP": sbi["upf_ip"].(string), + "LMF_IP": sbi["lmf_ip"].(string), + "NEF_IP": sbi["nef_ip"].(string), + "MME_IP": sbi["mme_ip"].(string), + "N3IWF_IP": sbi["n3iwf_ip"].(string), + "SMSC_IP": sbi["smsc_ip"].(string), + + "DB_IP": sbi["db_ip"].(string), + } } diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go deleted file mode 100644 index ae528f2..0000000 --- a/src/modules/network_element/service/ne_info.impl.go +++ /dev/null @@ -1,829 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/redis" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/ssh" - "nms_cxy/src/framework/utils/telnet" - neFetchlink "nms_cxy/src/modules/network_element/fetch_link" - "nms_cxy/src/modules/network_element/model" - "nms_cxy/src/modules/network_element/repository" -) - -// 实例化服务层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - neInfoRepository: repository.NewNeInfoImpl, - Para5GData: map[string]string{}, -} - -// 网元信息 服务层处理 -type NeInfoImpl struct { - // 网元信息数据信息 - neInfoRepository repository.INeInfo - Para5GData map[string]string -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neInfo) - if err != nil { - neInfo = model.NeInfo{} - } - } else { - neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { - redis.Del("", key) - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values)) - } - } - return neInfo -} - -// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 -func (r *NeInfoImpl) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) - redis.Del("", key) - neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values)) - } - return neInfo -} - -// ClearNeCacheByNeType 清除网元类型缓存 -func (r *NeInfoImpl) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%s*", cachekey.NE_KEY) - if neType != "*" { - key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) - } - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectNeInfoByRmuid 通过rmUID查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByRmuid(rmUid string) model.NeInfo { - var neInfo model.NeInfo - cacheKeys, _ := redis.GetKeys("", cachekey.NE_KEY+"*") - if len(cacheKeys) > 0 { - for _, key := range cacheKeys { - var v model.NeInfo - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - json.Unmarshal([]byte(jsonStr), &v) - } - if v.RmUID == rmUid { - neInfo = v - break - } - } - } else { - neInfos := r.SelectList(neInfo, false, false) - for _, v := range neInfos { - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) - redis.Del("", key) - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - if v.RmUID == rmUid { - neInfo = v - } - } - } - return neInfo -} - -// SelectPage 根据条件分页查询 -// -// bandStatus 带状态信息 -func (r *NeInfoImpl) SelectPage(query map[string]any, bandStatus bool) map[string]any { - data := r.neInfoRepository.SelectPage(query) - - // 网元直连读取网元服务状态 - if bandStatus { - rows := data["rows"].([]model.NeInfo) - r.bandNeStatus(&rows) - } - - return data -} - -// SelectList 查询列表 -// -// bandStatus 带状态信息 -// bandHost 带主机信息 -func (r *NeInfoImpl) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { - list := r.neInfoRepository.SelectList(ne) - - // 网元直连读取网元服务状态 - if bandStatus { - r.bandNeStatus(&list) - } - - // 网元主机信息 - if bandHost { - r.bandNeHosts(&list) - } - - return list -} - -// bandNeStatus 网元列表项数据带网元服务状态 -func (r *NeInfoImpl) bandNeStatus(arr *[]model.NeInfo) { - for i := range *arr { - v := (*arr)[i] - result, err := neFetchlink.NeState(v) - if err != nil { - (*arr)[i].ServerState = map[string]any{ - "online": false, - } - // 网元状态设置为离线 - if v.Status != "0" { - v.Status = "0" - (*arr)[i].Status = v.Status - r.neInfoRepository.Update(v) - } - continue - } - result["online"] = true - (*arr)[i].ServerState = result - // 网元状态设置为在线 - if v.Status != "1" { - // 下发网管配置信息给网元 - _, err = neFetchlink.NeConfigOMC(v) - if err == nil { - v.Status = "1" - } else { - v.Status = "2" - } - (*arr)[i].Status = v.Status - r.neInfoRepository.Update(v) - } - } -} - -// bandNeHosts 网元列表项数据带网元主机信息 -func (r *NeInfoImpl) bandNeHosts(arr *[]model.NeInfo) { - for i := range *arr { - v := (*arr)[i] - if v.HostIDs != "" { - hostIds := strings.Split(v.HostIDs, ",") - if len(hostIds) <= 1 { - continue - } - for _, hostId := range hostIds { - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - continue - } - (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) - } - } - } -} - -// SelectByIds 通过ID查询 -// -// bandHost 带主机信息 -func (r *NeInfoImpl) SelectById(infoId string, bandHost bool) model.NeInfo { - if infoId == "" { - return model.NeInfo{} - } - neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) - if len(neInfos) > 0 { - // 带主机信息 - if neInfos[0].HostIDs != "" && bandHost { - r.bandNeHosts(&neInfos) - } - return neInfos[0] - } - return model.NeInfo{} -} - -// Insert 新增信息 -func (r *NeInfoImpl) Insert(neInfo model.NeInfo) string { - // 主机信息新增 - if neInfo.Hosts != nil { - var hostIDs []string - for _, host := range neInfo.Hosts { - host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) - host.GroupID = "1" - hostId := NewNeHostImpl.Insert(host) - if hostId != "" { - hostIDs = append(hostIDs, hostId) - } - } - neInfo.HostIDs = strings.Join(hostIDs, ",") - } - - insertId := r.neInfoRepository.Insert(neInfo) - if insertId != "" { - // 刷新缓存 - r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - } - return insertId -} - -// Update 修改信息 -func (r *NeInfoImpl) Update(neInfo model.NeInfo) int64 { - // 主机信息更新 - if neInfo.Hosts != nil { - for _, host := range neInfo.Hosts { - if host.HostID != "" { - host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) - host.GroupID = "1" - NewNeHostImpl.Update(host) - } - } - } - - num := r.neInfoRepository.Update(neInfo) - if num > 0 { - // 刷新缓存 - r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - } - return num -} - -// DeleteByIds 批量删除信息 -func (r *NeInfoImpl) DeleteByIds(infoIds []string) (int64, error) { - // 检查是否存在 - infos := r.neInfoRepository.SelectByIds(infoIds) - if len(infos) <= 0 { - return 0, fmt.Errorf("neHostCmd.noData") - } - - if len(infos) == len(infoIds) { - for _, v := range infos { - // 主机信息删除 - if v.HostIDs != "" { - NewNeHostImpl.DeleteByIds(strings.Split(v.HostIDs, ",")) - } - // 删除License - neLicense := NewNeLicenseImpl.SelectByNeTypeAndNeID(v.NeType, v.NeId) - if neLicense.NeId == v.NeId { - NewNeLicenseImpl.DeleteByIds([]string{neLicense.ID}) - } - // 删除Version - neVersion := NewNeVersionImpl.SelectByNeTypeAndNeID(v.NeType, v.NeId) - if neVersion.NeId == v.NeId { - NewNeVersionImpl.DeleteByIds([]string{neVersion.ID}) - } - // 缓存信息删除 - redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) - } - rows := r.neInfoRepository.DeleteByIds(infoIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { - uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ - NeType: neType, - NeId: neId, - }) - if uniqueId == id { - return true - } - return uniqueId == "" -} - -// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() -func (r *NeInfoImpl) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { - logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) - return nil, fmt.Errorf("neinfo not found") - } - // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunSSHClient NeType:%s NeID:%s hostId not found", neType, neId) - return nil, fmt.Errorf("neinfo hostId not found") - } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host id not found") - } - hostId := hostIds[0] // 网元主机ssh 0:22 - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host not found") - } - if neHost.HostType != "ssh" { - logger.Errorf("NeRunSSHClient Hosts first HostType %s not ssh", neHost.HostType) - return nil, fmt.Errorf("neinfo host type not ssh") - } - - var connSSH ssh.ConnSSH - neHost.CopyTo(&connSSH) - var client *ssh.ConnSSH - var err error - if neHost.AuthMode == "2" { - client, err = connSSH.NewClientByLocalPrivate() - } else { - client, err = connSSH.NewClient() - } - if err != nil { - logger.Errorf("NeRunSSHClient NewClient err => %s", err.Error()) - return nil, fmt.Errorf("neinfo ssh client new err") - } - return client, nil -} - -// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 -func (r *NeInfoImpl) NeRunSSHCmd(neType, neId, cmd string) (string, error) { - sshClient, err := r.NeRunSSHClient(neType, neId) - if err != nil { - return "", err - } - defer sshClient.Close() - - // 执行命令 - output, err := sshClient.RunCMD(cmd) - if err != nil { - logger.Errorf("NeRunSSHCmd RunCMD %s err => %s", output, err.Error()) - return "", fmt.Errorf("neinfo ssh run cmd err") - } - return output, nil -} - -// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() -// num 是网元主机telnet 1:4100 2:5200 -func (r *NeInfoImpl) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { - logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) - return nil, fmt.Errorf("neinfo not found") - } - // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s hostId not found", neType, neId) - return nil, fmt.Errorf("neinfo hostId not found") - } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host id not found") - } - hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host not found") - } - - // 创建链接Telnet客户端 - var connTelnet telnet.ConnTelnet - neHost.CopyTo(&connTelnet) - telnetClient, err := connTelnet.NewClient() - if err != nil { - logger.Errorf("NeRunTelnetClient NewClient err => %s", err.Error()) - return nil, fmt.Errorf("neinfo telnet client new err") - } - return telnetClient, nil -} - -// neConfOAMData 网元OAM配置文件默认格式数据 -func (r *NeInfoImpl) neConfOAMData() map[string]any { - return map[string]any{ - "httpManageCfg": map[string]any{ - "ipType": "ipv4", - // 必改 - "ipv4": "172.60.5.2", - "ipv6": "", - "port": 33030, - "scheme": "http", - }, - "oamConfig": map[string]any{ - "enable": true, - "ipType": "ipv4", - "ipv4": "172.60.5.1", // 必改 - "ipv6": "", - "port": 33030, - "scheme": "http", - "neConfig": map[string]any{ // 必改 - "neId": "001", - "rmUid": "4400HX1XXX001", - "neName": "XXX_001", - "dn": "-", - "vendorName": "GD", - "province": "-", - "pvFlag": "PNF", - }, - }, - "snmpConfig": map[string]any{ - "enable": false, - "ipType": "ipv4", - "ipv4": "172.60.5.2", // 必改 - "ipv6": "", - "port": 4957, - }, - "kpiConfig": map[string]any{ - "enable": true, - "timer": 60, // 必改 - }, - // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", // 网元只会读一次后续会置空,建议不放 - } -} - -// neConfOAMRead 网元OAM配置文件读取 -func (r *NeInfoImpl) NeConfOAMRead(neType, neId string) (map[string]any, error) { - neTypeLower := strings.ToLower(neType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, "oam_manager.yaml") - - // 读取文件内容 - bytes, err := os.ReadFile(localFilePath) - if err != nil { - // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) - // return nil, fmt.Errorf("read file error") - // 无保留文件时返回默认文件数据 - oamData := r.neConfOAMData() - r.neConfOAMWirte(neType, neId, oamData, false) - return oamData, nil - } - content := string(bytes) - - // 序列化Map - mapData, err := parse.ConvertConfigToMap("yaml", content) - if err != nil { - logger.Warnf("NeConfOAMRead ConvertConfigToMap => %s", err.Error()) - return nil, fmt.Errorf("content convert type error") - } - return mapData, nil -} - -// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 -func (r *NeInfoImpl) neConfOAMWirte(neType, neId string, content any, sync bool) error { - neTypeLower := strings.ToLower(neType) - fileName := "oam_manager.yaml" - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, fileName) - - // 写入文件 - if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { - return fmt.Errorf("please check if the file exists or write permissions") - } - - // 同步到网元端 - if sync { - // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(neType, neId) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端配置路径 - neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) - neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+w %s", neFileDir, neFileDir, neFilePath, neFilePath)) - // 复制到网元进行覆盖 - if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - } - - return nil -} - -// NeConfOAMSync 网元OAM配置文件生成并同步 -func (r *NeInfoImpl) NeConfOAMSync(neInfo model.NeInfo, content map[string]any, sync bool) error { - oamData, err := r.NeConfOAMRead(neInfo.NeType, neInfo.NeId) - if oamData == nil || err != nil { - return fmt.Errorf("error read OAM file info") - } - // 网元HTTP服务 - if v, ok := oamData["httpManageCfg"]; ok { - item := v.(map[string]any) - item["port"] = neInfo.Port - if strings.Contains(neInfo.IP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = neInfo.IP - } - if strings.Contains(neInfo.IP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = neInfo.IP - } - - oamData["httpManageCfg"] = item - } - // 对网管HTTP配置 - if v, ok := oamData["oamConfig"]; ok { - item := v.(map[string]any) - item["neConfig"] = map[string]string{ - "neId": neInfo.NeId, - "rmUid": neInfo.RmUID, - "neName": neInfo.NeName, - "dn": neInfo.Dn, - "vendorName": neInfo.VendorName, - "province": neInfo.Province, - "pvFlag": neInfo.PvFlag, - } - - // 公共参数指定的OMC - if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" { - if strings.Contains(omcIP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = omcIP - } - if strings.Contains(omcIP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = omcIP - } - } - - if v, ok := content["omcIP"]; ok && v != "" && v != nil { - omcIP := v.(string) - if strings.Contains(omcIP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = omcIP - } - if strings.Contains(omcIP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = omcIP - } - } - if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil { - item["enable"] = parse.Boolean(oamEnable) - } - if oamPort, ok := content["oamPort"]; ok && oamPort != nil { - item["port"] = parse.Number(oamPort) - } - oamData["oamConfig"] = item - } - // 对网管SNMP配置 - if v, ok := oamData["snmpConfig"]; ok { - item := v.(map[string]any) - if strings.Contains(neInfo.IP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = neInfo.IP - } - if strings.Contains(neInfo.IP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = neInfo.IP - } - - if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil { - item["enable"] = parse.Boolean(snmpEnable) - } - if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil { - item["port"] = parse.Number(snmpPort) - } - oamData["snmpConfig"] = item - } - // 对网管KPI上报配置 - if v, ok := oamData["kpiConfig"]; ok { - item := v.(map[string]any) - if neInfo.NeType == "UPF" { - item["timer"] = 5 - } - - if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil { - item["enable"] = parse.Boolean(kpiEnable) - } - if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil { - item["timer"] = parse.Number(kpiTimer) - } - oamData["kpiConfig"] = item - } - if err := NewNeInfoImpl.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { - return fmt.Errorf("error wirte OAM file info") - } - return nil -} - -// NeConfPara5GRead 网元公共配置文件读取 -func (r *NeInfoImpl) NeConfPara5GRead() (map[string]any, error) { - // 网管本地路径 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - // 读取文件内容 - bytes, err := os.ReadFile(omcFilePath) - if err != nil { - logger.Warnf("NeConfPara5GRead ReadFile => %s", err.Error()) - return nil, fmt.Errorf("read file error") - } - content := string(bytes) - - // 序列化Map - mapData, err := parse.ConvertConfigToMap("yaml", content) - if err != nil { - logger.Warnf("NeConfPara5GRead ConvertConfigToMap => %s", err.Error()) - return nil, fmt.Errorf("content convert type error") - } - return mapData, nil -} - -// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId -func (r *NeInfoImpl) NeConfPara5GWirte(content map[string]any, syncNE []string) error { - // 网管本地路径 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - - if err := parse.ConvertConfigToFile("yaml", omcFilePath, content); err != nil { - return fmt.Errorf("please check if the file exists or write permissions") - } - - // 同步到网元端 - if len(syncNE) > 0 { - errMsg := []string{} - for _, neTI := range syncNE { - ti := strings.SplitN(neTI, "@", 2) - // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) - if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) - continue - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) - continue - } - defer sftpClient.Close() - - // 网元端配置路径 - neFilePath := "/usr/local/etc/conf/para5G.yaml" - neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) - // 复制到网元进行覆盖 - if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti)) - continue - } - } - if len(errMsg) > 0 { - return fmt.Errorf(strings.Join(errMsg, "\r\n")) - } - } - - // 转换一份数据到全局 - r.Para5GData = r.neConfPara5GDataConvert(content) - return nil -} - -// NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 -func (r *NeInfoImpl) neConfPara5GDataConvert(content map[string]any) map[string]string { - defer func() { - if err := recover(); err != nil { - logger.Errorf("NeConfPara5GDataConvert panic: %v", err) - // 文件异常就删除配置 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - os.Remove(omcFilePath) - } - }() - - basic := content["basic"].(map[string]any) - external := content["external"].(map[string]any) - sbi := content["sbi"].(map[string]any) - - mcc := "460" - mnc := "01" - mncDomain := "001" - if plmnId, plmnIdOk := basic["plmnId"].(map[string]any); plmnIdOk { - mcc = plmnId["mcc"].(string) - mnc = plmnId["mnc"].(string) - // If a user input two digit MNC, add a leading zero - if len(mnc) == 2 { - mncDomain = fmt.Sprintf("0%s", mnc) - } else { - mncDomain = mnc - } - } - - sst := "1" - sd := "000001" - if plmnId, plmnIdOk := basic["snssai"].(map[string]any); plmnIdOk { - sst = plmnId["sst"].(string) - sd = plmnId["sd"].(string) - } - - n3IPAmdMask := external["upfn3_ip"].(string) - n3Arr := strings.SplitN(n3IPAmdMask, "/", 2) - n3IP := n3Arr[0] - n3Mask := "255.255.255.0" - if len(n3Arr) > 1 { - n3Mask = parse.ConvertIPMask(parse.Number(n3Arr[1])) - } - - n6IPAmdMask := external["upfn6_ip"].(string) - n6Arr := strings.SplitN(n6IPAmdMask, "/", 2) - n6IP := n6Arr[0] - n6Mask := "255.255.255.0" - if len(n6Arr) > 1 { - n6Mask = parse.ConvertIPMask(parse.Number(n6Arr[1])) - } - - ueIPAmdMask := external["ue_pool"].(string) - ueArr := strings.SplitN(ueIPAmdMask, "/", 2) - ueIP := ueArr[0] - ueCicr := "24" - ueMask := "255.255.255.0" - if len(ueArr) > 1 { - ueCicr = ueArr[1] - ueMask = parse.ConvertIPMask(parse.Number(ueArr[1])) - } - - return map[string]string{ - // basic - "TAC": basic["tac"].(string), - "MCC": mcc, - "MNC": mnc, - "MNC_DOMAIN": mncDomain, - "SST": sst, - "SD": sd, - "DNN_DATA": basic["dnn_data"].(string), - "DNN_IMS": basic["dnn_ims"].(string), - - // external - "N2_IP": external["amfn2_ip"].(string), - "UE_POOL": external["ue_pool"].(string), - "UE_IP": ueIP, - "UE_MASK": ueMask, - "UE_CIDR": ueCicr, - "UPF_TYPE": external["upf_type"].(string), // StandardUPF LightUPF - "N3_IP": n3IP, - "N3_MASK": n3Mask, - "N3_GW": external["upfn3_gw"].(string), - "N3_PCI": external["upfn3_pci"].(string), - "N3_MAC": external["upfn3_mac"].(string), - "N6_IP": n6IP, - "N6_MASK": n6Mask, - "N6_GW": external["upfn6_gw"].(string), - "N6_PCI": external["upfn6_pci"].(string), - "N6_MAC": external["upfn6_mac"].(string), - - "SIP_IP": external["ims_sip_ip"].(string), - - "S1_MMEIP": external["mmes1_ip"].(string), - "S11_MMEIP": external["mmes11_ip"].(string), - "S10_MMEIP": external["mmes10_ip"].(string), - - // sbi - "OMC_IP": sbi["omc_ip"].(string), - "IMS_IP": sbi["ims_ip"].(string), - "AMF_IP": sbi["amf_ip"].(string), - "AUSF_IP": sbi["ausf_ip"].(string), - "UDM_IP": sbi["udm_ip"].(string), - "SMF_IP": sbi["smf_ip"].(string), - "PCF_IP": sbi["pcf_ip"].(string), - "NSSF_IP": sbi["nssf_ip"].(string), - "NRF_IP": sbi["nrf_ip"].(string), - "UPF_IP": sbi["upf_ip"].(string), - "LMF_IP": sbi["lmf_ip"].(string), - "NEF_IP": sbi["nef_ip"].(string), - "MME_IP": sbi["mme_ip"].(string), - "N3IWF_IP": sbi["n3iwf_ip"].(string), - - "DB_IP": sbi["db_ip"].(string), - } -} diff --git a/src/modules/network_element/service/ne_license.go b/src/modules/network_element/service/ne_license.go index 6dc8a35..fa84b15 100644 --- a/src/modules/network_element/service/ne_license.go +++ b/src/modules/network_element/service/ne_license.go @@ -1,34 +1,190 @@ package service -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "time" -// INeLicense 网元授权激活信息 服务层接口 -type INeLicense interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neLicense model.NeLicense) []model.NeLicense - - // SelectById 通过ID查询 - SelectById(id string) model.NeLicense - - // Insert 新增信息 - Insert(neLicense model.NeLicense) string - - // Update 修改信息 - Update(neLicense model.NeLicense) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 - SelectByNeTypeAndNeID(neType, neId string) model.NeLicense - - // ReadLicenseInfo 读取授权文件信息 - // 返回激活申请码, 激活文件 - ReadLicenseInfo(neLicense model.NeLicense) (string, string) - - // UploadLicense 授权文件上传到网元主机 - UploadLicense(neLicense model.NeLicense) error +// 实例化服务层 NeLicense 结构体 +var NewNeLicense = &NeLicense{ + neLicenseRepository: repository.NewNeLicense, +} + +// NeLicense 网元授权激活信息 服务层处理 +type NeLicense struct { + neLicenseRepository *repository.NeLicense // 网元授权激活信息表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeLicense) SelectPage(query map[string]any) map[string]any { + return r.neLicenseRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { + return r.neLicenseRepository.SelectList(neLicense) +} + +// SelectByIds 通过ID查询 +func (r *NeLicense) SelectById(id string) model.NeLicense { + if id == "" { + return model.NeLicense{} + } + neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// Insert 新增信息 +func (r *NeLicense) Insert(neLicense model.NeLicense) string { + return r.neLicenseRepository.Insert(neLicense) +} + +// Update 修改信息 +func (r *NeLicense) Update(neLicense model.NeLicense) int64 { + return r.neLicenseRepository.Update(neLicense) +} + +// DeleteByIds 批量删除信息 +func (r *NeLicense) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rowIds := r.neLicenseRepository.SelectByIds(ids) + if len(rowIds) <= 0 { + return 0, fmt.Errorf("neLicense.noData") + } + + if len(rowIds) == len(ids) { + rows := r.neLicenseRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// SelectByTypeAndID 通过网元类型和网元ID查询 +func (r *NeLicense) SelectByTypeAndID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ + NeType: neType, + NeId: neId, + }) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 +func (r *NeLicense) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ + NeType: neType, + NeId: neId, + }) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// ReadLicenseInfo 读取授权文件信息 +// 返回激活申请码, 激活文件 +func (r *NeLicense) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { + neTypeLower := strings.ToLower(neLicense.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_license" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId) + // 网元端授权文件路径 + nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId) + if err != nil { + return "", "" + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", "" + } + defer sftpClient.Close() + + // 复制授权申请码到本地 + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { + return "", "" + } + // 读取文件内容 + bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") + if err != nil { + return "", "" + } + + // 复制激活文件到本地 + licensePath := "" + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { + licensePath = omcPath + "/system.ini" + } + return strings.TrimSpace(string(bytes)), licensePath +} + +// UploadLicense 授权文件上传到网元主机 +func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error { + // 检查文件是否存在 + omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) + if _, err := os.Stat(omcLicensePath); err != nil { + return fmt.Errorf("file read failure") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端授权文件路径 + neTypeLower := strings.ToLower(neLicense.NeType) + neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) + neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) + + // 尝试备份授权文件 + neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) + + // 上传授权文件去覆盖 + if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + + // 重启服务 + if neLicense.Reload { + cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) + if neTypeLower == "ims" { + cmdStr = "ims-stop || true && ims-start" + } else if neTypeLower == "omc" { + cmdStr = "sudo systemctl restart restagent" + } + sshClient.RunCMD(cmdStr) + } + return nil } diff --git a/src/modules/network_element/service/ne_license.impl.go b/src/modules/network_element/service/ne_license.impl.go deleted file mode 100644 index fa64b78..0000000 --- a/src/modules/network_element/service/ne_license.impl.go +++ /dev/null @@ -1,191 +0,0 @@ -package service - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - "time" - - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/modules/network_element/model" - "nms_cxy/src/modules/network_element/repository" -) - -// 实例化服务层 NeLicenseImpl 结构体 -var NewNeLicenseImpl = &NeLicenseImpl{ - neLicenseRepository: repository.NewNeLicenseImpl, -} - -// NeLicenseImpl 网元授权激活信息 服务层处理 -type NeLicenseImpl struct { - // 网元授权激活信息表 - neLicenseRepository repository.INeLicense -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeLicenseImpl) SelectPage(query map[string]any) map[string]any { - return r.neLicenseRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeLicenseImpl) SelectList(neLicense model.NeLicense) []model.NeLicense { - return r.neLicenseRepository.SelectList(neLicense) -} - -// SelectByIds 通过ID查询 -func (r *NeLicenseImpl) SelectById(id string) model.NeLicense { - if id == "" { - return model.NeLicense{} - } - neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// Insert 新增信息 -func (r *NeLicenseImpl) Insert(neLicense model.NeLicense) string { - return r.neLicenseRepository.Insert(neLicense) -} - -// Update 修改信息 -func (r *NeLicenseImpl) Update(neLicense model.NeLicense) int64 { - return r.neLicenseRepository.Update(neLicense) -} - -// DeleteByIds 批量删除信息 -func (r *NeLicenseImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rowIds := r.neLicenseRepository.SelectByIds(ids) - if len(rowIds) <= 0 { - return 0, fmt.Errorf("neLicense.noData") - } - - if len(rowIds) == len(ids) { - rows := r.neLicenseRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// SelectByTypeAndID 通过网元类型和网元ID查询 -func (r *NeLicenseImpl) SelectByTypeAndID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ - NeType: neType, - NeId: neId, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 -func (r *NeLicenseImpl) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ - NeType: neType, - NeId: neId, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// ReadLicenseInfo 读取授权文件信息 -// 返回激活申请码, 激活文件 -func (r *NeLicenseImpl) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { - neTypeLower := strings.ToLower(neLicense.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_license" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId) - // 网元端授权文件路径 - nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neLicense.NeType, neLicense.NeId) - if err != nil { - return "", "" - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", "" - } - defer sftpClient.Close() - - // 复制授权申请码到本地 - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { - return "", "" - } - // 读取文件内容 - bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") - if err != nil { - return "", "" - } - - // 复制激活文件到本地 - licensePath := "" - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { - licensePath = omcPath + "/system.ini" - } - return strings.TrimSpace(string(bytes)), licensePath -} - -// UploadLicense 授权文件上传到网元主机 -func (r *NeLicenseImpl) UploadLicense(neLicense model.NeLicense) error { - // 检查文件是否存在 - omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) - if _, err := os.Stat(omcLicensePath); err != nil { - return fmt.Errorf("file read failure") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neLicense.NeType, neLicense.NeId) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端授权文件路径 - neTypeLower := strings.ToLower(neLicense.NeType) - neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) - neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) - - // 尝试备份授权文件 - neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) - - // 上传授权文件去覆盖 - if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - - // 重启服务 - if neLicense.Reload { - cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) - if neTypeLower == "ims" { - cmdStr = "ims-stop || true && ims-start" - } else if neTypeLower == "omc" { - cmdStr = "sudo systemctl restart omc" - } - sshClient.RunCMD(cmdStr) - } - return nil -} diff --git a/src/modules/network_element/service/ne_software.go b/src/modules/network_element/service/ne_software.go index 2f52dbc..c4910f0 100644 --- a/src/modules/network_element/service/ne_software.go +++ b/src/modules/network_element/service/ne_software.go @@ -1,30 +1,142 @@ package service -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" + "os" -// INeSoftware 网元软件包信息 服务层接口 -type INeSoftware interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neSoftware model.NeSoftware) []model.NeSoftware - - // SelectById 通过ID查询 - SelectById(id string) model.NeSoftware - - // Insert 新增信息 - Insert(neSoftware model.NeSoftware) string - - // Update 修改信息 - Update(neSoftware model.NeSoftware) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 - CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool - - // UpdateVersions 更新软件包对应网元的新版本 - UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 +// 实例化服务层 NeSoftware 结构体 +var NewNeSoftware = &NeSoftware{ + neSoftwareRepository: repository.NewNeSoftware, +} + +// NeSoftware 网元软件包信息 服务层处理 +type NeSoftware struct { + neSoftwareRepository *repository.NeSoftware // 网元软件包信息 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { + return r.neSoftwareRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + return r.neSoftwareRepository.SelectList(neSoftware) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftware) SelectById(id string) model.NeSoftware { + if id == "" { + return model.NeSoftware{} + } + neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeSoftware{} +} + +// Insert 新增信息 +func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { + inserId := r.neSoftwareRepository.Insert(neSoftware) + if inserId != "" { + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(model.NeVersion{NeType: neSoftware.NeType}, false) + if len(neVersions) > 0 { + for _, neVersion := range neVersions { + neVersion.NewName = neSoftware.Name + neVersion.NewVersion = neSoftware.Version + neVersion.NewPath = neSoftware.Path + neVersion.Status = "3" + neVersion.UpdateBy = neSoftware.CreateBy + NewNeVersion.Update(neVersion) + } + } + } + return inserId +} + +// Update 修改信息 +func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { + rows := r.neSoftwareRepository.Update(neSoftware) + if rows > 0 { + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(model.NeVersion{ + NeType: neSoftware.NeType, + Status: "3", + }, false) + if len(neVersions) > 0 { + for _, neVersion := range neVersions { + neVersion.NewName = neSoftware.Name + neVersion.NewVersion = neSoftware.Version + neVersion.NewPath = neSoftware.Path + neVersion.Status = "3" + neVersion.UpdateBy = neSoftware.UpdateBy + NewNeVersion.Update(neVersion) + } + } + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftware) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rows := r.neSoftwareRepository.SelectByIds(ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("neSoftware.noData") + } + + if len(rows) == len(ids) { + // 遍历软件包列表进行文件删除 + for _, row := range rows { + // 检查文件是否存在 + filePath := file.ParseUploadFilePath(row.Path) + if _, err := os.Stat(filePath); err != nil { + continue + } + os.Remove(filePath) + } + rows := r.neSoftwareRepository.DeleteByIds(ids) + return rows, nil + } + + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { + uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ + NeType: neType, + Name: name, + Version: version, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// UpdateVersions 更新软件包对应网元的新版本 +func (r *NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { + var rows int64 = 0 + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(neVersion, false) + if len(neVersions) > 0 { + for _, v := range neVersions { + v.NewName = neSoftware.Name + v.NewVersion = neSoftware.Version + v.NewPath = neSoftware.Path + v.Status = "3" + v.UpdateBy = neVersion.UpdateBy + rows += NewNeVersion.Update(v) + } + } + return rows } diff --git a/src/modules/network_element/service/ne_software.impl.go b/src/modules/network_element/service/ne_software.impl.go deleted file mode 100644 index f23ca01..0000000 --- a/src/modules/network_element/service/ne_software.impl.go +++ /dev/null @@ -1,143 +0,0 @@ -package service - -import ( - "fmt" - "os" - - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/modules/network_element/model" - "nms_cxy/src/modules/network_element/repository" -) - -// 实例化服务层 NeSoftwareImpl 结构体 -var NewNeSoftwareImpl = &NeSoftwareImpl{ - neSoftwareRepository: repository.NewNeSoftwareImpl, -} - -// NeSoftwareImpl 网元软件包信息 服务层处理 -type NeSoftwareImpl struct { - // 网元软件包信息 - neSoftwareRepository repository.INeSoftware -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { - return r.neSoftwareRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - return r.neSoftwareRepository.SelectList(neSoftware) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftwareImpl) SelectById(id string) model.NeSoftware { - if id == "" { - return model.NeSoftware{} - } - neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeSoftware{} -} - -// Insert 新增信息 -func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { - inserId := r.neSoftwareRepository.Insert(neSoftware) - if inserId != "" { - // 更新同类型的新包版本 - neVersions := NewNeVersionImpl.SelectList(model.NeVersion{NeType: neSoftware.NeType}) - if len(neVersions) > 0 { - for _, neVersion := range neVersions { - neVersion.NewName = neSoftware.Name - neVersion.NewVersion = neSoftware.Version - neVersion.NewPath = neSoftware.Path - neVersion.Status = "3" - neVersion.UpdateBy = neSoftware.CreateBy - NewNeVersionImpl.Update(neVersion) - } - } - } - return inserId -} - -// Update 修改信息 -func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { - rows := r.neSoftwareRepository.Update(neSoftware) - if rows > 0 { - // 更新同类型的新包版本 - neVersions := NewNeVersionImpl.SelectList(model.NeVersion{ - NeType: neSoftware.NeType, - Status: "3", - }) - if len(neVersions) > 0 { - for _, neVersion := range neVersions { - neVersion.NewName = neSoftware.Name - neVersion.NewVersion = neSoftware.Version - neVersion.NewPath = neSoftware.Path - neVersion.Status = "3" - neVersion.UpdateBy = neSoftware.UpdateBy - NewNeVersionImpl.Update(neVersion) - } - } - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeSoftwareImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rows := r.neSoftwareRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("neSoftware.noData") - } - - if len(rows) == len(ids) { - // 遍历软件包列表进行文件删除 - for _, row := range rows { - // 检查文件是否存在 - filePath := file.ParseUploadFilePath(row.Path) - if _, err := os.Stat(filePath); err != nil { - continue - } - os.Remove(filePath) - } - rows := r.neSoftwareRepository.DeleteByIds(ids) - return rows, nil - } - - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftwareImpl) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { - uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ - NeType: neType, - Name: name, - Version: version, - }) - if uniqueId == id { - return true - } - return uniqueId == "" -} - -// UpdateVersions 更新软件包对应网元的新版本 -func (r *NeSoftwareImpl) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { - var rows int64 = 0 - // 更新同类型的新包版本 - neVersions := NewNeVersionImpl.SelectList(neVersion) - if len(neVersions) > 0 { - for _, v := range neVersions { - v.NewName = neSoftware.Name - v.NewVersion = neSoftware.Version - v.NewPath = neSoftware.Path - v.Status = "3" - v.UpdateBy = neVersion.UpdateBy - rows += NewNeVersionImpl.Update(v) - } - } - return rows -} diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index b4cacdc..8fecd12 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -1,32 +1,744 @@ package service -import "nms_cxy/src/modules/network_element/model" +import ( + "fmt" + "os" + "path/filepath" + "strings" + "time" -// INeVersion 网元版本信息 服务层接口 -type INeVersion interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/ssh" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neVersion model.NeVersion) []model.NeVersion - - // SelectById 通过ID查询 - SelectById(id string) model.NeVersion - - // Insert 新增信息 - Insert(neVersion model.NeVersion) string - - // Update 修改信息 - Update(neVersion model.NeVersion) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // SelectByNeTypeAndNeID 通过网元类型和网元ID查询 - SelectByNeTypeAndNeID(neType, neId string) model.NeVersion - - // Operate 操作版本上传到网元主机执行命令 - // - // action 安装行为:install upgrade rollback - Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) +// 实例化服务层 NeVersion 结构体 +var NewNeVersion = &NeVersion{ + neVersionRepository: repository.NewNeVersion, +} + +// NeVersion 网元版本信息 服务层处理 +type NeVersion struct { + neVersionRepository *repository.NeVersion // 网元版本信息表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeVersion) SelectPage(query map[string]any, checkVersion bool) map[string]any { + data := r.neVersionRepository.SelectPage(query) + + // 网元直连检查更新网元服务版本 + if checkVersion { + rows := data["rows"].([]model.NeVersion) + r.checkNeVersion(&rows) + } + + return data +} + +// SelectConfigList 查询列表 +func (r *NeVersion) SelectList(neVersion model.NeVersion, checkVersion bool) []model.NeVersion { + list := r.neVersionRepository.SelectList(neVersion) + + // 网元直连检查更新网元服务版本 + if checkVersion { + r.checkNeVersion(&list) + } + + return list +} + +// checkNeVersion 网元列表检查更新网元版本 +func (r *NeVersion) checkNeVersion(arr *[]model.NeVersion) { + for i := range *arr { + item := (*arr)[i] + // 查询网元获取IP + neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId) + if neInfo.NeId != item.NeId || neInfo.IP == "" { + continue + } + result, err := neFetchlink.NeState(neInfo) + if err != nil { + continue + } + if v, ok := result["version"]; ok && v != nil { + ver := v.(string) + if ver == item.Version { + continue + } + item.Name = "-" + item.Path = "-" + item.Version = ver + } + if item.NeType != neInfo.NeType || item.NeId != neInfo.NeId { + item.NeType = neInfo.NeType + item.NeId = neInfo.NeId + } + r.Update(item) + (*arr)[i] = item + } +} + +// SelectByIds 通过ID查询 +func (r *NeVersion) SelectById(id string) model.NeVersion { + if id == "" { + return model.NeVersion{} + } + neVersions := r.neVersionRepository.SelectByIds([]string{id}) + if len(neVersions) > 0 { + return neVersions[0] + } + return model.NeVersion{} +} + +// Insert 新增信息 +func (r *NeVersion) Insert(neVersion model.NeVersion) string { + return r.neVersionRepository.Insert(neVersion) +} + +// Update 修改信息 +func (r *NeVersion) Update(neVersion model.NeVersion) int64 { + return r.neVersionRepository.Update(neVersion) +} + +// DeleteByIds 批量删除信息 +func (r *NeVersion) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rowIds := r.neVersionRepository.SelectByIds(ids) + if len(rowIds) <= 0 { + return 0, fmt.Errorf("neVersion.noData") + } + + if len(rowIds) == len(ids) { + rows := r.neVersionRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// SelectByNeTypeAndNeID 通过网元类型和网元ID查询 +func (r *NeVersion) SelectByNeTypeAndNeID(neType, neId string) model.NeVersion { + neVersions := r.neVersionRepository.SelectList(model.NeVersion{ + NeType: neType, + NeId: neId, + }) + if len(neVersions) > 0 { + return neVersions[0] + } + return model.NeVersion{} +} + +// Operate 操作版本上传到网元主机执行命令 +// +// action 安装行为:install upgrade rollback +func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neVersion.NeType, neVersion.NeId) + if err != nil { + return "", err + } + defer sshClient.Close() + + // ========= 文件传输阶段 ========= + softwarePath := neVersion.Path + if action == "install" || action == "upgrade" { + softwarePath = neVersion.NewPath + } + if action == "rollback" { + softwarePath = neVersion.PrePath + } + neFilePaths, err := r.operateFile(sshClient, softwarePath) + if err != nil { + return "", err + } + + // ========= 安装时设置 ========= + if action == "install" { + // 网元公共配置文件 + para5GMap, err := NewNeInfo.NeConfPara5GRead() + if para5GMap == nil || err != nil { + return "", fmt.Errorf("error read para5G file info") + } + if err := NewNeInfo.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { + return "", fmt.Errorf("error wirte para5G file info") + } + } + + // ========= 命令生成阶段 ========= + okFlagStr, cmdStrArr, err := r.operateCommand(action, neVersion.NeType, neFilePaths) + if err != nil { + return "", err + } + + // ========= 执行阶段 ========= + commandLine, err := r.operateRun(sshClient, preinput, cmdStrArr, neVersion.NeType, okFlagStr) + if err != nil { + return "", err + } + + // ========= 完成阶段 ========= + if strings.LastIndex(commandLine, okFlagStr) > 5 { + if err := r.operateDome(action, neVersion); err != nil { + return "", err + } + } + return commandLine, nil +} + +// operateFile 操作版本-文件传输阶段 +func (r *NeVersion) operateFile(sshClient *ssh.ConnSSH, softwarePath string) ([]string, error) { + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return nil, err + } + defer sftpClient.Close() + + nePath := "/tmp" + copyFileToNeMap := map[string]string{} + + // 统一处理多个文件和单个文件的情况 + var softwarePaths []string + if strings.Contains(softwarePath, ",") { + softwarePaths = strings.Split(softwarePath, ",") + } else { + softwarePaths = []string{softwarePath} + } + + for _, path := range softwarePaths { + // 检查文件是否存在 + localFilePath := file.ParseUploadFilePath(path) + if _, err := os.Stat(localFilePath); err != nil { + return nil, fmt.Errorf("file read failure") + } + + fileName := filepath.Base(path) + neFilePath := fmt.Sprintf("%s/%s", nePath, fileName) + copyFileToNeMap[localFilePath] = neFilePath + } + + // 上传软件包到 /tmp + neFilePaths := []string{} + for k, v := range copyFileToNeMap { + if err = sftpClient.CopyFileLocalToRemote(k, v); err != nil { + return nil, fmt.Errorf("error uploading package") + } + neFilePaths = append(neFilePaths, v) + } + return neFilePaths, nil +} + +// operateCommand 操作版本-命令生成阶段 +func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) (string, []string, error) { + neTypeLower := strings.ToLower(neType) + // 命令终止结束标记 + okFlagStr := fmt.Sprintf("%s version %s successful!", neTypeLower, action) + // 安装软件包 + pkgCmdStr := fmt.Sprintf("sudo dpkg -i %s", strings.Join(neFilePaths, " ")) + fileExt := filepath.Ext(strings.ToLower(neFilePaths[0])) + if strings.HasSuffix(fileExt, "rpm") { + pkgCmdStr = fmt.Sprintf("sudo rpm -Uvh --reinstall %s", strings.Join(neFilePaths, " ")) + } + + // 组合命令输入 + cmdStrArr := []string{} + if neType == "OMC" { + omcStrArr := []string{} + if action == "install" { + // 安装软件包 + pkgCmdStr = fmt.Sprintf("sudo M_PARAM=install dpkg -i %s", strings.Join(neFilePaths, " ")) + if strings.HasSuffix(fileExt, "rpm") { + pkgCmdStr = fmt.Sprintf("sudo M_PARAM=install rpm -Uvh %s", strings.Join(neFilePaths, " ")) + } + omcStrArr = append(omcStrArr, pkgCmdStr) + } else { + // 升级软件包 + pkgCmdStr = fmt.Sprintf("sudo M_PARAM=upgrade dpkg -i %s", strings.Join(neFilePaths, " ")) + if strings.HasSuffix(fileExt, "rpm") { + pkgCmdStr = fmt.Sprintf("sudo M_PARAM=upgrade rpm -Uvh --reinstall %s", strings.Join(neFilePaths, " ")) + } + omcStrArr = append(omcStrArr, pkgCmdStr) + } + // 删除软件包 + omcStrArr = append(omcStrArr, fmt.Sprintf("sudo rm %s", strings.Join(neFilePaths, " "))) + + // 2s后执行omc相关命令 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("nohup sh -c \"sleep 2s && %s\" > /tmp/omc_%s.out 2>&1 & \n", strings.Join(omcStrArr, " && "), action)) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr)) + return okFlagStr, cmdStrArr, nil + } else if neType == "IMS" { + if action == "install" { + para5GData := NewNeInfo.Para5GData + cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") + + // 公网 PLMN地址 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("/usr/local/etc/ims/default/tools/modipplmn.sh %s %s %s \n", para5GData["SIP_IP"], para5GData["MCC"], para5GData["MNC"])) + // 内网 服务地址 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("/usr/local/etc/ims/default/tools/modintraip.sh %s \n", para5GData["IMS_IP"])) + // IWF连接PCF服务 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/iwf/iwf_conf.yaml \n", para5GData["PCF_IP"])) + // 设置 HOST + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s ims' /etc/hosts || echo '%s ims' | sudo tee -a /etc/hosts \n", para5GData["IMS_IP"], para5GData["IMS_IP"])) + mnc_mcc := fmt.Sprintf("mnc%s.mcc%s", para5GData["MNC_DOMAIN"], para5GData["MCC"]) + hssHost := fmt.Sprintf("%s hss.ims.%s.3gppnetwork.org hss", para5GData["UDM_IP"], mnc_mcc) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", hssHost, hssHost)) + pcrfHost := fmt.Sprintf("%s pcrf.epc.%s.3gppnetwork.org pcrf", para5GData["IMS_IP"], mnc_mcc) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", pcrfHost, pcrfHost)) + imsOrgHost := fmt.Sprintf("ims.%s.3gppnetwork.org", mnc_mcc) + imsHost := fmt.Sprintf("%s %s ims", para5GData["SIP_IP"], imsOrgHost) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", imsHost, imsHost)) + pcscfHost := fmt.Sprintf("%s pcscf.%s pcscf", para5GData["SIP_IP"], imsOrgHost) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", pcscfHost, pcscfHost)) + icscfHost := fmt.Sprintf("%s icscf.%s icscf", para5GData["SIP_IP"], imsOrgHost) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", icscfHost, icscfHost)) + scscfHost := fmt.Sprintf("%s scscf.%s scscf", para5GData["SIP_IP"], imsOrgHost) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", scscfHost, scscfHost)) + mmtelHost := fmt.Sprintf("%s mmtel.%s mmtel", para5GData["SIP_IP"], imsOrgHost) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", mmtelHost, mmtelHost)) + mrfcHost := fmt.Sprintf("%s mrfc.%s mrfc", para5GData["SIP_IP"], imsOrgHost) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", mrfcHost, mrfcHost)) + smsHost := fmt.Sprintf("%s smsc.%s smsc", para5GData["SIP_IP"], imsOrgHost) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", smsHost, smsHost)) + + cmdStrArr = append(cmdStrArr, "ims-stop || true && ims-start \n") + // 30s后停止服务 + // cmdStrArr = append(cmdStrArr, "nohup sh -c \"sleep 30s && sudo ims-stop\" > /dev/null 2>&1 & \n") + } else { + cmdStrArr = append(cmdStrArr, "ims-stop \n") + cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") + cmdStrArr = append(cmdStrArr, "ims-start \n") + } + } else { + if action == "install" { + para5GData := NewNeInfo.Para5GData + cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") + + // AMF配置修改 + if neTypeLower == "amf" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/amf/default/amfcfg.yaml /usr/local/etc/amf/amfcfg.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["AMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.120/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["N2_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sst: 1/sst: %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["SST"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sd: 000001/sd: %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["SD"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/- 4388/- %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["TAC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.130/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["AUSF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["UDM_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.150/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["SMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["PCF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["NRF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.200/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["LMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.210/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["NEF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/- internet/- %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["DNN_DATA"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s n2' /etc/hosts || echo '%s n2' | sudo tee -a /etc/hosts \n", para5GData["N2_IP"], para5GData["N2_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s amf' /etc/hosts || echo '%s amf' | sudo tee -a /etc/hosts \n", para5GData["AMF_IP"], para5GData["AMF_IP"])) + } + // AUSF配置修改 + if neTypeLower == "ausf" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/ausf/default/ausfcfg.yaml /usr/local/etc/ausf/ausfcfg.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.130/%s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["AUSF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["UDM_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["NRF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s ausf' /etc/hosts || echo '%s ausf' | sudo tee -a /etc/hosts \n", para5GData["AUSF_IP"], para5GData["AUSF_IP"])) + } + // UDM配置修改 + if neTypeLower == "udm" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/udmcfg.yaml /usr/local/etc/udm/udmcfg.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/nssai.yaml /usr/local/etc/udm/nssai.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/snssai.yaml /usr/local/etc/udm/snssai.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/as.yaml /usr/local/etc/udm/as.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/dnn.yaml /usr/local/etc/udm/dnn.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/scscfSet.yaml /usr/local/etc/udm/scscfSet.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["NRF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["UDM_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.130/%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["AUSF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["AMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/udm/as.yaml \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/udm/scscfSet.yaml \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sst: 1/sst: %s/g\" /usr/local/etc/udm/nssai.yaml \n", para5GData["SST"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sst: 1/sst: %s/g\" /usr/local/etc/udm/snssai.yaml \n", para5GData["SST"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sd: 000001/sd: %s/g\" /usr/local/etc/udm/nssai.yaml \n", para5GData["SD"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sd: 000001/sd: %s/g\" /usr/local/etc/udm/snssai.yaml \n", para5GData["SD"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/dnn: internet/dnn: %s/g\" /usr/local/etc/udm/snssai.yaml \n", para5GData["DNN_DATA"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/dnn: ims/dnn: %s/g\" /usr/local/etc/udm/snssai.yaml \n", para5GData["DNN_IMS"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/serviceSelection: 'internet'/serviceSelection: '%s'/g\" /usr/local/etc/udm/epsApn.yaml \n", para5GData["DNN_DATA"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/serviceSelection: 'ims'/serviceSelection: '%s'/g\" /usr/local/etc/udm/epsApn.yaml \n", para5GData["DNN_IMS"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/dnn: internet/dnn: %s/g\" /usr/local/etc/udm/dnn.yaml \n", para5GData["DNN_DATA"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/dnn: ims/dnn: %s/g\" /usr/local/etc/udm/dnn.yaml \n", para5GData["DNN_IMS"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.110/%s/g\" /usr/local/etc/udm/as.yaml \n", para5GData["SIP_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s udm' /etc/hosts || echo '%s udm' | sudo tee -a /etc/hosts \n", para5GData["UDM_IP"], para5GData["UDM_IP"])) + } + // SMF配置修改 + if neTypeLower == "smf" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smf/default/smf_conf.yaml /usr/local/etc/smf/smf_conf.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.110/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["SIP_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["AMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["UDM_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.150/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["SMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["PCF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["NRF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.190/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["UPF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|10.2.1.0/24|%s|g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["UE_POOL"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/internet/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["DNN_DATA"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s smf' /etc/hosts || echo '%s smf' | sudo tee -a /etc/hosts \n", para5GData["SMF_IP"], para5GData["SMF_IP"])) + } + // PCF配置修改 + if neTypeLower == "pcf" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/pcf/default/pcfcfg.yaml /usr/local/etc/pcf/pcfcfg.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["AMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["UDM_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["PCF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["NRF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.210/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["NEF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s pcf' /etc/hosts || echo '%s pcf' | sudo tee -a /etc/hosts \n", para5GData["PCF_IP"], para5GData["PCF_IP"])) + } + + // NSSF配置修改 + if neTypeLower == "nssf" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/nssf/default/nssfcfg.yaml /usr/local/etc/nssf/nssfcfg.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.170/%s/g\" /usr/local/etc/nssf/nssfcfg.yaml \n", para5GData["NSSF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/nssf/nssfcfg.yaml \n", para5GData["NRF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/nssf/nssfcfg.yaml \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/nssf/nssfcfg.yaml \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s nssf' /etc/hosts || echo '%s nssf' | sudo tee -a /etc/hosts \n", para5GData["NSSF_IP"], para5GData["NSSF_IP"])) + } + // NRF配置修改 + if neTypeLower == "nrf" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/nrf/default/nrfcfg.yaml /usr/local/etc/nrf/nrfcfg.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/nrf/nrfcfg.yaml \n", para5GData["NRF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/nrf/nrfcfg.yaml \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/nrf/nrfcfg.yaml \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s nrf' /etc/hosts || echo '%s nrf' | sudo tee -a /etc/hosts \n", para5GData["NRF_IP"], para5GData["NRF_IP"])) + } + + // UPF配置修改 + if neTypeLower == "upf" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/upf/default/upfcfg.yaml /usr/local/etc/upf/upfcfg.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/upf/default/upfForwarder_1.yaml /usr/local/etc/upf/upfForwarder_1.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.190/%s/g\" /usr/local/etc/upf/upfcfg.yaml \n", para5GData["UPF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/localhost/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UPF_IP"])) + // UE + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ueIpv4: 10.2.1.0/s/ueIpv4: 10.2.1.0/ueIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UE_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ueIpv4Mask: 255.255.255.0/s/ueIpv4Mask: 255.255.255.0/ueIpv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UE_MASK"])) + // N3 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.190/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/ipv4Mask: 255.255.240.0/s/ipv4Mask: 255.255.240.0/ipv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_MASK"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/gatewayIpv4: 192.168.1.254/s/gatewayIpv4: 192.168.1.254/gatewayIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_GW"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/interfacePCI: \"0000:00:00.0\"/s/interfacePCI: \"0000:00:00.0\"/interfacePCI: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_PCI"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/macAddr: \"00:00:00:00:00:00\"/s/macAddr: \"00:00:00:00:00:00\"/macAddr: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_MAC"])) + // 标准版 N6 + if para5GData["UPF_TYPE"] == "StandardUPF" { + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/driverType: .*/s/driverType: .*/driverType: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UPF_DRIVER_TYPE"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/systemNetworkCardName: .*/s/systemNetworkCardName: .*/systemNetworkCardName: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UPF_NIC_NAME"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/driverType: .*/s/driverType: .*/driverType: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UPF_DRIVER_TYPE"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/systemNetworkCardName: .*/s/systemNetworkCardName: .*/systemNetworkCardName: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UPF_NIC_NAME"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.191/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ipv4Mask: 255.255.240.0/s/ipv4Mask: 255.255.240.0/ipv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_MASK"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/gatewayIpv4: 192.168.1.254/s/gatewayIpv4: 192.168.1.254/gatewayIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_GW"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/interfacePCI: \"0000:00:00.0\"/s/interfacePCI: \"0000:00:00.0\"/interfacePCI: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_PCI"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/macAddr: \"00:00:00:00:00:00\"/s/macAddr: \"00:00:00:00:00:00\"/macAddr: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_MAC"])) + // 路由 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo ip route add '%s/%s' via '%s' \n", para5GData["UE_IP"], para5GData["UE_CIDR"], para5GData["N6_IP"])) + } + // 轻量版 + if para5GData["UPF_TYPE"] == "LightUPF" { + cmdStrArr = append(cmdStrArr, "sudo sed -i \"s/192.168.8.191/0.0.0.0/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo sed -i \"s/type: upfd/type: tun/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo sed -i 's/driverType: .*/driverType: \"\"/g' /usr/local/etc/upf/upfForwarder_1.yaml \n") + } + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s upf' /etc/hosts || echo '%s upf' | sudo tee -a /etc/hosts \n", para5GData["UPF_IP"], para5GData["UPF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s upfn3' /etc/hosts || echo '%s upfn3' | sudo tee -a /etc/hosts \n", para5GData["N3_IP"], para5GData["N3_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s upfn6' /etc/hosts || echo '%s upfn6' | sudo tee -a /etc/hosts \n", para5GData["N6_IP"], para5GData["N6_IP"])) + } + + // LMF配置修改 - 已不再维护,导致激活License失败 + // NEF配置修改 - SNMP无需License + if neTypeLower == "nef" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/nef/default/nef_conf.yaml /usr/local/etc/nef/nef_conf.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.110/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["IMS_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["AMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.130/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["AUSF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["UDM_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.150/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["SMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["PCF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.170/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["NSSF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["NRF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.190/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["UPF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.210/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["NEF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s nef' /etc/hosts || echo '%s nef' | sudo tee -a /etc/hosts \n", para5GData["NEF_IP"], para5GData["NEF_IP"])) + } + + // MME配置修改 - 4G + if neTypeLower == "mme" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/mme/default/mme.conf /usr/local/etc/mme/mme.conf \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/mme/mme.conf \n", para5GData["AMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.150/%s/g\" /usr/local/etc/mme/mme.conf \n", para5GData["SMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|192.168.8.220/20|%s|g\" /usr/local/etc/mme/mme.conf \n", para5GData["S1_MMEIP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|172.16.5.220/24|%s|g\" /usr/local/etc/mme/mme.conf \n", para5GData["S11_MMEIP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|172.16.5.220|%s|g\" /usr/local/etc/mme/mme.conf \n", para5GData["MME_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|172.16.5.221/24|%s|g\" /usr/local/etc/mme/mme.conf \n", para5GData["S10_MMEIP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/mme/mme.conf \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/\"00101\"/\"%s%s\"/g\" /usr/local/etc/mme/mme.conf \n", para5GData["MCC"], para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/MCC=\"001\"/MCC=\"%s\"/g' /usr/local/etc/mme/mme.conf \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/MCC = \"001\"/MCC = \"%s\"/g' /usr/local/etc/mme/mme.conf \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/MNC=\"01\";/MNC=\"%s\";/g' /usr/local/etc/mme/mme.conf \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/MNC = \"01\";/MNC = \"%s\";/g' /usr/local/etc/mme/mme.conf \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/TAC = \"1\";/TAC = \"%s\";/g' /usr/local/etc/mme/mme.conf \n", para5GData["TAC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/TAC = 1;/TAC = %s;/g' /usr/local/etc/mme/mme.conf \n", para5GData["TAC"])) + // SMF开启 + cmdStrArr = append(cmdStrArr, "sudo sed -i \"/^ *gxcfg:/,/^ *[^ ]/{s/enable: false/enable: true/;b};\" /usr/local/etc/smf/smf_conf.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s mme' /etc/hosts || echo '%s mme' | sudo tee -a /etc/hosts \n", para5GData["MME_IP"], para5GData["MME_IP"])) + } + // N3IWF配置修改 + if neTypeLower == "n3iwf" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/n3iwf/default/n3iwfcfg.yaml /usr/local/etc/n3iwf/n3iwfcfg.yaml \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/MCC: 001/MCC: %s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["MCC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/MNC: 01/MNC: %s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["MNC"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.12.161/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N3IWF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.12.160/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N3IWF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.27/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["UDM_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.239/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["SMF_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.22/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N2_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.161/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N3_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.160/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N6_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s n3iwf' /etc/hosts || echo '%s n3iwf' | sudo tee -a /etc/hosts \n", para5GData["N3IWF_IP"], para5GData["N3IWF_IP"])) + } + // SMSC配置修改 + if neTypeLower == "smsc" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smsc/default/mcms_conf.txt /usr/local/etc/smsc/mcms_conf.txt \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smsc/default/sccp.conf /usr/local/etc/smsc/sccp.conf \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smsc/default/smsc_config.yaml /usr/local/etc/smsc/smsc_config.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smsc/default/wxc2_sys.conf /usr/local/etc/smsc/wxc2_sys.conf \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.240/%s/g\" /usr/local/etc/smsc/mcms_conf.txt \n", para5GData["SMSC_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.240/%s/g\" /usr/local/etc/smsc/sccp.conf \n", para5GData["SMSC_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.123/%s/g\" /usr/local/etc/smsc/smsc_config.yaml \n", para5GData["SMSC_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.240/%s/g\" /usr/local/etc/smsc/wxc2_sys.conf \n", para5GData["SMSC_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s smsc' /etc/hosts || echo '%s smsc' | sudo tee -a /etc/hosts \n", para5GData["SMSC_IP"], para5GData["SMSC_IP"])) + } + + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) + // 30s后停止服务 + // cmdStrArr = append(cmdStrArr, fmt.Sprintf("nohup sh -c \"sleep 30s && sudo service %s stop\" > /dev/null 2>&1 & \n", neTypeLower)) + } else { + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s stop \n", neTypeLower)) + cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) + } + } + + // 安装操作有redis安装时需要重启 + if action == "install" && (neTypeLower == "ims" || neTypeLower == "udm") { + // adb + if strings.Contains(pkgCmdStr, "adb") { + para5GData := NewNeInfo.Para5GData + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/adb/default/adb.conf /usr/local/etc/adb/adb.conf \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind 127.0.0.1 %s/g\" /usr/local/etc/adb/adb.conf \n", para5GData["DB_IP"])) + cmdStrArr = append(cmdStrArr, "sudo service adb restart \n") + } + // kvdb + if strings.Contains(pkgCmdStr, "kvdb") { + para5GData := NewNeInfo.Para5GData + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/kvdb/default/kvdb.conf /usr/local/etc/kvdb/kvdb.conf \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind 127.0.0.1 %s/g\" /usr/local/etc/kvdb/kvdb.conf \n", para5GData["DB_IP"])) + cmdStrArr = append(cmdStrArr, "sudo service kvdb restart \n") + } + } + + // 删除软件包 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo rm %s \n", strings.Join(neFilePaths, " "))) + // 结束 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr)) + + return okFlagStr, cmdStrArr, nil +} + +// operateRun 操作版本-执行阶段 +func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]string, cmdStrArr []string, neType string, okFlagStr string) (string, error) { + // ssh连接会话 + clientSession, err := sshClient.NewClientSession(127, 42) + if err != nil { + return "", fmt.Errorf("neinfo ssh client session new err") + } + defer clientSession.Close() + + firstRead := true // 首次命令进行记录日志信息 + commandLineText := "" // 日志信息 + done := make(chan bool) // 完成信号 + // 超时退出 120s + timeoutTicker := time.NewTicker(120 * time.Second) + defer timeoutTicker.Stop() + // 实时读取SSH消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + go func() { + for { + select { + case <-timeoutTicker.C: + done <- true + return + case <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + // 非首次进行记录命令 + if !firstRead { + commandLineText += outputStr + } + + // IMS预输入 + if neType == "IMS" { + // IMS包 P/I/S-CSCF Config 配置覆盖 + if strings.Contains(outputStr, "(P/I/S-CSCF Config)? ") { + if pisCSCF, ok := preinput["pisCSCF"]; ok && pisCSCF != "" { + clientSession.Write(fmt.Sprintf("%s \n", pisCSCF)) + } else { + clientSession.Write("y \n") + } + continue + } + // MF包 etc下目录覆盖 + if strings.Contains(outputStr, "/usr/local/etc/mf directory? (Yes/No, default: No)") { + if pisCSCF, ok := preinput["updateMFetc"]; ok && pisCSCF != "" { + clientSession.Write(fmt.Sprintf("%s \n", pisCSCF)) + } else { + clientSession.Write("No \n") + } + continue + } + // MF包 share下目录覆盖 + if strings.Contains(outputStr, "/usr/local/share/mf directory? (Yes/No, default: No)") { + if pisCSCF, ok := preinput["updateMFshare"]; ok && pisCSCF != "" { + clientSession.Write(fmt.Sprintf("%s \n", pisCSCF)) + } else { + clientSession.Write("No \n") + } + continue + } + } + + // 命令终止符后继续执行命令 + suffix := strings.HasSuffix(outputStr, "~]# ") || strings.HasSuffix(outputStr, "~$ ") + if len(cmdStrArr) > 0 && suffix { + if firstRead { + firstRead = false + } + shiftElement := cmdStrArr[0] // 获取第一个元素 + cmdStrArr = cmdStrArr[1:] // 将第一个元素从切片中移除 + clientSession.Write(shiftElement) + continue + } + // 最后输出的退出标记 + if strings.LastIndex(outputStr, okFlagStr) > 5 { + done <- true + break + } + } + } + } + }() + // 等待写入协程完成 + <-done + + return commandLineText, nil +} + +// operateDome 操作版本-完成阶段 +func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error { + if action == "install" { + // 网元信息 + neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) + if neInfo.NeId != neVersion.NeId { + return fmt.Errorf("error found neinfo") + } + + // ========= 网元OAM配置文件 start ========== + if err := NewNeInfo.NeConfOAMWirteSync(neInfo, nil, true); err != nil { + return fmt.Errorf("error wirte OAM file info") + } + // ========= 网元OAM配置文件 end =========== + + // SMSC配置修改IMS和UDM 配置 + if neInfo.NeType == "SMSC" { + para5GData := NewNeInfo.Para5GData + mnc_mcc := fmt.Sprintf("mnc%s.mcc%s", para5GData["MNC_DOMAIN"], para5GData["MCC"]) + smscHost := fmt.Sprintf("%s smsc.ims.%s.3gppnetwork.org", para5GData["SMSC_IP"], mnc_mcc) + smscHostCMD := fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", smscHost, smscHost) + smscIPCMD := fmt.Sprintf("grep -qxF '%s smsc' /etc/hosts || echo '%s smsc' | sudo tee -a /etc/hosts \n", para5GData["SMSC_IP"], para5GData["SMSC_IP"]) + smsHost := fmt.Sprintf("sudo sed -i '/^%s smsc.*smsc$/c\\' /etc/hosts", para5GData["SIP_IP"]) + + // IMS 配置 + imsNEs := NewNeInfo.SelectList(model.NeInfo{NeType: "IMS"}, false, false) + for _, v := range imsNEs { + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscIPCMD) + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscHostCMD) + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smsHost) + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, "sudo sed -i '/^#!define WITH_SMS/ s/^/#/' /usr/local/etc/ims/vars.cfg") + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, "ims-stop || true && ims-start") + } + // UDM 配置 + smscASName := fmt.Sprintf("sudo sed -i \"/- name: 'sms_as'/{n;s|serverName: .*|serverName: 'sip:%s:5060'|}\" /usr/local/etc/udm/as.yaml", para5GData["SMSC_IP"]) + smscASAddress := fmt.Sprintf("sudo sed -i \"/- name: 'sms_as'/{n;n;n;s|diameterAddress: .*|diameterAddress: 'smsc.ims.%s.3gppnetwork.org'|}\" /usr/local/etc/udm/as.yaml", mnc_mcc) + udmNEs := NewNeInfo.SelectList(model.NeInfo{NeType: "UDM"}, false, false) + for _, v := range udmNEs { + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscIPCMD) + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscHostCMD) + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscASName) + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscASAddress) + NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, "sudo service udm restart") + } + } + } + + // 更新Version + verInfo := r.SelectByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) + if verInfo.NeId == neVersion.NeId { + curName := verInfo.Name + curVersion := verInfo.Version + curPath := verInfo.Path + if action == "install" { + verInfo.Name = neVersion.NewName + verInfo.Version = neVersion.NewVersion + verInfo.Path = neVersion.NewPath + verInfo.PreName = "-" + verInfo.PreVersion = "-" + verInfo.PrePath = "-" + verInfo.NewName = "-" + verInfo.NewVersion = "-" + verInfo.NewPath = "-" + } + if action == "upgrade" { + verInfo.Name = neVersion.NewName + verInfo.Version = neVersion.NewVersion + verInfo.Path = neVersion.NewPath + verInfo.PreName = curName + verInfo.PreVersion = curVersion + verInfo.PrePath = curPath + verInfo.NewName = "-" + verInfo.NewVersion = "-" + verInfo.NewPath = "-" + } + if action == "rollback" { + verInfo.Name = neVersion.PreName + verInfo.Version = neVersion.PreVersion + verInfo.Path = neVersion.PrePath + verInfo.PreName = curName + verInfo.PreVersion = curVersion + verInfo.PrePath = curPath + } + + verInfo.Status = "1" + r.Update(verInfo) + } + return nil } diff --git a/src/modules/network_element/service/ne_version.impl.go b/src/modules/network_element/service/ne_version.impl.go deleted file mode 100644 index 13a281d..0000000 --- a/src/modules/network_element/service/ne_version.impl.go +++ /dev/null @@ -1,642 +0,0 @@ -package service - -import ( - "fmt" - "os" - "path/filepath" - "strings" - "time" - - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/ssh" - "nms_cxy/src/modules/network_element/model" - "nms_cxy/src/modules/network_element/repository" -) - -// 实例化服务层 NeVersionImpl 结构体 -var NewNeVersionImpl = &NeVersionImpl{ - neVersionRepository: repository.NewNeVersionImpl, -} - -// NeVersionImpl 网元版本信息 服务层处理 -type NeVersionImpl struct { - // 网元版本信息表 - neVersionRepository repository.INeVersion -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeVersionImpl) SelectPage(query map[string]any) map[string]any { - return r.neVersionRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeVersionImpl) SelectList(neVersion model.NeVersion) []model.NeVersion { - return r.neVersionRepository.SelectList(neVersion) -} - -// SelectByIds 通过ID查询 -func (r *NeVersionImpl) SelectById(id string) model.NeVersion { - if id == "" { - return model.NeVersion{} - } - neVersions := r.neVersionRepository.SelectByIds([]string{id}) - if len(neVersions) > 0 { - return neVersions[0] - } - return model.NeVersion{} -} - -// Insert 新增信息 -func (r *NeVersionImpl) Insert(neVersion model.NeVersion) string { - return r.neVersionRepository.Insert(neVersion) -} - -// Update 修改信息 -func (r *NeVersionImpl) Update(neVersion model.NeVersion) int64 { - return r.neVersionRepository.Update(neVersion) -} - -// DeleteByIds 批量删除信息 -func (r *NeVersionImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rowIds := r.neVersionRepository.SelectByIds(ids) - if len(rowIds) <= 0 { - return 0, fmt.Errorf("neVersion.noData") - } - - if len(rowIds) == len(ids) { - rows := r.neVersionRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// SelectByNeTypeAndNeID 通过网元类型和网元ID查询 -func (r *NeVersionImpl) SelectByNeTypeAndNeID(neType, neId string) model.NeVersion { - neVersions := r.neVersionRepository.SelectList(model.NeVersion{ - NeType: neType, - NeId: neId, - }) - if len(neVersions) > 0 { - return neVersions[0] - } - return model.NeVersion{} -} - -// Operate 操作版本上传到网元主机执行命令 -// -// action 安装行为:install upgrade rollback -func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neVersion.NeType, neVersion.NeId) - if err != nil { - return "", err - } - defer sshClient.Close() - - // ========= 文件传输阶段 ========= - softwarePath := neVersion.Path - if action == "install" || action == "upgrade" { - softwarePath = neVersion.NewPath - } - if action == "rollback" { - softwarePath = neVersion.PrePath - } - neFilePaths, err := r.operateFile(sshClient, softwarePath) - if err != nil { - return "", err - } - - // ========= 安装时设置 ========= - if action == "install" { - // 网元公共配置文件 - para5GMap, err := NewNeInfoImpl.NeConfPara5GRead() - if para5GMap == nil || err != nil { - return "", fmt.Errorf("error read para5G file info") - } - if err := NewNeInfoImpl.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { - return "", fmt.Errorf("error wirte para5G file info") - } - } - - // ========= 命令生成阶段 ========= - okFlagStr, cmdStrArr, err := r.operateCommand(action, neVersion.NeType, neFilePaths) - if err != nil { - return "", err - } - - // ========= 执行阶段 ========= - commandLine, err := r.operateRun(sshClient, preinput, cmdStrArr, neVersion.NeType, okFlagStr) - if err != nil { - return "", err - } - - // ========= 完成阶段 ========= - if strings.LastIndex(commandLine, okFlagStr) > 5 { - if err := r.operateDome(action, neVersion); err != nil { - return "", err - } - } - return commandLine, nil -} - -// operateDome 操作版本-文件传输阶段 -func (r *NeVersionImpl) operateFile(sshClient *ssh.ConnSSH, softwarePath string) ([]string, error) { - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return nil, err - } - defer sftpClient.Close() - - nePath := "/tmp" - copyFileToNeMap := map[string]string{} - - // 统一处理多个文件和单个文件的情况 - var softwarePaths []string - if strings.Contains(softwarePath, ",") { - softwarePaths = strings.Split(softwarePath, ",") - } else { - softwarePaths = []string{softwarePath} - } - - for _, path := range softwarePaths { - // 检查文件是否存在 - localFilePath := file.ParseUploadFilePath(path) - if _, err := os.Stat(localFilePath); err != nil { - return nil, fmt.Errorf("file read failure") - } - - fileName := filepath.Base(path) - neFilePath := fmt.Sprintf("%s/%s", nePath, fileName) - copyFileToNeMap[localFilePath] = neFilePath - } - - // 上传软件包到 /tmp - neFilePaths := []string{} - for k, v := range copyFileToNeMap { - if err = sftpClient.CopyFileLocalToRemote(k, v); err != nil { - return nil, fmt.Errorf("error uploading package") - } - neFilePaths = append(neFilePaths, v) - } - return neFilePaths, nil -} - -// operateDome 操作版本-命令生成阶段 -func (r *NeVersionImpl) operateCommand(action, neType string, neFilePaths []string) (string, []string, error) { - neTypeLower := strings.ToLower(neType) - // 命令终止结束标记 - okFlagStr := fmt.Sprintf("%s version %s successful!", neTypeLower, action) - // 安装软件包 - pkgCmdStr := fmt.Sprintf("sudo dpkg -i %s", strings.Join(neFilePaths, " ")) - fileExt := filepath.Ext(strings.ToLower(neFilePaths[0])) - if strings.HasSuffix(fileExt, "rpm") { - pkgCmdStr = fmt.Sprintf("sudo rpm -Uvh %s", strings.Join(neFilePaths, " ")) - } - - // 组合命令输入 - cmdStrArr := []string{} - if neType == "OMC" { - omcStrArr := []string{} - omcStrArr = append(omcStrArr, pkgCmdStr) - if action == "install" { - omcStrArr = append(omcStrArr, "/usr/local/omc/bin/setomc.sh -m install") // 初始化数据库 - } else { - omcStrArr = append(omcStrArr, "/usr/local/omc/bin/setomc.sh -m upgrade") // 升级数据库 - } - omcStrArr = append(omcStrArr, "sudo systemctl restart omc") // 重启服务 - omcStrArr = append(omcStrArr, fmt.Sprintf("sudo rm %s", strings.Join(neFilePaths, " "))) // 删除软件包 - - // 2s后安装 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("nohup sh -c \"sleep 2s && %s\" > /tmp/omc_%s.out 2>&1 & \n", strings.Join(omcStrArr, " && "), action)) - // 结束 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr)) - return okFlagStr, cmdStrArr, nil - } else if neType == "IMS" { - if action == "install" { - para5GData := NewNeInfoImpl.Para5GData - cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") - - // 公网 PLMN地址 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("/usr/local/etc/ims/default/tools/modipplmn.sh %s %s %s \n", para5GData["SIP_IP"], para5GData["MCC"], para5GData["MNC"])) - // 内网 服务地址 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("/usr/local/etc/ims/default/tools/modintraip.sh %s \n", para5GData["IMS_IP"])) - // IWF连接PCF服务 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/iwf/iwf_conf.yaml \n", para5GData["PCF_IP"])) - // 设置 HOST - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s ims' /etc/hosts || echo '%s ims' | sudo tee -a /etc/hosts \n", para5GData["IMS_IP"], para5GData["IMS_IP"])) - mnc_mcc := fmt.Sprintf("mnc%s.mcc%s", para5GData["MNC_DOMAIN"], para5GData["MCC"]) - hssHost := fmt.Sprintf("%s hss.ims.%s.3gppnetwork.org hss", para5GData["UDM_IP"], mnc_mcc) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", hssHost, hssHost)) - pcrfHost := fmt.Sprintf("%s pcrf.epc.%s.3gppnetwork.org pcrf", para5GData["IMS_IP"], mnc_mcc) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", pcrfHost, pcrfHost)) - imsOrgHost := fmt.Sprintf("ims.%s.3gppnetwork.org", mnc_mcc) - imsHost := fmt.Sprintf("%s %s ims", para5GData["SIP_IP"], imsOrgHost) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", imsHost, imsHost)) - pcscfHost := fmt.Sprintf("%s pcscf.%s pcscf", para5GData["SIP_IP"], imsOrgHost) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", pcscfHost, pcscfHost)) - icscfHost := fmt.Sprintf("%s icscf.%s icscf", para5GData["SIP_IP"], imsOrgHost) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", icscfHost, icscfHost)) - scscfHost := fmt.Sprintf("%s scscf.%s scscf", para5GData["SIP_IP"], imsOrgHost) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", scscfHost, scscfHost)) - mmtelHost := fmt.Sprintf("%s mmtel.%s mmtel", para5GData["SIP_IP"], imsOrgHost) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", mmtelHost, mmtelHost)) - mrfcHost := fmt.Sprintf("%s mrfc.%s mrfc", para5GData["SIP_IP"], imsOrgHost) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", mrfcHost, mrfcHost)) - smsHost := fmt.Sprintf("%s smsc.%s smsc", para5GData["SIP_IP"], imsOrgHost) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", smsHost, smsHost)) - - cmdStrArr = append(cmdStrArr, "ims-stop || true && ims-start \n") - // 30s后停止服务 - // cmdStrArr = append(cmdStrArr, "nohup sh -c \"sleep 30s && sudo ims-stop\" > /dev/null 2>&1 & \n") - } else { - cmdStrArr = append(cmdStrArr, "ims-stop \n") - cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") - cmdStrArr = append(cmdStrArr, "ims-start \n") - } - } else { - if action == "install" { - para5GData := NewNeInfoImpl.Para5GData - cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") - - // AMF配置修改 - if neTypeLower == "amf" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/amf/default/amfcfg.yaml /usr/local/etc/amf/amfcfg.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["AMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.120/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["N2_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sst: 1/sst: %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["SST"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sd: 000001/sd: %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["SD"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/- 4388/- %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["TAC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.130/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["AUSF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["UDM_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.150/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["SMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["PCF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["NRF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.200/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["LMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.210/%s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["NEF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/- internet/- %s/g\" /usr/local/etc/amf/amfcfg.yaml \n", para5GData["DNN_DATA"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s n2' /etc/hosts || echo '%s n2' | sudo tee -a /etc/hosts \n", para5GData["N2_IP"], para5GData["N2_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s amf' /etc/hosts || echo '%s amf' | sudo tee -a /etc/hosts \n", para5GData["AMF_IP"], para5GData["AMF_IP"])) - } - // AUSF配置修改 - if neTypeLower == "ausf" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/ausf/default/ausfcfg.yaml /usr/local/etc/ausf/ausfcfg.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.130/%s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["AUSF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["UDM_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["NRF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/ausf/ausfcfg.yaml \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s ausf' /etc/hosts || echo '%s ausf' | sudo tee -a /etc/hosts \n", para5GData["AUSF_IP"], para5GData["AUSF_IP"])) - } - // UDM配置修改 - if neTypeLower == "udm" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/udmcfg.yaml /usr/local/etc/udm/udmcfg.yaml \n") - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/nssai.yaml /usr/local/etc/udm/nssai.yaml \n") - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/snssai.yaml /usr/local/etc/udm/snssai.yaml \n") - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/as.yaml /usr/local/etc/udm/as.yaml \n") - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/dnn.yaml /usr/local/etc/udm/dnn.yaml \n") - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/udm/default/scscfSet.yaml /usr/local/etc/udm/scscfSet.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["NRF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["UDM_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.130/%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["AUSF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["AMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/udm/udmcfg.yaml \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/udm/as.yaml \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/udm/scscfSet.yaml \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sst: 1/sst: %s/g\" /usr/local/etc/udm/nssai.yaml \n", para5GData["SST"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sst: 1/sst: %s/g\" /usr/local/etc/udm/snssai.yaml \n", para5GData["SST"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sd: 000001/sd: %s/g\" /usr/local/etc/udm/nssai.yaml \n", para5GData["SD"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/sd: 000001/sd: %s/g\" /usr/local/etc/udm/snssai.yaml \n", para5GData["SD"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/dnn: internet/dnn: %s/g\" /usr/local/etc/udm/snssai.yaml \n", para5GData["DNN_DATA"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/dnn: ims/dnn: %s/g\" /usr/local/etc/udm/snssai.yaml \n", para5GData["DNN_IMS"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/serviceSelection: 'internet'/serviceSelection: '%s'/g\" /usr/local/etc/udm/epsApn.yaml \n", para5GData["DNN_DATA"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/serviceSelection: 'ims'/serviceSelection: '%s'/g\" /usr/local/etc/udm/epsApn.yaml \n", para5GData["DNN_IMS"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/dnn: internet/dnn: %s/g\" /usr/local/etc/udm/dnn.yaml \n", para5GData["DNN_DATA"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/dnn: ims/dnn: %s/g\" /usr/local/etc/udm/dnn.yaml \n", para5GData["DNN_IMS"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.110/%s/g\" /usr/local/etc/udm/as.yaml \n", para5GData["SIP_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s udm' /etc/hosts || echo '%s udm' | sudo tee -a /etc/hosts \n", para5GData["UDM_IP"], para5GData["UDM_IP"])) - } - // SMF配置修改 - if neTypeLower == "smf" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smf/default/smf_conf.yaml /usr/local/etc/smf/smf_conf.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.110/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["SIP_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["AMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["UDM_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.150/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["SMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["PCF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["NRF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.190/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["UPF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|10.2.1.0/24|%s|g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["UE_POOL"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/internet/%s/g\" /usr/local/etc/smf/smf_conf.yaml \n", para5GData["DNN_DATA"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s smf' /etc/hosts || echo '%s smf' | sudo tee -a /etc/hosts \n", para5GData["SMF_IP"], para5GData["SMF_IP"])) - } - // PCF配置修改 - if neTypeLower == "pcf" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/pcf/default/pcfcfg.yaml /usr/local/etc/pcf/pcfcfg.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["AMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["UDM_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["PCF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["NRF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.210/%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["NEF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/pcf/pcfcfg.yaml \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s pcf' /etc/hosts || echo '%s pcf' | sudo tee -a /etc/hosts \n", para5GData["PCF_IP"], para5GData["PCF_IP"])) - } - - // NSSF配置修改 - if neTypeLower == "nssf" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/nssf/default/nssfcfg.yaml /usr/local/etc/nssf/nssfcfg.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.170/%s/g\" /usr/local/etc/nssf/nssfcfg.yaml \n", para5GData["NSSF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/nssf/nssfcfg.yaml \n", para5GData["NRF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/nssf/nssfcfg.yaml \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/nssf/nssfcfg.yaml \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s nssf' /etc/hosts || echo '%s nssf' | sudo tee -a /etc/hosts \n", para5GData["NSSF_IP"], para5GData["NSSF_IP"])) - } - // NRF配置修改 - if neTypeLower == "nrf" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/nrf/default/nrfcfg.yaml /usr/local/etc/nrf/nrfcfg.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/nrf/nrfcfg.yaml \n", para5GData["NRF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mcc: 001/mcc: %s/g\" /usr/local/etc/nrf/nrfcfg.yaml \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc: 01/mnc: %s/g\" /usr/local/etc/nrf/nrfcfg.yaml \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s nrf' /etc/hosts || echo '%s nrf' | sudo tee -a /etc/hosts \n", para5GData["NRF_IP"], para5GData["NRF_IP"])) - } - - // UPF配置修改 - if neTypeLower == "upf" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/upf/default/upfcfg.yaml /usr/local/etc/upf/upfcfg.yaml \n") - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/upf/default/upfForwarder_1.yaml /usr/local/etc/upf/upfForwarder_1.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.190/%s/g\" /usr/local/etc/upf/upfcfg.yaml \n", para5GData["UPF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/localhost/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UPF_IP"])) - // UE - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ueIpv4: 10.2.1.0/s/ueIpv4: 10.2.1.0/ueIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UE_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ueIpv4Mask: 255.255.255.0/s/ueIpv4Mask: 255.255.255.0/ueIpv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UE_MASK"])) - // N3 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.190/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/ipv4Mask: 255.255.240.0/s/ipv4Mask: 255.255.240.0/ipv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_MASK"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/gatewayIpv4: 192.168.1.254/s/gatewayIpv4: 192.168.1.254/gatewayIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_GW"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/interfacePCI: \"0000:00:00.0\"/s/interfacePCI: \"0000:00:00.0\"/interfacePCI: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_PCI"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/macAddr: \"00:00:00:00:00:00\"/s/macAddr: \"00:00:00:00:00:00\"/macAddr: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_MAC"])) - // 标准版 N6 - if para5GData["UPF_TYPE"] == "StandardUPF" { - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.191/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ipv4Mask: 255.255.240.0/s/ipv4Mask: 255.255.240.0/ipv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_MASK"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/gatewayIpv4: 192.168.1.254/s/gatewayIpv4: 192.168.1.254/gatewayIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_GW"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/interfacePCI: \"0000:00:00.0\"/s/interfacePCI: \"0000:00:00.0\"/interfacePCI: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_PCI"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/macAddr: \"00:00:00:00:00:00\"/s/macAddr: \"00:00:00:00:00:00\"/macAddr: \"%s\"/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_MAC"])) - // 路由 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo ip route add '%s/%s' via '%s' \n", para5GData["UE_IP"], para5GData["UE_CIDR"], para5GData["N6_IP"])) - } - // 轻量版 - if para5GData["UPF_TYPE"] == "LightUPF" { - cmdStrArr = append(cmdStrArr, "sudo sed -i \"s/192.168.8.191/0.0.0.0/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n") - cmdStrArr = append(cmdStrArr, "sudo sed -i \"s/type: upfd/type: tun/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n") - cmdStrArr = append(cmdStrArr, "sudo sed -i 's/driverType: vmxnet3/driverType: \"\"/g' /usr/local/etc/upf/upfForwarder_1.yaml \n") - } - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s upf' /etc/hosts || echo '%s upf' | sudo tee -a /etc/hosts \n", para5GData["UPF_IP"], para5GData["UPF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s upfn3' /etc/hosts || echo '%s upfn3' | sudo tee -a /etc/hosts \n", para5GData["N3_IP"], para5GData["N3_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s upfn6' /etc/hosts || echo '%s upfn6' | sudo tee -a /etc/hosts \n", para5GData["N6_IP"], para5GData["N6_IP"])) - } - - // LMF配置修改 - 已不再维护,导致激活License失败 - // NEF配置修改 - SNMP无需License - if neTypeLower == "nef" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/nef/default/nef_conf.yaml /usr/local/etc/nef/nef_conf.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.110/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["IMS_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["AMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.130/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["AUSF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.140/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["UDM_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.150/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["SMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["PCF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.170/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["NSSF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.180/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["NRF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.190/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["UPF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.210/%s/g\" /usr/local/etc/nef/nef_conf.yaml \n", para5GData["NEF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s nef' /etc/hosts || echo '%s nef' | sudo tee -a /etc/hosts \n", para5GData["NEF_IP"], para5GData["NEF_IP"])) - } - - // MME配置修改 - 4G - if neTypeLower == "mme" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/mme/default/mme.conf /usr/local/etc/mme/mme.conf \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.120/%s/g\" /usr/local/etc/mme/mme.conf \n", para5GData["AMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.150/%s/g\" /usr/local/etc/mme/mme.conf \n", para5GData["SMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|192.168.8.220/20|%s|g\" /usr/local/etc/mme/mme.conf \n", para5GData["S1_MMEIP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|172.16.5.220/24|%s|g\" /usr/local/etc/mme/mme.conf \n", para5GData["S11_MMEIP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|172.16.5.220|%s|g\" /usr/local/etc/mme/mme.conf \n", para5GData["MME_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s|172.16.5.221/24|%s|g\" /usr/local/etc/mme/mme.conf \n", para5GData["S10_MMEIP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/mnc001.mcc001/mnc%s.mcc%s/g\" /usr/local/etc/mme/mme.conf \n", para5GData["MNC_DOMAIN"], para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/\"00101\"/\"%s%s\"/g\" /usr/local/etc/mme/mme.conf \n", para5GData["MCC"], para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/MCC=\"001\"/MCC=\"%s\"/g' /usr/local/etc/mme/mme.conf \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/MCC = \"001\"/MCC = \"%s\"/g' /usr/local/etc/mme/mme.conf \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/MNC=\"01\";/MNC=\"%s\";/g' /usr/local/etc/mme/mme.conf \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/MNC = \"01\";/MNC = \"%s\";/g' /usr/local/etc/mme/mme.conf \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/TAC = \"1\";/TAC = \"%s\";/g' /usr/local/etc/mme/mme.conf \n", para5GData["TAC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i 's/TAC = 1;/TAC = %s;/g' /usr/local/etc/mme/mme.conf \n", para5GData["TAC"])) - // SMF开启 - cmdStrArr = append(cmdStrArr, "sudo sed -i \"/^ *gxcfg:/,/^ *[^ ]/{s/enable: false/enable: true/;b};\" /usr/local/etc/smf/smf_conf.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s mme' /etc/hosts || echo '%s mme' | sudo tee -a /etc/hosts \n", para5GData["MME_IP"], para5GData["MME_IP"])) - } - // N3IWF配置修改 - if neTypeLower == "n3iwf" { - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/n3iwf/default/n3iwfcfg.yaml /usr/local/etc/n3iwf/n3iwfcfg.yaml \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/MCC: 001/MCC: %s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["MCC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/MNC: 01/MNC: %s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["MNC"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.12.161/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N3IWF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.12.160/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N3IWF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.27/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["UDM_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.239/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["SMF_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.22/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N2_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.161/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N3_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.160/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N6_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s n3iwf' /etc/hosts || echo '%s n3iwf' | sudo tee -a /etc/hosts \n", para5GData["N3IWF_IP"], para5GData["N3IWF_IP"])) - } - - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) - // 30s后停止服务 - // cmdStrArr = append(cmdStrArr, fmt.Sprintf("nohup sh -c \"sleep 30s && sudo service %s stop\" > /dev/null 2>&1 & \n", neTypeLower)) - } else { - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s stop \n", neTypeLower)) - cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) - } - } - - // 安装操作有redis安装时需要重启 - if action == "install" && (neTypeLower == "ims" || neTypeLower == "udm") { - // adb - if strings.Contains(pkgCmdStr, "adb") { - para5GData := NewNeInfoImpl.Para5GData - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/adb/default/adb.conf /usr/local/etc/adb/adb.conf \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind %s/g\" /usr/local/etc/adb/adb.conf \n", para5GData["DB_IP"])) - cmdStrArr = append(cmdStrArr, "sudo service adb restart \n") - } - // kvdb - if strings.Contains(pkgCmdStr, "kvdb") { - para5GData := NewNeInfoImpl.Para5GData - cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/kvdb/default/kvdb.conf /usr/local/etc/kvdb/kvdb.conf \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind %s/g\" /usr/local/etc/kvdb/kvdb.conf \n", para5GData["DB_IP"])) - cmdStrArr = append(cmdStrArr, "sudo service kvdb restart \n") - } - } - - // 删除软件包 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo rm %s \n", strings.Join(neFilePaths, " "))) - // 结束 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr)) - - return okFlagStr, cmdStrArr, nil -} - -// operateDome 操作版本-执行阶段 -func (r *NeVersionImpl) operateRun(sshClient *ssh.ConnSSH, preinput map[string]string, cmdStrArr []string, neType string, okFlagStr string) (string, error) { - // ssh连接会话 - clientSession, err := sshClient.NewClientSession(127, 42) - if err != nil { - return "", fmt.Errorf("neinfo ssh client session new err") - } - defer clientSession.Close() - - firstRead := true // 首次命令进行记录日志信息 - commandLineText := "" // 日志信息 - done := make(chan bool) // 完成信号 - // 超时退出 120s - timeoutTicker := time.NewTicker(120 * time.Second) - defer timeoutTicker.Stop() - // 实时读取SSH消息直接输出 - msTicker := time.NewTicker(100 * time.Millisecond) - defer msTicker.Stop() - go func() { - for { - select { - case <-timeoutTicker.C: - done <- true - return - case <-msTicker.C: - outputByte := clientSession.Read() - if len(outputByte) > 0 { - outputStr := string(outputByte) - // 非首次进行记录命令 - if !firstRead { - commandLineText += outputStr - } - - // IMS预输入 - if neType == "IMS" { - // IMS包 P/I/S-CSCF Config 配置覆盖 - if strings.Contains(outputStr, "(P/I/S-CSCF Config)? ") { - if pisCSCF, ok := preinput["pisCSCF"]; ok && pisCSCF != "" { - clientSession.Write(fmt.Sprintf("%s \n", pisCSCF)) - } else { - clientSession.Write("y \n") - } - continue - } - // MF包 etc下目录覆盖 - if strings.Contains(outputStr, "/usr/local/etc/mf directory? (Yes/No, default: No)") { - if pisCSCF, ok := preinput["updateMFetc"]; ok && pisCSCF != "" { - clientSession.Write(fmt.Sprintf("%s \n", pisCSCF)) - } else { - clientSession.Write("No \n") - } - continue - } - // MF包 share下目录覆盖 - if strings.Contains(outputStr, "/usr/local/share/mf directory? (Yes/No, default: No)") { - if pisCSCF, ok := preinput["updateMFshare"]; ok && pisCSCF != "" { - clientSession.Write(fmt.Sprintf("%s \n", pisCSCF)) - } else { - clientSession.Write("No \n") - } - continue - } - } - - // 命令终止符后继续执行命令 - suffix := strings.HasSuffix(outputStr, "~]# ") || strings.HasSuffix(outputStr, "~$ ") - if len(cmdStrArr) > 0 && suffix { - if firstRead { - firstRead = false - } - shiftElement := cmdStrArr[0] // 获取第一个元素 - cmdStrArr = cmdStrArr[1:] // 将第一个元素从切片中移除 - clientSession.Write(shiftElement) - continue - } - // 最后输出的退出标记 - if strings.LastIndex(outputStr, okFlagStr) > 5 { - done <- true - break - } - } - } - } - }() - // 等待写入协程完成 - <-done - - return commandLineText, nil -} - -// operateDome 操作版本-完成阶段 -func (r *NeVersionImpl) operateDome(action string, neVersion model.NeVersion) error { - if action == "install" { - // 网元信息 - neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) - if neInfo.NeId != neVersion.NeId { - return fmt.Errorf("error found neinfo") - } - // ========= 网元OAM配置文件 start ========== - if err := NewNeInfoImpl.NeConfOAMSync(neInfo, nil, true); err != nil { - return fmt.Errorf("error wirte OAM file info") - } - // ========= 网元OAM配置文件 end =========== - } - - // 更新Version - verInfo := r.SelectByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) - if verInfo.NeId == neVersion.NeId { - curName := verInfo.Name - curVersion := verInfo.Version - curPath := verInfo.Path - if action == "install" { - verInfo.Name = neVersion.NewName - verInfo.Version = neVersion.NewVersion - verInfo.Path = neVersion.NewPath - verInfo.PreName = "-" - verInfo.PreVersion = "-" - verInfo.PrePath = "-" - verInfo.NewName = "-" - verInfo.NewVersion = "-" - verInfo.NewPath = "-" - } - if action == "upgrade" { - verInfo.Name = neVersion.NewName - verInfo.Version = neVersion.NewVersion - verInfo.Path = neVersion.NewPath - verInfo.PreName = curName - verInfo.PreVersion = curVersion - verInfo.PrePath = curPath - verInfo.NewName = "-" - verInfo.NewVersion = "-" - verInfo.NewPath = "-" - } - if action == "rollback" { - verInfo.Name = neVersion.PreName - verInfo.Version = neVersion.PreVersion - verInfo.Path = neVersion.PrePath - verInfo.PreName = curName - verInfo.PreVersion = curVersion - verInfo.PrePath = curPath - } - - verInfo.Status = "1" - NewNeVersionImpl.Update(verInfo) - } - return nil -} diff --git a/src/modules/nms_cxy/README.md b/src/modules/nms_cxy/README.md index b4da127..24f8c9e 100644 --- a/src/modules/nms_cxy/README.md +++ b/src/modules/nms_cxy/README.md @@ -1,6 +1,15 @@ ## 北向模块 - 中国星网网络创新研究院 -以OMC网管代码为基础,模块相关配置内部处理 +以 OMC 网管代码为基础,模块相关配置内部处理 + +### 添加依赖 + +```sh +# 模块依赖 v1.43.3 +go get github.com/IBM/sarama +# 模块依赖 v7.0.76 +go get github.com/minio/minio-go/v7 +``` ### 引入模块 @@ -8,7 +17,7 @@ ```golang import ( - nmscxy "nms_cxy/src/modules/nms_cxy" + nmscxy "be.ems/src/modules/nms_cxy" ) // 初始模块路由 @@ -18,11 +27,6 @@ import ( nmscxy.Setup(app) // ... //} - - -// 模块依赖 -// github.com/IBM/sarama v1.43.3 -// github.com/minio/minio-go/v7 v7.0.76 ``` ### 模块配置拓展 @@ -69,12 +73,12 @@ nmsCXY: ## Kafka Topic -告警数据订阅 topic,名称为:专业编码-厂商编码-OMC 编号-数据类别(固定为 FM) -资源数据订阅 topic,名称为:专业编码-厂商编码-OMC 编号-网元类型-数据类别(固定为 NRM)-资源对象类型简称(一般没有) +- HX-AT-001-FM :告警数据订阅 topic,名称为:专业编码-厂商编码-OMC 编号-数据类别(固定为 FM) +- 资源数据订阅 topic,名称为:专业编码-厂商编码-OMC 编号-网元类型-数据类别(固定为 NRM)-资源对象类型简称(一般没有) ## 更新数据库脚本 -保留文件脚本:`build\system\usr\local\omc\etc\db\install\z_nms_cxy.sql` +保留文件脚本:`build\system\usr\local\omc\etc\db\common\z_nms_cxy.sql` ```sql SET NAMES utf8mb4; diff --git a/src/modules/nms_cxy/add_file/omc.yaml b/src/modules/nms_cxy/add_file/omc.yaml new file mode 100644 index 0000000..31f9f0d --- /dev/null +++ b/src/modules/nms_cxy/add_file/omc.yaml @@ -0,0 +1,221 @@ +# file: log file name +# level: /trace/debug/info/warn/error/fatal, default: debug +# duration: rotation time with xx hours, example: 1/12/24 hours +# count: rotation count of log, default is 30 rotation +logger: + file: /usr/local/omc/log/omc.log + level: warn + duration: 24 + count: 90 + +# rest agent listen ipv4/v6 and port, support multiple routines +# ip: 0.0.0.0 or ::0, support IPv4/v6 +# clientAuthType: 0:NoClientCert (default), 1:RequestClientCert, 2:RequireAnyClientCert, +# 3:VerifyClientCertIfGiven, 4:RequireAndVerifyClientCerts +rest: + - ipv4: 127.0.0.1 + ipv6: + port: 33030 + +webServer: + enabled: false + rootDir: /usr/local/omc/htdocs/front + listen: + - addr: :80 + schema: http + - addr: :443 + schema: https + clientAuthType: 0 + caFile: /usr/local/omc/etc/certs/omc-ca.crt + certFile: /usr/local/omc/etc/certs/omc-server.crt + keyFile: /usr/local/omc/etc/certs/omc-server.key + +database: + type: mysql + user: root + password: 1000omc@kp! + host: 127.0.0.1 + port: 33066 + name: omc_db + connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True + backup: /usr/local/omc/database + +# Redis data cache +redis: + dataSource: + # OMC system db + default: + port: 6379 # Redis port + host: "127.0.0.1" # Redis host + password: "helloearth" + db: 10 # Redis db_num + # UDM sub/auth db + udmuser: + port: 6379 # Redis port + host: "127.0.0.1" + password: "helloearth" + db: 0 # Redis db_num + # used to specify the default data source for multiple data resourece + defaultDataSourceName: "default" + +# sleep: time delay for after write buffer (millisecond) +# deadLine: timeout for io read and write (second) +mml: + sleep: 200 + deadLine: 10 + sizeRow: 600 + sizeCol: 128 + bufferSize: 65535 + mmlHome: ./mmlhome + +# Tracking configuration +trace: + enabled: false + host: "172.16.5.100" # Fill in the specific IP address + port: 33033 + +# NE config +ne: + user: omcuser + etcdir: /usr/local/etc + bindir: /usr/local/bin + omcdir: /usr/local/omc + scpdir: /tmp + licensedir: /usr/local/etc/{neType}/license + # backup etc list of IMS, does not contain spaces + etcListIMS: '{*.yaml,mmtel,vars.cfg}' + etcListDefault: '{*.yaml,*.conf,*.cfg}' + # true/false to overwrite config file when dpkg ne software + dpkgOverwrite: false + # dpkg timeout (second) + dpkgTimeout: 180 + +# chk2ne: true/false, if put OmcNeConfig parameters to NE +omc: + uriPrefix: "/omc/rest" + neType: OMC + neId: 001 + rmUID: 4400HX101 + neName: OMC + province: "" + vendor: "" + dn: "" + chk2ne: false + sn: "-" + checksign: false + rootDir: /usr/local/omc + binDir: /usr/local/omc/bin + backup: /usr/local/omc/backup + upload: /usr/local/omc/upload + frontUpload: /usr/local/omc/htdocs/front/upload + frontTraceDir: /usr/local/omc/htdocs/front/trace + software: /usr/local/omc/software + license: /usr/local/omc/license + gtpUri: gtp:192.168.2.119:32152 + checkContentType: false + testMode: false + rbacMode: true + runDir: /usr/local/omc/run + cmdTimeout: 120 + +# Alarm module setting +# Forward interface: +# TLS Skip verify: true/false +# email/sms +# smProxy: sms(Short Message Service)/smsc(SMS Centre) +# dataCoding: 0:GSM7BIT, 1:ASCII, 2:BINARY8BIT1, 3:LATIN1, +# 4:BINARY8BIT2, 6:CYRILLIC, 7:HEBREW, 8:UCS2 +alarm: + alarmEmailForward: + enable: true + emailList: + smtp: mail.smtp.com + port: 25 + user: smtpext@smtp.com + password: "1000smtp@omc!" + tlsSkipVerify: true + alarmSMSForward: + enable: true + mobileList: + smscAddr: "192.168.13.114:2775" + systemID: "omc" + password: "omc123" + systemType: "UTRAN" + dataCoding: 0 + serviceNumber: "OMC" + sms: + apiURL: http://smsc.xxx.com/ + accessKeyID: xxxx + accessKeySecret: xxxx + signName: xxx SMSC + templateCode: 1000 + smProxy: smsc + +# User authorized information +# crypt: mysql/md5/bcrypt +# token: true/false to check accessToken +# expires for session, unit: second +# Support single/multiple session of user +# +auth: + crypt: bcrypt + token: true + expires: 1800 + session: multiple + publicKey: /usr/local/omc/etc/certs/omc + privateKey: /usr/local/omc/etc/certs/omc + +# Parameter for limit number +# rmuid_maxnum: the max number of rmUID, default: 50 +# alarmid_maxnum: the max number of AlarmID, default: 50 +# pmid_maxnum: the max number of pmID, default: 50 +# subid_maxnum: the max number of subscription ID, default: 20 +# uri_maxlen: the max length of uri, default: 8192 +# rmuid_regexp: regexp pattern of rmUID +params: + rmuidmaxnum: 50 + alarmidmaxnum: 50 + pmidmaxnum: 50 + subidmaxnum: 20 + urimaxlen: 2100000 + rmuidregexp: "[0-9]{4}[A-Z]{2}[A-Z]{2}[0-9A-Z]{1}[0-9A-Z]{3}[0-9A-Z]{1,16}" + +testConfig: + enabled: false + file: /usr/local/omc/etc/testconfig.yaml + +# NMS-中国星网研究院 +nmsCXY: + # 注入路由组 + routerGroup: "/nms-cxy/api/rest" + # 专业编码2位 核心网HX 无线网WX + professionCode: "HX" + # 厂商编码2位 中信科ZX + vendorCode: "AT" + # OMC编号3位 + omcCode: "001" + # 设备序列号 + serialNumber: "1153492" + # Kafka配置 + kafka: + addrs: + - "192.168.9.58:19092" + - "192.168.9.58:29092" + - "192.168.9.58:39092" + # 启用 Kerberos 认证 + krb5: + enable: false + config: + configPath: "/path/to/krb5.conf" + keyTabPath: "/path/to/keytab" + serviceName: "kafka" + realm: "EXAMPLE.COM" + username: "client" + + # OSS配置 + oss: + bucketname: "omc-bucket" + endpoint: "192.168.9.58:19000" + useSSL: false + accessKeyID: "hZjJOByIz6TFzOzNkKB9" + secretAccessKey: "eLpRYAG5Wb3Dr6bvmznGoiLmmflUsydOENLp9tlu" diff --git a/src/modules/nms_cxy/add_file/z_nms_cxy.sql b/src/modules/nms_cxy/add_file/z_nms_cxy.sql new file mode 100644 index 0000000..a55cebf --- /dev/null +++ b/src/modules/nms_cxy/add_file/z_nms_cxy.sql @@ -0,0 +1,43 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; +-- ---------------------------- +-- 创建表 +-- ---------------------------- +DROP TABLE IF EXISTS `nms_cxy_nrm_log`; +CREATE TABLE `nms_cxy_nrm_log` ( + `msg_id` bigint NOT NULL AUTO_INCREMENT COMMENT '消息序号,9位长度,递增', + `ruid` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '网络资源对象Ruid', + `user_label` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户标签-网元名称', + `change_time` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '资源变化时间,格式为"2022-12-15 08:34:24"', + `change_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变化类型 add:新增 mod:修改 del:删除', + `change_oper` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '资源的具体属性', + `create_by` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建者', + `create_time` bigint DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`msg_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='星网-资源数据操作日志'; + +-- ---------------------------- +-- 新增记录 +-- ---------------------------- +-- 性能数据文件的上报 +INSERT IGNORE INTO `sys_job` VALUES (null,'job.nms_cxy.performance_upload_oss', 'SYSTEM', 'performance_upload_oss', '{\"interval\":15,\"neTypes\":[\"AMF\",\"UPF\",\"UDM\",\"SMF\",\"NSSF\"]}', '0 0/15 * * * ?', '3', '0', '1', '1', 'supervisor', 1698478134839, 'supervisor', 1710819124454, 'job.nms_cxy.performance_upload_oss_remark'); +INSERT IGNORE INTO `sys_dict_data` VALUES (210, 210, 'job.nms_cxy.performance_upload_oss', '性能数据文件的上报', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (211, 211, 'job.nms_cxy.performance_upload_oss_remark', 'interval周期为15分钟。neTypes为数组对应上报数据的网元类型。', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (212, 212, 'job.nms_cxy.performance_upload_oss', 'Reporting of performance data files', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (213, 213, 'job.nms_cxy.performance_upload_oss_remark', 'The interval period is 15 minutes. neTypes is an array corresponding to the type of network element for which the data was reported.', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); + +-- 资源数据上报接口 +INSERT IGNORE INTO `sys_job` VALUES (null,'job.nms_cxy.resource_upload_oss', 'SYSTEM', 'resource_upload_oss', '{\"neTypes\":[\"AMF\",\"UPF\"]}', '0 0 0,12 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134839, 'supervisor', 1710819133986, 'job.nms_cxy.resource_upload_oss_remark'); +INSERT IGNORE INTO `sys_dict_data` VALUES (215, 215, 'job.nms_cxy.resource_upload_oss', '资源数据上报接口', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (216, 216, 'job.nms_cxy.resource_upload_oss_remark', '每天的 0 时及 12 时上报网元的全量资源数据文件至 OSS。', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (217, 217, 'job.nms_cxy.resource_upload_oss', 'Resource data reporting interface', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (218, 218, 'job.nms_cxy.resource_upload_oss_remark', 'Full resource data files for network elements are reported to the OSS at 0000 and 1200 hours each day.', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); + +-- 配置数据上报接口 +INSERT IGNORE INTO `sys_job` VALUES (null,'job.nms_cxy.config_upload_oss', 'SYSTEM', 'config_upload_oss', '{\"neTypes\":[\"AMF\",\"UPF\",\"UDM\",\"SMF\"]}', '0 0 0,12 * * ?', '3', '0', '1', '1', 'supervisor', 1698478134839, 'supervisor', 1710818082110, 'job.nms_cxy.config_upload_oss_remark'); +INSERT IGNORE INTO `sys_dict_data` VALUES (220, 220, 'job.nms_cxy.config_upload_oss', '配置数据上报接口', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (221, 221, 'job.nms_cxy.config_upload_oss_remark', '配置数据上报时间为每日的0时及12时。', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (222, 222, 'job.nms_cxy.config_upload_oss', 'Configure data reporting interface', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT IGNORE INTO `sys_dict_data` VALUES (223, 223, 'job.nms_cxy.config_upload_oss_remark', 'Set the data reporting time to 0:00 and 12:00 every day.', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/src/modules/nms_cxy/controller/security.go b/src/modules/nms_cxy/controller/security.go index dc1354a..6ac9a57 100644 --- a/src/modules/nms_cxy/controller/security.go +++ b/src/modules/nms_cxy/controller/security.go @@ -1,21 +1,21 @@ package controller import ( - commonConstants "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/constants/token" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - tokenUtils "nms_cxy/src/framework/utils/token" - "nms_cxy/src/framework/vo/result" - commonService "nms_cxy/src/modules/common/service" - systemService "nms_cxy/src/modules/system/service" + commonConstants "be.ems/src/framework/constants/common" + "be.ems/src/framework/constants/token" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + tokenUtils "be.ems/src/framework/utils/token" + "be.ems/src/framework/vo/result" + commonService "be.ems/src/modules/common/service" + systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) // 实例化控制层 SecurityController 结构体 var NewSecurity = &SecurityController{ - accountService: commonService.NewAccountImpl, + accountService: commonService.NewAccount, sysLogLoginService: systemService.NewSysLogLoginImpl, } @@ -24,7 +24,7 @@ var NewSecurity = &SecurityController{ // PATH /securityManagement type SecurityController struct { // 账号身份操作服务 - accountService commonService.IAccount + accountService *commonService.Account // 系统登录访问 sysLogLoginService systemService.ISysLogLogin } diff --git a/src/modules/nms_cxy/controller/system.go b/src/modules/nms_cxy/controller/system.go index 9379401..da30141 100644 --- a/src/modules/nms_cxy/controller/system.go +++ b/src/modules/nms_cxy/controller/system.go @@ -2,26 +2,27 @@ package controller import ( "fmt" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/cmd" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/ping" - "nms_cxy/src/framework/vo/result" - neModel "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - "nms_cxy/src/modules/nms_cxy/service" - "nms_cxy/src/modules/nms_cxy/utils/common" "strings" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/cmd" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/ping" + "be.ems/src/framework/vo/result" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/nms_cxy/service" + "be.ems/src/modules/nms_cxy/utils/common" + "github.com/gin-gonic/gin" ) // 实例化控制层 SystemController 结构体 var NewSystem = &SystemController{ - neInfoService: neService.NewNeInfoImpl, - neVersionService: neService.NewNeVersionImpl, - neSoftwareService: neService.NewNeSoftwareImpl, + neInfoService: neService.NewNeInfo, + neVersionService: neService.NewNeVersion, + neSoftwareService: neService.NewNeSoftware, alarmService: service.NewAlarmImpl, logService: service.NewLogImpl, configService: service.NewConfigImpl, @@ -32,17 +33,17 @@ var NewSystem = &SystemController{ // PATH /systemManagement type SystemController struct { // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo // 网元版本信息服务 - neVersionService neService.INeVersion + neVersionService *neService.NeVersion // 网元软件包信息服务 - neSoftwareService neService.INeSoftware + neSoftwareService *neService.NeSoftware // 告警数据服务 - alarmService service.IAlarm + alarmService *service.AlarmImpl // 日志数据服务 - logService service.ILog + logService *service.LogImpl // 配置数据处理服务 - configService service.IConfig + configService *service.ConfigImpl } // 软件版本查询接口 diff --git a/src/modules/nms_cxy/controller/test.go b/src/modules/nms_cxy/controller/test.go index f2a7cec..ec7fc1f 100644 --- a/src/modules/nms_cxy/controller/test.go +++ b/src/modules/nms_cxy/controller/test.go @@ -2,27 +2,28 @@ package controller import ( "encoding/json" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - neDataModel "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - "nms_cxy/src/modules/nms_cxy/service" - "nms_cxy/src/modules/nms_cxy/utils/kafka" - "nms_cxy/src/modules/nms_cxy/utils/oss" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/nms_cxy/service" + "be.ems/src/modules/nms_cxy/utils/kafka" + "be.ems/src/modules/nms_cxy/utils/oss" "github.com/gin-gonic/gin" ) // 实例化控制层 TestController 结构体 var NewTest = &TestController{ - neInfoService: neService.NewNeInfoImpl, - alarmDataService: neDataService.NewAlarmImpl, + neInfoService: neService.NewNeInfo, + alarmDataService: neDataService.NewAlarm, alarmService: service.NewAlarmImpl, configService: service.NewConfigImpl, performanceService: service.NewPerformanceImpl, - resourceService: service.NewResourceImpl, + resourceService: service.NewResource, } // 测试接口 @@ -30,17 +31,17 @@ var NewTest = &TestController{ // PATH /testManagement type TestController struct { // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo // 告警信息服务 - alarmDataService neDataService.IAlarm + alarmDataService *neDataService.Alarm // 告警数据服务 - alarmService service.IAlarm + alarmService *service.AlarmImpl // 配置数据处理服务 - configService service.IConfig + configService *service.ConfigImpl // 性能数据处理服务 - performanceService service.IPerformance + performanceService *service.PerformanceImpl // 资源数据处理服务 - resourceService service.IResource + resourceService *service.Resource } // 默认测试 diff --git a/src/modules/nms_cxy/model/nms_cxy_nrm_log.go b/src/modules/nms_cxy/model/nms_cxy_nrm_log.go index f6fe9db..f7da11f 100644 --- a/src/modules/nms_cxy/model/nms_cxy_nrm_log.go +++ b/src/modules/nms_cxy/model/nms_cxy_nrm_log.go @@ -2,14 +2,14 @@ package model // NRMLog 资源数据操作日志 nms_cxy_nrm_log type NRMLog struct { - MsgID string `json:"MsgID" gorm:"column:msg_id"` // 消息序号,9位长度,递增 - Ruid string `json:"Ruid" gorm:"column:ruid"` // 网络资源对象Ruid - UserLabel string `json:"UserLabel" gorm:"column:user_label"` // 用户标签-网元名称 - ChangeTime string `json:"ChangeTime" gorm:"column:change_time"` // 资源变化时间,格式为"2022-12-15 08:34:24" - ChangeType string `json:"ChangeType" gorm:"column:change_type"` // 变化类型 add:新增 mod:修改 del:删除 - ChangeOper string `json:"ChangeOper" gorm:"column:change_oper"` // 资源的具体属性 - CreateBy string `json:"-" gorm:"column:create_by"` // 创建者 - CreateTime int64 `json:"-" gorm:"column:create_time"` // 创建时间 + MsgID string `json:"MsgID" gorm:"column:msg_id;primaryKey;autoIncrement"` // ID + Ruid string `json:"Ruid" gorm:"column:ruid"` // 网络资源对象Ruid + UserLabel string `json:"UserLabel" gorm:"column:user_label"` // 用户标签-网元名称 + ChangeTime string `json:"ChangeTime" gorm:"column:change_time"` // 资源变化时间,格式为"2022-12-15 08:34:24" + ChangeType string `json:"ChangeType" gorm:"column:change_type"` // 变化类型 add:新增 mod:修改 del:删除 + ChangeOper string `json:"ChangeOper" gorm:"column:change_oper"` // 资源的具体属性 + CreateBy string `json:"-" gorm:"column:create_by"` // 创建者 + CreateTime int64 `json:"-" gorm:"column:create_time"` // 创建时间 } // TableName 表名称 diff --git a/src/modules/nms_cxy/nms_cxy.go b/src/modules/nms_cxy/nms_cxy.go index c762797..13fc795 100644 --- a/src/modules/nms_cxy/nms_cxy.go +++ b/src/modules/nms_cxy/nms_cxy.go @@ -1,13 +1,13 @@ package nmscxy import ( - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/modules/nms_cxy/controller" - "nms_cxy/src/modules/nms_cxy/processor" - "nms_cxy/src/modules/nms_cxy/utils/kafka" - "nms_cxy/src/modules/nms_cxy/utils/oss" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/modules/nms_cxy/controller" + "be.ems/src/modules/nms_cxy/processor" + "be.ems/src/modules/nms_cxy/utils/kafka" + "be.ems/src/modules/nms_cxy/utils/oss" "github.com/gin-gonic/gin" ) diff --git a/src/modules/nms_cxy/processor/config/config.go b/src/modules/nms_cxy/processor/config/config.go index 9e0179c..cbcd907 100644 --- a/src/modules/nms_cxy/processor/config/config.go +++ b/src/modules/nms_cxy/processor/config/config.go @@ -3,9 +3,10 @@ package config import ( "encoding/json" "fmt" - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/logger" - "nms_cxy/src/modules/nms_cxy/service" + + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" + "be.ems/src/modules/nms_cxy/service" ) var NewProcessor = &ConfigProcessor{ @@ -18,7 +19,7 @@ type ConfigProcessor struct { // 执行次数 count int // 配置数据处理服务 - configService service.IConfig + configService *service.ConfigImpl } func (s *ConfigProcessor) Execute(data any) (any, error) { diff --git a/src/modules/nms_cxy/processor/performance/performance.go b/src/modules/nms_cxy/processor/performance/performance.go index e101e85..17d9ebd 100644 --- a/src/modules/nms_cxy/processor/performance/performance.go +++ b/src/modules/nms_cxy/processor/performance/performance.go @@ -3,11 +3,12 @@ package performance import ( "encoding/json" "fmt" - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/modules/nms_cxy/service" "time" + + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/modules/nms_cxy/service" ) var NewProcessor = &PerformanceProcessor{ @@ -20,7 +21,7 @@ type PerformanceProcessor struct { // 执行次数 count int // 性能数据处理服务 - performanceService service.IPerformance + performanceService *service.PerformanceImpl } func (s *PerformanceProcessor) Execute(data any) (any, error) { diff --git a/src/modules/nms_cxy/processor/processor.go b/src/modules/nms_cxy/processor/processor.go index fe23ff9..3e53105 100644 --- a/src/modules/nms_cxy/processor/processor.go +++ b/src/modules/nms_cxy/processor/processor.go @@ -1,10 +1,10 @@ package processor import ( - "nms_cxy/src/framework/cron" - "nms_cxy/src/modules/nms_cxy/processor/config" - "nms_cxy/src/modules/nms_cxy/processor/performance" - "nms_cxy/src/modules/nms_cxy/processor/resource" + "be.ems/src/framework/cron" + "be.ems/src/modules/nms_cxy/processor/config" + "be.ems/src/modules/nms_cxy/processor/performance" + "be.ems/src/modules/nms_cxy/processor/resource" ) // InitCronQueue 初始定时任务队列 diff --git a/src/modules/nms_cxy/processor/resource/resource.go b/src/modules/nms_cxy/processor/resource/resource.go index d27acc1..a3b2680 100644 --- a/src/modules/nms_cxy/processor/resource/resource.go +++ b/src/modules/nms_cxy/processor/resource/resource.go @@ -3,14 +3,15 @@ package resource import ( "encoding/json" "fmt" - "nms_cxy/src/framework/cron" - "nms_cxy/src/framework/logger" - "nms_cxy/src/modules/nms_cxy/service" + + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" + "be.ems/src/modules/nms_cxy/service" ) var NewProcessor = &ResourceProcessor{ count: 0, - resourceService: service.NewResourceImpl, + resourceService: service.NewResource, } // 资源上报 队列任务处理 @@ -18,7 +19,7 @@ type ResourceProcessor struct { // 执行次数 count int // 资源数据处理服务 - resourceService service.IResource + resourceService *service.Resource } func (s *ResourceProcessor) Execute(data any) (any, error) { diff --git a/src/modules/nms_cxy/service/alarm.go b/src/modules/nms_cxy/service/alarm.go index 99d0d85..8661faf 100644 --- a/src/modules/nms_cxy/service/alarm.go +++ b/src/modules/nms_cxy/service/alarm.go @@ -1,18 +1,164 @@ package service import ( - neDataModel "nms_cxy/src/modules/network_data/model" - "nms_cxy/src/modules/nms_cxy/model" + "encoding/json" + "fmt" + + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + "be.ems/src/modules/nms_cxy/model" + "be.ems/src/modules/nms_cxy/utils/common" + "be.ems/src/modules/nms_cxy/utils/kafka" ) -// 告警数据处理服务 服务层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys neDataModel.AlarmQuery) ([]model.Alarm, int64) - - // KafkaPush 推送数据Kafka - KafkaPush(alarm neDataModel.Alarm) error - - // AlarmDataToFile 告警数据写入文件 - AlarmDataToFile(requestId, neType, rmUID, startTime, endTime string) (int64, string) +// 实例化数据层 AlarmImpl 结构体 +var NewAlarmImpl = &AlarmImpl{ + alarmService: neDataService.NewAlarm, + alarmLevel: map[string]int64{ + "Critical": 1, + "Major": 2, + "Minor": 3, + "Warning": 4, + }, +} + +// 告警数据处理服务 服务层处理 +type AlarmImpl struct { + // 告警信息服务 + alarmService *neDataService.Alarm + // 原始告警级别 1:一级告警;2:二级告警;3:三级告警;4:四级告警 + alarmLevel map[string]int64 +} + +// SelectPage 根据条件分页查询 +func (s *AlarmImpl) SelectPage(querys neDataModel.AlarmQuery) ([]model.Alarm, int64) { + dataArr := []model.Alarm{} + // 查询数据 + pageData := s.alarmService.SelectPage(querys) + total := parse.Number(pageData["total"]) + rows, ok := pageData["rows"].([]neDataModel.Alarm) + if !ok || len(rows) <= 0 { + return dataArr, total + } + + for _, v := range rows { + item := s.parseAlarmData(v) + dataArr = append(dataArr, item) + } + return dataArr, total +} + +// parseAlarmData 解析转换为指定的告警对象 +func (s *AlarmImpl) parseAlarmData(v neDataModel.Alarm) model.Alarm { + alarmLevel, ok := s.alarmLevel[v.OrigSeverity] + if !ok { + alarmLevel = 0 + } + return model.Alarm{ + AlarmSeq: v.AlarmSeq, + AlarmTitle: v.AlarmTitle, + AlarmStatus: parse.Number(v.AlarmStatus), + AlarmType: v.AlarmType, + AlarmLevel: alarmLevel, + EventTime: date.ParseDateToStr(v.EventTime, date.YYYY_MM_DD_HH_MM_SS), + AlarmId: parse.Number(v.AlarmId), + CauseID: v.AlarmCode, + Cause: v.SpecificProblem, + NeRUID: v.ObjectUid, + NeUserLabel: v.NeName, + ObjectRUID: v.ObjectUid, + ObjectUserLabel: v.ObjectName, + AddInfo: v.AddInfo, + } +} + +// KafkaPush 推送数据Kafka +func (s *AlarmImpl) KafkaPush(alarm neDataModel.Alarm) error { + if alarm.AlarmTitle == "" { + return nil + } + + // 数据序列化 + data := s.parseAlarmData(alarm) + bytes, err := json.Marshal(data) + if err != nil { + logger.Errorf("KafkaPush parseAlarmData err => %s", err.Error()) + return err + } + + // 订阅topic,名称为:专业编码-厂商编码-OMC编号-数据类别(固定为FM) + basePath := common.BasePath("-") + topic := fmt.Sprintf("%s-FM", basePath) + + // 发送消息 + partition, offset, err := kafka.KInitConm.MessageSyncSend(topic, 0, string(bytes)) + if err != nil { + return err + } + logger.Infof("KafkaPush MessageSyncSend Partition:%d, Offset:%d", partition, offset) + return err +} + +// AlarmDataToFile 告警数据写入文件 +func (s *AlarmImpl) AlarmDataToFile(requestId, neType, rmUID, startTime, endTime string) (int64, string) { + var pageNum int64 = 1 + var pageSize int64 = 20 + dataArr := []any{} + + // 查询数据 + pageData := s.alarmService.SelectPage(neDataModel.AlarmQuery{ + PageNum: pageNum, + PageSize: pageSize, + StartTime: startTime, + EndTime: endTime, + RmUID: rmUID, + NeType: neType, + }) + + total := parse.Number(pageData["total"]) + rows, ok := pageData["rows"].([]neDataModel.Alarm) + if !ok || len(rows) <= 0 { + return int64(len(dataArr)), "" + } + for _, v := range rows { + dataArr = append(dataArr, s.parseAlarmData(v)) + } + + // 按总数分批遍历 + batchNum := total / pageSize + for i := 1; i <= int(batchNum); i++ { + // 查询数据 + pageData := s.alarmService.SelectPage(neDataModel.AlarmQuery{ + PageNum: int64(i), + PageSize: pageSize, + StartTime: startTime, + EndTime: endTime, + RmUID: rmUID, + NeType: neType, + }) + rows, ok := pageData["rows"].([]neDataModel.Alarm) + if !ok || len(rows) <= 0 { + return int64(len(dataArr)), "" + } + for _, v := range rows { + dataArr = append(dataArr, s.parseAlarmData(v)) + } + } + + // 文件名 + dataSaveFileName := common.DataSaveFileName{ + RequestId: requestId, + } + fileName := dataSaveFileName.JSON() + filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + err := file.WriterFileJSONLine(dataArr, filePath) + if err != nil { + return int64(len(dataArr)), "" + } + return int64(len(dataArr)), filePath } diff --git a/src/modules/nms_cxy/service/alarm.impl.go b/src/modules/nms_cxy/service/alarm.impl.go deleted file mode 100644 index ffb0ff6..0000000 --- a/src/modules/nms_cxy/service/alarm.impl.go +++ /dev/null @@ -1,163 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - neDataModel "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - "nms_cxy/src/modules/nms_cxy/model" - "nms_cxy/src/modules/nms_cxy/utils/common" - "nms_cxy/src/modules/nms_cxy/utils/kafka" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - alarmService: neDataService.NewAlarmImpl, - alarmLevel: map[string]int64{ - "Critical": 1, - "Major": 2, - "Minor": 3, - "Warning": 4, - }, -} - -// 告警数据处理服务 服务层处理 -type AlarmImpl struct { - // 告警信息服务 - alarmService neDataService.IAlarm - // 原始告警级别 1:一级告警;2:二级告警;3:三级告警;4:四级告警 - alarmLevel map[string]int64 -} - -// SelectPage 根据条件分页查询 -func (s *AlarmImpl) SelectPage(querys neDataModel.AlarmQuery) ([]model.Alarm, int64) { - dataArr := []model.Alarm{} - // 查询数据 - pageData := s.alarmService.SelectPage(querys) - total := parse.Number(pageData["total"]) - rows, ok := pageData["rows"].([]neDataModel.Alarm) - if !ok || len(rows) <= 0 { - return dataArr, total - } - - for _, v := range rows { - item := s.parseAlarmData(v) - dataArr = append(dataArr, item) - } - return dataArr, total -} - -// parseAlarmData 解析转换为指定的告警对象 -func (s *AlarmImpl) parseAlarmData(v neDataModel.Alarm) model.Alarm { - alarmLevel, ok := s.alarmLevel[v.OrigSeverity] - if !ok { - alarmLevel = 0 - } - return model.Alarm{ - AlarmSeq: v.AlarmSeq, - AlarmTitle: v.AlarmTitle, - AlarmStatus: parse.Number(v.AlarmStatus), - AlarmType: v.AlarmType, - AlarmLevel: alarmLevel, - EventTime: date.ParseDateToStr(v.EventTime, date.YYYY_MM_DD_HH_MM_SS), - AlarmId: parse.Number(v.AlarmId), - CauseID: v.AlarmCode, - Cause: v.SpecificProblem, - NeRUID: v.ObjectUid, - NeUserLabel: v.NeName, - ObjectRUID: v.ObjectUid, - ObjectUserLabel: v.ObjectName, - AddInfo: v.AddInfo, - } -} - -// KafkaPush 推送数据Kafka -func (s *AlarmImpl) KafkaPush(alarm neDataModel.Alarm) error { - if alarm.AlarmTitle == "" { - return nil - } - - // 数据序列化 - data := s.parseAlarmData(alarm) - bytes, err := json.Marshal(data) - if err != nil { - logger.Errorf("KafkaPush parseAlarmData err => %s", err.Error()) - return err - } - - // 订阅topic,名称为:专业编码-厂商编码-OMC编号-数据类别(固定为FM) - basePath := common.BasePath("-") - topic := fmt.Sprintf("%s-FM", basePath) - - // 发送消息 - partition, offset, err := kafka.KInitConm.MessageSyncSend(topic, 0, string(bytes)) - if err != nil { - return err - } - logger.Infof("KafkaPush MessageSyncSend Partition:%d, Offset:%d", partition, offset) - return err -} - -// AlarmDataToFile 告警数据写入文件 -func (s *AlarmImpl) AlarmDataToFile(requestId, neType, rmUID, startTime, endTime string) (int64, string) { - var pageNum int64 = 1 - var pageSize int64 = 20 - dataArr := []any{} - - // 查询数据 - pageData := s.alarmService.SelectPage(neDataModel.AlarmQuery{ - PageNum: pageNum, - PageSize: pageSize, - StartTime: startTime, - EndTime: endTime, - RmUID: rmUID, - NeType: neType, - }) - - total := parse.Number(pageData["total"]) - rows, ok := pageData["rows"].([]neDataModel.Alarm) - if !ok || len(rows) <= 0 { - return int64(len(dataArr)), "" - } - for _, v := range rows { - dataArr = append(dataArr, s.parseAlarmData(v)) - } - - // 按总数分批遍历 - batchNum := total / pageSize - for i := 1; i <= int(batchNum); i++ { - // 查询数据 - pageData := s.alarmService.SelectPage(neDataModel.AlarmQuery{ - PageNum: int64(i), - PageSize: pageSize, - StartTime: startTime, - EndTime: endTime, - RmUID: rmUID, - NeType: neType, - }) - rows, ok := pageData["rows"].([]neDataModel.Alarm) - if !ok || len(rows) <= 0 { - return int64(len(dataArr)), "" - } - for _, v := range rows { - dataArr = append(dataArr, s.parseAlarmData(v)) - } - } - - // 文件名 - dataSaveFileName := common.DataSaveFileName{ - RequestId: requestId, - } - fileName := dataSaveFileName.JSON() - filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) - err := file.WriterFileJSONLine(dataArr, filePath) - if err != nil { - return int64(len(dataArr)), "" - } - return int64(len(dataArr)), filePath -} diff --git a/src/modules/nms_cxy/service/config.go b/src/modules/nms_cxy/service/config.go index 931b987..c7d5b9d 100644 --- a/src/modules/nms_cxy/service/config.go +++ b/src/modules/nms_cxy/service/config.go @@ -1,17 +1,611 @@ package service import ( - neModel "nms_cxy/src/modules/network_element/model" + "encoding/json" + "fmt" + "runtime" + "strings" + "time" + + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/nms_cxy/model" + "be.ems/src/modules/nms_cxy/utils/common" + + neFetchlink "be.ems/src/modules/network_element/fetch_link" ) -// 配置数据处理服务 服务层接口 -type IConfig interface { - // ConfigUploadOSS 配置数据上报 - ConfigUploadOSS(neType string) error - - // ConfigParamQuery 配置参数查询 - ConfigParamQuery(neInfo neModel.NeInfo, operPara []string) map[string]any - - // ConfigParamModify 配置参数修改 - ConfigParamModify(neInfo neModel.NeInfo, byUsername string, operType string, operPara map[string]any) []string +// 实例化数据层 ConfigImpl 结构体 +var NewConfigImpl = &ConfigImpl{ + neInfoService: neService.NewNeInfo, + neVersionService: neService.NewNeVersion, + resourceService: NewResource, +} + +// 配置数据处理服务 服务层处理 +type ConfigImpl struct { + // 网元信息服务 + neInfoService *neService.NeInfo + // 网元版本信息服务 + neVersionService *neService.NeVersion + // 资源数据处理服务 + resourceService *Resource +} + +// ConfigUploadOSS 配置数据上报 +// 配置数据上报时间为每日的0时及12时, +func (s *ConfigImpl) ConfigUploadOSS(neType string) error { + // 查网元 + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, "001") + if neInfo.NeType != neType { + logger.Errorf("ConfigUploadOSS ne info not fount") + return fmt.Errorf("no ne info") + } + + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + logger.Errorf("ConfigUploadOSS NeRunSSHClient %s", err.Error()) + return fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + logger.Errorf("ConfigUploadOSS NewClientSFTP %s", err.Error()) + return fmt.Errorf("ne info sftp client err") + + } + defer sftpClient.Close() + + // 配置文件目录 + nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", strings.ToLower(neType)) + nePathTemp := fmt.Sprintf("/tmp/%s/config/", strings.ToLower(neType)) + localPath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/config/", strings.ToLower(neType)) + if runtime.GOOS == "windows" { + localPath = fmt.Sprintf("C:%s", localPath) + } + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", nePathTemp, nePath, nePathTemp)) + // 复制到本地 + if err = sftpClient.CopyDirRemoteToLocal(nePathTemp, localPath); err != nil { + logger.Errorf("%s : please check if scp remote copy is allowed", neInfo.NeType) + return fmt.Errorf("copy config err") + } + + // 文件名 + dataSaveFileName := common.DataSaveFileName{} + fileName := dataSaveFileName.ZIP() + filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + + err = file.CompressZipByDir(filePath, localPath) + if err != nil { + logger.Errorf("ConfigUploadOSS zip err %s", err.Error()) + return err + } + + return common.UploadOSSByZip(filePath, neType, "CM") +} + +// ConfigParamQuery 配置参数查询 +// +// 请参考NRM数据模型规范中类型为“R”的参数。 +func (s *ConfigImpl) ConfigParamQuery(neInfo neModel.NeInfo, operPara []string) map[string]any { + resultMap := map[string]any{} + + neState, err := neFetchlink.NeState(neInfo) + if err != nil { + return resultMap + } + + for _, key := range operPara { + // 网络设备的全网唯一标识 RW + if key == "Ruid" { + resultMap["Ruid"] = neInfo.RmUID + } + // 用户友好名 RW + if key == "UserLabel" { + resultMap["UserLabel"] = neInfo.NeName + } + // 制造商名称 + if key == "Manufacturer" { + resultMap["Manufacturer"] = neInfo.VendorName + } + // 设备型号 + if key == "Model" { + resultMap["Model"] = neInfo.NeType + } + // 设备序列号 + if key == "SerialNumber" { + resultMap["SerialNumber"] = neState["sn"] + } + // 硬件版本 + if key == "HardwareVersion" { + resultMap["HardwareVersion"] = neState["version"] + } + // 运行时长 + if key == "RunTime" { + resultMap["RunTime"] = 0 + } + // 首次使用日期 + if key == "FirstUseDate" { + resultMap["FirstUseDate"] = "2024" + } + // 设备侧管理口IP地址列表 RW + if key == "ManagementIpAddress" { + resultMap["ManagementIpAddress"] = []string{neInfo.IP} + } + // 设备运行状态 health,warning,fault + if key == "Status" { + if neInfo.Status == "0" { + resultMap["Status"] = "health" + } + if neInfo.Status == "1" { + resultMap["Status"] = "fault" + } + resultMap["Status"] = "warning" + } + // 设备重启 RW + if key == "Reboot" { + resultMap["Reboot"] = false + } + // 激活备份版本使能开关 RW + if key == "BackupSoftwareActivateEnable" { + resultMap["BackupSoftwareActivateEnable"] = false + } + // 系统当前版本 + if key == "CurrentSoftwareVersion" { + resultMap["CurrentSoftwareVersion"] = neState["version"] + } + // 系统备份版本 + if key == "BackupSoftwareVersion" { + resultMap["BackupSoftwareVersion"] = "-" + } + + // FQDN + if key == "Fqdn" { + resultMap["Fqdn"] = "-" + } + // 服务列表 + if key == "SbiServiceList" { + resultMap["SbiServiceList"] = []string{} + } + + // ============ AMF + // 全球AMF唯一标识列表 + if key == "GuamiList" { + resultMap["GuamiList"] = []string{} + } + // 网络切片列表 RW + if key == "SnssaiList" { + resultMap["SnssaiList"] = []string{} + } + // 最大注册用户数 + if key == "MaxUser" { + resultMap["MaxUser"] = neState["capability"] + } + // 相对容量 + if key == "RelativeCapacity" { + resultMap["RelativeCapacity"] = neState["capability"] + } + // 最大支持基站数 + if key == "MaxGnbNum" { + resultMap["MaxGnbNum"] = 0 + } + // 位置更新区域半径 RW + if key == "Delta" { + resultMap["Delta"] = 0 + } + // N8接口本端IP地址列表 RW + if key == "N8LocIpAddrList" { + resultMap["N8LocIpAddrList"] = 0 + } + // N8接口远端IP子网列表 RW + if key == "N8FarIpSubnetworkList" { + resultMap["N8FarIpSubnetworkList"] = 0 + } + // N11接口本端IP地址列表 RW + if key == "N11LocIpAddrList" { + resultMap["N11LocIpAddrList"] = 0 + } + // N11接口远端IP子网列表 RW + if key == "N11FarIpSubnetworkList" { + resultMap["N11FarIpSubnetworkList"] = 0 + } + // N12接口本端IP地址列表 RW + if key == "N12LocIpAddrList" { + resultMap["N12LocIpAddrList"] = 0 + } + // N12接口远端IP子网列表 RW + if key == "N12FarIpSubnetworkList" { + resultMap["N12FarIpSubnetworkList"] = 0 + } + + // ============ UDM + // 最大可存储的IMSI个数 + if key == "MaxNumImsi" { + resultMap["MaxNumImsi"] = 0 + } + // 最大可存储的MSISDN个数 + if key == "MaxNumMsisdn" { + resultMap["MaxNumMsisdn"] = 0 + } + + // ============ PCF + // 最大签约用户数 RW + if key == "MaxUe" { + resultMap["MaxUe"] = 0 + } + + // ============ UPF + // 最大QoS流数 + if key == "MaxQosFlows" { + resultMap["MaxQosFlows"] = 0 + } + // 最大数据吞吐率 + if key == "MaxThroughput" { + resultMap["MaxThroughput"] = "-" + } + // N9接口本端IP地址列表 RW + if key == "N9LocIpAddrList" { + resultMap["N9LocIpAddrList"] = []string{} + } + // N9接口远端IP子网列表 RW + if key == "N9FarIpSubnetworkList" { + resultMap["N9FarIpSubnetworkList"] = []string{} + } + // N3接口本端IP地址列表 RW + if key == "N3LocIpAddrList" { + resultMap["N3LocIpAddrList"] = []string{} + } + // N3接口远端IP子网列表 RW + if key == "N3FarIpSubnetworkList" { + resultMap["N3FarIpSubnetworkList"] = []string{} + } + + // ============ SMF + // 最大PDU会话数 + if key == "MaxPduSessions" { + resultMap["MaxPduSessions"] = 0 + } + // 最大QFI数 + if key == "MaxQfi" { + resultMap["MaxQfi"] = 0 + } + // 地址类型 RW + if key == "AddrType" { + resultMap["AddrType"] = "-" + } + // IP版本 RW + if key == "IpVersion" { + resultMap["IpVersion"] = "-" + } + // IP地址分段列表 RW + if key == "AddrList" { + resultMap["AddrList"] = []string{} + } + // N7接口本端IP地址列表 RW + if key == "N7LocIpAddrList" { + resultMap["N7LocIpAddrList"] = []string{} + } + // N7接口远端IP子网列表 RW + if key == "N7FarIpSubnetworkList" { + resultMap["N7FarIpSubnetworkList"] = []string{} + } + // N10接口本端IP地址列表 RW + if key == "N10LocIpAddrList" { + resultMap["N10LocIpAddrList"] = []string{} + } + // N10接口远端IP子网列表 RW + if key == "N10FarIpSubnetworkList" { + resultMap["N10FarIpSubnetworkList"] = []string{} + } + // N11接口本端IP地址列表 RW + if key == "N11LocIpAddrList" { + resultMap["N11LocIpAddrList"] = []string{} + } + // N11接口远端IP子网列表 RW + if key == "N11FarIpSubnetworkList" { + resultMap["N11FarIpSubnetworkList"] = []string{} + } + } + + return resultMap +} + +// ConfigParamModify 配置参数修改 +// operType 配置执行类型字符串 add:新增,mod:修改,del:删除 +// operPara 配置参数列表对象 具体可修改参数,请参考NRM数据模型规范中类型为“RW”的参数。 +func (s *ConfigImpl) ConfigParamModify(neInfo neModel.NeInfo, byUsername string, operType string, operPara map[string]any) []string { + failPara := []string{} + operParaSupport := []string{ + "Ruid", // 网络设备的全网唯一标识 RW + "UserLabel", // 用户友好名 RW + "ManagementIpAddress", // 设备侧管理口IP地址列表 RW + "Reboot", // 设备重启 RW + "BackupSoftwareActivateEnable", // 激活备份版本使能开关 RW + // ============ AMF + "SnssaiList", // 网络切片列表 RW + "Delta", // 位置更新区域半径 RW + "N8LocIpAddrList", // N8接口本端IP地址列表 RW + "N8FarIpSubnetworkList", // N8接口远端IP子网列表 RW + "N11LocIpAddrList", // N11接口本端IP地址列表 RW + "N11FarIpSubnetworkList", // N11接口远端IP子网列表 RW + "N12LocIpAddrList", // N12接口本端IP地址列表 RW + "N12FarIpSubnetworkList", // N12接口远端IP子网列表 RW + // ============ PCF + "MaxUe", // 最大签约用户数 RW + // ============ UPF + "N9LocIpAddrList", // N9接口本端IP地址列表 RW + "N9FarIpSubnetworkList", // N9接口远端IP子网列表 RW + "N3LocIpAddrList", // N3接口本端IP地址列表 RW + "N3FarIpSubnetworkList", // N3接口远端IP子网列表 RW + // ============ SMF + "AddrType", // 地址类型 RW + "IpVersion", // IP版本 RW + "AddrList", // IP地址分段列表 RW + "N7LocIpAddrList", // N7接口本端IP地址列表 RW + "N7FarIpSubnetworkList", // N7接口远端IP子网列表 RW + "N10LocIpAddrList", // N10接口本端IP地址列表 RW + "N10FarIpSubnetworkList", // N10接口远端IP子网列表 RW + } + + // 检查是否支持 + for k := range operPara { + hasKey := false + for _, key := range operParaSupport { + if k == key { + hasKey = true + break + } + } + if !hasKey { + failPara = append(failPara, k) + } + } + + // 网络设备的全网唯一标识 RW + _, okRuid := operPara["Ruid"] + // 用户友好名 RW + _, okUserLabel := operPara["UserLabel"] + // 设备侧管理口IP地址列表 RW + _, okManagementIpAddress := operPara["ManagementIpAddress"] + // 设备重启 RW + _, okReboot := operPara["Reboot"] + + _, okBackupSoftwareActivateEnable := operPara["BackupSoftwareActivateEnable"] + + // 修改 + if operType == "mod" { + if okRuid || okUserLabel || okManagementIpAddress || okReboot || okBackupSoftwareActivateEnable { + s.paramModifyBase(neInfo, operPara) + } + } + + // ============ AMF + // 网络切片列表 RW + _, okBackupSnssaiList := operPara["SnssaiList"] + // 位置更新区域半径 RW + _, okDelta := operPara["Delta"] + // N8接口本端IP地址列表 RW + _, okN8LocIpAddrList := operPara["N8LocIpAddrList"] + // N8接口远端IP子网列表 RW + _, okN8FarIpSubnetworkList := operPara["N8FarIpSubnetworkList"] + // N11接口本端IP地址列表 RW + _, okN11LocIpAddrList := operPara["N11LocIpAddrList"] + // N11接口远端IP子网列表 RW + _, okN11FarIpSubnetworkList := operPara["N11FarIpSubnetworkList"] + // N12接口本端IP地址列表 RW + _, okN12LocIpAddrList := operPara["N12LocIpAddrList"] + // N12接口远端IP子网列表 RW + _, okN12FarIpSubnetworkList := operPara["N12FarIpSubnetworkList"] + + // 修改 + if neInfo.NeType == "AMF" { + if okBackupSnssaiList || okDelta || okN8LocIpAddrList || okN8FarIpSubnetworkList || okN11LocIpAddrList || okN11FarIpSubnetworkList || okN12LocIpAddrList || okN12FarIpSubnetworkList { + rs := s.paramModifyAMF(neInfo, operPara) + failPara = append(failPara, rs...) + } + } + + // ============ PCF + // 最大签约用户数 RW + _, okMaxUe := operPara["MaxUe"] + + // 修改 + if neInfo.NeType == "PCF" { + if okMaxUe { + rs := s.paramModifyPCF(neInfo, operPara) + failPara = append(failPara, rs...) + } + } + + // ============ UPF + // N9接口本端IP地址列表 RW + _, okN9LocIpAddrList := operPara["N9LocIpAddrList"] + // N9接口远端IP子网列表 RW + _, okN9FarIpSubnetworkList := operPara["N9FarIpSubnetworkList"] + // N3接口本端IP地址列表 RW + _, okN3LocIpAddrList := operPara["N3LocIpAddrList"] + // N3接口远端IP子网列表 RW + _, okN3FarIpSubnetworkList := operPara["N3FarIpSubnetworkList"] + + // 修改 + if neInfo.NeType == "UPF" { + if okN9LocIpAddrList || okN9FarIpSubnetworkList || okN3LocIpAddrList || okN3FarIpSubnetworkList { + rs := s.paramModifyUPF(neInfo, operPara) + failPara = append(failPara, rs...) + } + } + + // ============ SMF + // 地址类型 RW + _, okAddrType := operPara["AddrType"] + // IP版本 RW + _, okIpVersion := operPara["IpVersion"] + // IP地址分段列表 RW + _, okAddrList := operPara["AddrList"] + // N7接口本端IP地址列表 RW + _, okN7LocIpAddrList := operPara["N7LocIpAddrList"] + // N7接口远端IP子网列表 RW + _, okN7FarIpSubnetworkList := operPara["N7FarIpSubnetworkList"] + // N10接口本端IP地址列表 RW + _, okN10LocIpAddrList := operPara["N10LocIpAddrList"] + // N10接口远端IP子网列表 RW + _, okN10FarIpSubnetworkList := operPara["N10FarIpSubnetworkList"] + + // 修改 + if neInfo.NeType == "SMF" { + if okAddrType || okIpVersion || okAddrList || okN7LocIpAddrList || okN7FarIpSubnetworkList || okN10LocIpAddrList || okN10FarIpSubnetworkList || okN11LocIpAddrList || okN11FarIpSubnetworkList { + rs := s.paramModifySMF(neInfo, operPara) + failPara = append(failPara, rs...) + } + } + + // 删除 + // if operType == "del" {} + + // 新增 + // if operType == "add" {} + + // 操作记录到数据库 + bytes, _ := json.Marshal(operPara) + nowTime := time.Now() + nrmLog := model.NRMLog{ + Ruid: neInfo.RmUID, + UserLabel: neInfo.NeName, + CreateBy: byUsername, + CreateTime: nowTime.UnixMilli(), + ChangeTime: date.ParseDateToStr(time.Now(), date.YYYY_MM_DD_HH_MM_SS), + ChangeType: operType, + ChangeOper: string(bytes), + } + nrmLogId := s.resourceService.ResourceeInsert(nrmLog) + // 操作记录推入kafka + if nrmLogId != "" { + pushData := operPara + pushData["MsgID"] = nrmLogId + pushData["Ruid"] = nrmLog.Ruid + pushData["ChangeTime"] = nrmLog.ChangeTime + pushData["ChangeType"] = nrmLog.ChangeType + s.resourceService.KafkaPush(neInfo.NeType, "", pushData) + } + + return failPara +} + +// paramModifyBase 修改基本 +func (s *ConfigImpl) paramModifyBase(neInfo neModel.NeInfo, operPara map[string]any) { + if v, ok := operPara["Ruid"]; ok && v != nil { + neInfo.RmUID = v.(string) + } + if v, ok := operPara["UserLabel"]; ok && v != nil { + neInfo.NeName = v.(string) + } + if v, ok := operPara["ManagementIpAddress"]; ok && v != nil { + managementIpAddress := v.([]string) + if len(managementIpAddress) > 0 { + neInfo.IP = managementIpAddress[0] + } + } + + // 重启 + if v, ok := operPara["Reboot"]; ok && v != nil { + if v.(bool) { + neTypeLower := strings.ToLower(neInfo.NeType) + cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) + if neTypeLower == "omc" { + cmdStr = "nohup sh -c \"sudo systemctl stop omc && sleep 5s && sudo systemctl restart omc\" > /dev/null 2>&1 &" + } else if neTypeLower == "ims" { + cmdStr = "ims-stop || true && ims-start" + } + _, err := s.neInfoService.NeRunSSHCmd(neInfo.NeType, neInfo.NeId, cmdStr) + if err != nil { + logger.Errorf("NE service reboot error %s \n", err.Error()) + } + } + } + + // 回退 + if v, ok := operPara["BackupSoftwareActivateEnable"]; ok && v != nil { + if v.(bool) { + neVersion := s.neVersionService.SelectByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + if neVersion.NeId == neInfo.NeId { + preinput := map[string]string{} + if neInfo.NeType == "IMS" { + preinput["pisCSCF"] = "y" + preinput["updateMFetc"] = "No" + preinput["updateMFshare"] = "No" + } + // 进行相关命令操作 + _, err := s.neVersionService.Operate("rollback", neVersion, preinput) + if err != nil { + logger.Errorf("NE service backupSoftwareActivateEnable error %s \n", err.Error()) + } + } + } + } + + // 获取网元状态是否正常 + _, err := neFetchlink.NeState(neInfo) + if err != nil { + neInfo.Status = "1" + } else { + // 下发网管配置信息给网元 + _, err = neFetchlink.NeConfigOMC(neInfo) + if err == nil { + neInfo.Status = "0" + } else { + neInfo.Status = "3" + } + } + s.neInfoService.Update(neInfo) +} + +// paramModifyAMF 修改AMF +func (s *ConfigImpl) paramModifyAMF(neInfo neModel.NeInfo, operPara map[string]any) []string { + failPara := []string{} + + fmt.Println(neInfo.NeType) + for k, v := range operPara { + fmt.Println(k, v) + failPara = append(failPara, k) + } + return failPara +} + +// paramModifyPCF 修改PCF +func (s *ConfigImpl) paramModifyPCF(neInfo neModel.NeInfo, operPara map[string]any) []string { + failPara := []string{} + fmt.Println(neInfo.NeType) + for k, v := range operPara { + fmt.Println(k, v) + failPara = append(failPara, k) + } + return failPara +} + +// paramModifyUPF 修改UPF +func (s *ConfigImpl) paramModifyUPF(neInfo neModel.NeInfo, operPara map[string]any) []string { + failPara := []string{} + fmt.Println(neInfo.NeType) + for k, v := range operPara { + fmt.Println(k, v) + failPara = append(failPara, k) + } + return failPara +} + +// paramModifySMF 修改SMF +func (s *ConfigImpl) paramModifySMF(neInfo neModel.NeInfo, operPara map[string]any) []string { + failPara := []string{} + fmt.Println(neInfo.NeType) + for k, v := range operPara { + fmt.Println(k, v) + failPara = append(failPara, k) + } + return failPara } diff --git a/src/modules/nms_cxy/service/config.impl.go b/src/modules/nms_cxy/service/config.impl.go deleted file mode 100644 index fbbe011..0000000 --- a/src/modules/nms_cxy/service/config.impl.go +++ /dev/null @@ -1,610 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - neModel "nms_cxy/src/modules/network_element/model" - neService "nms_cxy/src/modules/network_element/service" - "nms_cxy/src/modules/nms_cxy/model" - "nms_cxy/src/modules/nms_cxy/utils/common" - "runtime" - "strings" - "time" - - neFetchlink "nms_cxy/src/modules/network_element/fetch_link" -) - -// 实例化数据层 ConfigImpl 结构体 -var NewConfigImpl = &ConfigImpl{ - neInfoService: neService.NewNeInfoImpl, - neVersionService: neService.NewNeVersionImpl, - resourceService: NewResourceImpl, -} - -// 配置数据处理服务 服务层处理 -type ConfigImpl struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 网元版本信息服务 - neVersionService neService.INeVersion - // 资源数据处理服务 - resourceService IResource -} - -// ConfigUploadOSS 配置数据上报 -// 配置数据上报时间为每日的0时及12时, -func (s *ConfigImpl) ConfigUploadOSS(neType string) error { - // 查网元 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, "001") - if neInfo.NeType != neType { - logger.Errorf("ConfigUploadOSS ne info not fount") - return fmt.Errorf("no ne info") - } - - // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - logger.Errorf("ConfigUploadOSS NeRunSSHClient %s", err.Error()) - return fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - logger.Errorf("ConfigUploadOSS NewClientSFTP %s", err.Error()) - return fmt.Errorf("ne info sftp client err") - - } - defer sftpClient.Close() - - // 配置文件目录 - nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", strings.ToLower(neType)) - nePathTemp := fmt.Sprintf("/tmp/%s/config/", strings.ToLower(neType)) - localPath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/config/", strings.ToLower(neType)) - if runtime.GOOS == "windows" { - localPath = fmt.Sprintf("C:%s", localPath) - } - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", nePathTemp, nePath, nePathTemp)) - // 复制到本地 - if err = sftpClient.CopyDirRemoteToLocal(nePathTemp, localPath); err != nil { - logger.Errorf("%s : please check if scp remote copy is allowed", neInfo.NeType) - return fmt.Errorf("copy config err") - } - - // 文件名 - dataSaveFileName := common.DataSaveFileName{} - fileName := dataSaveFileName.ZIP() - filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) - - err = file.CompressZipByDir(filePath, localPath) - if err != nil { - logger.Errorf("ConfigUploadOSS zip err %s", err.Error()) - return err - } - - return common.UploadOSSByZip(filePath, neType, "CM") -} - -// ConfigParamQuery 配置参数查询 -// -// 请参考NRM数据模型规范中类型为“R”的参数。 -func (s *ConfigImpl) ConfigParamQuery(neInfo neModel.NeInfo, operPara []string) map[string]any { - resultMap := map[string]any{} - - neState, err := neFetchlink.NeState(neInfo) - if err != nil { - return resultMap - } - - for _, key := range operPara { - // 网络设备的全网唯一标识 RW - if key == "Ruid" { - resultMap["Ruid"] = neInfo.RmUID - } - // 用户友好名 RW - if key == "UserLabel" { - resultMap["UserLabel"] = neInfo.NeName - } - // 制造商名称 - if key == "Manufacturer" { - resultMap["Manufacturer"] = neInfo.VendorName - } - // 设备型号 - if key == "Model" { - resultMap["Model"] = neInfo.NeType - } - // 设备序列号 - if key == "SerialNumber" { - resultMap["SerialNumber"] = neState["sn"] - } - // 硬件版本 - if key == "HardwareVersion" { - resultMap["HardwareVersion"] = neState["version"] - } - // 运行时长 - if key == "RunTime" { - resultMap["RunTime"] = 0 - } - // 首次使用日期 - if key == "FirstUseDate" { - resultMap["FirstUseDate"] = "2024" - } - // 设备侧管理口IP地址列表 RW - if key == "ManagementIpAddress" { - resultMap["ManagementIpAddress"] = []string{neInfo.IP} - } - // 设备运行状态 health,warning,fault - if key == "Status" { - if neInfo.Status == "0" { - resultMap["Status"] = "health" - } - if neInfo.Status == "1" { - resultMap["Status"] = "fault" - } - resultMap["Status"] = "warning" - } - // 设备重启 RW - if key == "Reboot" { - resultMap["Reboot"] = false - } - // 激活备份版本使能开关 RW - if key == "BackupSoftwareActivateEnable" { - resultMap["BackupSoftwareActivateEnable"] = false - } - // 系统当前版本 - if key == "CurrentSoftwareVersion" { - resultMap["CurrentSoftwareVersion"] = neState["version"] - } - // 系统备份版本 - if key == "BackupSoftwareVersion" { - resultMap["BackupSoftwareVersion"] = "-" - } - - // FQDN - if key == "Fqdn" { - resultMap["Fqdn"] = "-" - } - // 服务列表 - if key == "SbiServiceList" { - resultMap["SbiServiceList"] = []string{} - } - - // ============ AMF - // 全球AMF唯一标识列表 - if key == "GuamiList" { - resultMap["GuamiList"] = []string{} - } - // 网络切片列表 RW - if key == "SnssaiList" { - resultMap["SnssaiList"] = []string{} - } - // 最大注册用户数 - if key == "MaxUser" { - resultMap["MaxUser"] = neState["capability"] - } - // 相对容量 - if key == "RelativeCapacity" { - resultMap["RelativeCapacity"] = neState["capability"] - } - // 最大支持基站数 - if key == "MaxGnbNum" { - resultMap["MaxGnbNum"] = 0 - } - // 位置更新区域半径 RW - if key == "Delta" { - resultMap["Delta"] = 0 - } - // N8接口本端IP地址列表 RW - if key == "N8LocIpAddrList" { - resultMap["N8LocIpAddrList"] = 0 - } - // N8接口远端IP子网列表 RW - if key == "N8FarIpSubnetworkList" { - resultMap["N8FarIpSubnetworkList"] = 0 - } - // N11接口本端IP地址列表 RW - if key == "N11LocIpAddrList" { - resultMap["N11LocIpAddrList"] = 0 - } - // N11接口远端IP子网列表 RW - if key == "N11FarIpSubnetworkList" { - resultMap["N11FarIpSubnetworkList"] = 0 - } - // N12接口本端IP地址列表 RW - if key == "N12LocIpAddrList" { - resultMap["N12LocIpAddrList"] = 0 - } - // N12接口远端IP子网列表 RW - if key == "N12FarIpSubnetworkList" { - resultMap["N12FarIpSubnetworkList"] = 0 - } - - // ============ UDM - // 最大可存储的IMSI个数 - if key == "MaxNumImsi" { - resultMap["MaxNumImsi"] = 0 - } - // 最大可存储的MSISDN个数 - if key == "MaxNumMsisdn" { - resultMap["MaxNumMsisdn"] = 0 - } - - // ============ PCF - // 最大签约用户数 RW - if key == "MaxUe" { - resultMap["MaxUe"] = 0 - } - - // ============ UPF - // 最大QoS流数 - if key == "MaxQosFlows" { - resultMap["MaxQosFlows"] = 0 - } - // 最大数据吞吐率 - if key == "MaxThroughput" { - resultMap["MaxThroughput"] = "-" - } - // N9接口本端IP地址列表 RW - if key == "N9LocIpAddrList" { - resultMap["N9LocIpAddrList"] = []string{} - } - // N9接口远端IP子网列表 RW - if key == "N9FarIpSubnetworkList" { - resultMap["N9FarIpSubnetworkList"] = []string{} - } - // N3接口本端IP地址列表 RW - if key == "N3LocIpAddrList" { - resultMap["N3LocIpAddrList"] = []string{} - } - // N3接口远端IP子网列表 RW - if key == "N3FarIpSubnetworkList" { - resultMap["N3FarIpSubnetworkList"] = []string{} - } - - // ============ SMF - // 最大PDU会话数 - if key == "MaxPduSessions" { - resultMap["MaxPduSessions"] = 0 - } - // 最大QFI数 - if key == "MaxQfi" { - resultMap["MaxQfi"] = 0 - } - // 地址类型 RW - if key == "AddrType" { - resultMap["AddrType"] = "-" - } - // IP版本 RW - if key == "IpVersion" { - resultMap["IpVersion"] = "-" - } - // IP地址分段列表 RW - if key == "AddrList" { - resultMap["AddrList"] = []string{} - } - // N7接口本端IP地址列表 RW - if key == "N7LocIpAddrList" { - resultMap["N7LocIpAddrList"] = []string{} - } - // N7接口远端IP子网列表 RW - if key == "N7FarIpSubnetworkList" { - resultMap["N7FarIpSubnetworkList"] = []string{} - } - // N10接口本端IP地址列表 RW - if key == "N10LocIpAddrList" { - resultMap["N10LocIpAddrList"] = []string{} - } - // N10接口远端IP子网列表 RW - if key == "N10FarIpSubnetworkList" { - resultMap["N10FarIpSubnetworkList"] = []string{} - } - // N11接口本端IP地址列表 RW - if key == "N11LocIpAddrList" { - resultMap["N11LocIpAddrList"] = []string{} - } - // N11接口远端IP子网列表 RW - if key == "N11FarIpSubnetworkList" { - resultMap["N11FarIpSubnetworkList"] = []string{} - } - } - - return resultMap -} - -// ConfigParamModify 配置参数修改 -// operType 配置执行类型字符串 add:新增,mod:修改,del:删除 -// operPara 配置参数列表对象 具体可修改参数,请参考NRM数据模型规范中类型为“RW”的参数。 -func (s *ConfigImpl) ConfigParamModify(neInfo neModel.NeInfo, byUsername string, operType string, operPara map[string]any) []string { - failPara := []string{} - operParaSupport := []string{ - "Ruid", // 网络设备的全网唯一标识 RW - "UserLabel", // 用户友好名 RW - "ManagementIpAddress", // 设备侧管理口IP地址列表 RW - "Reboot", // 设备重启 RW - "BackupSoftwareActivateEnable", // 激活备份版本使能开关 RW - // ============ AMF - "SnssaiList", // 网络切片列表 RW - "Delta", // 位置更新区域半径 RW - "N8LocIpAddrList", // N8接口本端IP地址列表 RW - "N8FarIpSubnetworkList", // N8接口远端IP子网列表 RW - "N11LocIpAddrList", // N11接口本端IP地址列表 RW - "N11FarIpSubnetworkList", // N11接口远端IP子网列表 RW - "N12LocIpAddrList", // N12接口本端IP地址列表 RW - "N12FarIpSubnetworkList", // N12接口远端IP子网列表 RW - // ============ PCF - "MaxUe", // 最大签约用户数 RW - // ============ UPF - "N9LocIpAddrList", // N9接口本端IP地址列表 RW - "N9FarIpSubnetworkList", // N9接口远端IP子网列表 RW - "N3LocIpAddrList", // N3接口本端IP地址列表 RW - "N3FarIpSubnetworkList", // N3接口远端IP子网列表 RW - // ============ SMF - "AddrType", // 地址类型 RW - "IpVersion", // IP版本 RW - "AddrList", // IP地址分段列表 RW - "N7LocIpAddrList", // N7接口本端IP地址列表 RW - "N7FarIpSubnetworkList", // N7接口远端IP子网列表 RW - "N10LocIpAddrList", // N10接口本端IP地址列表 RW - "N10FarIpSubnetworkList", // N10接口远端IP子网列表 RW - } - - // 检查是否支持 - for k := range operPara { - hasKey := false - for _, key := range operParaSupport { - if k == key { - hasKey = true - break - } - } - if !hasKey { - failPara = append(failPara, k) - } - } - - // 网络设备的全网唯一标识 RW - _, okRuid := operPara["Ruid"] - // 用户友好名 RW - _, okUserLabel := operPara["UserLabel"] - // 设备侧管理口IP地址列表 RW - _, okManagementIpAddress := operPara["ManagementIpAddress"] - // 设备重启 RW - _, okReboot := operPara["Reboot"] - - _, okBackupSoftwareActivateEnable := operPara["BackupSoftwareActivateEnable"] - - // 修改 - if operType == "mod" { - if okRuid || okUserLabel || okManagementIpAddress || okReboot || okBackupSoftwareActivateEnable { - s.paramModifyBase(neInfo, operPara) - } - } - - // ============ AMF - // 网络切片列表 RW - _, okBackupSnssaiList := operPara["SnssaiList"] - // 位置更新区域半径 RW - _, okDelta := operPara["Delta"] - // N8接口本端IP地址列表 RW - _, okN8LocIpAddrList := operPara["N8LocIpAddrList"] - // N8接口远端IP子网列表 RW - _, okN8FarIpSubnetworkList := operPara["N8FarIpSubnetworkList"] - // N11接口本端IP地址列表 RW - _, okN11LocIpAddrList := operPara["N11LocIpAddrList"] - // N11接口远端IP子网列表 RW - _, okN11FarIpSubnetworkList := operPara["N11FarIpSubnetworkList"] - // N12接口本端IP地址列表 RW - _, okN12LocIpAddrList := operPara["N12LocIpAddrList"] - // N12接口远端IP子网列表 RW - _, okN12FarIpSubnetworkList := operPara["N12FarIpSubnetworkList"] - - // 修改 - if neInfo.NeType == "AMF" { - if okBackupSnssaiList || okDelta || okN8LocIpAddrList || okN8FarIpSubnetworkList || okN11LocIpAddrList || okN11FarIpSubnetworkList || okN12LocIpAddrList || okN12FarIpSubnetworkList { - rs := s.paramModifyAMF(neInfo, operPara) - failPara = append(failPara, rs...) - } - } - - // ============ PCF - // 最大签约用户数 RW - _, okMaxUe := operPara["MaxUe"] - - // 修改 - if neInfo.NeType == "PCF" { - if okMaxUe { - rs := s.paramModifyPCF(neInfo, operPara) - failPara = append(failPara, rs...) - } - } - - // ============ UPF - // N9接口本端IP地址列表 RW - _, okN9LocIpAddrList := operPara["N9LocIpAddrList"] - // N9接口远端IP子网列表 RW - _, okN9FarIpSubnetworkList := operPara["N9FarIpSubnetworkList"] - // N3接口本端IP地址列表 RW - _, okN3LocIpAddrList := operPara["N3LocIpAddrList"] - // N3接口远端IP子网列表 RW - _, okN3FarIpSubnetworkList := operPara["N3FarIpSubnetworkList"] - - // 修改 - if neInfo.NeType == "UPF" { - if okN9LocIpAddrList || okN9FarIpSubnetworkList || okN3LocIpAddrList || okN3FarIpSubnetworkList { - rs := s.paramModifyUPF(neInfo, operPara) - failPara = append(failPara, rs...) - } - } - - // ============ SMF - // 地址类型 RW - _, okAddrType := operPara["AddrType"] - // IP版本 RW - _, okIpVersion := operPara["IpVersion"] - // IP地址分段列表 RW - _, okAddrList := operPara["AddrList"] - // N7接口本端IP地址列表 RW - _, okN7LocIpAddrList := operPara["N7LocIpAddrList"] - // N7接口远端IP子网列表 RW - _, okN7FarIpSubnetworkList := operPara["N7FarIpSubnetworkList"] - // N10接口本端IP地址列表 RW - _, okN10LocIpAddrList := operPara["N10LocIpAddrList"] - // N10接口远端IP子网列表 RW - _, okN10FarIpSubnetworkList := operPara["N10FarIpSubnetworkList"] - - // 修改 - if neInfo.NeType == "SMF" { - if okAddrType || okIpVersion || okAddrList || okN7LocIpAddrList || okN7FarIpSubnetworkList || okN10LocIpAddrList || okN10FarIpSubnetworkList || okN11LocIpAddrList || okN11FarIpSubnetworkList { - rs := s.paramModifySMF(neInfo, operPara) - failPara = append(failPara, rs...) - } - } - - // 删除 - // if operType == "del" {} - - // 新增 - // if operType == "add" {} - - // 操作记录到数据库 - bytes, _ := json.Marshal(operPara) - nowTime := time.Now() - nrmLog := model.NRMLog{ - Ruid: neInfo.RmUID, - UserLabel: neInfo.NeName, - CreateBy: byUsername, - CreateTime: nowTime.UnixMilli(), - ChangeTime: date.ParseDateToStr(time.Now(), date.YYYY_MM_DD_HH_MM_SS), - ChangeType: operType, - ChangeOper: string(bytes), - } - nrmLogId := s.resourceService.ResourceeInsert(nrmLog) - // 操作记录推入kafka - if nrmLogId != "" { - pushData := operPara - pushData["MsgID"] = nrmLogId - pushData["Ruid"] = nrmLog.Ruid - pushData["ChangeTime"] = nrmLog.ChangeTime - pushData["ChangeType"] = nrmLog.ChangeType - s.resourceService.KafkaPush(neInfo.NeType, "", pushData) - } - - return failPara -} - -// paramModifyBase 修改基本 -func (s *ConfigImpl) paramModifyBase(neInfo neModel.NeInfo, operPara map[string]any) { - if v, ok := operPara["Ruid"]; ok && v != nil { - neInfo.RmUID = v.(string) - } - if v, ok := operPara["UserLabel"]; ok && v != nil { - neInfo.NeName = v.(string) - } - if v, ok := operPara["ManagementIpAddress"]; ok && v != nil { - managementIpAddress := v.([]string) - if len(managementIpAddress) > 0 { - neInfo.IP = managementIpAddress[0] - } - } - - // 重启 - if v, ok := operPara["Reboot"]; ok && v != nil { - if v.(bool) { - neTypeLower := strings.ToLower(neInfo.NeType) - cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) - if neTypeLower == "omc" { - cmdStr = "nohup sh -c \"sudo systemctl stop omc && sleep 5s && sudo systemctl restart omc\" > /dev/null 2>&1 &" - } else if neTypeLower == "ims" { - cmdStr = "ims-stop || true && ims-start" - } - _, err := s.neInfoService.NeRunSSHCmd(neInfo.NeType, neInfo.NeId, cmdStr) - if err != nil { - logger.Errorf("NE service reboot error %s \n", err.Error()) - } - } - } - - // 回退 - if v, ok := operPara["BackupSoftwareActivateEnable"]; ok && v != nil { - if v.(bool) { - neVersion := s.neVersionService.SelectByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - if neVersion.NeId == neInfo.NeId { - preinput := map[string]string{} - if neInfo.NeType == "IMS" { - preinput["pisCSCF"] = "y" - preinput["updateMFetc"] = "No" - preinput["updateMFshare"] = "No" - } - // 进行相关命令操作 - _, err := s.neVersionService.Operate("rollback", neVersion, preinput) - if err != nil { - logger.Errorf("NE service backupSoftwareActivateEnable error %s \n", err.Error()) - } - } - } - } - - // 获取网元状态是否正常 - _, err := neFetchlink.NeState(neInfo) - if err != nil { - neInfo.Status = "1" - } else { - // 下发网管配置信息给网元 - _, err = neFetchlink.NeConfigOMC(neInfo) - if err == nil { - neInfo.Status = "0" - } else { - neInfo.Status = "3" - } - } - s.neInfoService.Update(neInfo) -} - -// paramModifyAMF 修改AMF -func (s *ConfigImpl) paramModifyAMF(neInfo neModel.NeInfo, operPara map[string]any) []string { - failPara := []string{} - - fmt.Println(neInfo.NeType) - for k, v := range operPara { - fmt.Println(k, v) - failPara = append(failPara, k) - } - return failPara -} - -// paramModifyPCF 修改PCF -func (s *ConfigImpl) paramModifyPCF(neInfo neModel.NeInfo, operPara map[string]any) []string { - failPara := []string{} - fmt.Println(neInfo.NeType) - for k, v := range operPara { - fmt.Println(k, v) - failPara = append(failPara, k) - } - return failPara -} - -// paramModifyUPF 修改UPF -func (s *ConfigImpl) paramModifyUPF(neInfo neModel.NeInfo, operPara map[string]any) []string { - failPara := []string{} - fmt.Println(neInfo.NeType) - for k, v := range operPara { - fmt.Println(k, v) - failPara = append(failPara, k) - } - return failPara -} - -// paramModifySMF 修改SMF -func (s *ConfigImpl) paramModifySMF(neInfo neModel.NeInfo, operPara map[string]any) []string { - failPara := []string{} - fmt.Println(neInfo.NeType) - for k, v := range operPara { - fmt.Println(k, v) - failPara = append(failPara, k) - } - return failPara -} diff --git a/src/modules/nms_cxy/service/log.go b/src/modules/nms_cxy/service/log.go index e8ff89c..1c03d66 100644 --- a/src/modules/nms_cxy/service/log.go +++ b/src/modules/nms_cxy/service/log.go @@ -1,10 +1,155 @@ package service -// 日志数据处理服务 服务层接口 -type ILog interface { - // OperateLogToFile 操作日志写入文件 - OperateLogToFile(language, startTime, endTime string) (int64, string) +import ( + "fmt" - // SecurityLogToFile 安全日志写入文件 - SecurityLogToFile(language, startTime, endTime string) (int64, string) + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/nms_cxy/utils/common" + systemModel "be.ems/src/modules/system/model" + systemService "be.ems/src/modules/system/service" +) + +// 实例化数据层 LogImpl 结构体 +var NewLogImpl = &LogImpl{ + sysLogOperateService: systemService.NewSysLogOperateImpl, + sysLogLoginService: systemService.NewSysLogLoginImpl, +} + +// 日志数据处理服务 服务层处理 +type LogImpl struct { + // 操作日志服务 + sysLogOperateService systemService.ISysLogOperate + // 系统登录日志服务 + sysLogLoginService systemService.ISysLogLogin +} + +// OperateLogToFile 操作日志写入文件 +func (s *LogImpl) OperateLogToFile(language, startTime, endTime string) (int64, string) { + var pageNum int64 = 1 + var pageSize int64 = 20 + dataArr := []any{} + + // 查询数据 + pageData := s.sysLogOperateService.SelectSysLogOperatePage(map[string]any{ + "beginTime": startTime, + "endTime": endTime, + "pageNum": pageNum, + "pageSize": pageSize, + }, "") + + total := parse.Number(pageData["total"]) + rows, ok := pageData["rows"].([]systemModel.SysLogOperate) + if !ok || len(rows) <= 0 { + return 0, "" + } + for _, v := range rows { + v.Title = i18n.TKey(language, v.Title) + v.OperLocation = i18n.TKey(language, v.OperLocation) + v.Method = "-" + dataArr = append(dataArr, v) + } + pageNum += 1 + + // 按总数分批遍历 + batchNum := total / pageSize + for i := 1; i <= int(batchNum); i++ { + // 查询数据 + pageData := s.sysLogOperateService.SelectSysLogOperatePage(map[string]any{ + "beginTime": startTime, + "endTime": endTime, + "pageNum": pageNum, + "pageSize": pageSize, + }, "") + rows, ok := pageData["rows"].([]systemModel.SysLogOperate) + if !ok || len(rows) <= 0 { + return int64(len(dataArr)), "" + } + for _, v := range rows { + v.Title = i18n.TKey(language, v.Title) + v.OperLocation = i18n.TKey(language, v.OperLocation) + v.Method = "-" + dataArr = append(dataArr, v) + } + pageNum += 1 + } + + // 文件名 + dataSaveFileName := common.DataSaveFileName{ + LogType: "operate", + } + fileName := dataSaveFileName.JSON() + filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + err := file.WriterFileJSONLine(dataArr, filePath) + if err != nil { + return int64(len(dataArr)), "" + } + return int64(len(dataArr)), filePath +} + +// SecurityLogToFile 安全日志写入文件 +func (s *LogImpl) SecurityLogToFile(language, startTime, endTime string) (int64, string) { + var pageNum int64 = 1 + var pageSize int64 = 20 + dataArr := []any{} + + // 查询数据 + pageData := s.sysLogLoginService.SelectSysLogLoginPage(map[string]any{ + "beginTime": startTime, + "endTime": endTime, + "pageNum": pageNum, + "pageSize": pageSize, + }, "") + + total := parse.Number(pageData["total"]) + rows, ok := pageData["rows"].([]systemModel.SysLogLogin) + if !ok || len(rows) <= 0 { + return 0, "" + } + for _, v := range rows { + v.LoginLocation = i18n.TKey(language, v.LoginLocation) + v.OS = i18n.TKey(language, v.OS) + v.Browser = i18n.TKey(language, v.Browser) + v.Msg = i18n.TKey(language, v.Msg) + dataArr = append(dataArr, v) + } + pageNum += 1 + + // 按总数分批遍历 + batchNum := total / pageSize + for i := 1; i <= int(batchNum); i++ { + // 查询数据 + pageData := s.sysLogLoginService.SelectSysLogLoginPage(map[string]any{ + "beginTime": startTime, + "endTime": endTime, + "pageNum": pageNum, + "pageSize": pageSize, + }, "") + rows, ok := pageData["rows"].([]systemModel.SysLogLogin) + if !ok || len(rows) <= 0 { + return int64(len(dataArr)), "" + } + for _, v := range rows { + v.LoginLocation = i18n.TKey(language, v.LoginLocation) + v.OS = i18n.TKey(language, v.OS) + v.Browser = i18n.TKey(language, v.Browser) + v.Msg = i18n.TKey(language, v.Msg) + dataArr = append(dataArr, v) + } + pageNum += 1 + } + + // 文件名 + dataSaveFileName := common.DataSaveFileName{ + LogType: "security", + } + fileName := dataSaveFileName.JSON() + filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + err := file.WriterFileJSONLine(dataArr, filePath) + if err != nil { + return int64(len(dataArr)), "" + } + return int64(len(dataArr)), filePath } diff --git a/src/modules/nms_cxy/service/log.impl.go b/src/modules/nms_cxy/service/log.impl.go deleted file mode 100644 index 0770277..0000000 --- a/src/modules/nms_cxy/service/log.impl.go +++ /dev/null @@ -1,154 +0,0 @@ -package service - -import ( - "fmt" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/modules/nms_cxy/utils/common" - systemModel "nms_cxy/src/modules/system/model" - systemService "nms_cxy/src/modules/system/service" -) - -// 实例化数据层 LogImpl 结构体 -var NewLogImpl = &LogImpl{ - sysLogOperateService: systemService.NewSysLogOperateImpl, - sysLogLoginService: systemService.NewSysLogLoginImpl, -} - -// 日志数据处理服务 服务层处理 -type LogImpl struct { - // 操作日志服务 - sysLogOperateService systemService.ISysLogOperate - // 系统登录日志服务 - sysLogLoginService systemService.ISysLogLogin -} - -// OperateLogToFile 操作日志写入文件 -func (s *LogImpl) OperateLogToFile(language, startTime, endTime string) (int64, string) { - var pageNum int64 = 1 - var pageSize int64 = 20 - dataArr := []any{} - - // 查询数据 - pageData := s.sysLogOperateService.SelectSysLogOperatePage(map[string]any{ - "beginTime": startTime, - "endTime": endTime, - "pageNum": pageNum, - "pageSize": pageSize, - }, "") - - total := parse.Number(pageData["total"]) - rows, ok := pageData["rows"].([]systemModel.SysLogOperate) - if !ok || len(rows) <= 0 { - return 0, "" - } - for _, v := range rows { - v.Title = i18n.TKey(language, v.Title) - v.OperLocation = i18n.TKey(language, v.OperLocation) - v.Method = "-" - dataArr = append(dataArr, v) - } - pageNum += 1 - - // 按总数分批遍历 - batchNum := total / pageSize - for i := 1; i <= int(batchNum); i++ { - // 查询数据 - pageData := s.sysLogOperateService.SelectSysLogOperatePage(map[string]any{ - "beginTime": startTime, - "endTime": endTime, - "pageNum": pageNum, - "pageSize": pageSize, - }, "") - rows, ok := pageData["rows"].([]systemModel.SysLogOperate) - if !ok || len(rows) <= 0 { - return int64(len(dataArr)), "" - } - for _, v := range rows { - v.Title = i18n.TKey(language, v.Title) - v.OperLocation = i18n.TKey(language, v.OperLocation) - v.Method = "-" - dataArr = append(dataArr, v) - } - pageNum += 1 - } - - // 文件名 - dataSaveFileName := common.DataSaveFileName{ - LogType: "operate", - } - fileName := dataSaveFileName.JSON() - filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) - err := file.WriterFileJSONLine(dataArr, filePath) - if err != nil { - return int64(len(dataArr)), "" - } - return int64(len(dataArr)), filePath -} - -// SecurityLogToFile 安全日志写入文件 -func (s *LogImpl) SecurityLogToFile(language, startTime, endTime string) (int64, string) { - var pageNum int64 = 1 - var pageSize int64 = 20 - dataArr := []any{} - - // 查询数据 - pageData := s.sysLogLoginService.SelectSysLogLoginPage(map[string]any{ - "beginTime": startTime, - "endTime": endTime, - "pageNum": pageNum, - "pageSize": pageSize, - }, "") - - total := parse.Number(pageData["total"]) - rows, ok := pageData["rows"].([]systemModel.SysLogLogin) - if !ok || len(rows) <= 0 { - return 0, "" - } - for _, v := range rows { - v.LoginLocation = i18n.TKey(language, v.LoginLocation) - v.OS = i18n.TKey(language, v.OS) - v.Browser = i18n.TKey(language, v.Browser) - v.Msg = i18n.TKey(language, v.Msg) - dataArr = append(dataArr, v) - } - pageNum += 1 - - // 按总数分批遍历 - batchNum := total / pageSize - for i := 1; i <= int(batchNum); i++ { - // 查询数据 - pageData := s.sysLogLoginService.SelectSysLogLoginPage(map[string]any{ - "beginTime": startTime, - "endTime": endTime, - "pageNum": pageNum, - "pageSize": pageSize, - }, "") - rows, ok := pageData["rows"].([]systemModel.SysLogLogin) - if !ok || len(rows) <= 0 { - return int64(len(dataArr)), "" - } - for _, v := range rows { - v.LoginLocation = i18n.TKey(language, v.LoginLocation) - v.OS = i18n.TKey(language, v.OS) - v.Browser = i18n.TKey(language, v.Browser) - v.Msg = i18n.TKey(language, v.Msg) - dataArr = append(dataArr, v) - } - pageNum += 1 - } - - // 文件名 - dataSaveFileName := common.DataSaveFileName{ - LogType: "security", - } - fileName := dataSaveFileName.JSON() - filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) - err := file.WriterFileJSONLine(dataArr, filePath) - if err != nil { - return int64(len(dataArr)), "" - } - return int64(len(dataArr)), filePath -} diff --git a/src/modules/nms_cxy/service/nms_cxy_nrm_log.go b/src/modules/nms_cxy/service/nms_cxy_nrm_log.go index 244ccbb..b4602b3 100644 --- a/src/modules/nms_cxy/service/nms_cxy_nrm_log.go +++ b/src/modules/nms_cxy/service/nms_cxy_nrm_log.go @@ -1,12 +1,84 @@ package service -import "nms_cxy/src/modules/nms_cxy/model" +import ( + "time" -// 资源数据操作日志服务 服务层接口 -type INRMLog interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/nms_cxy/model" +) - // Insert 新增信息 - Insert(nrmLog model.NRMLog) string +// 实例化数据层 NewNRMLog 结构体 +var NewNRMLog = &NRMLog{} + +// NRMLog 资源数据操作日志服务 数据层处理 +type NRMLog struct{} + +// SelectPage 根据条件分页查询字典类型 +func (r *NRMLog) SelectPage(query map[string]any) (int64, []model.NRMLog) { + tx := datasource.DB("").Model(&model.NRMLog{}) + // 查询条件拼接 + if v, ok := query["ruid"]; ok && v != "" { + tx = tx.Where("ruid = ?", v) + } + if v, ok := query["changeType"]; ok && v != "" { + tx = tx.Where("change_type = ?", v) + } + if v, ok := query["startTime"]; ok && v != "" { + tx = tx.Where("create_time >= ?", v) + } + if v, ok := query["endTime"]; ok && v != "" { + tx = tx.Where("create_time <= ?", v) + } + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("user_label = ?", v) + } + + var total int64 = 0 + rows := []model.NRMLog{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + logger.Errorf("total err => %v", err) + return total, rows + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v.(string) + if o, ok := query["sortOrder"]; ok && o != nil && v != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } else { + tx = tx.Order("id desc") + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return total, rows +} + +// Insert 新增信息 +func (r *NRMLog) Insert(param model.NRMLog) string { + if param.CreateBy != "" { + param.CreateTime = time.Now().UnixMilli() + } + + if err := datasource.DB("").Create(¶m).Error; err != nil { + logger.Errorf("Create err => %v", err) + } + return param.MsgID } diff --git a/src/modules/nms_cxy/service/nms_cxy_nrm_log.impl.go b/src/modules/nms_cxy/service/nms_cxy_nrm_log.impl.go deleted file mode 100644 index c0e201e..0000000 --- a/src/modules/nms_cxy/service/nms_cxy_nrm_log.impl.go +++ /dev/null @@ -1,173 +0,0 @@ -package service - -import ( - "strings" - "time" - - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/nms_cxy/model" -) - -// 实例化数据层 NewNRMLog 结构体 -var NewNRMLogImpl = &NRMLogImpl{ - selectSql: `select - msg_id, ruid, user_label, change_time, change_type, change_oper, create_by, create_time - from nms_cxy_nrm_log`, - - resultMap: map[string]string{ - "msg_id": "MsgID", - "ruid": "Ruid", - "user_label": "UserLabel", - "change_time": "ChangeTime", - "change_type": "ChangeType", - "change_oper": "ChangeOper", - "create_by": "CreateBy", - "create_time": "CreateTime", - }, -} - -// NRMLogImpl 资源数据操作日志服务 数据层处理 -type NRMLogImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NRMLogImpl) convertResultRows(rows []map[string]any) []model.NRMLog { - arr := make([]model.NRMLog, 0) - for _, row := range rows { - item := model.NRMLog{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NRMLogImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["ruid"]; ok && v != "" { - conditions = append(conditions, "ruid = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["changeType"]; ok && v != "" { - conditions = append(conditions, "change_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["startTime"]; ok && v != "" { - conditions = append(conditions, "create_time >= ?") - params = append(params, v) - } - if v, ok := query["endTime"]; ok && v != "" { - conditions = append(conditions, "create_time <= ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NRMLog{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from nms_cxy_nrm_log" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// Insert 新增信息 -func (r *NRMLogImpl) Insert(nrmLog model.NRMLog) string { - // 参数拼接 - params := make(map[string]any) - if nrmLog.MsgID != "" { - params["msg_id"] = nrmLog.MsgID - } - if nrmLog.Ruid != "" { - params["ruid"] = nrmLog.Ruid - } - if nrmLog.UserLabel != "" { - params["user_label"] = nrmLog.UserLabel - } - if nrmLog.ChangeTime != "" { - params["change_time"] = nrmLog.ChangeTime - } - if nrmLog.ChangeType != "" { - params["change_type"] = nrmLog.ChangeType - } - if nrmLog.ChangeOper != "" { - params["change_oper"] = nrmLog.ChangeOper - } - if nrmLog.CreateBy != "" { - params["create_by"] = nrmLog.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into nms_cxy_nrm_log (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} diff --git a/src/modules/nms_cxy/service/performance.go b/src/modules/nms_cxy/service/performance.go index cb23a7a..4a84f4e 100644 --- a/src/modules/nms_cxy/service/performance.go +++ b/src/modules/nms_cxy/service/performance.go @@ -1,7 +1,809 @@ package service -// 性能数据处理服务 服务层接口 -type IPerformance interface { - // PerformanceUploadOSS 性能数据上报 - PerformanceUploadOSS(neType, startTime, endTime string) error +import ( + "fmt" + + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/file" + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/nms_cxy/utils/common" +) + +// 实例化数据层 PerformanceImpl 结构体 +var NewPerformanceImpl = &PerformanceImpl{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, +} + +// 性能数据处理服务 服务层处理 +type PerformanceImpl struct { + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 +} + +// PerformanceUploadOSS 性能数据上报 +// 性能数据文件的上报周期为15分钟。 +func (s *PerformanceImpl) PerformanceUploadOSS(neType, startTime, endTime string) error { + // 查网元 + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, "001") + if neInfo.NeType != neType { + logger.Errorf("ConfigUploadOSS ne info not fount") + return fmt.Errorf("no ne info") + } + + // 数据行 + query := neDataModel.GoldKPIQuery{ + RmUID: neInfo.RmUID, + NeType: neInfo.NeType, + StartTime: startTime, + EndTime: endTime, + Interval: 900, + } + data := s.perfKPIService.SelectGoldKPI(query) + + if len(data) == 0 { + logger.Errorf("PerformanceUploadOSS SelectGoldKPI neType:%s startTime:%s endTime:%s", neType, startTime, endTime) + return fmt.Errorf("not Performance data") + } + + // 转换数据 + parseDataArr := [][]string{} + if neInfo.NeType == "AMF" { + parseDataArr = s.parseDataAMF(neInfo.RmUID, neInfo.NeName, data) + } + if neInfo.NeType == "UPF" { + parseDataArr = s.parseDataUPF(neInfo.RmUID, neInfo.NeName, data) + } + if neInfo.NeType == "UDM" { + parseDataArr = s.parseDataUDM(neInfo.RmUID, neInfo.NeName, data) + } + if neInfo.NeType == "SMF" { + parseDataArr = s.parseDataSMF(neInfo.RmUID, neInfo.NeName, data) + } + if neInfo.NeType == "NSSF" { + parseDataArr = s.parseDataNSSF(neInfo.RmUID, neInfo.NeName, data) + } + + // 文件名 + dataSaveFileName := common.DataSaveFileName{ + ResCode: neType, + } + fileName := dataSaveFileName.CSV() + filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + err := file.WriterFileCSV(parseDataArr, filePath) + if err != nil { + return err + } + + return common.UploadOSSByZip(filePath, neType, "PM") +} + +// parseDataAMF PM数据AMF +func (s *PerformanceImpl) parseDataAMF(ruid, userLabel string, data []map[string]any) [][]string { + parseDataArr := [][]string{} + // 数据行头 + headerArr := []string{ + // 资源对象的RUID及UserLabel + "RUID", "UserLabel", + // PA + "AMF.AuthReq", // 鉴权请求次数 + "AMF.AuthFail", // 鉴权参数错误次数 + "AMF.AuthFail.20", // MAC错误导致的鉴权参数错误次数 + "AMF.AuthFail.21", // 非5G鉴权导致的鉴权参数错误次数 + "AMF.AuthFail.26", // 同步失败导致的鉴权参数错误次数 + "AMF.AuthReject", // 鉴权拒绝次数 + // PB + "AMF.RegSub", // AMF注册态用户数 + "AMF.RegSub.CmIdle", // AMF空闲态用户数 + "AMF.RegSub.CmConnected", // AMF连接态用户数 + "AMF.RegSub_NS", // 每网络切片的AMF注册用户数 + // PC + "AMF.AttInitReg", // 初始注册请求次数 + "AMF.SuccInitReg", // 初始注册成功次数 + "AMF.FailedInitReg", // 初始注册失败次数 + "AMF.FailedInitReg._Cause", // 分原因值的初始注册失败次数 + "AMF.FailedInitReg.3", // 初始注册失败次数_非法用户 + "AMF.FailedInitReg.5", // 初始注册失败次数_PEI不允许 + "AMF.FailedInitReg.6", // 初始注册失败次数_非法设备 + "AMF.FailedInitReg.7", // 初始注册失败次数_5GS服务不允许 + "AMF.FailedInitReg.7.User", // 初始注册失败次数_5GS服务不允许_用户原因 + "AMF.FailedInitReg.15", // 初始注册失败次数_跟踪区内无合适小区 + "AMF.FailedInitReg.15.User", // 初始注册失败次数_跟踪区内无合适小区_用户原因 + "AMF.InitRegTime", // 初始注册平均时长 + // PD + "AMF.RegUpdReq", // 注册更新请求次数 + "AMF.RegUpdReq.Mob.InterAmf", // AMF间移动性注册更新请求次数 + "AMF.RegUpdReq.Mob.IntraAmf", // AMF内移动性注册更新请求次数 + "AMF.RegUpdReq.Per", // 周期性注册更新请求次数 + "AMF.RegUpdAcpt", // 注册更新接受次数 + "AMF.RegUpdAcpt.Mob.InterAmf", // AMF间移动性注册更新接受次数 + "AMF.RegUpdAcpt.Mob.IntraAmf", // AMF内移动性注册更新接受次数 + "AMF.RegUpdAcpt.Per", // 周期性注册更新接受次数 + "AMF.RegUpdRej", // 注册更新失败次数 + "AMF.RegUpdRej._Cause", // 分原因的注册更新失败次数 + "AMF.RegUpdRej.3", // 注册更新失败次数(非法用户) + "AMF.RegUpdRej.6", // 注册更新失败次数(非法设备) + "AMF.RegUpdRej.7", // 注册更新失败次数(5GS服务不允许) + // PE + "AMF.PagAtt", // 寻呼请求次数 AMF的寻呼请求次数。不包括二次寻呼(二次及二次以上统称为二次寻呼)请求次数。 + "AMF.FirstPagingSucc", // 一次寻呼响应次数 "一次寻呼成功次数。 " + "AMF.SecondPagingSucc", // 二次寻呼响应次数 二次(及二次以上)寻呼成功次数。 + "AMF.AttServiceReq", // 业务请求尝试次数 "UE发起的业务请求次数 " + "AMF.FailServiceReq", // 业务请求被拒次数 UE发起业务请求被拒绝个数 + "AMF.FailServiceReq._Cause", // 分原因的业务请求被拒次数 + // PF + "AMF.AttIntraAmfXn", // AMF内Xn接口切换尝试数 AMF内基于Xn接口的切换尝试次数。" + "AMF.SuccIntraAmfXn", // AMF内Xn接口切换成功次数 AMF内基于Xn接口的切换成功次数。 + "AMF.AttIntraAmfN2", // AMF内N2接口切换尝试次数 AMF内基于N2接口的切换尝试次数。 + "AMF.SuccIntraAmfN2", // AMF内N2接口切换成功次数 AMF内基于N2接口的切换成功次数。 + "AMF.AttOutInterAmf", // AMF间切换出尝试次数 AMF间的切换,切换出源AMF尝试次数。 + "AMF.SuccOutInterAmf", // AMF间切换出成功次数 AMF间的切换,切换出源AMF成功次数。 + "AMF.AttIncInterAmf", // AMF间切换入尝试次数 AMF间的切换,切换入目标AMF尝试次数。 + "AMF.SuccIncInterAmf", // AMF间切换入成功次数 AMF间的切换,切换入目标AMF成功次数。 + // PG + "AMF.Att5GHandoverTo4G", // 从5G网络切换出至4G网络尝试次数 + "AMF.Succ5GHandoverTo4G", // 从5G网络切换出至4G网络成功次数 + "AMF.Att4GHandoverTo5G", // 从4G网络切换入5G网络尝试次数 + "AMF.Succ4GHandoverTo5G", // 从4G网络切换入5G网络成功次数 + "AMF.Req4GReselectTo5G", // 从4G网络重选入5G网络请求次数 + "AMF.Acc4GReselectTo5G", // 从4G网络重选入5G网络接受次数 + // PH + "AMF.MeanLoad", // 系统平均负荷 + // PI + "AMF.UecmRegReq", // UECM注册请求次数 + "AMF.UecmRegSucc", // UECM注册成功次数 + "AMF.UecmRegFail", // UECM注册失败次数 + "AMF.UecmRegFail._Cause", // 分原因的UECM注册失败次数 + "AMF.UecmRegFail.Unknown5GSub", // UECM注册失败次数_未签约5G + "AMF.UecmRegFail.NoPsSub", // UECM注册失败次数_未签约PS业务 + "AMF.UecmRegFail.RoamNotAllowed", // UECM注册失败次数_漫游不允许 + "AMF.UecmRegFail.AccessNotAllowed", // UECM注册失败次数_接入类型不允许 + "AMF.UecmRegFail.RatNotAllowed", // UECM注册失败次数_5GS接入不允许 + "AMF.UecmDeregReq", // AMF发起的UECM去注册请求次数 + "AMF.UecmDeregSucc", // AMF发起的UECM去注册成功次数 + "AMF.UecmDeregNotifyReq", // UDM发起的UECM去注册请求次数 + "AMF.UecmDeregNotifySucc", // UDM发起的UECM去注册成功次数 + // PJ + "AMF.SmContextCreateReq", // 会话上下文建立请求次数 AMF向SMF发起建立会话上下文的次数。 + "AMF.SessionCreateSucc", // 会话上下文建立成功次数 SMF返回AMF建立会话上下文成功的次数 + "AMF.SmContextUpdateReq", // 会话上下文更新请求次数 AMF向SMF发起更新会话上下文的次数。 + "AMF.SessionUpdateSucc", // 会话上下文更新成功次数 SMF返回AMF更新会话上下文成功的次数 + "AMF.SmContextReleaseReq", // 会话上下文释放请求次数 AMF向SMF发起释放会话上下文的次数。 + "AMF.SessionReleaseSucc", // 会话上下文释放成功次数 SMF返回AMF释放会话上下文成功的次数 + "AMF.SmContextRetrieveReq", // 会话上下文查询请求次数 AMF向SMF发起查询会话上下文的次数。 + "AMF.SessionRetrieveSucc", // 会话上下文查询成功次数 SMF返回AMF查询会话上下文成功的次数 + // PK + "AMF.UeAuthReq", // AMF向AUSF发起鉴权请求次数 AMF向AUSF发起鉴权请求消息次数 + "AMF.UeAuthSucc", // AUSF向AMF返回的鉴权成功次数 AUSF向AMF返回的鉴权成功消息次数 + "AMF.UeAuthFail", // 鉴权失败次数 统计AMF收到的AUSF返回的鉴权失败次数,并分application error进行统计。 + "AMF.UeAuthFail._Cause", // 分原因的鉴权失败次数 + "AMF.UeAuthCfmReq", // AMF向AUSF发起鉴权确认请求次数 AMF向AUSF发起鉴权确认请求消息次数 + "AMF.UeAuthCfmSucc", // AUSF向AMF返回的鉴权确认成功次数 AUSF向AMF返回的鉴权确认成功消息次数 + // PL + "AMF.GnbNum", // AMF挂接5G基站数 统计周期结束点时刻,挂接在AMF下的5G基站数量 + + } + parseDataArr = append(parseDataArr, headerArr) + // 单行数据 + rowmArr := make([]string, len(headerArr)) + for i := range rowmArr { + rowmArr[i] = "0" + } + rowmArr[0] = ruid + rowmArr[1] = userLabel + + // 遍历数据插入单行数据 + itemArr := rowmArr + for _, item := range data { + // AMF.01 AMF注册态用户数 + // AMF.02 AMF初始注册请求次数 + // AMF.03 AMF初始注册成功次数 + // AMF.04 AMF初始注册失败次数_非法用户 + // AMF.05 AMF初始注册失败次数_PEI不允许 + // AMF.06 AMF初始注册失败次数_非法设备 + // AMF.07 AMF初始注册失败次数_5GS服务不允许_用户原因 + // AMF.08 AMF初始注册失败次数_跟踪区内无合适小区_用户原因 + // AMF.09 AMF初始注册失败次数_N1模式不允许 + // AMF.10 AMF初始注册失败次数_PLMN不允许 + // AMF.11 AMF初始注册失败次数_跟踪区不允许 + // AMF.12 AMF初始注册失败次数_漫游跟踪区禁止接入 + // AMF.13 AMF初始注册失败次数_无可用网络切片 + // AMF.14 AMF初始注册失败次数_协议错误_用户原因 + // AMF.15 AMF一次寻呼响应次数 + // AMF.16 AMF二次寻呼响应次数 + // AMF.17 AMF寻呼请求次数 + // AMF.18 AMF业务请求被拒次数 + // AMF.19 AMF业务请求尝试次数 + // AMF.20 EPS在线用户数 + // AMF.21 EPS附着成功次数 + // AMF.22 EPS附着请求次数 + // AMF.23 EPS附着失败次数_非法用户 + // AMF.24 EPS附着失败次数_非法终端 + // AMF.25 EPS附着失败次数_非法ME + // AMF.26 EPS附着失败次数_EPS服务不允许_用户原因 + // AMF.27 EPS附着失败次数_EPS和非EPS服务不允许 + // AMF.28 EPS附着失败次数_跟踪区内无合适小区_用户原因 + // AMF.29 EPS附着失败次数_ESM失败_用户原因 + // AMF.30 MME一次寻呼响应次数 + // AMF.31 MME二次寻呼响应次数 + // AMF.32 MME寻呼请求次数 + // AMF.A.02 AMF移动性注册更新成功次数 + // AMF.A.03 AMF移动性注册更新失败次数 + // AMF.A.04 AMF紧急注册请求次数 + // AMF.A.05 AMF紧急注册成功次数 + // AMF.A.06 AMF紧急注册失败次数 + // AMF.A.07 UE发起的去注册请求次数 + // AMF.A.08 UE发起的去注册成功次数 + // AMF.A.09 AMF发起的去注册请求次数 + // AMF.A.10 AMF发起的去注册成功次数 + // AMF.A.11 UDM发起的去注册请求次数 + // AMF.A.12 UDM发起的去注册成功次数 + // AMF.A.13 AMF寻呼失败次数 + // AMF.A.14 AMF隐式去注册次数 + // ===================== + + // AMF.01 AMF注册态用户数 + if v, ok := item["AMF.01"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[2] = vStr + } + + // AMF.A.14 AMF隐式去注册次数 + if v, ok := item["AMF.A.14"]; ok && v != nil { + itemArr[3] = fmt.Sprint(v) + } + // 添加后恢复单行数据 + parseDataArr = append(parseDataArr, itemArr) + itemArr = rowmArr + } + return parseDataArr +} + +// parseDataUPF PM数据UPF +func (s *PerformanceImpl) parseDataUPF(ruid, userLabel string, data []map[string]any) [][]string { + parseDataArr := [][]string{} + // 数据行头 + headerArr := []string{ + // 资源对象的RUID及UserLabel + "RUID", "UserLabel", + // PA + "UPF.PfcpSessionEstabReq", // PFCP会话建立请求次数 PFCP会话建立请求次数。 + "UPF.PfcpSessionEstabReq._Ns", // 分切片的PFCP会话建立请求次数 按照S-NSSAI统计的PFCP会话建立请求次数。 + "UPF.PfcpSessionEstabSucc", // PFCP会话建立成功次数 PFCP会话建立成功次数。 + "UPF.PfcpSessionEstabSucc._Ns", // 分切片的PFCP会话建立成功次数 按照S-NSSAI统计的PFCP会话建立成功次数。 + "UPF.PfcpSessionEstabFail", // PFCP会话建立失败次数 PFCP会话建立被拒绝的次数,并按拒绝原因分类统计。 + "UPF.PfcpSessionEstabFail._Cause", // 分原因的PFCP会话建立失败次数 + "UPF.PfcpSessionEstabFail._Ns", // 分切片的PFCP会话建立失败次数 按照S-NSSAI统计PFCP会话建立被拒绝的次数 + "UPF.PfcpSessionModifyReq", // PFCP会话修改请求次数 PFCP会话修改请求次数。 + "UPF.PfcpSessionModifyReq._Ns", // 分切片的PFCP会话修改请求次数 按照S-NSSAI统计PFCP会话修改请求次数。 + "UPF.PfcpSessionModifySucc", // PFCP会话修改成功次数 PFCP会话修改成功次数。 + "UPF.PfcpSessionModifySucc._Ns", // 分切片的PFCP会话修改成功次数 按照S-NSSAI统计PFCP会话修改成功次数。 + "UPF.PfcpSessionModifyFail", // PFCP会话修改失败次数 PFCP会话修改拒绝的次数,并按拒绝原因分类统计。 + "UPF.PfcpSessionModifyFail._Cause", // 分原因的PFCP会话修改失败次数 + "UPF.PfcpSessionModifyFail._Ns", // 分切片的PFCP会话修改失败次数 按照S-NSSAI统计PFCP会话修改拒绝的次数。 + // PB + "UPF.MeanQosFlows", // 平均QoS流数 一个统计周期内UPF中的平均QoS流数。 + "UPF.MeanQosFlows._Ns", // 分切片的平均QoS流数 一个统计周期内按照S-NSSAI统计UPF中的平均QoS流数。 + "UPF.MeanQosFlows._Dnn", // 分DNN的平均QoS流数 一个统计周期内按照DNN统计UPF中的平均QoS流数。 + "UPF.MaxQosFlows", // 最大QoS流数 一个统计周期内UPF中的最大QoS流数。 + "UPF.MaxQosFlows._Ns", // 分切片的最大QoS流数 一个统计周期内按照S-NSSAI统计UPF中的最大QoS流数。 + "UPF.MaxQosFlows._Dnn", // 分DNN的最大QoS流数 一个统计周期内按照DNN统计UPF中的最大QoS流数。 + // PC + "UPF.N3IncPkt", // N3接口接收GTP包数 UPF从N3接口接收的GTP包数,并按DNN分别进行统计; + "UPF.N3IncPkt._Dnn", // 分DNN的N3接口接收GTP包数 + "UPF.N3OgPkt", // N3接口发送GTP包数 UPF从N3接口发送出去的GTP包数,并按DNN分别进行统计; + "UPF.N3OgPkt._Dnn", // 分DNN的N3接口发送GTP包数 + "UPF.N3IncOct", // N3接口接收GTP包字节数 UPF从N3接口接收的GTP包字节数(含GTP头),并按DNN分别进行统计; + "UPF.N3IncOct._Dnn", // 分DNN的N3接口接收GTP包字节数 + "UPF.N3OgOct", // N3接口发送GTP包字节数 UPF从N3接口发送的GTP包字节数(含GTP头),并按DNN分别进行统计; + "UPF.N3OgOct._Dnn", // 分DNN的N3接口发送GTP包字节数 + "UPF.N3DiscPkt", // N3接口接收错误GTP包数 N3接口因出错丢弃的GTP包个数,并按DNN分别进行统计; + "UPF.N3DiscPkt._Dnn", // 分DNN的N3接口接收错误GTP包数 + // PD + "UPF.N9aIncPkt", // N9a接口接收GTP包数 UPF从左侧N9a接口接收的GTP包数,并按DNN分别进行统计; + "UPF.N9aIncPkt._Dnn", // 分DNN的N9a接口接收GTP包数 + "UPF.N9aOgPkt", // N9a接口发送GTP包数 "UPF从左侧N9a接口发送出去的GTP包数,并按DNN分别进行统计;" + "UPF.N9aOgPkt._Dnn", // 分DNN的N9a接口发送GTP包数 + "UPF.N9aIncOct", // N9a接口接收GTP包字节数 UPF从左侧N9a接口接收的GTP包字节数,并按DNN分别进行统计; + "UPF.N9aIncOct._Dnn", // 分DNN的N9a接口接收GTP包字节数 + "UPF.N9aOgOct", // N9a接口发送GTP包字节数 UPF从左侧N9a接口发送的GTP包字节数,并按DNN分别进行统计; + "UPF.N9aOgOct._Dnn", // 分DNN的N9a接口发送GTP包字节数 + "UPF.N9aDiscPkt", // N9a接口接收错误GTP包数 UPF对左侧N9a接口因出错丢弃的GTP包个数,并按DNN分别进行统计; + "UPF.N9aDiscPkt._Dnn", // 分DNN的N9a接口接收错误GTP包数 + "UPF.N9cIncPkt", // N9c接口接收GTP包数 UPF从右侧N9c接口接收的GTP包数,并按DNN分别进行统计; + "UPF.N9cIncPkt._Dnn", // 分DNN的N9c接口接收GTP包数 + "UPF.N9cOgPkt", // N9c接口发送GTP包数 UPF从右侧N9c接口发送出去的GTP包数,并按DNN分别进行统计; + "UPF.N9cOgPkt._Dnn", // 分DNN的N9c接口发送GTP包数 + "UPF.N9cIncOct", // N9c接口接收GTP包字节数 UPF从右侧N9c接口接收的GTP包字节数,并按DNN分别进行统计; + "UPF.N9cIncOct._Dnn", // 分DNN的N9c接口接收GTP包字节数 + "UPF.N9cOgOct", // N9c接口发送GTP包字节数 UPF从右侧N9c接口发送的GTP包字节数,并按DNN分别进行统计; + "UPF.N9cOgOct._Dnn", // 分DNN的N9c接口发送GTP包字节数 + "UPF.N9cDiscPkt", // N9c接口接收错误GTP包数 UPF对右侧N9c接口因出错丢弃的GTP包个数,并按DNN分别进行统计; + "UPF.N9cDiscPkt._Dnn", // 分DNN的N9c接口接收错误GTP包数 + // PE + "UPF.N6IncPkt", // N6接口接收IP包数 统计UPF在N6接口接收到的IP包个数,并按DNN分别进行统计; + "UPF.N6IncPkt._Dnn", // 分DNN的N6接口接收IP包数 + "UPF.N6OgPkt", // N6接口发送IP包数 统计UPF在N6向发送的IP包个数,并按DNN分别进行统计; + "UPF.N6OgPkt._Dnn", // 分DNN的N6接口发送IP包数 + "UPF.N6IncOct", // N6接口接收字节数 统计UPF在N6接收到的IP包PDU字节数,并按DNN分别进行统计; + "UPF.N6IncOct._Dnn", // 分DNN的N6接口接收字节数 + "UPF.N6OgOct", // N6接口发送字节数 统计UPF在N6发送的IP包PDU字节数,并按DNN分别进行统计; + "UPF.N6OgOct._Dnn", // 分DNN的N6接口发送字节数 + "UPF.N6DiscPkt", // N6接口出错丢弃的IP包数 统计N6口出错丢弃的IP包个数,并按DNN分别进行统计; + "UPF.N6DiscPkt._Dnn", // 分DNN的N6接口出错丢弃的IP包数 + // PF + "UPF.MeanLoad", // 系统平均负荷 对物理网元:指测量周期中,网元的硬件资源负荷的抽样平均值。网元的硬件资源负荷可取对网元影响最大的模块的负荷,或取不同模块的负荷的加权平均值,不同厂商设备的计算方法各不相同 + } + parseDataArr = append(parseDataArr, headerArr) + // 单行数据 + rowmArr := make([]string, len(headerArr)) + for i := range rowmArr { + rowmArr[i] = "0" + } + rowmArr[0] = ruid + rowmArr[1] = userLabel + + // 遍历数据插入单行数据 + itemArr := rowmArr + for _, item := range data { + // UPF.01 PFCP会话建立成功次数 + // UPF.02 PFCP会话建立请求次数 + // UPF.03 N6接口上行字节数 + // UPF.04 N6接口下行字节数 + // UPF.05 N3接口上行字节数 + // UPF.06 N3接口下行字节数 + // UPF.07 SGi接口上行字节数 + // UPF.08 SGi接口下行字节数 + // UPF.09 S1-U接口上行字节数 + // UPF.10 S1-U接口下行字节数 + // ============= + + // PFCP会话建立成功次数 + if v, ok := item["UPF.01"]; ok && v != nil { + itemArr[4] = fmt.Sprint(v) + } + // PFCP会话建立请求次数 + if v, ok := item["UPF.02"]; ok && v != nil { + itemArr[2] = fmt.Sprint(v) + } + // N6接口上行字节数 + if v, ok := item["UPF.03"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[54] = vStr + itemArr[55] = vStr + itemArr[58] = vStr + itemArr[59] = vStr + } + // N6接口下行字节数 + if v, ok := item["UPF.04"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[52] = vStr + itemArr[53] = vStr + itemArr[56] = vStr + itemArr[57] = vStr + } + // N3接口上行字节数 + if v, ok := item["UPF.05"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[22] = vStr + itemArr[23] = vStr + itemArr[26] = vStr + itemArr[27] = vStr + } + // N3接口下行字节数 + if v, ok := item["UPF.06"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[24] = vStr + itemArr[25] = vStr + itemArr[28] = vStr + itemArr[29] = vStr + } + // SGi接口上行字节数 + if v, ok := item["UPF.07"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[32] = vStr + itemArr[33] = vStr + itemArr[36] = vStr + itemArr[37] = vStr + } + // SGi接口下行字节数 + if v, ok := item["UPF.08"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[34] = vStr + itemArr[35] = vStr + itemArr[38] = vStr + itemArr[39] = vStr + } + // S1-U接口上行字节数 + if v, ok := item["UPF.09"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[42] = vStr + itemArr[43] = vStr + itemArr[46] = vStr + itemArr[47] = vStr + } + // S1-U接口下行字节数 + if v, ok := item["UPF.10"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[44] = vStr + itemArr[45] = vStr + itemArr[48] = vStr + itemArr[49] = vStr + } + // 添加后恢复单行数据 + parseDataArr = append(parseDataArr, itemArr) + itemArr = rowmArr + } + return parseDataArr +} + +// parseDataUDM PM数据UDM +func (s *PerformanceImpl) parseDataUDM(ruid, userLabel string, data []map[string]any) [][]string { + parseDataArr := [][]string{} + // 数据行头 + headerArr := []string{ + // 资源对象的RUID及UserLabel + "RUID", "UserLabel", + // PA + "UDM.AmfUecmRegReq", // AMF发起的UECM注册请求次数 统计UDM收到的AMF发起的UECM注册请求次数 + "UDM.AmfUecmRegSucc", // AMF发起的UECM注册成功次数 统计UDM返回的成功的AMF注册响应次数 + "UDM.AmfUecmRegUpdateReq", // 更新注册参数请求次数 更新注册参数请求次数 + "UDM.AmfUecmRegUpdateSucc", // 更新注册参数成功次数 更新注册参数成功次数 + "UDM.AmfUecmDeregReq", // AMF发起的UECM去注册请求次数 统计AMF发起的UECM去注册请求次数 + "UDM.AmfUecmDeregSucc", // AMF发起的UECM去注册成功次数 统计AMF发起的UECM去注册成功次数 + "UDM.SmfUecmRegReq", // SMF发起的UECM注册请求次数 统计SMF发起的用户上下文注册请求次数 + "UDM.SmfUecmRegSucc", // SMF发起的UECM注册成功次数 统计UDM返回的成功的用户上下文注册响应次数 + "UDM.SmfUecmDeregReq", // SMF发起的UECM去注册请求次数 统计SMF发起的用户上下文去注册请求次数 + "UDM.SmfUecmDeregSucc", // SMF发起的UECM去注册成功次数 统计UDM返回的成功的用户上下文去注册响应次数 + "UDM.SdmGetReq", // 获取用户数据请求次数 统计UDM收到的获取用户数据请求次数 + "UDM.SdmGetSucc", // 获取用户数据成功次数 统计UDM成功返回用户数据次数 + "UDM.SdmNotif", // 用户数据变化通知次数 统计UDM发送用户数据变化通知次数 + "UDM.SdmSubscrReq", // 订阅用户数据请求次数 统计UDM收到的订阅用户数据相关通知请求次数 + "UDM.SdmSubscrSucc", // 订阅用户数据成功次数 统计UDM返回的订阅用户数据相关通知成功次数 + "UDM.SdmUnSubscrReq", // 去订阅用户数据请求次数 统计UDM收到的去订阅用户数据相关通知请求次数 + "UDM.SdmUnSubscrSucc", // 去订阅用户数据成功次数 统计UDM返回的去订阅用户数据相关通知成功次数 + "UDM.UecmDeregNotif", // 去注册通知次数 统计UDM发送的去注册通知次数 + // PB + "UDR.5GSubIn", // 5G网络SUPI数 统计UDR存储的SUPI数 + "UDR.5GActSubIn", // 5G用户数 统计UDR存储的5G MSISDN数 + "UDR.5GActSubIn", // 5G活动用户数 统计UDR存储的有位置信息的MSISDN用户数 + // PC + "Ausf.UeAuthReq", // 鉴权请求次数 AUSF收到的鉴权请求次数 + "Ausf.UeAuthAnsSucc", // 鉴权成功次数 AUSF返回鉴权成功响应次数 + } + parseDataArr = append(parseDataArr, headerArr) + // 单行数据 + rowmArr := make([]string, len(headerArr)) + for i := range rowmArr { + rowmArr[i] = "0" + } + rowmArr[0] = ruid + rowmArr[1] = userLabel + + // 遍历数据插入单行数据 + itemArr := rowmArr + for _, item := range data { + // UDM.01 5G注册用户数 + // UDM.02 AMF发起的UECM注册请求次数 + // UDM.03 AMF发起的UECM注册成功次数 + // UDM.04 SMF发起的UECM注册成功次数 + // UDM.05 SMF发起的UECM注册请求次数 + // UDM.06 4G注册用户数 + // UDM.07 4G鉴权信息查询成功次数 + // UDM.08 4G鉴权信息查询请求次数 + // UDM.09 4G更新位置成功次数 + // UDM.10 4G更新位置请求次数 + // UDM.11 SAR成功响应总次数 + // UDM.12 SAR请求总次数 + // UDM.13 LIR成功响应总次数 + // UDM.14 LIR请求总次数 + // ================== + + // 5G注册用户数 + if v, ok := item["UDM.01"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[21] = vStr + itemArr[22] = vStr + } + // AMF发起的UECM注册请求次数 + if v, ok := item["UDM.02"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[2] = vStr + itemArr[6] = vStr + } + // AMF发起的UECM注册成功次数 + if v, ok := item["UDM.03"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[3] = vStr + itemArr[7] = vStr + } + // SMF发起的UECM注册成功次数 + if v, ok := item["UDM.04"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[9] = vStr + itemArr[11] = vStr + } + // SMF发起的UECM注册请求次数 + if v, ok := item["UDM.05"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[8] = vStr + itemArr[10] = vStr + } + // 4G注册用户数 + if v, ok := item["UDM.06"]; ok && v != nil { + itemArr[19] = fmt.Sprint(v) + } + // 4G鉴权信息查询成功次数 + if v, ok := item["UDM.07"]; ok && v != nil { + itemArr[13] = fmt.Sprint(v) + } + // 4G鉴权信息查询请求次数 + if v, ok := item["UDM.08"]; ok && v != nil { + itemArr[12] = fmt.Sprint(v) + } + // 4G更新位置成功次数 + if v, ok := item["UDM.09"]; ok && v != nil { + itemArr[16] = fmt.Sprint(v) + } + // 4G更新位置请求次数 + if v, ok := item["UDM.10"]; ok && v != nil { + itemArr[15] = fmt.Sprint(v) + } + // SAR成功响应总次数 + if v, ok := item["UDM.11"]; ok && v != nil { + itemArr[18] = fmt.Sprint(v) + } + // SAR请求总次数 + if v, ok := item["UDM.12"]; ok && v != nil { + itemArr[17] = fmt.Sprint(v) + } + // LIR成功响应总次数 + if v, ok := item["UDM.13"]; ok && v != nil { + itemArr[24] = fmt.Sprint(v) + } + // LIR请求总次数 + if v, ok := item["UDM.14"]; ok && v != nil { + itemArr[23] = fmt.Sprint(v) + } + // 添加后恢复单行数据 + parseDataArr = append(parseDataArr, itemArr) + itemArr = rowmArr + } + return parseDataArr +} + +// parseDataSMF PM数据SMF +func (s *PerformanceImpl) parseDataSMF(ruid, userLabel string, data []map[string]any) [][]string { + parseDataArr := [][]string{} + // 数据行头 + headerArr := []string{ + // 资源对象的RUID及UserLabel + "RUID", "UserLabel", + // PA + "SMF.AttCreatePduSession", // PDU会话建立请求次数 UE发起的PDU会话建立请求次数。 + "SMF.AttCreatePduSession._Ns", // 分网络切片的PDU会话建立请求次数 按照S-NSSAI统计UE发起的PDU会话建立请求次数。 + "SMF.AttCreatePduSession._Dnn", // 分DNN的PDU会话建立请求次数 按照DNN统计UE发起的PDU会话建立请求次数。 + "SMF.SuccCreatePduSession", // PDU会话建立成功次数 UE发起的PDU会话建立成功次数。 + "SMF.SuccCreatePduSession._Ns", // 分网络切片的PDU会话建立成功次数 按照S-NSSAI统计UE发起的PDU会话建立成功次数。 + "SMF.SuccCreatePduSession._Dnn", // 分DNN的PDU会话建立成功次数 按照DNN统计UE发起的PDU会话建立成功次数。 + "SMF.FailCreatePduSession", // PDU会话建立失败次数 UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。 + "SMF.FailCreatePduSession._Cause", // 分原因的PDU会话建立失败次数 + "SMF.FailCreatePduSession._Ns", // 分网络切片的PDU会话建立失败次数 按照S-NSSAI统计UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。 + "SMF.FailCreatePduSession._Dnn", // 分DNN的PDU会话建立失败次数 按照DNN统计UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。 + "SMF.AttSmfModifyPduSession", // SMF发起的PDU会话修改请求次数 SMF发起的PDU会话修改请求次数。 + "SMF.AttSmfModifyPduSession._Ns", // 分网络切片的PDU会话修改请求次数 按照S-NSSAI统计SMF发起的PDU会话修改请求次数。 + "SMF.AttSmfModifyPduSession._Dnn", // 分DNN的PDU会话修改请求次数 按照DNN统计SMF发起的PDU会话修改请求次数。 + "SMF.SuccSmfModifyPduSession", // SMF发起的PDU会话修改成功次数 SMF发起的PDU会话修改成功次数。 + "SMF.SuccSmfModifyPduSession._Ns", // 分网络切片的SMF发起的PDU会话修改成功次数 按照S-NSSAI统计SMF发起的PDU会话修改成功次数。 + "SMF.SuccSmfModifyPduSession._Dnn", // 分DNN的SMF发起的PDU会话修改成功次数 按照DNN统计SMF发起的PDU会话修改成功次数。 + "SMF.FailSmfModifyPduSession", // SMF发起的PDU会话修改失败次数 "SMF发起的PDU会话修改被UE拒绝的次数,并按拒绝原因分类统计。" + "SMF.FailSmfModifyPduSession._Cause", // 分原因的SMF发起的PDU会话修改失败次数 + "SMF.FailSmfModifyPduSession._Ns", // 分网络切片的SMF发起的PDU会话修改失败次数 按照S-NSSAI统计UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。 + "SMF.FailSmfModifyPduSession._Dnn", // 分DNN的SMF发起的PDU会话修改失败次数 "按照DNN统计UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。" + "SMF.PduSessionCreateTime", // PDU会话建立流程平均时长 "成功的PDU会话建立流程的平均时长。" + // PB + "SMF.MeanPduSession", // 平均PDU会话数 + "SMF.MeanPduSession._Ns", // 分网络切片的平均PDU会话数 + "SMF.MeanPduSession._Dnn", // 分DNN的平均PDU会话数 + "SMF.MaxPduSession", // 最大PDU会话数 + "SMF.MaxPduSession._Ns", // 分网络切片的最大PDU会话数 + "SMF.MaxPduSession._Dnn", // 分DNN的最大PDU会话数 + "SMF.MeanQf", // 平均Qos流数 + "SMF.MeanQf._Ns", // 分网络切片的平均Qos流数 + "SMF.MeanQf._Dnn", // 分DNN的平均Qos流数 + "SMF.MaxQf", // 最大Qos流数 + "SMF.MaxQf._Ns", // 分网络切片的最大Qos流数 + "SMF.MaxQf._Dnn", // 分DNN的最大Qos流数 + // PC + "SMF.MeanLoad", // 系统平均负荷 + // PD + "SMF.MeanAllcAddr", // 平均分配的地址数 SMF为UE平均分配的地址数。 + "SMF.MeanAllcAddr._Ns", // 分网络切片的平均分配的地址数 按照S-NSSAI统计统计的SMF为UE平均分配的地址数。 + "SMF.MaxAllcAddr", // 最大分配的地址数 SMF为UE最大分配的地址数。 + "SMF.MaxAllcAddr._Ns", // 分网络切片的最大分配的地址数 按照S-NSSAI统计的SMF为UE最大分配的地址数。 + // PE + "SMF.SmPlcyCtrlCreateReq", // 创建SM策略请求的次数 SMF向PCF发起创建SM策略请求的次数。 + "SMF.SmPlcyCtrlCreateSucc", // 创建SM策略成功次数 PCF向SMF返回创建SM策略成功的次数。 + "SMF.SmPlcyCtrlUpdateReq", // 更新SM策略请求的次数 SMF向PCF发起更新SM策略请求的次数。 + "SMF.SmPlcyCtrlUpdateSucc", // 更新SM策略成功次数 PCF向SMF返回更新SM策略成功的次数。 + "SMF.SmPlcyCtrlDeleteReq", // 删除策略请求的次数 SMF向PCF发起删除SM策略请求的次数。 + "SMF.SmPlcyCtrlDeleteSucc", // 删除SM策略成功次数 PCF向SMF返回删除SM策略成功的次数。 + // PF + "SMF.UecmRegReq", // UE上下文注册请求次数 SMF向UDM发起UE上下文注册请求的次数 + "SMF.UecmRegSucc", // UE上下文注册成功次数 SMF收到UDM返回的UE上下文注册成功的次数 + "SMF.UecmRegFail", // UE上下文注册失败次数 SMF收到UDM返回的UE上下文注册失败的次数 + "SMF.UecmRegFail._Cause", // 分原因的UE上下文注册失败次数 + "SMF.UecmRegFail.Unknown5GSub", // UE上下文注册失败次数_未签约5G + "SMF.UecmRegFail.RoamNotAllowed", // UE上下文注册失败次数_漫游不允许 + "SMF.UecmRegFail.DnnNotAllowed", // UE上下文注册失败次数_DNN未授权 + "SMF.UecmRegFail.UserNotFound", // UE上下文注册失败次数_未找到用户 + "SMF.UecmDeregReq", // UE上下文去注册请求次数 SMF向UDM发起UE上下文去注册请求的次数 + "SMF.UecmDeregSucc", // UE上下文去注册成功次数 SMF向UDM发起UE上下文去注册请求的次数 + "SMF.UecmDeregNotifyReq", // UE上下文去注册通知请求次数 UDM向SMF发送UE上下文去注册通知次数。 + "SMF.UecmDeregNotifySucc", // UE上下文去注册通知成功次数 SMF向UDM返回UE上下文去注册通知确认消息次数。 + } + parseDataArr = append(parseDataArr, headerArr) + // 单行数据 + rowmArr := make([]string, len(headerArr)) + for i := range rowmArr { + rowmArr[i] = "0" + } + rowmArr[0] = ruid + rowmArr[1] = userLabel + + // 遍历数据插入单行数据 + itemArr := rowmArr + for _, item := range data { + // SMF.01 5G实时PDU会话数 + // SMF.02 PDU会话建立成功次数 + // SMF.03 PDU会话建立请求次数 + // SMF.04 IMS PDU会话建立成功次数 + // SMF.05 IMS PDU会话建立请求次数 + // SMF.06 EPS-Fallback成功数 + // SMF.07 EPS-Fallback请求数 + // SMF.08 4G在线会话数 + // SMF.09 PGW缺省承载建立成功个数 + // SMF.10 PGW缺省承载建立请求个数 + // SMF.11 PGW专用承载建立成功个数 + // SMF.12 PGW专用承载建立请求个数 + // SMF.13 IMS缺省承载成功建立个数 + // SMF.14 IMS缺省承载请求建立个数 + // SMF.A.01 PDU会话接受次数 + // SMF.A.02 基站Pdu资源创建成功次数 + // SMF.A.03 查询用户SM数据失败次数 + // SMF.A.04 PFCP会话建立失败次数 + // SMF.A.05 基站Pdu资源创建失败次数 + // SMF.A.06 PFCP会话修改失败次数 + // SMF.A.07 PDU会话拒绝次数 + // SMF.A.08 PDU会话释放指示次数 + // ================== + + // 5G实时PDU会话数 + if v, ok := item["SMF.01"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[26] = vStr + itemArr[27] = vStr + itemArr[28] = vStr + } + // PDU会话建立成功次数 + if v, ok := item["SMF.02"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[5] = vStr + itemArr[6] = vStr + itemArr[7] = vStr + } + // PDU会话建立请求次数 + if v, ok := item["SMF.03"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[2] = vStr + itemArr[3] = vStr + itemArr[4] = vStr + } + // IMS PDU会话建立成功次数 + // IMS PDU会话建立请求次数 + // EPS-Fallback成功数 + // EPS-Fallback请求数 + // 4G在线会话数 + // PGW缺省承载建立成功个数 + // PGW缺省承载建立请求个数 + // PGW专用承载建立成功个数 + // PGW专用承载建立请求个数 + // IMS缺省承载成功建立个数 + // IMS缺省承载请求建立个数 + // PDU会话接受次数 + // 基站Pdu资源创建成功次数 + // 查询用户SM数据失败次数 + // PFCP会话建立失败次数 + // 基站Pdu资源创建失败次数 + // PFCP会话修改失败次数 + // PDU会话拒绝次数 + if v, ok := item["SMF.A.07"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[18] = vStr + itemArr[19] = vStr + itemArr[20] = vStr + itemArr[21] = vStr + } + // PDU会话释放指示次数 + if v, ok := item["SMF.A.08"]; ok && v != nil { + itemArr[23] = fmt.Sprint(v) + } + // 添加后恢复单行数据 + parseDataArr = append(parseDataArr, itemArr) + itemArr = rowmArr + } + return parseDataArr +} + +// parseDataNSSF PM数据NSSF +func (s *PerformanceImpl) parseDataNSSF(ruid, userLabel string, data []map[string]any) [][]string { + parseDataArr := [][]string{} + // 数据行头 + headerArr := []string{ + // 资源对象的RUID及UserLabel + "RUID", "UserLabel", + // PA + "NSSF.NsSelectReq", // 网络切片选择请求次数 NSSF收到的网络切片选择请求次数 + "NSSF.NsSelectReq.Reg", // 注册过程网络切片选择请求次数 注册过程中NSSF收到的网络切片选择请求次数 + "NSSF.NsSelectReq.Pdu", // PDU会话建立过程网络切片选择请求次数 PDU会话建立过程中NSSF收到的网络切片选择请求次数 + "NSSF.NsSelectSucc", // 网络切片选择成功次数 NSSF返回网络切片选择成功次数; + "NSSF.NsSelectSucc.Reg", // 注册过程网络切片选择成功次数 注册过程中NSSF返回网络切片选择成功次数 + "NSSF.NsSelectSucc.Pdu", // PDU会话建立过程网络切片选择成功次数 PDU会话建立过程中NSSF返回网络切片选择成功次数 + "NSSF.NsSelectFail", // 网络切片选择失败次数 NSSF返回网络切片选择失败次数,分原因进行分类统计 + "NSSF.NsSelectFail._Cause", // 分原因的网络切片选择失败次数 + // PB + "NSSF.MeanLoad", //系统平均负荷 + } + parseDataArr = append(parseDataArr, headerArr) + // 单行数据 + rowmArr := make([]string, len(headerArr)) + for i := range rowmArr { + rowmArr[i] = "0" + } + rowmArr[0] = ruid + rowmArr[1] = userLabel + + // 遍历数据插入单行数据 + itemArr := rowmArr + for _, item := range data { + // NSSF.A.01 可用AMF注册更新次数 + // NSSF.A.02 可用AMF注册成功次数 + // NSSF.A.03 可用AMF注册次数 + // NSSF.A.04 可用AMF注册更新成功次数 + // NSSF.A.05 可用AMF去注册成功次数 + // NSSF.A.06 可用AMF去注册次数 + // NSSF.A.07 网元订阅成功次数 + // NSSF.A.08 网元订阅次数 + // NSSF.A.09 网元去订阅成功次数 + // NSSF.A.10 网元去订阅次数 + // NSSF.A.11 向NRF注册成功次数 + // NSSF.A.12 向NRF注册次数 + // NSSF.A.13 向NRF发送心跳次数 + // NSSF.A.14 当前注册AMF个数 + // NSSF.A.15 当前订阅网元个数 + // ===================== + + // NSSF.A.01 可用AMF注册更新次数 + if v, ok := item["NSSF.A.01"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[2] = vStr + itemArr[3] = vStr + itemArr[4] = vStr + } + + // NSSF.A.15 当前订阅网元个数 + if v, ok := item["NSSF.A.15"]; ok && v != nil { + vStr := fmt.Sprint(v) + itemArr[12] = vStr + itemArr[13] = vStr + itemArr[14] = vStr + } + // 添加后恢复单行数据 + parseDataArr = append(parseDataArr, itemArr) + itemArr = rowmArr + } + return parseDataArr } diff --git a/src/modules/nms_cxy/service/performance.impl.go b/src/modules/nms_cxy/service/performance.impl.go deleted file mode 100644 index 7e6549d..0000000 --- a/src/modules/nms_cxy/service/performance.impl.go +++ /dev/null @@ -1,810 +0,0 @@ -package service - -import ( - "fmt" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/file" - neDataModel "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" - "nms_cxy/src/modules/nms_cxy/utils/common" -) - -// 实例化数据层 PerformanceImpl 结构体 -var NewPerformanceImpl = &PerformanceImpl{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, -} - -// 性能数据处理服务 服务层处理 -type PerformanceImpl struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI -} - -// PerformanceUploadOSS 性能数据上报 -// 性能数据文件的上报周期为15分钟。 -func (s *PerformanceImpl) PerformanceUploadOSS(neType, startTime, endTime string) error { - // 查网元 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, "001") - if neInfo.NeType != neType { - logger.Errorf("ConfigUploadOSS ne info not fount") - return fmt.Errorf("no ne info") - } - - // 数据行 - query := neDataModel.GoldKPIQuery{ - RmUID: neInfo.RmUID, - NeType: neInfo.NeType, - StartTime: startTime, - EndTime: endTime, - Interval: 900, - } - data := s.perfKPIService.SelectGoldKPI(query) - - if len(data) == 0 { - logger.Errorf("PerformanceUploadOSS SelectGoldKPI neType:%s startTime:%s endTime:%s", neType, startTime, endTime) - return fmt.Errorf("not Performance data") - } - - // 转换数据 - parseDataArr := [][]string{} - if neInfo.NeType == "AMF" { - parseDataArr = s.parseDataAMF(neInfo.RmUID, neInfo.NeName, data) - } - if neInfo.NeType == "UPF" { - parseDataArr = s.parseDataUPF(neInfo.RmUID, neInfo.NeName, data) - } - if neInfo.NeType == "UDM" { - parseDataArr = s.parseDataUDM(neInfo.RmUID, neInfo.NeName, data) - } - if neInfo.NeType == "SMF" { - parseDataArr = s.parseDataSMF(neInfo.RmUID, neInfo.NeName, data) - } - if neInfo.NeType == "NSSF" { - parseDataArr = s.parseDataNSSF(neInfo.RmUID, neInfo.NeName, data) - } - - // 文件名 - dataSaveFileName := common.DataSaveFileName{ - ResCode: neType, - } - fileName := dataSaveFileName.CSV() - filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) - err := file.WriterFileCSV(parseDataArr, filePath) - if err != nil { - return err - } - - return common.UploadOSSByZip(filePath, neType, "PM") -} - -// parseDataAMF PM数据AMF -func (s *PerformanceImpl) parseDataAMF(ruid, userLabel string, data []map[string]any) [][]string { - parseDataArr := [][]string{} - // 数据行头 - headerArr := []string{ - // 资源对象的RUID及UserLabel - "RUID", "UserLabel", - // PA - "AMF.AuthReq", // 鉴权请求次数 - "AMF.AuthFail", // 鉴权参数错误次数 - "AMF.AuthFail.20", // MAC错误导致的鉴权参数错误次数 - "AMF.AuthFail.21", // 非5G鉴权导致的鉴权参数错误次数 - "AMF.AuthFail.26", // 同步失败导致的鉴权参数错误次数 - "AMF.AuthReject", // 鉴权拒绝次数 - // PB - "AMF.RegSub", // AMF注册态用户数 - "AMF.RegSub.CmIdle", // AMF空闲态用户数 - "AMF.RegSub.CmConnected", // AMF连接态用户数 - "AMF.RegSub_NS", // 每网络切片的AMF注册用户数 - // PC - "AMF.AttInitReg", // 初始注册请求次数 - "AMF.SuccInitReg", // 初始注册成功次数 - "AMF.FailedInitReg", // 初始注册失败次数 - "AMF.FailedInitReg._Cause", // 分原因值的初始注册失败次数 - "AMF.FailedInitReg.3", // 初始注册失败次数_非法用户 - "AMF.FailedInitReg.5", // 初始注册失败次数_PEI不允许 - "AMF.FailedInitReg.6", // 初始注册失败次数_非法设备 - "AMF.FailedInitReg.7", // 初始注册失败次数_5GS服务不允许 - "AMF.FailedInitReg.7.User", // 初始注册失败次数_5GS服务不允许_用户原因 - "AMF.FailedInitReg.15", // 初始注册失败次数_跟踪区内无合适小区 - "AMF.FailedInitReg.15.User", // 初始注册失败次数_跟踪区内无合适小区_用户原因 - "AMF.InitRegTime", // 初始注册平均时长 - // PD - "AMF.RegUpdReq", // 注册更新请求次数 - "AMF.RegUpdReq.Mob.InterAmf", // AMF间移动性注册更新请求次数 - "AMF.RegUpdReq.Mob.IntraAmf", // AMF内移动性注册更新请求次数 - "AMF.RegUpdReq.Per", // 周期性注册更新请求次数 - "AMF.RegUpdAcpt", // 注册更新接受次数 - "AMF.RegUpdAcpt.Mob.InterAmf", // AMF间移动性注册更新接受次数 - "AMF.RegUpdAcpt.Mob.IntraAmf", // AMF内移动性注册更新接受次数 - "AMF.RegUpdAcpt.Per", // 周期性注册更新接受次数 - "AMF.RegUpdRej", // 注册更新失败次数 - "AMF.RegUpdRej._Cause", // 分原因的注册更新失败次数 - "AMF.RegUpdRej.3", // 注册更新失败次数(非法用户) - "AMF.RegUpdRej.6", // 注册更新失败次数(非法设备) - "AMF.RegUpdRej.7", // 注册更新失败次数(5GS服务不允许) - // PE - "AMF.PagAtt", // 寻呼请求次数 AMF的寻呼请求次数。不包括二次寻呼(二次及二次以上统称为二次寻呼)请求次数。 - "AMF.FirstPagingSucc", // 一次寻呼响应次数 "一次寻呼成功次数。 " - "AMF.SecondPagingSucc", // 二次寻呼响应次数 二次(及二次以上)寻呼成功次数。 - "AMF.AttServiceReq", // 业务请求尝试次数 "UE发起的业务请求次数 " - "AMF.FailServiceReq", // 业务请求被拒次数 UE发起业务请求被拒绝个数 - "AMF.FailServiceReq._Cause", // 分原因的业务请求被拒次数 - // PF - "AMF.AttIntraAmfXn", // AMF内Xn接口切换尝试数 AMF内基于Xn接口的切换尝试次数。" - "AMF.SuccIntraAmfXn", // AMF内Xn接口切换成功次数 AMF内基于Xn接口的切换成功次数。 - "AMF.AttIntraAmfN2", // AMF内N2接口切换尝试次数 AMF内基于N2接口的切换尝试次数。 - "AMF.SuccIntraAmfN2", // AMF内N2接口切换成功次数 AMF内基于N2接口的切换成功次数。 - "AMF.AttOutInterAmf", // AMF间切换出尝试次数 AMF间的切换,切换出源AMF尝试次数。 - "AMF.SuccOutInterAmf", // AMF间切换出成功次数 AMF间的切换,切换出源AMF成功次数。 - "AMF.AttIncInterAmf", // AMF间切换入尝试次数 AMF间的切换,切换入目标AMF尝试次数。 - "AMF.SuccIncInterAmf", // AMF间切换入成功次数 AMF间的切换,切换入目标AMF成功次数。 - // PG - "AMF.Att5GHandoverTo4G", // 从5G网络切换出至4G网络尝试次数 - "AMF.Succ5GHandoverTo4G", // 从5G网络切换出至4G网络成功次数 - "AMF.Att4GHandoverTo5G", // 从4G网络切换入5G网络尝试次数 - "AMF.Succ4GHandoverTo5G", // 从4G网络切换入5G网络成功次数 - "AMF.Req4GReselectTo5G", // 从4G网络重选入5G网络请求次数 - "AMF.Acc4GReselectTo5G", // 从4G网络重选入5G网络接受次数 - // PH - "AMF.MeanLoad", // 系统平均负荷 - // PI - "AMF.UecmRegReq", // UECM注册请求次数 - "AMF.UecmRegSucc", // UECM注册成功次数 - "AMF.UecmRegFail", // UECM注册失败次数 - "AMF.UecmRegFail._Cause", // 分原因的UECM注册失败次数 - "AMF.UecmRegFail.Unknown5GSub", // UECM注册失败次数_未签约5G - "AMF.UecmRegFail.NoPsSub", // UECM注册失败次数_未签约PS业务 - "AMF.UecmRegFail.RoamNotAllowed", // UECM注册失败次数_漫游不允许 - "AMF.UecmRegFail.AccessNotAllowed", // UECM注册失败次数_接入类型不允许 - "AMF.UecmRegFail.RatNotAllowed", // UECM注册失败次数_5GS接入不允许 - "AMF.UecmDeregReq", // AMF发起的UECM去注册请求次数 - "AMF.UecmDeregSucc", // AMF发起的UECM去注册成功次数 - "AMF.UecmDeregNotifyReq", // UDM发起的UECM去注册请求次数 - "AMF.UecmDeregNotifySucc", // UDM发起的UECM去注册成功次数 - // PJ - "AMF.SmContextCreateReq", // 会话上下文建立请求次数 AMF向SMF发起建立会话上下文的次数。 - "AMF.SessionCreateSucc", // 会话上下文建立成功次数 SMF返回AMF建立会话上下文成功的次数 - "AMF.SmContextUpdateReq", // 会话上下文更新请求次数 AMF向SMF发起更新会话上下文的次数。 - "AMF.SessionUpdateSucc", // 会话上下文更新成功次数 SMF返回AMF更新会话上下文成功的次数 - "AMF.SmContextReleaseReq", // 会话上下文释放请求次数 AMF向SMF发起释放会话上下文的次数。 - "AMF.SessionReleaseSucc", // 会话上下文释放成功次数 SMF返回AMF释放会话上下文成功的次数 - "AMF.SmContextRetrieveReq", // 会话上下文查询请求次数 AMF向SMF发起查询会话上下文的次数。 - "AMF.SessionRetrieveSucc", // 会话上下文查询成功次数 SMF返回AMF查询会话上下文成功的次数 - // PK - "AMF.UeAuthReq", // AMF向AUSF发起鉴权请求次数 AMF向AUSF发起鉴权请求消息次数 - "AMF.UeAuthSucc", // AUSF向AMF返回的鉴权成功次数 AUSF向AMF返回的鉴权成功消息次数 - "AMF.UeAuthFail", // 鉴权失败次数 统计AMF收到的AUSF返回的鉴权失败次数,并分application error进行统计。 - "AMF.UeAuthFail._Cause", // 分原因的鉴权失败次数 - "AMF.UeAuthCfmReq", // AMF向AUSF发起鉴权确认请求次数 AMF向AUSF发起鉴权确认请求消息次数 - "AMF.UeAuthCfmSucc", // AUSF向AMF返回的鉴权确认成功次数 AUSF向AMF返回的鉴权确认成功消息次数 - // PL - "AMF.GnbNum", // AMF挂接5G基站数 统计周期结束点时刻,挂接在AMF下的5G基站数量 - - } - parseDataArr = append(parseDataArr, headerArr) - // 单行数据 - rowmArr := make([]string, len(headerArr)) - for i := range rowmArr { - rowmArr[i] = "0" - } - rowmArr[0] = ruid - rowmArr[1] = userLabel - - // 遍历数据插入单行数据 - itemArr := rowmArr - for _, item := range data { - // AMF.01 AMF注册态用户数 - // AMF.02 AMF初始注册请求次数 - // AMF.03 AMF初始注册成功次数 - // AMF.04 AMF初始注册失败次数_非法用户 - // AMF.05 AMF初始注册失败次数_PEI不允许 - // AMF.06 AMF初始注册失败次数_非法设备 - // AMF.07 AMF初始注册失败次数_5GS服务不允许_用户原因 - // AMF.08 AMF初始注册失败次数_跟踪区内无合适小区_用户原因 - // AMF.09 AMF初始注册失败次数_N1模式不允许 - // AMF.10 AMF初始注册失败次数_PLMN不允许 - // AMF.11 AMF初始注册失败次数_跟踪区不允许 - // AMF.12 AMF初始注册失败次数_漫游跟踪区禁止接入 - // AMF.13 AMF初始注册失败次数_无可用网络切片 - // AMF.14 AMF初始注册失败次数_协议错误_用户原因 - // AMF.15 AMF一次寻呼响应次数 - // AMF.16 AMF二次寻呼响应次数 - // AMF.17 AMF寻呼请求次数 - // AMF.18 AMF业务请求被拒次数 - // AMF.19 AMF业务请求尝试次数 - // AMF.20 EPS在线用户数 - // AMF.21 EPS附着成功次数 - // AMF.22 EPS附着请求次数 - // AMF.23 EPS附着失败次数_非法用户 - // AMF.24 EPS附着失败次数_非法终端 - // AMF.25 EPS附着失败次数_非法ME - // AMF.26 EPS附着失败次数_EPS服务不允许_用户原因 - // AMF.27 EPS附着失败次数_EPS和非EPS服务不允许 - // AMF.28 EPS附着失败次数_跟踪区内无合适小区_用户原因 - // AMF.29 EPS附着失败次数_ESM失败_用户原因 - // AMF.30 MME一次寻呼响应次数 - // AMF.31 MME二次寻呼响应次数 - // AMF.32 MME寻呼请求次数 - // AMF.A.02 AMF移动性注册更新成功次数 - // AMF.A.03 AMF移动性注册更新失败次数 - // AMF.A.04 AMF紧急注册请求次数 - // AMF.A.05 AMF紧急注册成功次数 - // AMF.A.06 AMF紧急注册失败次数 - // AMF.A.07 UE发起的去注册请求次数 - // AMF.A.08 UE发起的去注册成功次数 - // AMF.A.09 AMF发起的去注册请求次数 - // AMF.A.10 AMF发起的去注册成功次数 - // AMF.A.11 UDM发起的去注册请求次数 - // AMF.A.12 UDM发起的去注册成功次数 - // AMF.A.13 AMF寻呼失败次数 - // AMF.A.14 AMF隐式去注册次数 - // ===================== - - // AMF.01 AMF注册态用户数 - if v, ok := item["AMF.01"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[2] = vStr - } - - // AMF.A.14 AMF隐式去注册次数 - if v, ok := item["AMF.A.14"]; ok && v != nil { - itemArr[3] = fmt.Sprint(v) - } - // 添加后恢复单行数据 - parseDataArr = append(parseDataArr, itemArr) - itemArr = rowmArr - } - return parseDataArr -} - -// parseDataUPF PM数据UPF -func (s *PerformanceImpl) parseDataUPF(ruid, userLabel string, data []map[string]any) [][]string { - parseDataArr := [][]string{} - // 数据行头 - headerArr := []string{ - // 资源对象的RUID及UserLabel - "RUID", "UserLabel", - // PA - "UPF.PfcpSessionEstabReq", // PFCP会话建立请求次数 PFCP会话建立请求次数。 - "UPF.PfcpSessionEstabReq._Ns", // 分切片的PFCP会话建立请求次数 按照S-NSSAI统计的PFCP会话建立请求次数。 - "UPF.PfcpSessionEstabSucc", // PFCP会话建立成功次数 PFCP会话建立成功次数。 - "UPF.PfcpSessionEstabSucc._Ns", // 分切片的PFCP会话建立成功次数 按照S-NSSAI统计的PFCP会话建立成功次数。 - "UPF.PfcpSessionEstabFail", // PFCP会话建立失败次数 PFCP会话建立被拒绝的次数,并按拒绝原因分类统计。 - "UPF.PfcpSessionEstabFail._Cause", // 分原因的PFCP会话建立失败次数 - "UPF.PfcpSessionEstabFail._Ns", // 分切片的PFCP会话建立失败次数 按照S-NSSAI统计PFCP会话建立被拒绝的次数 - "UPF.PfcpSessionModifyReq", // PFCP会话修改请求次数 PFCP会话修改请求次数。 - "UPF.PfcpSessionModifyReq._Ns", // 分切片的PFCP会话修改请求次数 按照S-NSSAI统计PFCP会话修改请求次数。 - "UPF.PfcpSessionModifySucc", // PFCP会话修改成功次数 PFCP会话修改成功次数。 - "UPF.PfcpSessionModifySucc._Ns", // 分切片的PFCP会话修改成功次数 按照S-NSSAI统计PFCP会话修改成功次数。 - "UPF.PfcpSessionModifyFail", // PFCP会话修改失败次数 PFCP会话修改拒绝的次数,并按拒绝原因分类统计。 - "UPF.PfcpSessionModifyFail._Cause", // 分原因的PFCP会话修改失败次数 - "UPF.PfcpSessionModifyFail._Ns", // 分切片的PFCP会话修改失败次数 按照S-NSSAI统计PFCP会话修改拒绝的次数。 - // PB - "UPF.MeanQosFlows", // 平均QoS流数 一个统计周期内UPF中的平均QoS流数。 - "UPF.MeanQosFlows._Ns", // 分切片的平均QoS流数 一个统计周期内按照S-NSSAI统计UPF中的平均QoS流数。 - "UPF.MeanQosFlows._Dnn", // 分DNN的平均QoS流数 一个统计周期内按照DNN统计UPF中的平均QoS流数。 - "UPF.MaxQosFlows", // 最大QoS流数 一个统计周期内UPF中的最大QoS流数。 - "UPF.MaxQosFlows._Ns", // 分切片的最大QoS流数 一个统计周期内按照S-NSSAI统计UPF中的最大QoS流数。 - "UPF.MaxQosFlows._Dnn", // 分DNN的最大QoS流数 一个统计周期内按照DNN统计UPF中的最大QoS流数。 - // PC - "UPF.N3IncPkt", // N3接口接收GTP包数 UPF从N3接口接收的GTP包数,并按DNN分别进行统计; - "UPF.N3IncPkt._Dnn", // 分DNN的N3接口接收GTP包数 - "UPF.N3OgPkt", // N3接口发送GTP包数 UPF从N3接口发送出去的GTP包数,并按DNN分别进行统计; - "UPF.N3OgPkt._Dnn", // 分DNN的N3接口发送GTP包数 - "UPF.N3IncOct", // N3接口接收GTP包字节数 UPF从N3接口接收的GTP包字节数(含GTP头),并按DNN分别进行统计; - "UPF.N3IncOct._Dnn", // 分DNN的N3接口接收GTP包字节数 - "UPF.N3OgOct", // N3接口发送GTP包字节数 UPF从N3接口发送的GTP包字节数(含GTP头),并按DNN分别进行统计; - "UPF.N3OgOct._Dnn", // 分DNN的N3接口发送GTP包字节数 - "UPF.N3DiscPkt", // N3接口接收错误GTP包数 N3接口因出错丢弃的GTP包个数,并按DNN分别进行统计; - "UPF.N3DiscPkt._Dnn", // 分DNN的N3接口接收错误GTP包数 - // PD - "UPF.N9aIncPkt", // N9a接口接收GTP包数 UPF从左侧N9a接口接收的GTP包数,并按DNN分别进行统计; - "UPF.N9aIncPkt._Dnn", // 分DNN的N9a接口接收GTP包数 - "UPF.N9aOgPkt", // N9a接口发送GTP包数 "UPF从左侧N9a接口发送出去的GTP包数,并按DNN分别进行统计;" - "UPF.N9aOgPkt._Dnn", // 分DNN的N9a接口发送GTP包数 - "UPF.N9aIncOct", // N9a接口接收GTP包字节数 UPF从左侧N9a接口接收的GTP包字节数,并按DNN分别进行统计; - "UPF.N9aIncOct._Dnn", // 分DNN的N9a接口接收GTP包字节数 - "UPF.N9aOgOct", // N9a接口发送GTP包字节数 UPF从左侧N9a接口发送的GTP包字节数,并按DNN分别进行统计; - "UPF.N9aOgOct._Dnn", // 分DNN的N9a接口发送GTP包字节数 - "UPF.N9aDiscPkt", // N9a接口接收错误GTP包数 UPF对左侧N9a接口因出错丢弃的GTP包个数,并按DNN分别进行统计; - "UPF.N9aDiscPkt._Dnn", // 分DNN的N9a接口接收错误GTP包数 - "UPF.N9cIncPkt", // N9c接口接收GTP包数 UPF从右侧N9c接口接收的GTP包数,并按DNN分别进行统计; - "UPF.N9cIncPkt._Dnn", // 分DNN的N9c接口接收GTP包数 - "UPF.N9cOgPkt", // N9c接口发送GTP包数 UPF从右侧N9c接口发送出去的GTP包数,并按DNN分别进行统计; - "UPF.N9cOgPkt._Dnn", // 分DNN的N9c接口发送GTP包数 - "UPF.N9cIncOct", // N9c接口接收GTP包字节数 UPF从右侧N9c接口接收的GTP包字节数,并按DNN分别进行统计; - "UPF.N9cIncOct._Dnn", // 分DNN的N9c接口接收GTP包字节数 - "UPF.N9cOgOct", // N9c接口发送GTP包字节数 UPF从右侧N9c接口发送的GTP包字节数,并按DNN分别进行统计; - "UPF.N9cOgOct._Dnn", // 分DNN的N9c接口发送GTP包字节数 - "UPF.N9cDiscPkt", // N9c接口接收错误GTP包数 UPF对右侧N9c接口因出错丢弃的GTP包个数,并按DNN分别进行统计; - "UPF.N9cDiscPkt._Dnn", // 分DNN的N9c接口接收错误GTP包数 - // PE - "UPF.N6IncPkt", // N6接口接收IP包数 统计UPF在N6接口接收到的IP包个数,并按DNN分别进行统计; - "UPF.N6IncPkt._Dnn", // 分DNN的N6接口接收IP包数 - "UPF.N6OgPkt", // N6接口发送IP包数 统计UPF在N6向发送的IP包个数,并按DNN分别进行统计; - "UPF.N6OgPkt._Dnn", // 分DNN的N6接口发送IP包数 - "UPF.N6IncOct", // N6接口接收字节数 统计UPF在N6接收到的IP包PDU字节数,并按DNN分别进行统计; - "UPF.N6IncOct._Dnn", // 分DNN的N6接口接收字节数 - "UPF.N6OgOct", // N6接口发送字节数 统计UPF在N6发送的IP包PDU字节数,并按DNN分别进行统计; - "UPF.N6OgOct._Dnn", // 分DNN的N6接口发送字节数 - "UPF.N6DiscPkt", // N6接口出错丢弃的IP包数 统计N6口出错丢弃的IP包个数,并按DNN分别进行统计; - "UPF.N6DiscPkt._Dnn", // 分DNN的N6接口出错丢弃的IP包数 - // PF - "UPF.MeanLoad", // 系统平均负荷 对物理网元:指测量周期中,网元的硬件资源负荷的抽样平均值。网元的硬件资源负荷可取对网元影响最大的模块的负荷,或取不同模块的负荷的加权平均值,不同厂商设备的计算方法各不相同 - } - parseDataArr = append(parseDataArr, headerArr) - // 单行数据 - rowmArr := make([]string, len(headerArr)) - for i := range rowmArr { - rowmArr[i] = "0" - } - rowmArr[0] = ruid - rowmArr[1] = userLabel - - // 遍历数据插入单行数据 - itemArr := rowmArr - for _, item := range data { - // UPF.01 PFCP会话建立成功次数 - // UPF.02 PFCP会话建立请求次数 - // UPF.03 N6接口上行字节数 - // UPF.04 N6接口下行字节数 - // UPF.05 N3接口上行字节数 - // UPF.06 N3接口下行字节数 - // UPF.07 SGi接口上行字节数 - // UPF.08 SGi接口下行字节数 - // UPF.09 S1-U接口上行字节数 - // UPF.10 S1-U接口下行字节数 - // ============= - - // PFCP会话建立成功次数 - if v, ok := item["UPF.01"]; ok && v != nil { - itemArr[4] = fmt.Sprint(v) - } - // PFCP会话建立请求次数 - if v, ok := item["UPF.02"]; ok && v != nil { - itemArr[2] = fmt.Sprint(v) - } - // N6接口上行字节数 - if v, ok := item["UPF.03"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[54] = vStr - itemArr[55] = vStr - itemArr[58] = vStr - itemArr[59] = vStr - } - // N6接口下行字节数 - if v, ok := item["UPF.04"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[52] = vStr - itemArr[53] = vStr - itemArr[56] = vStr - itemArr[57] = vStr - } - // N3接口上行字节数 - if v, ok := item["UPF.05"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[22] = vStr - itemArr[23] = vStr - itemArr[26] = vStr - itemArr[27] = vStr - } - // N3接口下行字节数 - if v, ok := item["UPF.06"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[24] = vStr - itemArr[25] = vStr - itemArr[28] = vStr - itemArr[29] = vStr - } - // SGi接口上行字节数 - if v, ok := item["UPF.07"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[32] = vStr - itemArr[33] = vStr - itemArr[36] = vStr - itemArr[37] = vStr - } - // SGi接口下行字节数 - if v, ok := item["UPF.08"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[34] = vStr - itemArr[35] = vStr - itemArr[38] = vStr - itemArr[39] = vStr - } - // S1-U接口上行字节数 - if v, ok := item["UPF.09"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[42] = vStr - itemArr[43] = vStr - itemArr[46] = vStr - itemArr[47] = vStr - } - // S1-U接口下行字节数 - if v, ok := item["UPF.10"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[44] = vStr - itemArr[45] = vStr - itemArr[48] = vStr - itemArr[49] = vStr - } - // 添加后恢复单行数据 - parseDataArr = append(parseDataArr, itemArr) - itemArr = rowmArr - } - return parseDataArr -} - -// parseDataUDM PM数据UDM -func (s *PerformanceImpl) parseDataUDM(ruid, userLabel string, data []map[string]any) [][]string { - parseDataArr := [][]string{} - // 数据行头 - headerArr := []string{ - // 资源对象的RUID及UserLabel - "RUID", "UserLabel", - // PA - "UDM.AmfUecmRegReq", // AMF发起的UECM注册请求次数 统计UDM收到的AMF发起的UECM注册请求次数 - "UDM.AmfUecmRegSucc", // AMF发起的UECM注册成功次数 统计UDM返回的成功的AMF注册响应次数 - "UDM.AmfUecmRegUpdateReq", // 更新注册参数请求次数 更新注册参数请求次数 - "UDM.AmfUecmRegUpdateSucc", // 更新注册参数成功次数 更新注册参数成功次数 - "UDM.AmfUecmDeregReq", // AMF发起的UECM去注册请求次数 统计AMF发起的UECM去注册请求次数 - "UDM.AmfUecmDeregSucc", // AMF发起的UECM去注册成功次数 统计AMF发起的UECM去注册成功次数 - "UDM.SmfUecmRegReq", // SMF发起的UECM注册请求次数 统计SMF发起的用户上下文注册请求次数 - "UDM.SmfUecmRegSucc", // SMF发起的UECM注册成功次数 统计UDM返回的成功的用户上下文注册响应次数 - "UDM.SmfUecmDeregReq", // SMF发起的UECM去注册请求次数 统计SMF发起的用户上下文去注册请求次数 - "UDM.SmfUecmDeregSucc", // SMF发起的UECM去注册成功次数 统计UDM返回的成功的用户上下文去注册响应次数 - "UDM.SdmGetReq", // 获取用户数据请求次数 统计UDM收到的获取用户数据请求次数 - "UDM.SdmGetSucc", // 获取用户数据成功次数 统计UDM成功返回用户数据次数 - "UDM.SdmNotif", // 用户数据变化通知次数 统计UDM发送用户数据变化通知次数 - "UDM.SdmSubscrReq", // 订阅用户数据请求次数 统计UDM收到的订阅用户数据相关通知请求次数 - "UDM.SdmSubscrSucc", // 订阅用户数据成功次数 统计UDM返回的订阅用户数据相关通知成功次数 - "UDM.SdmUnSubscrReq", // 去订阅用户数据请求次数 统计UDM收到的去订阅用户数据相关通知请求次数 - "UDM.SdmUnSubscrSucc", // 去订阅用户数据成功次数 统计UDM返回的去订阅用户数据相关通知成功次数 - "UDM.UecmDeregNotif", // 去注册通知次数 统计UDM发送的去注册通知次数 - // PB - "UDR.5GSubIn", // 5G网络SUPI数 统计UDR存储的SUPI数 - "UDR.5GActSubIn", // 5G用户数 统计UDR存储的5G MSISDN数 - "UDR.5GActSubIn", // 5G活动用户数 统计UDR存储的有位置信息的MSISDN用户数 - // PC - "Ausf.UeAuthReq", // 鉴权请求次数 AUSF收到的鉴权请求次数 - "Ausf.UeAuthAnsSucc", // 鉴权成功次数 AUSF返回鉴权成功响应次数 - } - parseDataArr = append(parseDataArr, headerArr) - // 单行数据 - rowmArr := make([]string, len(headerArr)) - for i := range rowmArr { - rowmArr[i] = "0" - } - rowmArr[0] = ruid - rowmArr[1] = userLabel - - // 遍历数据插入单行数据 - itemArr := rowmArr - for _, item := range data { - // UDM.01 5G注册用户数 - // UDM.02 AMF发起的UECM注册请求次数 - // UDM.03 AMF发起的UECM注册成功次数 - // UDM.04 SMF发起的UECM注册成功次数 - // UDM.05 SMF发起的UECM注册请求次数 - // UDM.06 4G注册用户数 - // UDM.07 4G鉴权信息查询成功次数 - // UDM.08 4G鉴权信息查询请求次数 - // UDM.09 4G更新位置成功次数 - // UDM.10 4G更新位置请求次数 - // UDM.11 SAR成功响应总次数 - // UDM.12 SAR请求总次数 - // UDM.13 LIR成功响应总次数 - // UDM.14 LIR请求总次数 - // ================== - - // 5G注册用户数 - if v, ok := item["UDM.01"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[21] = vStr - itemArr[22] = vStr - } - // AMF发起的UECM注册请求次数 - if v, ok := item["UDM.02"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[2] = vStr - itemArr[6] = vStr - } - // AMF发起的UECM注册成功次数 - if v, ok := item["UDM.03"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[3] = vStr - itemArr[7] = vStr - } - // SMF发起的UECM注册成功次数 - if v, ok := item["UDM.04"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[9] = vStr - itemArr[11] = vStr - } - // SMF发起的UECM注册请求次数 - if v, ok := item["UDM.05"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[8] = vStr - itemArr[10] = vStr - } - // 4G注册用户数 - if v, ok := item["UDM.06"]; ok && v != nil { - itemArr[19] = fmt.Sprint(v) - } - // 4G鉴权信息查询成功次数 - if v, ok := item["UDM.07"]; ok && v != nil { - itemArr[13] = fmt.Sprint(v) - } - // 4G鉴权信息查询请求次数 - if v, ok := item["UDM.08"]; ok && v != nil { - itemArr[12] = fmt.Sprint(v) - } - // 4G更新位置成功次数 - if v, ok := item["UDM.09"]; ok && v != nil { - itemArr[16] = fmt.Sprint(v) - } - // 4G更新位置请求次数 - if v, ok := item["UDM.10"]; ok && v != nil { - itemArr[15] = fmt.Sprint(v) - } - // SAR成功响应总次数 - if v, ok := item["UDM.11"]; ok && v != nil { - itemArr[18] = fmt.Sprint(v) - } - // SAR请求总次数 - if v, ok := item["UDM.12"]; ok && v != nil { - itemArr[17] = fmt.Sprint(v) - } - // LIR成功响应总次数 - if v, ok := item["UDM.13"]; ok && v != nil { - itemArr[24] = fmt.Sprint(v) - } - // LIR请求总次数 - if v, ok := item["UDM.14"]; ok && v != nil { - itemArr[23] = fmt.Sprint(v) - } - // 添加后恢复单行数据 - parseDataArr = append(parseDataArr, itemArr) - itemArr = rowmArr - } - return parseDataArr -} - -// parseDataSMF PM数据SMF -func (s *PerformanceImpl) parseDataSMF(ruid, userLabel string, data []map[string]any) [][]string { - parseDataArr := [][]string{} - // 数据行头 - headerArr := []string{ - // 资源对象的RUID及UserLabel - "RUID", "UserLabel", - // PA - "SMF.AttCreatePduSession", // PDU会话建立请求次数 UE发起的PDU会话建立请求次数。 - "SMF.AttCreatePduSession._Ns", // 分网络切片的PDU会话建立请求次数 按照S-NSSAI统计UE发起的PDU会话建立请求次数。 - "SMF.AttCreatePduSession._Dnn", // 分DNN的PDU会话建立请求次数 按照DNN统计UE发起的PDU会话建立请求次数。 - "SMF.SuccCreatePduSession", // PDU会话建立成功次数 UE发起的PDU会话建立成功次数。 - "SMF.SuccCreatePduSession._Ns", // 分网络切片的PDU会话建立成功次数 按照S-NSSAI统计UE发起的PDU会话建立成功次数。 - "SMF.SuccCreatePduSession._Dnn", // 分DNN的PDU会话建立成功次数 按照DNN统计UE发起的PDU会话建立成功次数。 - "SMF.FailCreatePduSession", // PDU会话建立失败次数 UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。 - "SMF.FailCreatePduSession._Cause", // 分原因的PDU会话建立失败次数 - "SMF.FailCreatePduSession._Ns", // 分网络切片的PDU会话建立失败次数 按照S-NSSAI统计UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。 - "SMF.FailCreatePduSession._Dnn", // 分DNN的PDU会话建立失败次数 按照DNN统计UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。 - "SMF.AttSmfModifyPduSession", // SMF发起的PDU会话修改请求次数 SMF发起的PDU会话修改请求次数。 - "SMF.AttSmfModifyPduSession._Ns", // 分网络切片的PDU会话修改请求次数 按照S-NSSAI统计SMF发起的PDU会话修改请求次数。 - "SMF.AttSmfModifyPduSession._Dnn", // 分DNN的PDU会话修改请求次数 按照DNN统计SMF发起的PDU会话修改请求次数。 - "SMF.SuccSmfModifyPduSession", // SMF发起的PDU会话修改成功次数 SMF发起的PDU会话修改成功次数。 - "SMF.SuccSmfModifyPduSession._Ns", // 分网络切片的SMF发起的PDU会话修改成功次数 按照S-NSSAI统计SMF发起的PDU会话修改成功次数。 - "SMF.SuccSmfModifyPduSession._Dnn", // 分DNN的SMF发起的PDU会话修改成功次数 按照DNN统计SMF发起的PDU会话修改成功次数。 - "SMF.FailSmfModifyPduSession", // SMF发起的PDU会话修改失败次数 "SMF发起的PDU会话修改被UE拒绝的次数,并按拒绝原因分类统计。" - "SMF.FailSmfModifyPduSession._Cause", // 分原因的SMF发起的PDU会话修改失败次数 - "SMF.FailSmfModifyPduSession._Ns", // 分网络切片的SMF发起的PDU会话修改失败次数 按照S-NSSAI统计UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。 - "SMF.FailSmfModifyPduSession._Dnn", // 分DNN的SMF发起的PDU会话修改失败次数 "按照DNN统计UE发起的PDU会话建立被SMF拒绝的次数,并按拒绝原因分类统计。" - "SMF.PduSessionCreateTime", // PDU会话建立流程平均时长 "成功的PDU会话建立流程的平均时长。" - // PB - "SMF.MeanPduSession", // 平均PDU会话数 - "SMF.MeanPduSession._Ns", // 分网络切片的平均PDU会话数 - "SMF.MeanPduSession._Dnn", // 分DNN的平均PDU会话数 - "SMF.MaxPduSession", // 最大PDU会话数 - "SMF.MaxPduSession._Ns", // 分网络切片的最大PDU会话数 - "SMF.MaxPduSession._Dnn", // 分DNN的最大PDU会话数 - "SMF.MeanQf", // 平均Qos流数 - "SMF.MeanQf._Ns", // 分网络切片的平均Qos流数 - "SMF.MeanQf._Dnn", // 分DNN的平均Qos流数 - "SMF.MaxQf", // 最大Qos流数 - "SMF.MaxQf._Ns", // 分网络切片的最大Qos流数 - "SMF.MaxQf._Dnn", // 分DNN的最大Qos流数 - // PC - "SMF.MeanLoad", // 系统平均负荷 - // PD - "SMF.MeanAllcAddr", // 平均分配的地址数 SMF为UE平均分配的地址数。 - "SMF.MeanAllcAddr._Ns", // 分网络切片的平均分配的地址数 按照S-NSSAI统计统计的SMF为UE平均分配的地址数。 - "SMF.MaxAllcAddr", // 最大分配的地址数 SMF为UE最大分配的地址数。 - "SMF.MaxAllcAddr._Ns", // 分网络切片的最大分配的地址数 按照S-NSSAI统计的SMF为UE最大分配的地址数。 - // PE - "SMF.SmPlcyCtrlCreateReq", // 创建SM策略请求的次数 SMF向PCF发起创建SM策略请求的次数。 - "SMF.SmPlcyCtrlCreateSucc", // 创建SM策略成功次数 PCF向SMF返回创建SM策略成功的次数。 - "SMF.SmPlcyCtrlUpdateReq", // 更新SM策略请求的次数 SMF向PCF发起更新SM策略请求的次数。 - "SMF.SmPlcyCtrlUpdateSucc", // 更新SM策略成功次数 PCF向SMF返回更新SM策略成功的次数。 - "SMF.SmPlcyCtrlDeleteReq", // 删除策略请求的次数 SMF向PCF发起删除SM策略请求的次数。 - "SMF.SmPlcyCtrlDeleteSucc", // 删除SM策略成功次数 PCF向SMF返回删除SM策略成功的次数。 - // PF - "SMF.UecmRegReq", // UE上下文注册请求次数 SMF向UDM发起UE上下文注册请求的次数 - "SMF.UecmRegSucc", // UE上下文注册成功次数 SMF收到UDM返回的UE上下文注册成功的次数 - "SMF.UecmRegFail", // UE上下文注册失败次数 SMF收到UDM返回的UE上下文注册失败的次数 - "SMF.UecmRegFail._Cause", // 分原因的UE上下文注册失败次数 - "SMF.UecmRegFail.Unknown5GSub", // UE上下文注册失败次数_未签约5G - "SMF.UecmRegFail.RoamNotAllowed", // UE上下文注册失败次数_漫游不允许 - "SMF.UecmRegFail.DnnNotAllowed", // UE上下文注册失败次数_DNN未授权 - "SMF.UecmRegFail.UserNotFound", // UE上下文注册失败次数_未找到用户 - "SMF.UecmDeregReq", // UE上下文去注册请求次数 SMF向UDM发起UE上下文去注册请求的次数 - "SMF.UecmDeregSucc", // UE上下文去注册成功次数 SMF向UDM发起UE上下文去注册请求的次数 - "SMF.UecmDeregNotifyReq", // UE上下文去注册通知请求次数 UDM向SMF发送UE上下文去注册通知次数。 - "SMF.UecmDeregNotifySucc", // UE上下文去注册通知成功次数 SMF向UDM返回UE上下文去注册通知确认消息次数。 - } - parseDataArr = append(parseDataArr, headerArr) - // 单行数据 - rowmArr := make([]string, len(headerArr)) - for i := range rowmArr { - rowmArr[i] = "0" - } - rowmArr[0] = ruid - rowmArr[1] = userLabel - - // 遍历数据插入单行数据 - itemArr := rowmArr - for _, item := range data { - // SMF.01 5G实时PDU会话数 - // SMF.02 PDU会话建立成功次数 - // SMF.03 PDU会话建立请求次数 - // SMF.04 IMS PDU会话建立成功次数 - // SMF.05 IMS PDU会话建立请求次数 - // SMF.06 EPS-Fallback成功数 - // SMF.07 EPS-Fallback请求数 - // SMF.08 4G在线会话数 - // SMF.09 PGW缺省承载建立成功个数 - // SMF.10 PGW缺省承载建立请求个数 - // SMF.11 PGW专用承载建立成功个数 - // SMF.12 PGW专用承载建立请求个数 - // SMF.13 IMS缺省承载成功建立个数 - // SMF.14 IMS缺省承载请求建立个数 - // SMF.A.01 PDU会话接受次数 - // SMF.A.02 基站Pdu资源创建成功次数 - // SMF.A.03 查询用户SM数据失败次数 - // SMF.A.04 PFCP会话建立失败次数 - // SMF.A.05 基站Pdu资源创建失败次数 - // SMF.A.06 PFCP会话修改失败次数 - // SMF.A.07 PDU会话拒绝次数 - // SMF.A.08 PDU会话释放指示次数 - // ================== - - // 5G实时PDU会话数 - if v, ok := item["SMF.01"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[26] = vStr - itemArr[27] = vStr - itemArr[28] = vStr - } - // PDU会话建立成功次数 - if v, ok := item["SMF.02"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[5] = vStr - itemArr[6] = vStr - itemArr[7] = vStr - } - // PDU会话建立请求次数 - if v, ok := item["SMF.03"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[2] = vStr - itemArr[3] = vStr - itemArr[4] = vStr - } - // IMS PDU会话建立成功次数 - // IMS PDU会话建立请求次数 - // EPS-Fallback成功数 - // EPS-Fallback请求数 - // 4G在线会话数 - // PGW缺省承载建立成功个数 - // PGW缺省承载建立请求个数 - // PGW专用承载建立成功个数 - // PGW专用承载建立请求个数 - // IMS缺省承载成功建立个数 - // IMS缺省承载请求建立个数 - // PDU会话接受次数 - // 基站Pdu资源创建成功次数 - // 查询用户SM数据失败次数 - // PFCP会话建立失败次数 - // 基站Pdu资源创建失败次数 - // PFCP会话修改失败次数 - // PDU会话拒绝次数 - if v, ok := item["SMF.A.07"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[18] = vStr - itemArr[19] = vStr - itemArr[20] = vStr - itemArr[21] = vStr - } - // PDU会话释放指示次数 - if v, ok := item["SMF.A.08"]; ok && v != nil { - itemArr[23] = fmt.Sprint(v) - } - // 添加后恢复单行数据 - parseDataArr = append(parseDataArr, itemArr) - itemArr = rowmArr - } - return parseDataArr -} - -// parseDataNSSF PM数据NSSF -func (s *PerformanceImpl) parseDataNSSF(ruid, userLabel string, data []map[string]any) [][]string { - parseDataArr := [][]string{} - // 数据行头 - headerArr := []string{ - // 资源对象的RUID及UserLabel - "RUID", "UserLabel", - // PA - "NSSF.NsSelectReq", // 网络切片选择请求次数 NSSF收到的网络切片选择请求次数 - "NSSF.NsSelectReq.Reg", // 注册过程网络切片选择请求次数 注册过程中NSSF收到的网络切片选择请求次数 - "NSSF.NsSelectReq.Pdu", // PDU会话建立过程网络切片选择请求次数 PDU会话建立过程中NSSF收到的网络切片选择请求次数 - "NSSF.NsSelectSucc", // 网络切片选择成功次数 NSSF返回网络切片选择成功次数; - "NSSF.NsSelectSucc.Reg", // 注册过程网络切片选择成功次数 注册过程中NSSF返回网络切片选择成功次数 - "NSSF.NsSelectSucc.Pdu", // PDU会话建立过程网络切片选择成功次数 PDU会话建立过程中NSSF返回网络切片选择成功次数 - "NSSF.NsSelectFail", // 网络切片选择失败次数 NSSF返回网络切片选择失败次数,分原因进行分类统计 - "NSSF.NsSelectFail._Cause", // 分原因的网络切片选择失败次数 - // PB - "NSSF.MeanLoad", //系统平均负荷 - } - parseDataArr = append(parseDataArr, headerArr) - // 单行数据 - rowmArr := make([]string, len(headerArr)) - for i := range rowmArr { - rowmArr[i] = "0" - } - rowmArr[0] = ruid - rowmArr[1] = userLabel - - // 遍历数据插入单行数据 - itemArr := rowmArr - for _, item := range data { - // NSSF.A.01 可用AMF注册更新次数 - // NSSF.A.02 可用AMF注册成功次数 - // NSSF.A.03 可用AMF注册次数 - // NSSF.A.04 可用AMF注册更新成功次数 - // NSSF.A.05 可用AMF去注册成功次数 - // NSSF.A.06 可用AMF去注册次数 - // NSSF.A.07 网元订阅成功次数 - // NSSF.A.08 网元订阅次数 - // NSSF.A.09 网元去订阅成功次数 - // NSSF.A.10 网元去订阅次数 - // NSSF.A.11 向NRF注册成功次数 - // NSSF.A.12 向NRF注册次数 - // NSSF.A.13 向NRF发送心跳次数 - // NSSF.A.14 当前注册AMF个数 - // NSSF.A.15 当前订阅网元个数 - // ===================== - - // NSSF.A.01 可用AMF注册更新次数 - if v, ok := item["NSSF.A.01"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[2] = vStr - itemArr[3] = vStr - itemArr[4] = vStr - } - - // NSSF.A.15 当前订阅网元个数 - if v, ok := item["NSSF.A.15"]; ok && v != nil { - vStr := fmt.Sprint(v) - itemArr[12] = vStr - itemArr[13] = vStr - itemArr[14] = vStr - } - // 添加后恢复单行数据 - parseDataArr = append(parseDataArr, itemArr) - itemArr = rowmArr - } - return parseDataArr -} diff --git a/src/modules/nms_cxy/service/resource.go b/src/modules/nms_cxy/service/resource.go index 6b43dc7..b1c9d5f 100644 --- a/src/modules/nms_cxy/service/resource.go +++ b/src/modules/nms_cxy/service/resource.go @@ -1,17 +1,161 @@ package service -import "nms_cxy/src/modules/nms_cxy/model" +import ( + "encoding/json" + "fmt" + "time" -// 资源数据处理服务 服务层接口 -type IResource interface { - // ResourceeUploadOSS 资源数据上报 - ResourceeUploadOSS(neType string) error + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/file" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/nms_cxy/model" + "be.ems/src/modules/nms_cxy/utils/common" + "be.ems/src/modules/nms_cxy/utils/kafka" +) - // ResourceeInsert 资源数据变更日志插入 - ResourceeInsert(nrmLog model.NRMLog) string - - // KafkaPush 推送数据Kafka - // - // acronyms 资源对象类型简称,没有就填空字符串 - KafkaPush(neType string, acronyms string, data any) error +// 实例化数据层 Resource 结构体 +var NewResource = &Resource{ + nrmLogService: NewNRMLog, + neInfoService: neService.NewNeInfo, +} + +// 资源数据处理服务 服务层处理 +type Resource struct { + nrmLogService *NRMLog // 资源数据日志处理服务 + neInfoService *neService.NeInfo // 网元信息服务 +} + +// ResourceeUploadOSS 资源数据上报 +// OMC在每天的0时及12时上报网元的全量资源数据文件至OSS +func (s *Resource) ResourceeUploadOSS(neType string) error { + var pageNum int64 = 1 + var pageSize int64 = 20 + dataArr := []any{} + + // 查网元 + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, "001") + if neInfo.NeType != neType { + logger.Errorf("ResourceeUploadOSS ne info not fount") + return fmt.Errorf("ne info not fount") + } + startTime := time.Now().UnixMilli() + + // 查询数据 + total, rows := s.nrmLogService.SelectPage(map[string]any{ + "startTime": startTime, + "neType": neType, + "ruid": neInfo.RmUID, + "pageNum": pageNum, + "pageSize": pageSize, + }) + if total <= 0 { + return fmt.Errorf("resourcee rows not fount") + } + for _, v := range rows { + data := map[string]any{} + data["MsgID"] = v.MsgID + data["Ruid"] = v.Ruid + data["UserLabel"] = v.UserLabel + data["ChangeTime"] = v.ChangeTime + data["ChangeType"] = v.ChangeType + // 操作数据合并 + changeOper := map[string]any{} + json.Unmarshal([]byte(v.ChangeOper), &changeOper) + for operK, operV := range changeOper { + data[operK] = operV + } + dataArr = append(dataArr, data) + } + pageNum += 1 + + // 按总数分批遍历 + batchNum := total / pageSize + for i := 1; i <= int(batchNum); i++ { + // 查询数据 + total, rows := s.nrmLogService.SelectPage(map[string]any{ + "startTime": startTime, + "neType": neType, + "ruid": neInfo.RmUID, + "pageNum": pageNum, + "pageSize": pageSize, + }) + if total <= 0 { + return fmt.Errorf("resourcee rows not fount") + } + for _, v := range rows { + data := map[string]any{} + data["MsgID"] = v.MsgID + data["Ruid"] = v.Ruid + data["UserLabel"] = v.UserLabel + data["ChangeTime"] = v.ChangeTime + data["ChangeType"] = v.ChangeType + // 操作数据合并 + changeOper := map[string]any{} + json.Unmarshal([]byte(v.ChangeOper), &changeOper) + for operK, operV := range changeOper { + data[operK] = operV + } + dataArr = append(dataArr, data) + } + pageNum += 1 + } + + // dataArr = append(dataArr, map[string]any{ + // "RUID": "WXZX001CLL0000115349200113", + // "UserLabel": "cell1000", + // "CellBarred": 0, + // "UeInactiveTimer": 10000, + // "SupportRRCNumbers": 200, + // }) + + // 文件名 + dataSaveFileName := common.DataSaveFileName{ + ResCode: neType, + } + fileName := dataSaveFileName.JSON() + filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + // 数据写入json文件 + err := file.WriterFileJSONLine(dataArr, filePath) + if err != nil { + return err + } + return common.UploadOSSByJSONToZip(filePath, neType, "NRM") +} + +// ResourceeInsert 资源数据变更日志插入 +func (s *Resource) ResourceeInsert(nrmLog model.NRMLog) string { + return s.nrmLogService.Insert(nrmLog) +} + +// KafkaPush 推送数据Kafka +// +// acronyms 资源对象类型简称,没有就填空字符串 +func (s *Resource) KafkaPush(neType string, acronyms string, data any) error { + if neType == "" { + return nil + } + + // 数据序列化 + bytes, err := json.Marshal(data) + if err != nil { + logger.Errorf("KafkaPush ResourceChangeData err => %s", err.Error()) + return err + } + + // 订阅topic,名称为:专业编码-厂商编码-OMC编号-网元类型-数据类别(固定为NRM)-资源对象类型简称 + basePath := common.BasePath("-") + topic := fmt.Sprintf("%s-%s-NRM", basePath, neType) + if acronyms != "" { + topic = topic + "-" + acronyms + } + + // 发送消息 + partition, offset, err := kafka.KInitConm.MessageSyncSend(topic, 0, string(bytes)) + if err != nil { + logger.Errorf("KafkaPush MessageSyncSend err => %s", err.Error()) + return err + } + logger.Infof("KafkaPush MessageSyncSend Partition:%d, Offset:%d", partition, offset) + return err } diff --git a/src/modules/nms_cxy/service/resource.impl.go b/src/modules/nms_cxy/service/resource.impl.go deleted file mode 100644 index 50cac39..0000000 --- a/src/modules/nms_cxy/service/resource.impl.go +++ /dev/null @@ -1,167 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - neService "nms_cxy/src/modules/network_element/service" - "nms_cxy/src/modules/nms_cxy/model" - "nms_cxy/src/modules/nms_cxy/utils/common" - "nms_cxy/src/modules/nms_cxy/utils/kafka" - "time" -) - -// 实例化数据层 ResourceImpl 结构体 -var NewResourceImpl = &ResourceImpl{ - nrmLogService: NewNRMLogImpl, - neInfoService: neService.NewNeInfoImpl, -} - -// 资源数据处理服务 服务层处理 -type ResourceImpl struct { - // 资源数据日志处理服务 - nrmLogService INRMLog - // 网元信息服务 - neInfoService neService.INeInfo -} - -// ResourceeUploadOSS 资源数据上报 -// OMC在每天的0时及12时上报网元的全量资源数据文件至OSS -func (s *ResourceImpl) ResourceeUploadOSS(neType string) error { - var pageNum int64 = 1 - var pageSize int64 = 20 - dataArr := []any{} - - // 查网元 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, "001") - if neInfo.NeType != neType { - logger.Errorf("ResourceeUploadOSS ne info not fount") - return fmt.Errorf("ne info not fount") - } - startTime := time.Now().UnixMilli() - - // 查询数据 - pageData := s.nrmLogService.SelectPage(map[string]any{ - "startTime": startTime, - "neType": neType, - "ruid": neInfo.RmUID, - "pageNum": pageNum, - "pageSize": pageSize, - }) - - total := parse.Number(pageData["total"]) - rows, ok := pageData["rows"].([]model.NRMLog) - if !ok || len(rows) <= 0 { - return fmt.Errorf("resourcee rows not fount") - } - for _, v := range rows { - data := map[string]any{} - data["MsgID"] = v.MsgID - data["Ruid"] = v.Ruid - data["UserLabel"] = v.UserLabel - data["ChangeTime"] = v.ChangeTime - data["ChangeType"] = v.ChangeType - // 操作数据合并 - changeOper := map[string]any{} - json.Unmarshal([]byte(v.ChangeOper), &changeOper) - for operK, operV := range changeOper { - data[operK] = operV - } - dataArr = append(dataArr, data) - } - pageNum += 1 - - // 按总数分批遍历 - batchNum := total / pageSize - for i := 1; i <= int(batchNum); i++ { - // 查询数据 - pageData := s.nrmLogService.SelectPage(map[string]any{ - "startTime": startTime, - "neType": neType, - "ruid": neInfo.RmUID, - "pageNum": pageNum, - "pageSize": pageSize, - }) - rows, ok := pageData["rows"].([]model.NRMLog) - if !ok || len(rows) <= 0 { - return fmt.Errorf("resourcee rows not fount") - } - for _, v := range rows { - data := map[string]any{} - data["MsgID"] = v.MsgID - data["Ruid"] = v.Ruid - data["UserLabel"] = v.UserLabel - data["ChangeTime"] = v.ChangeTime - data["ChangeType"] = v.ChangeType - // 操作数据合并 - changeOper := map[string]any{} - json.Unmarshal([]byte(v.ChangeOper), &changeOper) - for operK, operV := range changeOper { - data[operK] = operV - } - dataArr = append(dataArr, data) - } - pageNum += 1 - } - - // dataArr = append(dataArr, map[string]any{ - // "RUID": "WXZX001CLL0000115349200113", - // "UserLabel": "cell1000", - // "CellBarred": 0, - // "UeInactiveTimer": 10000, - // "SupportRRCNumbers": 200, - // }) - - // 文件名 - dataSaveFileName := common.DataSaveFileName{ - ResCode: neType, - } - fileName := dataSaveFileName.JSON() - filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) - // 数据写入json文件 - err := file.WriterFileJSONLine(dataArr, filePath) - if err != nil { - return err - } - return common.UploadOSSByJSONToZip(filePath, neType, "NRM") -} - -// ResourceeInsert 资源数据变更日志插入 -func (s *ResourceImpl) ResourceeInsert(nrmLog model.NRMLog) string { - return s.nrmLogService.Insert(nrmLog) -} - -// KafkaPush 推送数据Kafka -// -// acronyms 资源对象类型简称,没有就填空字符串 -func (s *ResourceImpl) KafkaPush(neType string, acronyms string, data any) error { - if neType == "" { - return nil - } - - // 数据序列化 - bytes, err := json.Marshal(data) - if err != nil { - logger.Errorf("KafkaPush ResourceChangeData err => %s", err.Error()) - return err - } - - // 订阅topic,名称为:专业编码-厂商编码-OMC编号-网元类型-数据类别(固定为NRM)-资源对象类型简称 - basePath := common.BasePath("-") - topic := fmt.Sprintf("%s-%s-NRM", basePath, neType) - if acronyms != "" { - topic = topic + "-" + acronyms - } - - // 发送消息 - partition, offset, err := kafka.KInitConm.MessageSyncSend(topic, 0, string(bytes)) - if err != nil { - logger.Errorf("KafkaPush MessageSyncSend err => %s", err.Error()) - return err - } - logger.Infof("KafkaPush MessageSyncSend Partition:%d, Offset:%d", partition, offset) - return err -} diff --git a/src/modules/nms_cxy/utils/common/common.go b/src/modules/nms_cxy/utils/common/common.go index d591887..172260e 100644 --- a/src/modules/nms_cxy/utils/common/common.go +++ b/src/modules/nms_cxy/utils/common/common.go @@ -2,13 +2,14 @@ package common import ( "fmt" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/modules/nms_cxy/utils/oss" "path/filepath" "strings" "time" + + "be.ems/src/framework/config" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/nms_cxy/utils/oss" ) // DataSaveFileName 数据文件命名要求 diff --git a/src/modules/nms_cxy/utils/kafka/kafka.go b/src/modules/nms_cxy/utils/kafka/kafka.go index 01e0bd2..11d0fec 100644 --- a/src/modules/nms_cxy/utils/kafka/kafka.go +++ b/src/modules/nms_cxy/utils/kafka/kafka.go @@ -2,10 +2,11 @@ package kafka import ( "context" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/logger" "time" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "github.com/IBM/sarama" ) diff --git a/src/modules/nms_cxy/utils/oss/oss.go b/src/modules/nms_cxy/utils/oss/oss.go index 066b6e7..514bfbf 100644 --- a/src/modules/nms_cxy/utils/oss/oss.go +++ b/src/modules/nms_cxy/utils/oss/oss.go @@ -2,8 +2,9 @@ package oss import ( "context" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/logger" + + "be.ems/src/framework/config" + "be.ems/src/framework/logger" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" @@ -27,16 +28,19 @@ func InitConfig() { Secure: useSSL, }) if err != nil { - logger.Fatalf("minio %s client err %v", endpoint, err) + logger.Errorf("minio %s client err %v", endpoint, err) + return } // 检查存储桶是否存在可用 found, err := minioClient.BucketExists(context.Background(), bucketname) if err != nil { - logger.Fatalf("minio %s bucket [%s] exists err %v", endpoint, bucketname, err) + logger.Errorf("minio %s bucket [%s] exists err %v", endpoint, bucketname, err) + return } if !found { - logger.Fatalf("minio %s bucket [%s] not found err %v", endpoint, bucketname, err) + logger.Errorf("minio %s bucket [%s] not found err %v", endpoint, bucketname, err) + return } logger.Infof("minio %s bucket [%s] exists", endpoint, bucketname) OInitConm = minioClient diff --git a/src/modules/system/controller/sys_config.go b/src/modules/system/controller/sys_config.go index f721228..5809dca 100644 --- a/src/modules/system/controller/sys_config.go +++ b/src/modules/system/controller/sys_config.go @@ -6,13 +6,13 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -214,7 +214,7 @@ func (s *SysConfigController) ConfigKey(c *gin.Context) { } key := s.sysConfigService.SelectConfigValueByKey(configKey) if key != "" { - c.JSON(200, result.OkData(key)) + c.JSON(200, result.OkData(i18n.TKey(language, key))) return } c.JSON(200, result.Err(nil)) diff --git a/src/modules/system/controller/sys_dept.go b/src/modules/system/controller/sys_dept.go index 00c7580..4ddfc18 100644 --- a/src/modules/system/controller/sys_dept.go +++ b/src/modules/system/controller/sys_dept.go @@ -3,13 +3,13 @@ package controller import ( "strings" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" diff --git a/src/modules/system/controller/sys_dict_data.go b/src/modules/system/controller/sys_dict_data.go index bbfd04a..c3eec5f 100644 --- a/src/modules/system/controller/sys_dict_data.go +++ b/src/modules/system/controller/sys_dict_data.go @@ -6,13 +6,13 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -20,18 +20,16 @@ import ( // 实例化控制层 SysDictDataController 结构体 var NewSysDictData = &SysDictDataController{ - sysDictDataService: service.NewSysDictDataImpl, - sysDictTypeService: service.NewSysDictTypeImpl, + sysDictDataService: service.NewSysDictData, + sysDictTypeService: service.NewSysDictType, } // 字典类型对应的字典数据信息 // // PATH /system/dict/data type SysDictDataController struct { - // 字典数据服务 - sysDictDataService service.ISysDictData - // 字典类型服务 - sysDictTypeService service.ISysDictType + sysDictDataService *service.SysDictData // 字典数据服务 + sysDictTypeService *service.SysDictType // 字典类型服务 } // 字典数据列表 diff --git a/src/modules/system/controller/sys_dict_type.go b/src/modules/system/controller/sys_dict_type.go index b1971ab..939cd3e 100644 --- a/src/modules/system/controller/sys_dict_type.go +++ b/src/modules/system/controller/sys_dict_type.go @@ -6,14 +6,14 @@ import ( "strings" "time" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -21,15 +21,14 @@ import ( // 实例化控制层 SysDictTypeController 结构体 var NewSysDictType = &SysDictTypeController{ - sysDictTypeService: service.NewSysDictTypeImpl, + sysDictTypeService: service.NewSysDictType, } // 字典类型信息 // // PATH /system/dict/type type SysDictTypeController struct { - // 字典类型服务 - sysDictTypeService service.ISysDictType + sysDictTypeService *service.SysDictType // 字典类型服务 } // 字典类型列表 diff --git a/src/modules/system/controller/sys_log_login.go b/src/modules/system/controller/sys_log_login.go index 61184d5..0444d32 100644 --- a/src/modules/system/controller/sys_log_login.go +++ b/src/modules/system/controller/sys_log_login.go @@ -6,15 +6,15 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - commonService "nms_cxy/src/modules/common/service" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + commonService "be.ems/src/modules/common/service" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) @@ -22,7 +22,7 @@ import ( // 实例化控制层 SysLogLoginController 结构体 var NewSysLogLogin = &SysLogLoginController{ sysLogLoginService: service.NewSysLogLoginImpl, - accountService: commonService.NewAccountImpl, + accountService: commonService.NewAccount, } // 系统登录日志信息 @@ -31,8 +31,7 @@ var NewSysLogLogin = &SysLogLoginController{ type SysLogLoginController struct { // 系统登录日志服务 sysLogLoginService service.ISysLogLogin - // 账号身份操作服务 - accountService commonService.IAccount + accountService *commonService.Account // 账号身份操作服务 } // 系统登录日志列表 diff --git a/src/modules/system/controller/sys_log_operate.go b/src/modules/system/controller/sys_log_operate.go index 31f913c..e5cc4a3 100644 --- a/src/modules/system/controller/sys_log_operate.go +++ b/src/modules/system/controller/sys_log_operate.go @@ -6,14 +6,14 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) diff --git a/src/modules/system/controller/sys_menu.go b/src/modules/system/controller/sys_menu.go index 6dad49e..8454e7d 100644 --- a/src/modules/system/controller/sys_menu.go +++ b/src/modules/system/controller/sys_menu.go @@ -1,16 +1,16 @@ package controller import ( - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/constants/menu" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/regular" - "nms_cxy/src/framework/vo" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/config" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/constants/menu" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/regular" + "be.ems/src/framework/vo" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" diff --git a/src/modules/system/controller/sys_post.go b/src/modules/system/controller/sys_post.go index 03f63d6..26a2822 100644 --- a/src/modules/system/controller/sys_post.go +++ b/src/modules/system/controller/sys_post.go @@ -6,14 +6,14 @@ import ( "strings" "time" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" diff --git a/src/modules/system/controller/sys_profile.go b/src/modules/system/controller/sys_profile.go index deb2e24..34626a2 100644 --- a/src/modules/system/controller/sys_profile.go +++ b/src/modules/system/controller/sys_profile.go @@ -1,19 +1,19 @@ package controller import ( - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/admin" - "nms_cxy/src/framework/constants/uploadsubpath" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/crypto" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/regular" - "nms_cxy/src/framework/utils/token" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/config" + "be.ems/src/framework/constants/admin" + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/regular" + "be.ems/src/framework/utils/token" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -157,6 +157,7 @@ func (s *SysProfileController) UpdateProfile(c *gin.Context) { PhoneNumber: body.PhoneNumber, Email: body.Email, Sex: body.Sex, + Remark: loginUser.User.Remark, } rows := s.sysUserService.UpdateUser(sysUser) if rows > 0 { @@ -229,9 +230,13 @@ func (s *SysProfileController) UpdatePwd(c *gin.Context) { // 修改新密码 sysUser := model.SysUser{ - UserID: userId, - UpdateBy: userName, - Password: body.NewPassword, + UserID: userId, + UpdateBy: userName, + Password: body.NewPassword, + Sex: user.Sex, + PhoneNumber: user.PhoneNumber, + Email: user.Email, + Remark: user.Remark, } rows := s.sysUserService.UpdateUser(sysUser) if rows > 0 { @@ -268,9 +273,13 @@ func (s *SysProfileController) Avatar(c *gin.Context) { // 更新头像地址 sysUser := model.SysUser{ - UserID: loginUser.UserID, - UpdateBy: loginUser.User.UserName, - Avatar: filePath, + UserID: loginUser.UserID, + UpdateBy: loginUser.User.UserName, + Avatar: filePath, + Sex: loginUser.User.Sex, + PhoneNumber: loginUser.User.PhoneNumber, + Email: loginUser.User.Email, + Remark: loginUser.User.Remark, } rows := s.sysUserService.UpdateUser(sysUser) if rows > 0 { diff --git a/src/modules/system/controller/sys_role.go b/src/modules/system/controller/sys_role.go index c2557ef..c291c3f 100644 --- a/src/modules/system/controller/sys_role.go +++ b/src/modules/system/controller/sys_role.go @@ -6,15 +6,15 @@ import ( "strings" "time" - "nms_cxy/src/framework/constants/admin" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/constants/admin" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -24,7 +24,7 @@ import ( var NewSysRole = &SysRoleController{ sysRoleService: service.NewSysRoleImpl, sysUserService: service.NewSysUserImpl, - sysDictDataService: service.NewSysDictDataImpl, + sysDictDataService: service.NewSysDictData, } // 角色信息 @@ -34,9 +34,8 @@ type SysRoleController struct { // 角色服务 sysRoleService service.ISysRole // 用户服务 - sysUserService service.ISysUser - // 字典数据服务 - sysDictDataService service.ISysDictData + sysUserService service.ISysUser + sysDictDataService *service.SysDictData // 字典数据服务 } // 角色列表 diff --git a/src/modules/system/controller/sys_user.go b/src/modules/system/controller/sys_user.go index facf615..34f6834 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -6,18 +6,18 @@ import ( "strings" "time" - "nms_cxy/src/framework/config" - "nms_cxy/src/framework/constants/admin" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/file" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/regular" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/config" + "be.ems/src/framework/constants/admin" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/regular" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -28,7 +28,7 @@ var NewSysUser = &SysUserController{ sysUserService: service.NewSysUserImpl, sysRoleService: service.NewSysRoleImpl, sysPostService: service.NewSysPostImpl, - sysDictDataService: service.NewSysDictDataImpl, + sysDictDataService: service.NewSysDictData, sysConfigService: service.NewSysConfigImpl, } @@ -41,9 +41,8 @@ type SysUserController struct { // 角色服务 sysRoleService service.ISysRole // 岗位服务 - sysPostService service.ISysPost - // 字典数据服务 - sysDictDataService service.ISysDictData + sysPostService service.ISysPost + sysDictDataService *service.SysDictData // 字典数据服务 // 参数配置服务 sysConfigService service.ISysConfig } @@ -412,9 +411,13 @@ func (s *SysUserController) ResetPwd(c *gin.Context) { userName := ctx.LoginUserToUserName(c) info := model.SysUser{ - UserID: body.UserID, - Password: body.Password, - UpdateBy: userName, + UserID: body.UserID, + Password: body.Password, + UpdateBy: userName, + Sex: user.Sex, + PhoneNumber: user.PhoneNumber, + Email: user.Email, + Remark: user.Remark, } rows := s.sysUserService.UpdateUser(info) if rows > 0 { @@ -455,9 +458,13 @@ func (s *SysUserController) Status(c *gin.Context) { userName := ctx.LoginUserToUserName(c) info := model.SysUser{ - UserID: body.UserID, - Status: body.Status, - UpdateBy: userName, + UserID: body.UserID, + Status: body.Status, + UpdateBy: userName, + Sex: user.Sex, + PhoneNumber: user.PhoneNumber, + Email: user.Email, + Remark: user.Remark, } rows := s.sysUserService.UpdateUser(info) if rows > 0 { diff --git a/src/modules/system/repository/sys_config.go b/src/modules/system/repository/sys_config.go index 046fa0c..9755fb0 100644 --- a/src/modules/system/repository/sys_config.go +++ b/src/modules/system/repository/sys_config.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysConfig 参数配置表 数据层接口 type ISysConfig interface { diff --git a/src/modules/system/repository/sys_config.impl.go b/src/modules/system/repository/sys_config.impl.go index 4f29f2f..4b32377 100644 --- a/src/modules/system/repository/sys_config.impl.go +++ b/src/modules/system/repository/sys_config.impl.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysConfigImpl 结构体 diff --git a/src/modules/system/repository/sys_dept.go b/src/modules/system/repository/sys_dept.go index efcd3e5..99b4aea 100644 --- a/src/modules/system/repository/sys_dept.go +++ b/src/modules/system/repository/sys_dept.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysDept 部门表 数据层接口 type ISysDept interface { diff --git a/src/modules/system/repository/sys_dept.impl.go b/src/modules/system/repository/sys_dept.impl.go index a155f3c..62ec2d2 100644 --- a/src/modules/system/repository/sys_dept.impl.go +++ b/src/modules/system/repository/sys_dept.impl.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysDeptImpl 结构体 diff --git a/src/modules/system/repository/sys_dict_data.go b/src/modules/system/repository/sys_dict_data.go index ac1220f..cfa8b5a 100644 --- a/src/modules/system/repository/sys_dict_data.go +++ b/src/modules/system/repository/sys_dict_data.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysDictData 字典类型数据表 数据层接口 type ISysDictData interface { diff --git a/src/modules/system/repository/sys_dict_data.impl.go b/src/modules/system/repository/sys_dict_data.impl.go index 1bb1528..5231a2a 100644 --- a/src/modules/system/repository/sys_dict_data.impl.go +++ b/src/modules/system/repository/sys_dict_data.impl.go @@ -5,15 +5,15 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysDictDataImpl 结构体 -var NewSysDictDataImpl = &SysDictDataImpl{ +var NewSysDictData = &SysDictDataImpl{ selectSql: `select dict_code, dict_sort, dict_label, dict_value, dict_type, tag_class, tag_type, status, create_by, create_time, remark from sys_dict_data`, diff --git a/src/modules/system/repository/sys_dict_type.go b/src/modules/system/repository/sys_dict_type.go index 8e23b47..d38d34d 100644 --- a/src/modules/system/repository/sys_dict_type.go +++ b/src/modules/system/repository/sys_dict_type.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysDictType 字典类型表 数据层接口 type ISysDictType interface { diff --git a/src/modules/system/repository/sys_dict_type.impl.go b/src/modules/system/repository/sys_dict_type.impl.go index 219ae97..db32136 100644 --- a/src/modules/system/repository/sys_dict_type.impl.go +++ b/src/modules/system/repository/sys_dict_type.impl.go @@ -5,15 +5,15 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysDictTypeImpl 结构体 -var NewSysDictTypeImpl = &SysDictTypeImpl{ +var NewSysDictType = &SysDictTypeImpl{ selectSql: `select dict_id, dict_name, dict_type, status, create_by, create_time, remark from sys_dict_type`, diff --git a/src/modules/system/repository/sys_log_login.go b/src/modules/system/repository/sys_log_login.go index 18ff3ef..8dfbc82 100644 --- a/src/modules/system/repository/sys_log_login.go +++ b/src/modules/system/repository/sys_log_login.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysLogLogin 系统登录日志表 数据层接口 type ISysLogLogin interface { diff --git a/src/modules/system/repository/sys_log_login.impl.go b/src/modules/system/repository/sys_log_login.impl.go index 3c20966..d32e17b 100644 --- a/src/modules/system/repository/sys_log_login.impl.go +++ b/src/modules/system/repository/sys_log_login.impl.go @@ -4,11 +4,11 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysLogLoginImpl 结构体 diff --git a/src/modules/system/repository/sys_log_operate.go b/src/modules/system/repository/sys_log_operate.go index 7595cb1..5f8cb01 100644 --- a/src/modules/system/repository/sys_log_operate.go +++ b/src/modules/system/repository/sys_log_operate.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysLogOperate 操作日志表 数据层接口 type ISysLogOperate interface { diff --git a/src/modules/system/repository/sys_log_operate.impl.go b/src/modules/system/repository/sys_log_operate.impl.go index 51adef2..b6a0869 100644 --- a/src/modules/system/repository/sys_log_operate.impl.go +++ b/src/modules/system/repository/sys_log_operate.impl.go @@ -4,11 +4,11 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysLogOperateImpl 结构体 diff --git a/src/modules/system/repository/sys_menu.go b/src/modules/system/repository/sys_menu.go index 75e7ac8..bf03077 100644 --- a/src/modules/system/repository/sys_menu.go +++ b/src/modules/system/repository/sys_menu.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysMenu 菜单表 数据层接口 type ISysMenu interface { diff --git a/src/modules/system/repository/sys_menu.impl.go b/src/modules/system/repository/sys_menu.impl.go index 62d0561..9407e65 100644 --- a/src/modules/system/repository/sys_menu.impl.go +++ b/src/modules/system/repository/sys_menu.impl.go @@ -5,12 +5,12 @@ import ( "strings" "time" - "nms_cxy/src/framework/constants/menu" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/constants/menu" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysMenuImpl 结构体 diff --git a/src/modules/system/repository/sys_post.go b/src/modules/system/repository/sys_post.go index 9a20b77..ba7b3f8 100644 --- a/src/modules/system/repository/sys_post.go +++ b/src/modules/system/repository/sys_post.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysPost 岗位表 数据层接口 type ISysPost interface { diff --git a/src/modules/system/repository/sys_post.impl.go b/src/modules/system/repository/sys_post.impl.go index 9377328..c200811 100644 --- a/src/modules/system/repository/sys_post.impl.go +++ b/src/modules/system/repository/sys_post.impl.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysPostImpl 结构体 diff --git a/src/modules/system/repository/sys_role.go b/src/modules/system/repository/sys_role.go index d78643c..85fd822 100644 --- a/src/modules/system/repository/sys_role.go +++ b/src/modules/system/repository/sys_role.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysRole 角色表 数据层接口 type ISysRole interface { diff --git a/src/modules/system/repository/sys_role.impl.go b/src/modules/system/repository/sys_role.impl.go index 4f9a732..8fe89fa 100644 --- a/src/modules/system/repository/sys_role.impl.go +++ b/src/modules/system/repository/sys_role.impl.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysRoleImpl 结构体 diff --git a/src/modules/system/repository/sys_role_dept.go b/src/modules/system/repository/sys_role_dept.go index b51f809..f46f00f 100644 --- a/src/modules/system/repository/sys_role_dept.go +++ b/src/modules/system/repository/sys_role_dept.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysRoleDept 角色与部门关联表 数据层接口 type ISysRoleDept interface { diff --git a/src/modules/system/repository/sys_role_dept.impl.go b/src/modules/system/repository/sys_role_dept.impl.go index 6d84614..0435912 100644 --- a/src/modules/system/repository/sys_role_dept.impl.go +++ b/src/modules/system/repository/sys_role_dept.impl.go @@ -4,10 +4,10 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysRoleDeptImpl 结构体 diff --git a/src/modules/system/repository/sys_role_menu.go b/src/modules/system/repository/sys_role_menu.go index 4642cef..486ba95 100644 --- a/src/modules/system/repository/sys_role_menu.go +++ b/src/modules/system/repository/sys_role_menu.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysRoleMenu 角色与菜单关联表 数据层接口 type ISysRoleMenu interface { diff --git a/src/modules/system/repository/sys_role_menu.impl.go b/src/modules/system/repository/sys_role_menu.impl.go index 8e01ac5..0570d86 100644 --- a/src/modules/system/repository/sys_role_menu.impl.go +++ b/src/modules/system/repository/sys_role_menu.impl.go @@ -4,11 +4,11 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysRoleMenuImpl 结构体 diff --git a/src/modules/system/repository/sys_user.go b/src/modules/system/repository/sys_user.go index 5542883..cb45da2 100644 --- a/src/modules/system/repository/sys_user.go +++ b/src/modules/system/repository/sys_user.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysUser 用户表 数据层接口 type ISysUser interface { diff --git a/src/modules/system/repository/sys_user.impl.go b/src/modules/system/repository/sys_user.impl.go index 707be56..b240304 100644 --- a/src/modules/system/repository/sys_user.impl.go +++ b/src/modules/system/repository/sys_user.impl.go @@ -5,12 +5,12 @@ import ( "strings" "time" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/crypto" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysUserImpl 结构体 @@ -513,7 +513,9 @@ func (r *SysUserImpl) UpdateUser(sysUser model.SysUser) int64 { func (r *SysUserImpl) DeleteUserByIds(userIds []string) int64 { placeholder := repo.KeyPlaceholderByQuery(len(userIds)) username := "CASE WHEN user_name = '' THEN user_name WHEN LENGTH(user_name) >= 36 THEN CONCAT('del_', SUBSTRING(user_name, 5, 36)) ELSE CONCAT('del_', user_name) END" - sql := fmt.Sprintf("update sys_user set del_flag = '1', user_name = %s where user_id in (%s)", username, placeholder) + email := "CASE WHEN email = '' THEN email WHEN LENGTH(email) >= 64 THEN CONCAT('del_', SUBSTRING(email, 5, 64)) ELSE CONCAT('del_', email) END" + phonenumber := "CASE WHEN phonenumber = '' THEN phonenumber WHEN LENGTH(phonenumber) >= 16 THEN CONCAT('del_', SUBSTRING(phonenumber, 5, 16)) ELSE CONCAT('del_', phonenumber) END" + sql := fmt.Sprintf("update sys_user set del_flag = '1', user_name = %s, email = %s, phonenumber = %s where user_id in (%s)", username, email, phonenumber, placeholder) parameters := repo.ConvertIdsSlice(userIds) results, err := datasource.ExecDB("", sql, parameters) if err != nil { diff --git a/src/modules/system/repository/sys_user_post.go b/src/modules/system/repository/sys_user_post.go index c358a17..2a13449 100644 --- a/src/modules/system/repository/sys_user_post.go +++ b/src/modules/system/repository/sys_user_post.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysUserPost 用户与岗位关联表 数据层接口 type ISysUserPost interface { diff --git a/src/modules/system/repository/sys_user_post.impl.go b/src/modules/system/repository/sys_user_post.impl.go index e613858..baa2393 100644 --- a/src/modules/system/repository/sys_user_post.impl.go +++ b/src/modules/system/repository/sys_user_post.impl.go @@ -4,11 +4,11 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysUserPostImpl 结构体 diff --git a/src/modules/system/repository/sys_user_role.go b/src/modules/system/repository/sys_user_role.go index 50e6573..392b88d 100644 --- a/src/modules/system/repository/sys_user_role.go +++ b/src/modules/system/repository/sys_user_role.go @@ -1,6 +1,6 @@ package repository -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysUserRole 用户与角色关联表 数据层接口 type ISysUserRole interface { diff --git a/src/modules/system/repository/sys_user_role.impl.go b/src/modules/system/repository/sys_user_role.impl.go index 18ff4d3..f472a1c 100644 --- a/src/modules/system/repository/sys_user_role.impl.go +++ b/src/modules/system/repository/sys_user_role.impl.go @@ -4,11 +4,11 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/datasource" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/repo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysUserRoleImpl 结构体 diff --git a/src/modules/system/service/sys_config.go b/src/modules/system/service/sys_config.go index 140d110..38c3108 100644 --- a/src/modules/system/service/sys_config.go +++ b/src/modules/system/service/sys_config.go @@ -1,6 +1,6 @@ package service -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysConfig 参数配置 服务层接口 type ISysConfig interface { diff --git a/src/modules/system/service/sys_config.impl.go b/src/modules/system/service/sys_config.impl.go index abf7b9a..d983102 100644 --- a/src/modules/system/service/sys_config.impl.go +++ b/src/modules/system/service/sys_config.impl.go @@ -3,10 +3,10 @@ package service import ( "fmt" - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/redis" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysConfigImpl 结构体 diff --git a/src/modules/system/service/sys_dept.go b/src/modules/system/service/sys_dept.go index d0f14e9..65b04c6 100644 --- a/src/modules/system/service/sys_dept.go +++ b/src/modules/system/service/sys_dept.go @@ -1,8 +1,8 @@ package service import ( - "nms_cxy/src/framework/vo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/vo" + "be.ems/src/modules/system/model" ) // ISysDept 部门管理 服务层接口 diff --git a/src/modules/system/service/sys_dept.impl.go b/src/modules/system/service/sys_dept.impl.go index a3b145f..7e266f3 100644 --- a/src/modules/system/service/sys_dept.impl.go +++ b/src/modules/system/service/sys_dept.impl.go @@ -3,10 +3,10 @@ package service import ( "strings" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/vo" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/vo" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysDeptImpl 结构体 diff --git a/src/modules/system/service/sys_dict_data.go b/src/modules/system/service/sys_dict_data.go index 57ee43f..d558107 100644 --- a/src/modules/system/service/sys_dict_data.go +++ b/src/modules/system/service/sys_dict_data.go @@ -1,33 +1,114 @@ package service -import "nms_cxy/src/modules/system/model" +import ( + "fmt" -// ISysDictData 字典类型数据 服务层接口 -type ISysDictData interface { - // SelectDictDataPage 根据条件分页查询字典数据 - SelectDictDataPage(query map[string]any) map[string]any + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectDictDataList 根据条件查询字典数据 - SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData - - // SelectDictDataByCode 根据字典数据编码查询信息 - SelectDictDataByCode(dictCode string) model.SysDictData - - // SelectDictDataByType 根据字典类型查询信息 - SelectDictDataByType(dictType string) []model.SysDictData - - // CheckUniqueDictLabel 校验字典标签是否唯一 - CheckUniqueDictLabel(dictType, dictLabel, dictCode string) bool - - // CheckUniqueDictValue 校验字典键值是否唯一 - CheckUniqueDictValue(dictType, dictValue, dictCode string) bool - - // DeleteDictDataByCodes 批量删除字典数据信息 - DeleteDictDataByCodes(dictCodes []string) (int64, error) - - // InsertDictData 新增字典数据信息 - InsertDictData(sysDictData model.SysDictData) string - - // UpdateDictData 修改字典数据信息 - UpdateDictData(sysDictData model.SysDictData) int64 +// 实例化服务层 SysDictData 结构体 +var NewSysDictData = &SysDictData{ + sysDictDataRepository: repository.NewSysDictData, + sysDictTypeService: NewSysDictType, +} + +// SysDictData 字典类型数据 服务层处理 +type SysDictData struct { + sysDictDataRepository repository.ISysDictData // 字典数据服务 + sysDictTypeService *SysDictType // 字典类型服务 +} + +// SelectDictDataPage 根据条件分页查询字典数据 +func (r *SysDictData) SelectDictDataPage(query map[string]any) map[string]any { + return r.sysDictDataRepository.SelectDictDataPage(query) +} + +// SelectDictDataList 根据条件查询字典数据 +func (r *SysDictData) SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData { + return r.sysDictDataRepository.SelectDictDataList(sysDictData) +} + +// SelectDictDataByCode 根据字典数据编码查询信息 +func (r *SysDictData) SelectDictDataByCode(dictCode string) model.SysDictData { + if dictCode == "" { + return model.SysDictData{} + } + dictCodes := r.sysDictDataRepository.SelectDictDataByCodes([]string{dictCode}) + if len(dictCodes) > 0 { + return dictCodes[0] + } + return model.SysDictData{} +} + +// SelectDictDataByType 根据字典类型查询信息 +func (r *SysDictData) SelectDictDataByType(dictType string) []model.SysDictData { + return r.sysDictTypeService.DictDataCache(dictType) +} + +// CheckUniqueDictLabel 校验字典标签是否唯一 +func (r *SysDictData) CheckUniqueDictLabel(dictType, dictLabel, dictCode string) bool { + uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ + DictType: dictType, + DictLabel: dictLabel, + }) + if uniqueId == dictCode { + return true + } + return uniqueId == "" +} + +// CheckUniqueDictValue 校验字典键值是否唯一 +func (r *SysDictData) CheckUniqueDictValue(dictType, dictValue, dictCode string) bool { + uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ + DictType: dictType, + DictValue: dictValue, + }) + if uniqueId == dictCode { + return true + } + return uniqueId == "" +} + +// DeleteDictDataByCodes 批量删除字典数据信息 +func (r *SysDictData) DeleteDictDataByCodes(dictCodes []string) (int64, error) { + // 检查是否存在 + dictDatas := r.sysDictDataRepository.SelectDictDataByCodes(dictCodes) + if len(dictDatas) <= 0 { + // 没有可访问字典编码数据! + return 0, fmt.Errorf("there is no accessible dictionary-encoded data") + } + if len(dictDatas) == len(dictCodes) { + for _, v := range dictDatas { + // 刷新缓存 + r.sysDictTypeService.ClearDictCache(v.DictType) + r.sysDictTypeService.LoadingDictCache(v.DictType) + } + rows := r.sysDictDataRepository.DeleteDictDataByCodes(dictCodes) + return rows, nil + } + // 删除字典数据信息失败! + return 0, fmt.Errorf("failed to delete dictionary data information") +} + +// InsertDictData 新增字典数据信息 +func (r *SysDictData) InsertDictData(sysDictData model.SysDictData) string { + insertId := r.sysDictDataRepository.InsertDictData(sysDictData) + if insertId != "" { + // 刷新缓存 + r.sysDictTypeService.ClearDictCache(sysDictData.DictType) + r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) + } + return insertId +} + +// UpdateDictData 修改字典数据信息 +func (r *SysDictData) UpdateDictData(sysDictData model.SysDictData) int64 { + rows := r.sysDictDataRepository.UpdateDictData(sysDictData) + if rows > 0 { + // 刷新缓存 + r.sysDictTypeService.ClearDictCache(sysDictData.DictType) + r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) + } + return rows } diff --git a/src/modules/system/service/sys_dict_data.impl.go b/src/modules/system/service/sys_dict_data.impl.go deleted file mode 100644 index 26c7b07..0000000 --- a/src/modules/system/service/sys_dict_data.impl.go +++ /dev/null @@ -1,116 +0,0 @@ -package service - -import ( - "fmt" - - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" -) - -// 实例化服务层 SysDictDataImpl 结构体 -var NewSysDictDataImpl = &SysDictDataImpl{ - sysDictDataRepository: repository.NewSysDictDataImpl, - sysDictTypeService: NewSysDictTypeImpl, -} - -// SysDictDataImpl 字典类型数据 服务层处理 -type SysDictDataImpl struct { - // 字典数据服务 - sysDictDataRepository repository.ISysDictData - // 字典类型服务 - sysDictTypeService ISysDictType -} - -// SelectDictDataPage 根据条件分页查询字典数据 -func (r *SysDictDataImpl) SelectDictDataPage(query map[string]any) map[string]any { - return r.sysDictDataRepository.SelectDictDataPage(query) -} - -// SelectDictDataList 根据条件查询字典数据 -func (r *SysDictDataImpl) SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData { - return r.sysDictDataRepository.SelectDictDataList(sysDictData) -} - -// SelectDictDataByCode 根据字典数据编码查询信息 -func (r *SysDictDataImpl) SelectDictDataByCode(dictCode string) model.SysDictData { - if dictCode == "" { - return model.SysDictData{} - } - dictCodes := r.sysDictDataRepository.SelectDictDataByCodes([]string{dictCode}) - if len(dictCodes) > 0 { - return dictCodes[0] - } - return model.SysDictData{} -} - -// SelectDictDataByType 根据字典类型查询信息 -func (r *SysDictDataImpl) SelectDictDataByType(dictType string) []model.SysDictData { - return r.sysDictTypeService.DictDataCache(dictType) -} - -// CheckUniqueDictLabel 校验字典标签是否唯一 -func (r *SysDictDataImpl) CheckUniqueDictLabel(dictType, dictLabel, dictCode string) bool { - uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ - DictType: dictType, - DictLabel: dictLabel, - }) - if uniqueId == dictCode { - return true - } - return uniqueId == "" -} - -// CheckUniqueDictValue 校验字典键值是否唯一 -func (r *SysDictDataImpl) CheckUniqueDictValue(dictType, dictValue, dictCode string) bool { - uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ - DictType: dictType, - DictValue: dictValue, - }) - if uniqueId == dictCode { - return true - } - return uniqueId == "" -} - -// DeleteDictDataByCodes 批量删除字典数据信息 -func (r *SysDictDataImpl) DeleteDictDataByCodes(dictCodes []string) (int64, error) { - // 检查是否存在 - dictDatas := r.sysDictDataRepository.SelectDictDataByCodes(dictCodes) - if len(dictDatas) <= 0 { - // 没有可访问字典编码数据! - return 0, fmt.Errorf("there is no accessible dictionary-encoded data") - } - if len(dictDatas) == len(dictCodes) { - for _, v := range dictDatas { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(v.DictType) - r.sysDictTypeService.LoadingDictCache(v.DictType) - } - rows := r.sysDictDataRepository.DeleteDictDataByCodes(dictCodes) - return rows, nil - } - // 删除字典数据信息失败! - return 0, fmt.Errorf("failed to delete dictionary data information") -} - -// InsertDictData 新增字典数据信息 -func (r *SysDictDataImpl) InsertDictData(sysDictData model.SysDictData) string { - insertId := r.sysDictDataRepository.InsertDictData(sysDictData) - if insertId != "" { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(sysDictData.DictType) - r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) - } - return insertId -} - -// UpdateDictData 修改字典数据信息 -func (r *SysDictDataImpl) UpdateDictData(sysDictData model.SysDictData) int64 { - rows := r.sysDictDataRepository.UpdateDictData(sysDictData) - if rows > 0 { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(sysDictData.DictType) - r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) - } - return rows -} diff --git a/src/modules/system/service/sys_dict_type.go b/src/modules/system/service/sys_dict_type.go index c28db8e..4008b32 100644 --- a/src/modules/system/service/sys_dict_type.go +++ b/src/modules/system/service/sys_dict_type.go @@ -1,45 +1,212 @@ package service -import "nms_cxy/src/modules/system/model" +import ( + "encoding/json" + "fmt" -// ISysDictType 字典类型 服务层接口 -type ISysDictType interface { - // SelectDictTypePage 根据条件分页查询字典类型 - SelectDictTypePage(query map[string]any) map[string]any + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/redis" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectDictTypeList 根据条件查询字典类型 - SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType - - // SelectDictTypeByID 根据字典类型ID查询信息 - SelectDictTypeByID(dictID string) model.SysDictType - - // SelectDictTypeByType 根据字典类型查询信息 - SelectDictTypeByType(dictType string) model.SysDictType - - // CheckUniqueDictName 校验字典名称是否唯一 - CheckUniqueDictName(dictName, dictID string) bool - - // CheckUniqueDictType 校验字典类型是否唯一 - CheckUniqueDictType(dictType, dictID string) bool - - // InsertDictType 新增字典类型信息 - InsertDictType(sysDictType model.SysDictType) string - - // UpdateDictType 修改字典类型信息 - UpdateDictType(sysDictType model.SysDictType) int64 - - // DeleteDictTypeByIDs 批量删除字典类型信息 - DeleteDictTypeByIDs(dictIDs []string) (int64, error) - - // ResetDictCache 重置字典缓存数据 - ResetDictCache() - - // 加载字典缓存数据 - LoadingDictCache(dictType string) - - // 清空字典缓存数据 - ClearDictCache(dictType string) bool - - // DictDataCache 获取字典数据缓存数据 - DictDataCache(dictType string) []model.SysDictData +// 实例化服务层 SysDictType 结构体 +var NewSysDictType = &SysDictType{ + sysDictTypeRepository: repository.NewSysDictType, + sysDictDataRepository: repository.NewSysDictData, +} + +// SysDictType 字典类型 服务层处理 +type SysDictType struct { + // 字典类型服务 + sysDictTypeRepository repository.ISysDictType + // 字典数据服务 + sysDictDataRepository repository.ISysDictData +} + +// SelectDictTypePage 根据条件分页查询字典类型 +func (r *SysDictType) SelectDictTypePage(query map[string]any) map[string]any { + return r.sysDictTypeRepository.SelectDictTypePage(query) +} + +// SelectDictTypeList 根据条件查询字典类型 +func (r *SysDictType) SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType { + return r.sysDictTypeRepository.SelectDictTypeList(sysDictType) +} + +// SelectDictTypeByID 根据字典类型ID查询信息 +func (r *SysDictType) SelectDictTypeByID(dictID string) model.SysDictType { + if dictID == "" { + return model.SysDictType{} + } + dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{dictID}) + if len(dictTypes) > 0 { + return dictTypes[0] + } + return model.SysDictType{} +} + +// SelectDictTypeByType 根据字典类型查询信息 +func (r *SysDictType) SelectDictTypeByType(dictType string) model.SysDictType { + return r.sysDictTypeRepository.SelectDictTypeByType(dictType) +} + +// CheckUniqueDictName 校验字典名称是否唯一 +func (r *SysDictType) CheckUniqueDictName(dictName, dictID string) bool { + uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ + DictName: dictName, + }) + if uniqueId == dictID { + return true + } + return uniqueId == "" +} + +// CheckUniqueDictType 校验字典类型是否唯一 +func (r *SysDictType) CheckUniqueDictType(dictType, dictID string) bool { + uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ + DictType: dictType, + }) + if uniqueId == dictID { + return true + } + return uniqueId == "" +} + +// InsertDictType 新增字典类型信息 +func (r *SysDictType) InsertDictType(sysDictType model.SysDictType) string { + insertId := r.sysDictTypeRepository.InsertDictType(sysDictType) + if insertId != "" { + r.LoadingDictCache(sysDictType.DictType) + } + return insertId +} + +// UpdateDictType 修改字典类型信息 +func (r *SysDictType) UpdateDictType(sysDictType model.SysDictType) int64 { + data := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{sysDictType.DictID}) + if len(data) == 0 { + return 0 + } + // 修改字典类型key时同步更新其字典数据的类型key + oldDictType := data[0].DictType + rows := r.sysDictTypeRepository.UpdateDictType(sysDictType) + if rows > 0 && oldDictType != "" && oldDictType != sysDictType.DictType { + r.sysDictDataRepository.UpdateDictDataType(oldDictType, sysDictType.DictType) + } + // 刷新缓存 + r.ClearDictCache(oldDictType) + r.LoadingDictCache(sysDictType.DictType) + return rows +} + +// DeleteDictTypeByIDs 批量删除字典类型信息 +func (r *SysDictType) DeleteDictTypeByIDs(dictIDs []string) (int64, error) { + // 检查是否存在 + dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs(dictIDs) + if len(dictTypes) <= 0 { + // 没有可访问字典类型数据! + return 0, fmt.Errorf("there is no accessible dictionary type data") + } + for _, v := range dictTypes { + // 字典类型下级含有数据 + useCount := r.sysDictDataRepository.CountDictDataByType(v.DictType) + if useCount > 0 { + // 【%s】存在字典数据,不能删除 + return 0, fmt.Errorf("[%s] dictionary data exists and cannot be deleted", v.DictName) + } + // 清除缓存 + r.ClearDictCache(v.DictType) + } + if len(dictTypes) == len(dictIDs) { + rows := r.sysDictTypeRepository.DeleteDictTypeByIDs(dictIDs) + return rows, nil + } + // 删除字典数据信息失败! + return 0, fmt.Errorf("failed to delete dictionary data information") +} + +// ResetDictCache 重置字典缓存数据 +func (r *SysDictType) ResetDictCache() { + r.ClearDictCache("*") + r.LoadingDictCache("") +} + +// getCacheKey 组装缓存key +func (r *SysDictType) getDictCache(dictType string) string { + return cachekey.SYS_DICT_KEY + dictType +} + +// LoadingDictCache 加载字典缓存数据 +func (r *SysDictType) LoadingDictCache(dictType string) { + sysDictData := model.SysDictData{ + Status: common.STATUS_YES, + } + + // 指定字典类型 + if dictType != "" { + sysDictData.DictType = dictType + // 删除缓存 + key := r.getDictCache(dictType) + redis.Del("", key) + } + + sysDictDataList := r.sysDictDataRepository.SelectDictDataList(sysDictData) + if len(sysDictDataList) == 0 { + return + } + + // 将字典数据按类型分组 + m := make(map[string][]model.SysDictData, 0) + for _, v := range sysDictDataList { + key := v.DictType + if item, ok := m[key]; ok { + m[key] = append(item, v) + } else { + m[key] = []model.SysDictData{v} + } + } + + // 放入缓存 + for k, v := range m { + key := r.getDictCache(k) + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + } +} + +// ClearDictCache 清空字典缓存数据 +func (r *SysDictType) ClearDictCache(dictType string) bool { + key := r.getDictCache(dictType) + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// DictDataCache 获取字典数据缓存数据 +func (r *SysDictType) DictDataCache(dictType string) []model.SysDictData { + data := []model.SysDictData{} + key := r.getDictCache(dictType) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &data) + if err != nil { + data = []model.SysDictData{} + } + } else { + data = r.sysDictDataRepository.SelectDictDataList(model.SysDictData{ + Status: common.STATUS_YES, + DictType: dictType, + }) + if len(data) > 0 { + redis.Del("", key) + values, _ := json.Marshal(data) + redis.Set("", key, string(values)) + } + } + return data } diff --git a/src/modules/system/service/sys_dict_type.impl.go b/src/modules/system/service/sys_dict_type.impl.go deleted file mode 100644 index d800aa1..0000000 --- a/src/modules/system/service/sys_dict_type.impl.go +++ /dev/null @@ -1,212 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - - "nms_cxy/src/framework/constants/cachekey" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/redis" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" -) - -// 实例化服务层 SysDictTypeImpl 结构体 -var NewSysDictTypeImpl = &SysDictTypeImpl{ - sysDictTypeRepository: repository.NewSysDictTypeImpl, - sysDictDataRepository: repository.NewSysDictDataImpl, -} - -// SysDictTypeImpl 字典类型 服务层处理 -type SysDictTypeImpl struct { - // 字典类型服务 - sysDictTypeRepository repository.ISysDictType - // 字典数据服务 - sysDictDataRepository repository.ISysDictData -} - -// SelectDictTypePage 根据条件分页查询字典类型 -func (r *SysDictTypeImpl) SelectDictTypePage(query map[string]any) map[string]any { - return r.sysDictTypeRepository.SelectDictTypePage(query) -} - -// SelectDictTypeList 根据条件查询字典类型 -func (r *SysDictTypeImpl) SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType { - return r.sysDictTypeRepository.SelectDictTypeList(sysDictType) -} - -// SelectDictTypeByID 根据字典类型ID查询信息 -func (r *SysDictTypeImpl) SelectDictTypeByID(dictID string) model.SysDictType { - if dictID == "" { - return model.SysDictType{} - } - dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{dictID}) - if len(dictTypes) > 0 { - return dictTypes[0] - } - return model.SysDictType{} -} - -// SelectDictTypeByType 根据字典类型查询信息 -func (r *SysDictTypeImpl) SelectDictTypeByType(dictType string) model.SysDictType { - return r.sysDictTypeRepository.SelectDictTypeByType(dictType) -} - -// CheckUniqueDictName 校验字典名称是否唯一 -func (r *SysDictTypeImpl) CheckUniqueDictName(dictName, dictID string) bool { - uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ - DictName: dictName, - }) - if uniqueId == dictID { - return true - } - return uniqueId == "" -} - -// CheckUniqueDictType 校验字典类型是否唯一 -func (r *SysDictTypeImpl) CheckUniqueDictType(dictType, dictID string) bool { - uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ - DictType: dictType, - }) - if uniqueId == dictID { - return true - } - return uniqueId == "" -} - -// InsertDictType 新增字典类型信息 -func (r *SysDictTypeImpl) InsertDictType(sysDictType model.SysDictType) string { - insertId := r.sysDictTypeRepository.InsertDictType(sysDictType) - if insertId != "" { - r.LoadingDictCache(sysDictType.DictType) - } - return insertId -} - -// UpdateDictType 修改字典类型信息 -func (r *SysDictTypeImpl) UpdateDictType(sysDictType model.SysDictType) int64 { - data := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{sysDictType.DictID}) - if len(data) == 0 { - return 0 - } - // 修改字典类型key时同步更新其字典数据的类型key - oldDictType := data[0].DictType - rows := r.sysDictTypeRepository.UpdateDictType(sysDictType) - if rows > 0 && oldDictType != "" && oldDictType != sysDictType.DictType { - r.sysDictDataRepository.UpdateDictDataType(oldDictType, sysDictType.DictType) - } - // 刷新缓存 - r.ClearDictCache(oldDictType) - r.LoadingDictCache(sysDictType.DictType) - return rows -} - -// DeleteDictTypeByIDs 批量删除字典类型信息 -func (r *SysDictTypeImpl) DeleteDictTypeByIDs(dictIDs []string) (int64, error) { - // 检查是否存在 - dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs(dictIDs) - if len(dictTypes) <= 0 { - // 没有可访问字典类型数据! - return 0, fmt.Errorf("there is no accessible dictionary type data") - } - for _, v := range dictTypes { - // 字典类型下级含有数据 - useCount := r.sysDictDataRepository.CountDictDataByType(v.DictType) - if useCount > 0 { - // 【%s】存在字典数据,不能删除 - return 0, fmt.Errorf("[%s] dictionary data exists and cannot be deleted", v.DictName) - } - // 清除缓存 - r.ClearDictCache(v.DictType) - } - if len(dictTypes) == len(dictIDs) { - rows := r.sysDictTypeRepository.DeleteDictTypeByIDs(dictIDs) - return rows, nil - } - // 删除字典数据信息失败! - return 0, fmt.Errorf("failed to delete dictionary data information") -} - -// ResetDictCache 重置字典缓存数据 -func (r *SysDictTypeImpl) ResetDictCache() { - r.ClearDictCache("*") - r.LoadingDictCache("") -} - -// getCacheKey 组装缓存key -func (r *SysDictTypeImpl) getDictCache(dictType string) string { - return cachekey.SYS_DICT_KEY + dictType -} - -// LoadingDictCache 加载字典缓存数据 -func (r *SysDictTypeImpl) LoadingDictCache(dictType string) { - sysDictData := model.SysDictData{ - Status: common.STATUS_YES, - } - - // 指定字典类型 - if dictType != "" { - sysDictData.DictType = dictType - // 删除缓存 - key := r.getDictCache(dictType) - redis.Del("", key) - } - - sysDictDataList := r.sysDictDataRepository.SelectDictDataList(sysDictData) - if len(sysDictDataList) == 0 { - return - } - - // 将字典数据按类型分组 - m := make(map[string][]model.SysDictData, 0) - for _, v := range sysDictDataList { - key := v.DictType - if item, ok := m[key]; ok { - m[key] = append(item, v) - } else { - m[key] = []model.SysDictData{v} - } - } - - // 放入缓存 - for k, v := range m { - key := r.getDictCache(k) - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - } -} - -// ClearDictCache 清空字典缓存数据 -func (r *SysDictTypeImpl) ClearDictCache(dictType string) bool { - key := r.getDictCache(dictType) - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// DictDataCache 获取字典数据缓存数据 -func (r *SysDictTypeImpl) DictDataCache(dictType string) []model.SysDictData { - data := []model.SysDictData{} - key := r.getDictCache(dictType) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &data) - if err != nil { - data = []model.SysDictData{} - } - } else { - data = r.sysDictDataRepository.SelectDictDataList(model.SysDictData{ - Status: common.STATUS_YES, - DictType: dictType, - }) - if len(data) > 0 { - redis.Del("", key) - values, _ := json.Marshal(data) - redis.Set("", key, string(values)) - } - } - return data -} diff --git a/src/modules/system/service/sys_log_login.go b/src/modules/system/service/sys_log_login.go index 80b329c..9b62ac3 100644 --- a/src/modules/system/service/sys_log_login.go +++ b/src/modules/system/service/sys_log_login.go @@ -1,6 +1,6 @@ package service -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysLogLogin 系统登录日志 服务层接口 type ISysLogLogin interface { diff --git a/src/modules/system/service/sys_log_login.impl.go b/src/modules/system/service/sys_log_login.impl.go index 66fa240..226b0da 100644 --- a/src/modules/system/service/sys_log_login.impl.go +++ b/src/modules/system/service/sys_log_login.impl.go @@ -1,8 +1,8 @@ package service import ( - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysLogLoginImpl 结构体 diff --git a/src/modules/system/service/sys_log_operate.go b/src/modules/system/service/sys_log_operate.go index ae5bb96..d0857b6 100644 --- a/src/modules/system/service/sys_log_operate.go +++ b/src/modules/system/service/sys_log_operate.go @@ -1,6 +1,6 @@ package service -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysLogOperate 操作日志表 服务层接口 type ISysLogOperate interface { diff --git a/src/modules/system/service/sys_log_operate.impl.go b/src/modules/system/service/sys_log_operate.impl.go index ff584cc..c6edb18 100644 --- a/src/modules/system/service/sys_log_operate.impl.go +++ b/src/modules/system/service/sys_log_operate.impl.go @@ -1,8 +1,8 @@ package service import ( - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysLogOperateImpl 结构体 diff --git a/src/modules/system/service/sys_menu.go b/src/modules/system/service/sys_menu.go index b14cbfc..02381e5 100644 --- a/src/modules/system/service/sys_menu.go +++ b/src/modules/system/service/sys_menu.go @@ -1,8 +1,8 @@ package service import ( - "nms_cxy/src/framework/vo" - "nms_cxy/src/modules/system/model" + "be.ems/src/framework/vo" + "be.ems/src/modules/system/model" ) // ISysMenu 菜单 服务层接口 diff --git a/src/modules/system/service/sys_menu.impl.go b/src/modules/system/service/sys_menu.impl.go index af63955..3bb338b 100644 --- a/src/modules/system/service/sys_menu.impl.go +++ b/src/modules/system/service/sys_menu.impl.go @@ -4,13 +4,13 @@ import ( "encoding/base64" "strings" - "nms_cxy/src/framework/constants/common" - "nms_cxy/src/framework/constants/menu" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/regular" - "nms_cxy/src/framework/vo" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/constants/menu" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/regular" + "be.ems/src/framework/vo" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysMenuImpl 结构体 diff --git a/src/modules/system/service/sys_post.go b/src/modules/system/service/sys_post.go index 7af7014..4911e96 100644 --- a/src/modules/system/service/sys_post.go +++ b/src/modules/system/service/sys_post.go @@ -1,6 +1,6 @@ package service -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysPost 岗位信息 服务层接口 type ISysPost interface { diff --git a/src/modules/system/service/sys_post.impl.go b/src/modules/system/service/sys_post.impl.go index 270b6ed..3fbc9de 100644 --- a/src/modules/system/service/sys_post.impl.go +++ b/src/modules/system/service/sys_post.impl.go @@ -3,8 +3,8 @@ package service import ( "fmt" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysPostImpl 结构体 diff --git a/src/modules/system/service/sys_role.go b/src/modules/system/service/sys_role.go index 0217255..6bdca71 100644 --- a/src/modules/system/service/sys_role.go +++ b/src/modules/system/service/sys_role.go @@ -1,6 +1,6 @@ package service -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysRole 角色 服务层接口 type ISysRole interface { diff --git a/src/modules/system/service/sys_role.impl.go b/src/modules/system/service/sys_role.impl.go index b968ffb..708b4ff 100644 --- a/src/modules/system/service/sys_role.impl.go +++ b/src/modules/system/service/sys_role.impl.go @@ -3,8 +3,8 @@ package service import ( "fmt" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysRoleImpl 结构体 diff --git a/src/modules/system/service/sys_user.go b/src/modules/system/service/sys_user.go index 5d5d378..7c149ea 100644 --- a/src/modules/system/service/sys_user.go +++ b/src/modules/system/service/sys_user.go @@ -1,6 +1,6 @@ package service -import "nms_cxy/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysUser 用户 服务层接口 type ISysUser interface { diff --git a/src/modules/system/service/sys_user.impl.go b/src/modules/system/service/sys_user.impl.go index c8e63ac..8f1baf2 100644 --- a/src/modules/system/service/sys_user.impl.go +++ b/src/modules/system/service/sys_user.impl.go @@ -3,9 +3,9 @@ package service import ( "fmt" - "nms_cxy/src/framework/constants/admin" - "nms_cxy/src/modules/system/model" - "nms_cxy/src/modules/system/repository" + "be.ems/src/framework/constants/admin" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysUserImpl 结构体 diff --git a/src/modules/system/system.go b/src/modules/system/system.go index 5bfd205..1331f83 100644 --- a/src/modules/system/system.go +++ b/src/modules/system/system.go @@ -1,12 +1,12 @@ package system import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/framework/middleware/collectlogs" - "nms_cxy/src/framework/middleware/repeat" - "nms_cxy/src/modules/system/controller" - "nms_cxy/src/modules/system/service" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/framework/middleware/repeat" + "be.ems/src/modules/system/controller" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) @@ -439,5 +439,5 @@ func InitLoad() { // 启动时,刷新缓存-参数配置 service.NewSysConfigImpl.ResetConfigCache() // 启动时,刷新缓存-字典类型数据 - service.NewSysDictTypeImpl.ResetDictCache() + service.NewSysDictType.ResetDictCache() } diff --git a/src/modules/tool/controller/iperf.go b/src/modules/tool/controller/iperf.go new file mode 100644 index 0000000..c684974 --- /dev/null +++ b/src/modules/tool/controller/iperf.go @@ -0,0 +1,154 @@ +package controller + +import ( + "encoding/json" + "fmt" + "strings" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/tool/service" + wsService "be.ems/src/modules/ws/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 IPerfController 结构体 +var NewIPerf = &IPerfController{ + iperfService: service.NewIPerf, + wsService: wsService.NewWS, +} + +// iperf 网络性能测试工具 https://iperf.fr/iperf-download.php +// +// PATH /tool/iperf +type IPerfController struct { + iperfService *service.IPerf // IPerf3 网络性能测试工具服务 + wsService *wsService.WS // WebSocket 服务 +} + +// iperf 版本信息 +// +// GET /v +func (s *IPerfController) Version(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeId string `form:"neId" binding:"required"` // 网元ID + Version string `form:"version" binding:"required,oneof=V2 V3"` // 版本 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + output, err := s.iperfService.Version(query.NeType, query.NeId, query.Version) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + data := strings.Split(output, "\n") + c.JSON(200, result.OkData(data)) +} + +// iperf 软件安装 +// +// POST /i +func (s *IPerfController) Install(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + NeType string `json:"neType" binding:"required"` // 网元类型 + NeId string `json:"neId" binding:"required"` // 网元ID + Version string `form:"version" binding:"required,oneof=V2 V3"` // 版本 + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + if err := s.iperfService.Install(body.NeType, body.NeId, body.Version); err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.Ok(nil)) +} + +// iperf 软件运行 +// +// GET /run +func (s *IPerfController) Run(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeId string `form:"neId" binding:"required"` // 网元标识id + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // ssh连接会话 + clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) + if err != nil { + c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.iperfService.Run) + + // 等待1秒,排空首次消息 + time.Sleep(1 * time.Second) + _ = clientSession.Read() + + // 实时读取Run消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("iperf3_%d", ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/tool/controller/ping.go b/src/modules/tool/controller/ping.go new file mode 100644 index 0000000..aa70e03 --- /dev/null +++ b/src/modules/tool/controller/ping.go @@ -0,0 +1,180 @@ +package controller + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/tool/model" + "be.ems/src/modules/tool/service" + wsService "be.ems/src/modules/ws/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 PingController 结构体 +var NewPing = &PingController{ + pingService: service.NewPing, + wsService: wsService.NewWS, +} + +// ping ICMP网络探测工具 https://github.com/prometheus-community/pro-bing +// +// PATH /tool/ping +type PingController struct { + pingService *service.Ping // ping ICMP网络探测工具 + wsService *wsService.WS // WebSocket 服务 +} + +// ping 基本信息运行 +// +// POST / +func (s *PingController) Statistics(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.Ping + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + info, err := s.pingService.Statistics(body) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.OkData(info)) +} + +// ping 传统UNIX运行 +// +// GET / +func (s *PingController) StatisticsOn(c *gin.Context) { + language := ctx.AcceptLanguage(c) + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, nil) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.pingService.StatisticsOn) + + // 等待停止信号 + for value := range wsClient.StopChan { + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) + return + } +} + +// ping 网元端版本信息 +// +// GET /v +func (s *PingController) Version(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeID string `form:"neId" binding:"required"` // 网元ID + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + output, err := s.pingService.Version(query.NeType, query.NeID) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.OkData(output)) +} + +// ping 网元端UNIX运行 +// +// GET /run +func (s *PingController) Run(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeId string `form:"neId" binding:"required"` // 网元标识id + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // ssh连接会话 + clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) + if err != nil { + c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.pingService.Run) + + // 等待1秒,排空首次消息 + time.Sleep(1 * time.Second) + _ = clientSession.Read() + + // 实时读取Run消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("ping_%d", ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/tool/model/ping.go b/src/modules/tool/model/ping.go new file mode 100644 index 0000000..9a00b1f --- /dev/null +++ b/src/modules/tool/model/ping.go @@ -0,0 +1,62 @@ +package model + +import ( + "runtime" + "time" + + probing "github.com/prometheus-community/pro-bing" +) + +// Ping 探针发包参数 +type Ping struct { + DesAddr string `json:"desAddr" binding:"required"` // 目的 IP 地址(字符串类型,必填) + SrcAddr string `json:"srcAddr"` // 源 IP 地址(字符串类型,可选) + Interval int `json:"interval"` // 发包间隔(整数类型,可选,单位:秒,取值范围:1-60,默认值:1) + TTL int `json:"ttl"` // TTL(整数类型,可选,取值范围:1-255,默认值:255) + Count int `json:"count"` // 发包数(整数类型,可选,取值范围:1-65535,默认值:5) + Size int `json:"size"` // 报文大小(整数类型,可选,取值范围:36-8192,默认值:36) + Timeout int `json:"timeout"` // 报文超时时间(整数类型,可选,单位:秒,取值范围:1-60,默认值:2) +} + +// setDefaultValue 设置默认值 +func (p *Ping) setDefaultValue() { + if p.Interval < 1 || p.Interval > 10 { + p.Interval = 1 + } + if p.TTL < 1 || p.TTL > 255 { + p.TTL = 255 + } + if p.Count < 1 || p.Count > 65535 { + p.Count = 5 + } + if p.Size < 36 || p.Size > 8192 { + p.Size = 36 + } + if p.Timeout < 1 || p.Timeout > 60 { + p.Timeout = 2 + } +} + +// NewPinger ping对象 +func (p *Ping) NewPinger() (*probing.Pinger, error) { + p.setDefaultValue() + + pinger, err := probing.NewPinger(p.DesAddr) + if err != nil { + return nil, err + } + if p.SrcAddr != "" { + pinger.Source = p.SrcAddr + } + pinger.Interval = time.Duration(p.Interval) * time.Second + pinger.TTL = p.TTL + pinger.Count = p.Count + pinger.Size = p.Size + pinger.Timeout = time.Duration(p.Timeout) * time.Second + + // 设置特权模式(需要管理员权限) + if runtime.GOOS == "windows" { + pinger.SetPrivileged(true) + } + return pinger, nil +} diff --git a/src/modules/tool/service/iperf.go b/src/modules/tool/service/iperf.go new file mode 100644 index 0000000..bdb3b7e --- /dev/null +++ b/src/modules/tool/service/iperf.go @@ -0,0 +1,289 @@ +package service + +import ( + "encoding/json" + "fmt" + "io" + "strings" + "time" + + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + wsModel "be.ems/src/modules/ws/model" +) + +// 实例化服务层 IPerf 结构体 +var NewIPerf = &IPerf{} + +// IPerf 网络性能测试工具 服务层处理 +type IPerf struct{} + +// Version 查询版本信息 +func (s *IPerf) Version(meType, neId, version string) (string, error) { + if version != "V2" && version != "V3" { + return "", fmt.Errorf("iperf version is required V2 or V3") + } + cmd := "iperf3 --version" + if version == "V2" { + cmd = "iperf -v" + } + + // 网元主机的SSH客户端 + sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) + if err != nil { + return "", err + } + defer sshClient.Close() + + // 检查是否安装iperf + output, err := sshClient.RunCMD(cmd) + if err != nil { + if version == "V2" && strings.HasSuffix(err.Error(), "status 1") { // V2 版本 + return strings.TrimSpace(output), nil + } + return "", fmt.Errorf("iperf %s not installed", version) + } + return strings.TrimSpace(output), err +} + +// Install 安装iperf3 +func (s *IPerf) Install(meType, neId, version string) error { + if version != "V2" && version != "V3" { + return fmt.Errorf("iperf version is required V2 or V3") + } + + // 网元主机的SSH客户端 + sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + nePath := "/tmp" + depPkg := "sudo dpkg -i" + depDir := "assets/dependency/iperf3/deb" + + // 检查平台类型 + if _, err := sshClient.RunCMD("sudo dpkg --version"); err == nil { + depPkg = "sudo dpkg -i" + depDir = "assets/dependency/iperf3/deb" + // sudo apt remove iperf3 libiperf0 libsctp1 libsctp-dev lksctp-tools + } else if _, err := sshClient.RunCMD("sudo yum --version"); err == nil { + depPkg = "sudo rpm -Uvh --nosignature --reinstall --force" + depDir = "assets/dependency/iperf3/rpm" + // yum remove iperf3 iperf3-help.noarch + } else { + return fmt.Errorf("iperf %s not supported install", version) + } + + // V2版本和V3版本的安装包路径不同 + if version == "V2" { + depDir = strings.Replace(depDir, "iperf3", "iperf", 1) + } + + // 从 embed.FS 中读取默认配置文件内容 + assetsDir := config.GetAssetsDirFS() + fsDirEntrys, err := assetsDir.ReadDir(depDir) + if err != nil { + return err + } + neFilePaths := []string{} + for _, d := range fsDirEntrys { + // 打开本地文件 + localFile, err := assetsDir.Open(fmt.Sprintf("%s/%s", depDir, d.Name())) + if err != nil { + return fmt.Errorf("iperf %s file local error", version) + } + defer localFile.Close() + // 创建远程文件 + remotePath := fmt.Sprintf("%s/%s", nePath, d.Name()) + remoteFile, err := sftpClient.Client.Create(remotePath) + if err != nil { + return fmt.Errorf("iperf %s file remote error", version) + } + defer remoteFile.Close() + // 使用 io.Copy 将嵌入的文件内容复制到目标文件 + if _, err := io.Copy(remoteFile, localFile); err != nil { + return fmt.Errorf("iperf %s file copy error", version) + } + neFilePaths = append(neFilePaths, remotePath) + } + + // 删除软件包 + defer func() { + pkgRemove := fmt.Sprintf("sudo rm %s", strings.Join(neFilePaths, " ")) + sshClient.RunCMD(pkgRemove) + }() + + // 安装软件包 + pkgInstall := fmt.Sprintf("%s %s", depPkg, strings.Join(neFilePaths, " ")) + if _, err := sshClient.RunCMD(pkgInstall); err != nil { + return fmt.Errorf("iperf %s install error", version) + } + return err +} + +// Run 接收IPerf3终端交互业务处理 +func (s *IPerf) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws IPerf Run UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + // 主动关闭 + resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + client.MsgChan <- resultByte + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + return + case "iperf": + // SSH会话消息接收写入会话 + var command string + command, err = s.parseOptions(reqMsg.Data) + if command != "" && err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write(command) + } + case "ctrl-c": + // 模拟按下 Ctrl+C + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write("\u0003\n") + case "resize": + // 会话窗口重置 + msgByte, _ := json.Marshal(reqMsg.Data) + var data struct { + Cols int `json:"cols"` + Rows int `json:"rows"` + } + err = json.Unmarshal(msgByte, &data) + if err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + err = sshClientSession.Session.WindowChange(data.Rows, data.Cols) + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws IPerf Run UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// parseOptions 解析拼装iperf3命令 iperf [-s|-c host] [options] +func (s *IPerf) parseOptions(reqData any) (string, error) { + msgByte, _ := json.Marshal(reqData) + var data struct { + Command string `json:"command"` // 命令字符串 + Version string `json:"version"` // 服务版本,默认V3 + Mode string `json:"mode"` // 服务端或客户端,默认客户端client + Host string `json:"host"` // 客户端连接到的服务端IP地址 + // Server or Client + Port int `json:"port"` // 服务端口 + Interval int `json:"interval"` // 每次报告之间的时间间隔,单位为秒 + // Server + OneOff bool `json:"oneOff"` // 只进行一次连接 + // Client + UDP bool `json:"udp"` // use UDP rather than TCP + Time int `json:"time"` // 以秒为单位的传输时间(默认为 10 秒) + Reverse bool `json:"reverse"` // 以反向模式运行(服务器发送,客户端接收) + Window string `json:"window"` // 设置窗口大小/套接字缓冲区大小 + Parallel int `json:"parallel"` // 运行的并行客户端流数量 + Bitrate int `json:"bitrate"` // 以比特/秒为单位(0 表示无限制) + } + if err := json.Unmarshal(msgByte, &data); err != nil { + logger.Warnf("ws processor parseClient err: %s", err.Error()) + return "", fmt.Errorf("query data structure error") + } + if data.Version != "V3" && data.Version != "V2" { + return "", fmt.Errorf("query data version support V3 or V2") + } + + command := []string{"iperf3"} + if data.Version == "V2" { + command = []string{"iperf"} + } + // 命令字符串高优先级 + if data.Command != "" { + command = append(command, data.Command) + command = append(command, "\n") + return strings.Join(command, " "), nil + } + + if data.Mode != "client" && data.Mode != "server" { + return "", fmt.Errorf("query data mode support client or server") + } + if data.Mode == "client" && data.Host == "" { + return "", fmt.Errorf("query data client host empty") + } + + if data.Mode == "client" { + command = append(command, "-c") + command = append(command, data.Host) + // Client + if data.UDP { + command = append(command, "-u") + } + if data.Time > 0 { + command = append(command, fmt.Sprintf("-t %d", data.Time)) + } + if data.Bitrate > 0 { + command = append(command, fmt.Sprintf("-b %d", data.Bitrate)) + } + if data.Parallel > 0 { + command = append(command, fmt.Sprintf("-P %d", data.Parallel)) + } + if data.Reverse { + command = append(command, "-R") + } + if data.Window != "" { + command = append(command, fmt.Sprintf("-w %s", data.Window)) + } + } + if data.Mode == "server" { + command = append(command, "-s") + // Server + if data.OneOff { + command = append(command, "-1") + } + } + + // Server or Client + if data.Port > 0 { + command = append(command, fmt.Sprintf("-p %d", data.Port)) + } + if data.Interval > 0 { + command = append(command, fmt.Sprintf("-i %d", data.Interval)) + } + command = append(command, "\n") + return strings.Join(command, " "), nil +} diff --git a/src/modules/tool/service/ping.go b/src/modules/tool/service/ping.go new file mode 100644 index 0000000..79f51a2 --- /dev/null +++ b/src/modules/tool/service/ping.go @@ -0,0 +1,261 @@ +package service + +import ( + "encoding/json" + "fmt" + "io" + "strings" + "time" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/tool/model" + wsModel "be.ems/src/modules/ws/model" + probing "github.com/prometheus-community/pro-bing" +) + +// 实例化服务层 Ping 结构体 +var NewPing = &Ping{} + +// Ping 网络性能测试工具 服务层处理 +type Ping struct{} + +// Statistics ping基本信息 +func (s *Ping) Statistics(ping model.Ping) (map[string]any, error) { + pinger, err := ping.NewPinger() + if err != nil { + return nil, err + } + if err = pinger.Run(); err != nil { + return nil, err + } + defer pinger.Stop() + stats := pinger.Statistics() + return map[string]any{ + "minTime": stats.MinRtt.Microseconds(), // 最小时延(整数类型,可选,单位:微秒) + "maxTime": stats.MaxRtt.Microseconds(), // 最大时延(整数类型,可选,单位:微秒) + "avgTime": stats.AvgRtt.Microseconds(), // 平均时延(整数类型,可选,单位:微秒) + "lossRate": int64(stats.PacketLoss), // 丢包率(整数类型,可选,单位:%) + "jitter": stats.StdDevRtt.Microseconds(), // 时延抖动(整数类型,可选,单位:微秒) + }, nil +} + +// StatisticsOn ping模拟传统UNIX +func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws Commont UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + // 主动关闭 + resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + client.MsgChan <- resultByte + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + return + case "ping": + msgByte, _ := json.Marshal(reqMsg.Data) + var ping model.Ping + if errj := json.Unmarshal(msgByte, &ping); errj != nil { + err = fmt.Errorf("query data structure error") + } + var pinger *probing.Pinger + pinger, errp := ping.NewPinger() + if errp != nil { + logger.Warnf("ws pinger new err: %s", errp.Error()) + err = fmt.Errorf("pinger error") + } + defer pinger.Stop() + + // 接收的数据包 + pinger.OnRecv = func(pkt *probing.Packet) { + resultByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": fmt.Sprintf("%d bytes from %s: icmp_seq=%d time=%v\\r\\n", pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt), + })) + client.MsgChan <- resultByte + } + // 已接收过的数据包 + pinger.OnDuplicateRecv = func(pkt *probing.Packet) { + resultByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": fmt.Sprintf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\\r\\n", pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.TTL), + })) + client.MsgChan <- resultByte + } + // 接收结束 + pinger.OnFinish = func(stats *probing.Statistics) { + end1 := fmt.Sprintf("\\r\\n--- %s ping statistics ---\\r\\n", stats.Addr) + end2 := fmt.Sprintf("%d packets transmitted, %d packets received, %v%% packet loss\\r\\n", stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss) + end3 := fmt.Sprintf("round-trip min/avg/max/stddev = %v/%v/%v/%v\\r\\n", stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt) + resultByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": fmt.Sprintf("%s%s%s", end1, end2, end3), + })) + client.MsgChan <- resultByte + } + resultByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": fmt.Sprintf("PING %s (%s) %d bytes of data.\\r\\n", pinger.Addr(), pinger.IPAddr(), pinger.Size), + })) + client.MsgChan <- resultByte + if errp := pinger.Run(); errp != nil { + logger.Warnf("ws pinger run err: %s", errp.Error()) + err = fmt.Errorf("pinger error") + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws ping run UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// Version 查询版本信息 +func (s *Ping) Version(meType, neId string) (string, error) { + // 检查是否安装ping + output, err := neService.NewNeInfo.NeRunSSHCmd(meType, neId, "ping -V") + if err != nil { + return "", fmt.Errorf("ping not installed") + } + return strings.TrimSpace(output), err +} + +// Run 接收ping终端交互业务处理 +func (s *Ping) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws ping run UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + // 主动关闭 + resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + client.MsgChan <- resultByte + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + return + case "ping": + // SSH会话消息接收写入会话 + var command string + command, err = s.parseOptions(reqMsg.Data) + if command != "" && err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write(command) + } + case "ctrl-c": + // 模拟按下 Ctrl+C + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write("\u0003\n") + case "resize": + // 会话窗口重置 + msgByte, _ := json.Marshal(reqMsg.Data) + var data struct { + Cols int `json:"cols"` + Rows int `json:"rows"` + } + err = json.Unmarshal(msgByte, &data) + if err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + err = sshClientSession.Session.WindowChange(data.Rows, data.Cols) + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws ping run UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// parseOptions 解析拼装ping命令 ping [options] +func (s *Ping) parseOptions(reqData any) (string, error) { + msgByte, _ := json.Marshal(reqData) + var data struct { + Command string `json:"command"` // 命令字符串 + DesAddr string `json:"desAddr"` // dns name or ip address + // Options + Interval int `json:"interval"` // seconds between sending each packet + TTL int `json:"ttl"` // define time to live + Cunt int `json:"count"` // 次回复后停止 + Size int `json:"size"` // 使用 作为要发送的数据字节数 + Timeout int `json:"timeout"` // time to wait for response + } + if err := json.Unmarshal(msgByte, &data); err != nil { + logger.Warnf("ws processor parseClient err: %s", err.Error()) + return "", fmt.Errorf("query data structure error") + } + + command := []string{"ping"} + // 命令字符串高优先级 + if data.Command != "" { + command = append(command, data.Command) + command = append(command, "\n") + return strings.Join(command, " "), nil + } + + // Options + if data.Interval > 0 { + command = append(command, fmt.Sprintf("-i %d", data.Interval)) + } + if data.TTL > 0 { + command = append(command, fmt.Sprintf("-t %d", data.TTL)) + } + if data.Cunt > 0 { + command = append(command, fmt.Sprintf("-c %d", data.Cunt)) + } + if data.Size > 0 { + command = append(command, fmt.Sprintf("-s %d", data.Size)) + } + if data.Timeout > 0 { + command = append(command, fmt.Sprintf("-w %d", data.Timeout)) + } + + command = append(command, data.DesAddr) + command = append(command, "\n") + return strings.Join(command, " "), nil +} diff --git a/src/modules/tool/tool.go b/src/modules/tool/tool.go new file mode 100644 index 0000000..7038568 --- /dev/null +++ b/src/modules/tool/tool.go @@ -0,0 +1,57 @@ +package tool + +import ( + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/modules/tool/controller" + + "github.com/gin-gonic/gin" +) + +// 模块路由注册 +func Setup(router *gin.Engine) { + logger.Infof("开始加载 ====> tool 模块路由") + + // iperf 网络性能测试工具 + iperfGroup := router.Group("/tool/iperf") + { + iperfGroup.GET("/v", + middleware.PreAuthorize(nil), + controller.NewIPerf.Version, + ) + iperfGroup.POST("/i", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.iperf", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewIPerf.Install, + ) + iperfGroup.GET("/run", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.iperf", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewIPerf.Run, + ) + } + + // ping ICMP网络探测工具 + pingGroup := router.Group("/tool/ping") + { + pingGroup.POST("", + middleware.PreAuthorize(nil), + controller.NewPing.Statistics, + ) + pingGroup.GET("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ping", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewPing.StatisticsOn, + ) + pingGroup.GET("/v", + middleware.PreAuthorize(nil), + controller.NewPing.Version, + ) + pingGroup.GET("/run", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ping", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewPing.Run, + ) + } +} diff --git a/src/modules/trace/controller/packet.go b/src/modules/trace/controller/packet.go new file mode 100644 index 0000000..ac54aa2 --- /dev/null +++ b/src/modules/trace/controller/packet.go @@ -0,0 +1,121 @@ +package controller + +import ( + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + traceService "be.ems/src/modules/trace/service" + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" +) + +// 实例化控制层 PacketController 结构体 +var NewPacket = &PacketController{ + packetService: traceService.NewPacket, +} + +// 信令跟踪 +// +// PATH /trace/packet +type PacketController struct { + packetService *traceService.Packet // 信令跟踪服务 +} + +// 信令跟踪网卡设备列表 +// +// GET /devices +func (s *PacketController) Devices(c *gin.Context) { + data := s.packetService.NetworkDevices() + c.JSON(200, result.OkData(data)) +} + +// 信令跟踪开始 +// +// POST /start +func (s *PacketController) Start(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + 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.Filter, body.OutputPCAP) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.OkData(msg)) +} + +// 信令跟踪结束 +// +// POST /stop +func (s *PacketController) Stop(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + TaskNo string `json:"taskNo" binding:"required"` // 任务编号 + } + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + if err := s.packetService.LiveStop(body.TaskNo); err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + 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" ` // 过滤表达式(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"))) + return + } + + if err := s.packetService.LiveFilter(body.TaskNo, body.Expr); err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.Ok(nil)) +} + +// 信令跟踪续期保活 +// +// PUT /keep-alive +func (s *PacketController) KeepAlive(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + TaskNo string `json:"taskNo" binding:"required"` // 任务编号 + Duration int `json:"duration" ` // 服务失效的时间,默认设置为120秒 + } + 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)) +} diff --git a/src/modules/trace/controller/tcpdump.go b/src/modules/trace/controller/tcpdump.go index 46caafe..0133f06 100644 --- a/src/modules/trace/controller/tcpdump.go +++ b/src/modules/trace/controller/tcpdump.go @@ -1,39 +1,33 @@ package controller import ( - "os" - "path/filepath" - - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/vo/result" - neService "nms_cxy/src/modules/network_element/service" - traceService "nms_cxy/src/modules/trace/service" - + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + traceService "be.ems/src/modules/trace/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) -// 实例化控制层 TcpdumpController 结构体 -var NewTcpdump = &TcpdumpController{ - TcpdumpService: traceService.NewTcpdumpImpl, - neInfoService: neService.NewNeInfoImpl, +// 实例化控制层 TCPdumpController 结构体 +var NewTCPdump = &TCPdumpController{ + tcpdumpService: traceService.NewTCPdump, + neInfoService: neService.NewNeInfo, } -// 信令抓包请求 +// 信令抓包 // // PATH /tcpdump -type TcpdumpController struct { - // 信令抓包服务 - TcpdumpService traceService.ITcpdump - // 网元信息服务 - neInfoService neService.INeInfo +type TCPdumpController struct { + tcpdumpService *traceService.TCPdump // 信令抓包服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元抓包PACP 开始 // // POST /start -func (s *TcpdumpController) DumpStart(c *gin.Context) { +func (s *TCPdumpController) DumpStart(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 @@ -46,7 +40,7 @@ func (s *TcpdumpController) DumpStart(c *gin.Context) { return } - taskCode, err := s.TcpdumpService.DumpStart(body.NeType, body.NeId, body.Cmd) + taskCode, err := s.tcpdumpService.DumpStart(body.NeType, body.NeId, body.Cmd) if err != nil { c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -57,7 +51,7 @@ func (s *TcpdumpController) DumpStart(c *gin.Context) { // 网元抓包PACP 结束 // // POST /stop -func (s *TcpdumpController) DumpStop(c *gin.Context) { +func (s *TCPdumpController) DumpStop(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 @@ -70,48 +64,18 @@ func (s *TcpdumpController) DumpStop(c *gin.Context) { return } - taskLog, err := s.TcpdumpService.DumpStop(body.NeType, body.NeId, body.TaskCode) + logFiles, err := s.tcpdumpService.DumpStop(body.NeType, body.NeId, body.TaskCode) if err != nil { c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkMsg(taskLog)) -} - -// 网元抓包PACP 下载 -// -// GET /download -func (s *TcpdumpController) DumpDownload(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - NeType string `form:"neType" binding:"required"` // 网元类型 - NeID string `form:"neId" binding:"required"` // 网元ID - TaskCode string `form:"taskCode" binding:"required"` // 任务码,停止任务并查看日志信息 - DelTemp bool `form:"delTemp"` // 完成后是否删除本地临时zip文件 - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - zipFilePath, err := s.TcpdumpService.DumpDownload(query.NeType, query.NeID, query.TaskCode) - if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - - defer func() { - if query.DelTemp { - _ = os.Remove(zipFilePath) - } - }() - c.FileAttachment(zipFilePath, filepath.Base(zipFilePath)) + c.JSON(200, result.OkData(logFiles)) } // UPF标准版内部抓包 // // POST /upf -func (s *TcpdumpController) UPFTrace(c *gin.Context) { +func (s *TCPdumpController) UPFTrace(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 @@ -124,7 +88,7 @@ func (s *TcpdumpController) UPFTrace(c *gin.Context) { return } - msg, err := s.TcpdumpService.UPFTrace(body.NeType, body.NeId, body.Cmd) + msg, err := s.tcpdumpService.UPFTrace(body.NeType, body.NeId, body.Cmd) if err != nil { c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) return diff --git a/src/modules/trace/controller/trace_data.go b/src/modules/trace/controller/trace_data.go new file mode 100644 index 0000000..2d8222b --- /dev/null +++ b/src/modules/trace/controller/trace_data.go @@ -0,0 +1,62 @@ +package controller + +import ( + "strings" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + traceService "be.ems/src/modules/trace/service" + "github.com/gin-gonic/gin" +) + +// 实例化控制层 TraceDataController 结构体 +var NewTraceData = &TraceDataController{ + traceDataService: traceService.NewTraceData, +} + +// 跟踪任务数据 +// +// PATH /data +type TraceDataController struct { + // 跟踪_数据信息服务 + traceDataService *traceService.TraceData +} + +// 跟踪任务数据列表 +// +// GET /list +func (s *TraceDataController) List(c *gin.Context) { + query := ctx.QueryMap(c) + + // 查询数据 + data := s.traceDataService.SelectPage(query) + c.JSON(200, result.Ok(data)) +} + +// 跟踪任务数据删除 +// +// DELETE /:ids +func (s *TraceDataController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + rowIds := c.Param("ids") + if rowIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(rowIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.traceDataService.DeleteByIds(uniqueIDs) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) + c.JSON(200, result.OkMsg(msg)) +} diff --git a/src/modules/trace/controller/trace_task.go b/src/modules/trace/controller/trace_task.go new file mode 100644 index 0000000..fc912ea --- /dev/null +++ b/src/modules/trace/controller/trace_task.go @@ -0,0 +1,155 @@ +package controller + +import ( + "fmt" + "path/filepath" + "runtime" + "strings" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/trace/model" + traceService "be.ems/src/modules/trace/service" + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" +) + +// 实例化控制层 TraceTaskController 结构体 +var NewTraceTask = &TraceTaskController{ + traceTaskService: traceService.NewTraceTask, +} + +// 跟踪任务 +// +// PATH /task +type TraceTaskController struct { + // 跟踪_任务信息服务 + traceTaskService *traceService.TraceTask +} + +// 跟踪任务列表 +// +// GET /list +func (s *TraceTaskController) List(c *gin.Context) { + query := ctx.QueryMap(c) + + // 查询数据 + data := s.traceTaskService.SelectPage(query) + c.JSON(200, result.Ok(data)) +} + +// 跟踪任务信息 +// +// GET /:id +func (s *TraceTaskController) Info(c *gin.Context) { + language := ctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + data := s.traceTaskService.SelectById(id) + if data.ID == id { + c.JSON(200, result.OkData(data)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 跟踪任务新增 +// +// POST / +func (s *TraceTaskController) Add(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.TraceTask + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.ID != "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + body.CreateBy = ctx.LoginUserToUserName(c) + if err = s.traceTaskService.Insert(body); err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.Ok(nil)) +} + +// 跟踪任务修改 +// +// PUT / +func (s *TraceTaskController) Edit(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.TraceTask + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.ID == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查是否存在 + taskInfo := s.traceTaskService.SelectById(body.ID) + if taskInfo.ID != body.ID { + // 没有可访问任务信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "task.noData"))) + return + } + + body.UpdateBy = ctx.LoginUserToUserName(c) + if err = s.traceTaskService.Update(body); err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.Ok(nil)) +} + +// 跟踪任务删除 +// +// DELETE /:ids +func (s *TraceTaskController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + rowIds := c.Param("ids") + if rowIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(rowIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.traceTaskService.DeleteByIds(uniqueIDs) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) + c.JSON(200, result.OkMsg(msg)) +} + +// 跟踪任务文件 +// +// GET /filePull +func (s *TraceTaskController) FilePull(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys struct { + TraceId string `form:"traceId" binding:"required"` + } + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + fileName := fmt.Sprintf("task_%s.pcap", querys.TraceId) + localFilePath := filepath.Join("/tmp/omc/trace", fileName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + c.FileAttachment(localFilePath, fileName) +} diff --git a/src/modules/trace/controller/trace_task_hlr.go b/src/modules/trace/controller/trace_task_hlr.go new file mode 100644 index 0000000..07acc5b --- /dev/null +++ b/src/modules/trace/controller/trace_task_hlr.go @@ -0,0 +1,240 @@ +package controller + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/generate" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/trace/model" + traceService "be.ems/src/modules/trace/service" + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" +) + +// 实例化控制层 TraceTaskHlrController 结构体 +var NewTraceTaskHlr = &TraceTaskHlrController{ + neInfoService: neService.NewNeInfo, + traceTaskHlrService: traceService.NewTraceTaskHlr, +} + +// 跟踪任务网元HLR +// +// PATH /task/hlr +type TraceTaskHlrController struct { + neInfoService *neService.NeInfo // 网元信息服务 + traceTaskHlrService *traceService.TraceTaskHlr // 跟踪_任务给HRL网元信息服务 +} + +// 跟踪任务列表 +// +// GET /list +func (s *TraceTaskHlrController) List(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys model.TraceTaskHlrQuery + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询数据 + data := s.traceTaskHlrService.SelectPage(querys) + c.JSON(200, result.Ok(data)) +} + +// 跟踪任务删除 +// +// DELETE /:ids +func (s *TraceTaskHlrController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + rowIds := c.Param("ids") + if rowIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(rowIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.traceTaskHlrService.DeleteByIds(uniqueIDs) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) + c.JSON(200, result.OkMsg(msg)) +} + +// 跟踪任务创建 +// +// POST /start +func (s *TraceTaskHlrController) Start(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + IMSI string `json:"imsi"` // IMSI + MSISDN string `json:"msisdn"` // MSISDN + StartTime int64 `json:"startTime"` // 开始时间 + EndTime int64 `json:"endTime"` // 结束时间 + Remark string `json:"remark"` // 备注说明 + } + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + if body.IMSI == "" && body.MSISDN == "" { + c.JSON(400, result.CodeMsg(400, "imsi amd msisdn is empty")) + return + } + + task := model.TraceTaskHlr{ + IMSI: body.IMSI, + MSISDN: body.MSISDN, + StartTime: body.StartTime, + EndTime: body.EndTime, + Remark: body.Remark, + CreateBy: ctx.LoginUserToUserName(c), + } + id, err := s.traceTaskHlrService.Start(task) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.OkData(id)) +} + +// 跟踪任务停止 +// +// POST /stop +func (s *TraceTaskHlrController) Stop(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + ID string `json:"id" binding:"required"` // 任务ID + } + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 处理字符转id数组后去重 + ids := strings.Split(body.ID, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + + errArr := []map[string]any{} + for _, id := range uniqueIDs { + task := s.traceTaskHlrService.SelectById(id) + if task.ID != id || task.ID == "" { + errArr = append(errArr, map[string]any{"id": id, "err": "task not found"}) + continue + } + + task.UpdateBy = ctx.LoginUserToUserName(c) + err := s.traceTaskHlrService.Stop(task) + if err != nil { + errArr = append(errArr, map[string]any{"id": id, "err": err.Error()}) + continue + } + } + c.JSON(200, result.OkData(errArr)) +} + +// 跟踪任务文件 +// +// POST /file +func (s *TraceTaskHlrController) File(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + ID string `json:"id" binding:"required"` // 任务ID + Dir string `json:"dir" binding:"required"` // 网元文件目录 + } + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + task := s.traceTaskHlrService.SelectById(body.ID) + if task.ID != body.ID || task.ID == "" { + c.JSON(200, result.CodeMsg(400, "task not found")) + return + } + + list, err := s.traceTaskHlrService.File(task.TraceId, body.Dir) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.OkData(list)) +} + +// 跟踪任务文件从网元到本地 +// +// GET /filePull +func (s *TraceTaskHlrController) FilePull(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys struct { + NeType string `form:"neType" binding:"required"` + NeID string `form:"neId" binding:"required"` + Path string `form:"path" binding:"required"` + FileName string `form:"fileName" binding:"required"` + DelTemp bool `form:"delTemp"` // 删除本地临时文件 + } + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sftpClient.Close() + + nePath := filepath.ToSlash(filepath.Join(querys.Path, querys.FileName)) + fileName := generate.Code(6) + "_" + querys.FileName + localFilePath := filepath.Join("/tmp/omc/pull", fileName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + // 复制到本地 + if err = sftpClient.CopyFileRemoteToLocal(nePath, localFilePath); err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + defer func() { + if querys.DelTemp { + _ = os.Remove(localFilePath) + } + }() + c.FileAttachment(localFilePath, fileName) +} diff --git a/src/modules/trace/model/trace_data.go b/src/modules/trace/model/trace_data.go new file mode 100644 index 0000000..368d16e --- /dev/null +++ b/src/modules/trace/model/trace_data.go @@ -0,0 +1,23 @@ +package model + +// TraceData 跟踪_数据 trace_data +type TraceData struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + TaskId int64 `json:"taskId" gorm:"task_id"` // 任务ID + IMSI string `json:"imsi" gorm:"imsi"` + MSISDN string `json:"msisdn" gorm:"msisdn"` // 可能存在 + SrcAddr string `json:"srcAddr" gorm:"src_addr"` // 源地址带端口 + DstAddr string `json:"dstAddr" gorm:"dst_addr"` // 目标地址带端口 + IfType int64 `json:"ifType" gorm:"if_type"` // 接口类型,未分类 + MsgType int64 `json:"msgType" gorm:"msg_type"` + MsgDirect int64 `json:"msgDirect" gorm:"msg_direct"` + Length int64 `json:"length" gorm:"length"` // 去除头后的原始数据byte长度 + Timestamp int64 `json:"timestamp" gorm:"timestamp"` // 毫秒 + RawMsg string `json:"rawMsg" gorm:"raw_msg"` // 去除头后的原始数据byteBase64 + DecMsg string `json:"decMsg" gorm:"dec_msg"` // TCP内容消息 +} + +// TableName 表名称 +func (*TraceData) TableName() string { + return "trace_data" +} diff --git a/src/modules/trace/model/trace_task.go b/src/modules/trace/model/trace_task.go new file mode 100644 index 0000000..752d4f7 --- /dev/null +++ b/src/modules/trace/model/trace_task.go @@ -0,0 +1,31 @@ +package model + +// TraceTask 跟踪_任务 +type TraceTask struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 跟踪任务ID + TraceId string `json:"traceId" gorm:"trace_id"` // 任务编号 + TraceType string `json:"traceType" gorm:"trace_type"` // 1-Interface,2-Device,3-User + StartTime int64 `json:"startTime" gorm:"start_time"` // 开始时间 毫秒 + EndTime int64 `json:"endTime" gorm:"end_time"` // 结束时间 毫秒 + Interfaces string `json:"interfaces" gorm:"interfaces"` // 接口跟踪必须 例如 N8,N10 + IMSI string `json:"imsi" gorm:"imsi"` // 用户跟踪必须 + MSISDN string `json:"msisdn" gorm:"msisdn"` // 用户跟踪可选 + UeIp string `json:"ueIp" gorm:"ue_ip"` // 设备跟踪必须 IP + SrcIp string `json:"srcIp" gorm:"src_ip"` // 源地址IP + DstIp string `json:"dstIp" gorm:"dst_ip"` // 目标地址IP + SignalPort int64 `json:"signalPort" gorm:"signal_port"` // 地址IP端口 + CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 + UpdateBy string `json:"updateBy" gorm:"update_by"` // 更新者 + UpdateTime int64 `json:"updateTime" gorm:"update_time"` // 更新时间 + Remark string `json:"remark" gorm:"remark"` // 备注 + NeType string `json:"neType" gorm:"ne_type"` // 网元类型 + NeId string `json:"neId" gorm:"ne_id"` // 网元ID + NotifyUrl string `json:"notifyUrl" gorm:"notify_url"` // 信息数据通知回调地址UDP 例如udp:192.168.5.58:29500 + FetchMsg string `json:"fetchMsg" gorm:"fetch_msg"` // 任务下发请求响应消息 +} + +// TableName 表名称 +func (*TraceTask) TableName() string { + return "trace_task" +} diff --git a/src/modules/trace/model/trace_task_hlr.go b/src/modules/trace/model/trace_task_hlr.go new file mode 100644 index 0000000..2d306c4 --- /dev/null +++ b/src/modules/trace/model/trace_task_hlr.go @@ -0,0 +1,35 @@ +package model + +// TraceTaskHlr 跟踪_任务给HRL网元 trace_task_hlr +type TraceTaskHlr struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + TraceId string `json:"traceId" gorm:"trace_id"` // 任务编号 + IMSI string `json:"imsi" gorm:"imsi"` // IMSI + MSISDN string `json:"msisdn" gorm:"msisdn"` // MSISDN + StartTime int64 `json:"startTime" gorm:"start_time"` // 开始时间 + EndTime int64 `json:"endTime" gorm:"end_time"` // 结束时间 + Status string `json:"status" gorm:"status"` // 任务状态(0停止 1进行) + Msg string `json:"msg" gorm:"msg"` // 任务信息 + Remark string `json:"remark" gorm:"remark"` // 备注说明 + CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 + UpdateBy string `json:"updateBy" gorm:"update_by"` // 更新者 + UpdateTime int64 `json:"updateTime" gorm:"update_time"` // 更新时间 +} + +// TableName 表名称 +func (*TraceTaskHlr) TableName() string { + return "trace_task_hlr" +} + +// TraceTaskHlrQuery 查询参数结构体 +type TraceTaskHlrQuery struct { + IMSI string `json:"imsi" form:"imsi"` // imsi + MSISDN string `json:"msisdn" form:"msisdn"` // msisdn + StartTime string `json:"startTime" form:"startTime"` + EndTime string `json:"endTime" form:"endTime"` + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=imsi msisdn"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` +} diff --git a/src/modules/trace/packet_task/packet.go b/src/modules/trace/packet_task/packet.go new file mode 100644 index 0000000..5df723b --- /dev/null +++ b/src/modules/trace/packet_task/packet.go @@ -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 +} diff --git a/src/modules/trace/packet_task/packet_frame.go b/src/modules/trace/packet_task/packet_frame.go new file mode 100644 index 0000000..d060149 --- /dev/null +++ b/src/modules/trace/packet_task/packet_frame.go @@ -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 +} diff --git a/src/modules/trace/packet_task/packet_frame_util.go b/src/modules/trace/packet_task/packet_frame_util.go new file mode 100644 index 0000000..77d86a9 --- /dev/null +++ b/src/modules/trace/packet_task/packet_frame_util.go @@ -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 +} diff --git a/src/modules/trace/repository/trace_data.go b/src/modules/trace/repository/trace_data.go new file mode 100644 index 0000000..c1e791b --- /dev/null +++ b/src/modules/trace/repository/trace_data.go @@ -0,0 +1,246 @@ +package repository + +import ( + "strings" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/trace/model" +) + +// 实例化数据层 TraceData 结构体 +var NewTraceData = &TraceData{ + selectSql: `select id, task_id, imsi, msisdn, src_addr, dst_addr, if_type, msg_type, msg_direct, length, timestamp, raw_msg, dec_msg from trace_data`, + + resultMap: map[string]string{ + "id": "ID", + "task_id": "TaskId", + "imsi": "IMSI", + "msisdn": "MSISDN", + "src_addr": "SrcAddr", + "dst_addr": "DstAddr", + "if_type": "IfType", + "msg_type": "MsgType", + "msg_direct": "MsgDirect", + "length": "Length", + "timestamp": "Timestamp", + "raw_msg": "RawMsg", + "dec_msg": "DecMsg", + }, +} + +// CDREventIMSImpl 跟踪_任务给HRL网元 数据层处理 +type TraceData struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *TraceData) convertResultRows(rows []map[string]any) []model.TraceData { + arr := make([]model.TraceData, 0) + for _, row := range rows { + item := model.TraceData{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *TraceData) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["imsi"]; ok && v != "" { + conditions = append(conditions, "imsi like concat(?, '%')") + params = append(params, v) + } + if v, ok := query["msisdn"]; ok && v != "" { + conditions = append(conditions, "msisdn like concat(?, '%')") + params = append(params, v) + } + if v, ok := query["startTime"]; ok && v != "" { + conditions = append(conditions, "timestamp >= ?") + params = append(params, v) + } + if v, ok := query["endTime"]; ok && v != "" { + conditions = append(conditions, "timestamp <= ?") + params = append(params, v) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.TraceData{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from trace_data" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *TraceData) SelectList(data model.TraceData) []model.TraceData { + // 查询条件拼接 + var conditions []string + var params []any + if data.IMSI != "" { + conditions = append(conditions, "imsi = ?") + params = append(params, data.IMSI) + } + if data.MSISDN != "" { + conditions = append(conditions, "msisdn = ?") + params = append(params, data.MSISDN) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *TraceData) SelectByIds(ids []string) []model.TraceData { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.TraceData{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *TraceData) Insert(data model.TraceData) string { + // 参数拼接 + params := make(map[string]any) + if data.TaskId > 0 { + params["task_id"] = data.TaskId + } + if data.IMSI != "" { + params["imsi"] = data.IMSI + } + if data.MSISDN != "" { + params["msisdn"] = data.MSISDN + } + if data.SrcAddr != "" { + params["src_addr"] = data.SrcAddr + } + if data.DstAddr != "" { + params["dst_addr"] = data.DstAddr + } + if data.IfType > -1 { + params["if_type"] = data.IfType + } + if data.MsgType > -1 { + params["msg_type"] = data.MsgType + } + if data.MsgDirect > -1 { + params["msg_direct"] = data.MsgDirect + } + if data.Length > 0 { + params["length"] = data.Length + } + if data.Timestamp > 0 { + params["timestamp"] = data.Timestamp + } + if data.RawMsg != "" { + params["raw_msg"] = data.RawMsg + } + if data.DecMsg != "" { + params["dec_msg"] = data.DecMsg + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into trace_data (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// DeleteByIds 批量删除信息 +func (r *TraceData) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from trace_data where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results +} diff --git a/src/modules/trace/repository/trace_task.go b/src/modules/trace/repository/trace_task.go new file mode 100644 index 0000000..39f3aa3 --- /dev/null +++ b/src/modules/trace/repository/trace_task.go @@ -0,0 +1,358 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/trace/model" +) + +// 实例化数据层 TraceTask 结构体 +var NewTraceTask = &TraceTask{ + selectSql: `select id, trace_id, trace_type, start_time, end_time, + interfaces, imsi, msisdn, + ue_ip, src_ip, dst_ip, signal_port, + create_by, create_time, update_by, update_time, remark, + ne_type, ne_id, notify_url, fetch_msg + from trace_task`, + + resultMap: map[string]string{ + "id": "ID", + "trace_id": "TraceId", + "trace_type": "TraceType", + "start_time": "StartTime", + "end_time": "EndTime", + "interfaces": "Interfaces", + "imsi": "IMSI", + "msisdn": "MSISDN", + "ue_ip": "UeIp", + "src_ip": "SrcIp", + "dst_ip": "DstIp", + "signal_port": "SignalPort", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + "remark": "Remark", + "ne_type": "NeType", + "ne_id": "NeId", + "notify_url": "NotifyUrl", + "fetch_msg": "FetchMsg", + }, +} + +// TraceTask 跟踪_任务 数据层处理 +type TraceTask struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *TraceTask) convertResultRows(rows []map[string]any) []model.TraceTask { + arr := make([]model.TraceTask, 0) + for _, row := range rows { + item := model.TraceTask{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *TraceTask) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, v) + } + if v, ok := query["imsi"]; ok && v != "" { + conditions = append(conditions, "imsi like concat(?, '%')") + params = append(params, v) + } + if v, ok := query["msisdn"]; ok && v != "" { + conditions = append(conditions, "msisdn like concat(?, '%')") + params = append(params, v) + } + if v, ok := query["startTime"]; ok && v != "" { + conditions = append(conditions, "start_time >= ?") + params = append(params, v) + } + if v, ok := query["endTime"]; ok && v != "" { + conditions = append(conditions, "end_time <= ?") + params = append(params, v) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.TraceTask{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from trace_task" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v.(string) + if v, ok := query["sortOrder"]; ok && v != "" { + if v.(string) == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *TraceTask) SelectList(task model.TraceTask) []model.TraceTask { + // 查询条件拼接 + var conditions []string + var params []any + if task.IMSI != "" { + conditions = append(conditions, "imsi = ?") + params = append(params, task.IMSI) + } + if task.SrcIp != "" { + conditions = append(conditions, "src_ip = ?") + params = append(params, task.SrcIp) + } + if task.DstIp != "" { + conditions = append(conditions, "dst_ip = ?") + params = append(params, task.DstIp) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *TraceTask) SelectByIds(ids []string) []model.TraceTask { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.TraceTask{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *TraceTask) Insert(task model.TraceTask) string { + // 参数拼接 + params := make(map[string]any) + if task.TraceId != "" { + params["trace_id"] = task.TraceId + } + if task.TraceType != "" { + params["trace_type"] = task.TraceType + } + if task.StartTime > 0 { + params["start_time"] = task.StartTime + } + if task.EndTime > 0 { + params["end_time"] = task.EndTime + } + if task.Interfaces != "" { + params["interfaces"] = task.Interfaces + } + if task.IMSI != "" { + params["imsi"] = task.IMSI + } + if task.MSISDN != "" { + params["msisdn"] = task.MSISDN + } + if task.UeIp != "" { + params["ue_ip"] = task.UeIp + } + if task.SrcIp != "" { + params["src_ip"] = task.SrcIp + } + if task.DstIp != "" { + params["dst_ip"] = task.DstIp + } + if task.SignalPort != 0 { + params["signal_port"] = task.SignalPort + } + if task.NeType != "" { + params["ne_type"] = task.NeType + } + if task.NeId != "" { + params["ne_id"] = task.NeId + } + if task.NotifyUrl != "" { + params["notify_url"] = task.NotifyUrl + } + if task.FetchMsg != "" { + params["fetch_msg"] = task.FetchMsg + } + if task.Remark != "" { + params["remark"] = task.Remark + } + if task.CreateBy != "" { + params["create_by"] = task.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into trace_task (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *TraceTask) Update(task model.TraceTask) int64 { + // 参数拼接 + params := make(map[string]any) + params["trace_id"] = task.TraceId + params["trace_type"] = task.TraceType + params["ne_type"] = task.NeType + params["ne_id"] = task.NeId + params["notify_url"] = task.NotifyUrl + + params["start_time"] = task.StartTime + params["end_time"] = task.EndTime + params["fetch_msg"] = task.FetchMsg + params["remark"] = task.Remark + + params["interfaces"] = task.Interfaces + + params["imsi"] = task.IMSI + params["msisdn"] = task.MSISDN + + params["ue_ip"] = task.UeIp + params["src_ip"] = task.SrcIp + params["dst_ip"] = task.DstIp + params["signal_port"] = task.SignalPort + + if task.UpdateBy != "" { + params["update_by"] = task.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update trace_task set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, task.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *TraceTask) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from trace_task where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results +} + +// LastID 最后一条ID +func (r *TraceTask) LastID() int64 { + // 查询数据 + querySql := "SELECT id as 'str' FROM trace_task ORDER BY id DESC LIMIT 1" + results, err := datasource.RawDB("", querySql, nil) + if err != nil { + logger.Errorf("query err %v", err) + return 0 + } + if len(results) > 0 { + return parse.Number(results[0]["str"]) + } + return 0 +} diff --git a/src/modules/trace/repository/trace_task_hlr.go b/src/modules/trace/repository/trace_task_hlr.go new file mode 100644 index 0000000..15b6cbf --- /dev/null +++ b/src/modules/trace/repository/trace_task_hlr.go @@ -0,0 +1,316 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/trace/model" +) + +// 实例化数据层 TraceTaskHlr 结构体 +var NewTraceTaskHlr = &TraceTaskHlr{ + selectSql: `select id, trace_id, imsi, msisdn, start_time, end_time, status, msg, remark, create_by, create_time, update_by, update_time from trace_task_hlr`, + + resultMap: map[string]string{ + "id": "ID", + "trace_id": "TraceId", + "imsi": "IMSI", + "msisdn": "MSISDN", + "start_time": "StartTime", + "end_time": "EndTime", + "status": "Status", + "msg": "Msg", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// TraceTaskHlr 跟踪_任务给HRL网元 数据层处理 +type TraceTaskHlr struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *TraceTaskHlr) convertResultRows(rows []map[string]any) []model.TraceTaskHlr { + arr := make([]model.TraceTaskHlr, 0) + for _, row := range rows { + item := model.TraceTaskHlr{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *TraceTaskHlr) SelectPage(querys model.TraceTaskHlrQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.IMSI != "" { + conditions = append(conditions, "imsi like concat(?, '%')") + params = append(params, querys.IMSI) + } + if querys.MSISDN != "" { + conditions = append(conditions, "msisdn like concat(?, '%')") + params = append(params, querys.MSISDN) + } + if querys.StartTime != "" && len(querys.StartTime) == 13 { + conditions = append(conditions, "start_time >= ?") + params = append(params, querys.StartTime) + } + if querys.EndTime != "" && len(querys.EndTime) == 13 { + conditions = append(conditions, "end_time <= ?") + params = append(params, querys.EndTime) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.TraceTaskHlr{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from trace_task_hlr" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *TraceTaskHlr) SelectList(task model.TraceTaskHlr) []model.TraceTaskHlr { + // 查询条件拼接 + var conditions []string + var params []any + if task.IMSI != "" { + conditions = append(conditions, "imsi = ?") + params = append(params, task.IMSI) + } + if task.MSISDN != "" { + conditions = append(conditions, "msisdn = ?") + params = append(params, task.MSISDN) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *TraceTaskHlr) SelectByIds(ids []string) []model.TraceTaskHlr { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.TraceTaskHlr{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *TraceTaskHlr) Insert(task model.TraceTaskHlr) string { + // 参数拼接 + params := make(map[string]any) + if task.TraceId != "" { + params["trace_id"] = task.TraceId + } + if task.IMSI != "" { + params["imsi"] = task.IMSI + } + if task.MSISDN != "" { + params["msisdn"] = task.MSISDN + } + if task.StartTime != 0 { + params["start_time"] = task.StartTime + } + if task.EndTime != 0 { + params["end_time"] = task.EndTime + } + if task.Status != "" { + params["status"] = task.Status + } + if task.Msg != "" { + params["msg"] = task.Msg + } + if task.Remark != "" { + params["remark"] = task.Remark + } + if task.CreateBy != "" { + params["create_by"] = task.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into trace_task_hlr (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *TraceTaskHlr) Update(task model.TraceTaskHlr) int64 { + // 参数拼接 + params := make(map[string]any) + if task.TraceId != "" { + params["trace_id"] = task.TraceId + } + if task.IMSI != "" { + params["imsi"] = task.IMSI + } + if task.MSISDN != "" { + params["msisdn"] = task.MSISDN + } + if task.StartTime != 0 { + params["start_time"] = task.StartTime + } + if task.EndTime != 0 { + params["end_time"] = task.EndTime + } + if task.Status != "" { + params["status"] = task.Status + } + if task.Msg != "" { + params["msg"] = task.Msg + } + if task.Remark != "" { + params["remark"] = task.Remark + } + if task.UpdateBy != "" { + params["update_by"] = task.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update trace_task_hlr set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, task.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *TraceTaskHlr) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from trace_task_hlr where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results +} + +// LastID 最后一条ID +func (r *TraceTaskHlr) LastID() int64 { + // 查询数据 + querySql := "SELECT id as 'str' FROM trace_task_hlr ORDER BY id DESC LIMIT 1" + results, err := datasource.RawDB("", querySql, nil) + if err != nil { + logger.Errorf("query err %v", err) + return 0 + } + if len(results) > 0 { + return parse.Number(results[0]["str"]) + } + return 0 +} diff --git a/src/modules/trace/service/packet.go b/src/modules/trace/service/packet.go new file mode 100644 index 0000000..64cc643 --- /dev/null +++ b/src/modules/trace/service/packet.go @@ -0,0 +1,67 @@ +package service + +import ( + "be.ems/src/framework/vo" + packetTask "be.ems/src/modules/trace/packet_task" +) + +// 实例化服务层 Packet 结构体 +var NewPacket = &Packet{} + +// 信令跟踪 服务层处理 +type Packet struct{} + +// NetworkDevices 获取网卡设备信息 +func (s *Packet) NetworkDevices() []vo.TreeSelect { + arr := make([]vo.TreeSelect, 0) + devices, err := packetTask.NetworkDevices() + if err != nil { + return arr + } + + for _, device := range devices { + if len(device.Addresses) == 0 { + continue + } + + lable := device.Description + if lable == "" { + lable = device.Name + } + item := vo.TreeSelect{ + ID: device.Name, + Label: lable, + Children: []vo.TreeSelect{}, + } + + for _, address := range device.Addresses { + if address.IP != nil { + ip := address.IP.String() + item.Children = append(item.Children, vo.TreeSelect{ID: ip, Label: ip}) + } + } + arr = append(arr, item) + } + + return arr +} + +// LiveStart 开始捕获数据 +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 { + 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 { + return packetTask.LiveStop(taskNo) +} diff --git a/src/modules/trace/service/tcpdump.go b/src/modules/trace/service/tcpdump.go index 9f77fb0..b94a027 100644 --- a/src/modules/trace/service/tcpdump.go +++ b/src/modules/trace/service/tcpdump.go @@ -1,16 +1,284 @@ package service -// 信令抓包 服务层接口 -type ITcpdump interface { - // DumpStart 触发tcpdump开始抓包 - DumpStart(neType, neId, cmdStr string) (string, error) +import ( + "fmt" + "path/filepath" + "regexp" + "strings" + "sync" + "time" - // DumpStop 停止已存在抓包句柄 - DumpStop(neType, neId, taskCode string) (string, error) + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ssh" + neService "be.ems/src/modules/network_element/service" +) - // DumpDownload 抓包文件网元端复制到本地输出zip文件 - DumpDownload(neType, neId, taskCode string) (string, error) - - // UPFTrace UPF标准版内部抓包 - UPFTrace(neType, neId, cmdStr string) (string, error) +// 实例化服务层 TCPdump 结构体 +var NewTCPdump = &TCPdump{ + neInfoService: neService.NewNeInfo, +} + +// 信令抓包 服务层处理 +type TCPdump struct { + neInfoService *neService.NeInfo // 网元信息服务 +} + +// 抓包进程PID +var dumpPIDMap sync.Map + +// DumpStart 触发tcpdump开始抓包 +func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) { + // 命令检查 + if strings.Contains(cmdStr, "-w") { + return "", fmt.Errorf("command cannot contain -w") + } + + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId || neInfo.IP == "" { + return "", fmt.Errorf("app.common.noNEInfo") + } + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", err + } + defer sshClient.Close() + + // 检查是否安装tcpdump + if msg, err := sshClient.RunCMD("sudo tcpdump --version"); err != nil { + // bash: tcpdump: command not found + msg = strings.TrimSpace(msg) + logger.Errorf("DumpStart err: %s => %s", msg, err.Error()) + return "", fmt.Errorf("%s", msg) + } + + taskCode := time.Now().Format("20060102150405") + // 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241 + neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo chmod 777 -R /tmp/omc", neDirTemp)) + + // 命令拼装 + logPath := fmt.Sprintf("%s/tcpdump.log", neDirTemp) + filePath := fmt.Sprintf("%s/part_%s.pcap ", neDirTemp, taskCode) + if strings.Contains(cmdStr, "-G") { + filePath = fmt.Sprintf("%s/part_%%Y%%m%%d%%H%%M%%S.pcap ", neDirTemp) + } + sendCmd := fmt.Sprintf("sudo timeout 60m sudo tcpdump -i any %s -w %s > %s 2>&1 & echo $!", cmdStr, filePath, logPath) + // sudo timeout 60m sudo tcpdump -i any -n -s 0 -v -G 60 -W 6 -w /tmp/omc/tcpdump/udm/001/20240817104241/part_%Y-%m-%d_%H:%M:%S.pcap > /tmp/omc/tcpdump/udm/001/20240817104241/tcpdump.log 2>&1 & echo $! + // sudo timeout 60m sudo tcpdump -i any -n -s 0 -v -w /tmp/omc/tcpdump/udm/001/20240817105440/part_2024-08-17_10:54:40.pcap > /tmp/omc/tcpdump/udm/001/20240817105440/tcpdump.log 2>&1 & echo $! + // + // timeout 超时60分钟后发送kill命令,1分钟后强制终止命令。tcpdump -G 文件轮转间隔时间(秒) -W 文件轮转保留最近数量 + // sudo timeout --kill-after=1m 60m sudo tcpdump -i any -n -s 0 -v -G 10 -W 7 -w /tmp/part_%Y%m%d%H%M%S.pcap > /tmp/part.log 2>&1 & echo $! + // sudo kill $(pgrep -P 722729) + outputPID, err := sshClient.RunCMD(sendCmd) + outputPID = strings.TrimSpace(outputPID) + if err != nil || strings.HasPrefix(outputPID, "stderr:") { + logger.Errorf("DumpStart err: %s => %s", outputPID, err.Error()) + return "", err + } + + // 日志文件行号 + PIDMap := s.logFileLastLine(neType, sshClient) + PIDMap["neType"] = neInfo.NeType + PIDMap["neId"] = neInfo.NeId + PIDMap["taskCode"] = taskCode + PIDMap["pid"] = outputPID + PIDMap["cmd"] = sendCmd + + // 检查进程 ps aux | grep tcpdump + // 强杀 sudo pkill tcpdump + pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) + dumpPIDMap.Store(pidKey, PIDMap) + return taskCode, err +} + +// DumpStop 停止已存在抓包句柄 +func (s *TCPdump) DumpStop(neType, neId, taskCode string) ([]string, error) { + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId || neInfo.IP == "" { + return []string{}, fmt.Errorf("app.common.noNEInfo") + } + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return []string{}, err + } + defer sshClient.Close() + + // 是否存在执行过的进程 + pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) + PIDMap, ok := dumpPIDMap.Load(pidKey) + if !ok || PIDMap == nil { + return []string{}, fmt.Errorf("tcpdump is not running") + } + pid, ok := PIDMap.(map[string]string)["pid"] + if !ok || pid == "" { + return []string{}, fmt.Errorf("tcpdump is not running") + } + s.logFileLastLineToFile(PIDMap.(map[string]string), sshClient) + + // 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241 + neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) + // 命令拼装 + sendCmd := fmt.Sprintf("pids=$(pgrep -P %s) && [ -n \"$pids\" ] && sudo kill $pids;sudo timeout 2s ls %s", pid, neDirTemp) + // pids=$(pgrep -P 1914341) && [ -n "$pids" ] && sudo kill $pids;sudo timeout 2s ls /tmp/omc/tcpdump/udm/001/20240817104241 + output, err := sshClient.RunCMD(sendCmd) + output = strings.TrimSpace(output) + if err != nil || strings.HasPrefix(output, "ls: ") { + logger.Errorf("DumpStop err: %s => %s", output, err.Error()) + return []string{}, err + } + files := strings.Split(output, "\n") + dumpPIDMap.Delete(pidKey) + return files, nil +} + +// logFileLastLine 日志文件最后行号 +func (s *TCPdump) logFileLastLine(neType string, sshClient *ssh.ConnSSH) map[string]string { + logFileArr := make([]string, 0) + mapFile := make(map[string]string, 0) + + // 存放文件目录 /var/log/xxx.log + if neType == "IMS" { + logFileArr = append(logFileArr, + "/var/log/ims/pcscf/pcscf.log", + "/var/log/ims/bgcf/bgcf.log", + "/var/log/ims/bsf/bsf.log", + "/var/log/ims/icscf/icscf.log", + "/var/log/ims/ismc/ismc.log", + "/var/log/ims/mmtel/mmtel.log", + "/var/log/ims/scscf/scscf.log", + "/var/log/ims/iwf/iwf.log", + ) + } else { + neLogFile := fmt.Sprintf("/var/log/%s.log", strings.ToLower(neType)) + logFileArr = append(logFileArr, neLogFile) + } + + for _, v := range logFileArr { + lastLine, err := sshClient.RunCMD(fmt.Sprintf("sed -n '$=' %s", v)) + lastLine = strings.TrimSpace(lastLine) + if err != nil || strings.HasPrefix(lastLine, "sed: can't") { + logger.Errorf("logFileLastLine err: %s => %s", lastLine, err.Error()) + continue + } + mapFile[v] = lastLine + } + return mapFile +} + +// logFileLastLine 日志文件最后行号 +func (s *TCPdump) logFileLastLineToFile(PIDMap map[string]string, sshClient *ssh.ConnSSH) error { + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + neType := PIDMap["neType"] + neId := PIDMap["neId"] + taskCode := PIDMap["taskCode"] + // 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241 + sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") + neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neType), neId, taskCode) + + lastLineMap := s.logFileLastLine(neType, sshClient) + for lastLogFile, lastFileLine := range lastLineMap { + for startLogFile, startFileLine := range PIDMap { + if lastLogFile == startLogFile && lastFileLine != "" { + if startFileLine == "" { + startFileLine = "1" // 起始行号从第一行开始 + } + outputFile := fmt.Sprintf("%s/%s", neDirTemp, filepath.Base(lastLogFile)) + sendCmd := fmt.Sprintf("sed -n \"%s,%sp\" \"%s\" > \"%s\"", startFileLine, lastFileLine, lastLogFile, outputFile) + // sed -n "1,5p" "/var/log/amf.log" > "/tmp/omc/tcpdump/amf/001/20241008141336/amf.log" + output, err := sshClient.RunCMD(sendCmd) + if err != nil || strings.HasPrefix(output, "stderr:") { + logger.Errorf("logFileLastLineToFile err: %s => %s", strings.TrimSpace(output), err.Error()) + continue + } + } + } + } + return nil +} + +// UPFTrace UPF标准版内部抓包 +func (s *TCPdump) UPFTrace(neType, neId, cmdStr string) (string, error) { + // 命令检查 + if strings.Contains(cmdStr, "file") { + return "", fmt.Errorf("command cannot contain file") + } + + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId || neInfo.IP == "" { + return "", fmt.Errorf("app.common.noNEInfo") + } + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", err + } + defer sshClient.Close() + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UPF", neInfo.NeId, 2) + if err != nil { + return "", err + } + defer telnetClient.Close() + + // 命令拼装 + fileName := fmt.Sprintf("%s_%s_part_%s.pcap ", neInfo.NeType, neInfo.NeId, time.Now().Format("20060102150405")) + pcapCmd := fmt.Sprintf("%s\r\n", cmdStr) + // 以off结尾是停止抓包,不需要写文件 + if !strings.Contains(cmdStr, "off") { + // pcap trace rx tx max 100000 intfc any file UPF_001_part_20240817164516.pcap + pcapCmd = fmt.Sprintf("%s file %s\r\n", cmdStr, fileName) + } + // 发送命令 UPF内部默认输出路径/tmp只能写文件名 + // pcap trace rx tx max 100000 intfc any file upf_test.pcap + // pcap trace rx tx off + output, err := telnetClient.RunCMD(pcapCmd) + if err != nil { + logger.Warnf("DumpUPF err: %s => %s", output, err.Error()) + return "", err + } + + // 结果截取 + arr := strings.Split(output, "\r\n") + if len(arr) == 2 { + return "", fmt.Errorf("trace pacp run failed") + } + if len(arr) > 3 { + resMsg := arr[2] + // pcap trace: unknown input `f file UPF_001_part_2024-08-19...' + // pcap trace: dispatch trace already enabled... + // pcap trace: dispatch trace already disabled... + // pcap trace: No packets captured... + // Write 100000 packets to /tmp/UPF_001_part_20240817164516.pcap, and stop capture... + if strings.Contains(resMsg, "unknown input") { + return "", fmt.Errorf("trace pacp unknown input") + } + if strings.Contains(resMsg, "already enabled") { + return "", fmt.Errorf("trace pacp already running") + } + if strings.Contains(resMsg, "already disabled") { + return "", fmt.Errorf("trace pacp not running") + } + if strings.Contains(resMsg, "No packets") { + return "", fmt.Errorf("trace pacp not packets") + } + if strings.Contains(resMsg, "packets to") { + matches := regexp.MustCompile(`(/tmp/[^,\s]+)`).FindStringSubmatch(resMsg) + if len(matches) == 0 { + return "", fmt.Errorf("file path not found") + } + return matches[0], nil + } + } + return "trace pacp running", nil } diff --git a/src/modules/trace/service/tcpdump.impl.go b/src/modules/trace/service/tcpdump.impl.go deleted file mode 100644 index 51042c8..0000000 --- a/src/modules/trace/service/tcpdump.impl.go +++ /dev/null @@ -1,248 +0,0 @@ -package service - -import ( - "fmt" - "os" - "path/filepath" - "regexp" - "runtime" - "strings" - "sync" - "time" - - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/file" - neService "nms_cxy/src/modules/network_element/service" -) - -// 实例化服务层 TcpdumpImpl 结构体 -var NewTcpdumpImpl = &TcpdumpImpl{ - neInfoService: neService.NewNeInfoImpl, -} - -// 信令抓包 服务层处理 -type TcpdumpImpl struct { - // 网元信息服务 - neInfoService neService.INeInfo -} - -// 抓包进程PID -var dumpPIDMap sync.Map - -// DumpStart 触发tcpdump开始抓包 -func (s *TcpdumpImpl) DumpStart(neType, neId, cmdStr string) (string, error) { - // 命令检查 - if strings.Contains(cmdStr, "w") { - return "", fmt.Errorf("command cannot contain -w") - } - - // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId || neInfo.IP == "" { - return "", fmt.Errorf("app.common.noNEInfo") - } - // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", err - } - defer sshClient.Close() - - // 检查是否安装tcpdump - if msg, err := sshClient.RunCMD("sudo tcpdump --version"); err != nil { - // bash: tcpdump: command not found - msg = strings.TrimSpace(msg) - logger.Errorf("DumpStart err: %s => %s", msg, err.Error()) - return "", fmt.Errorf(msg) - } - - taskCode := time.Now().Format("20060102150405") - // 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241 - neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo chmod 777 -R /tmp/omc", neDirTemp)) - - // 命令拼装 - logPath := fmt.Sprintf("%s/tcpdump.log", neDirTemp) - filePath := fmt.Sprintf("%s/part_%s.pcap ", neDirTemp, taskCode) - if strings.Contains(cmdStr, "-G") { - filePath = fmt.Sprintf("%s/part_%%Y%%m%%d%%H%%M%%S.pcap ", neDirTemp) - } - sendCmd := fmt.Sprintf("sudo timeout 60m sudo tcpdump -i any %s -w %s > %s 2>&1 & echo $!", cmdStr, filePath, logPath) - // sudo timeout 60m sudo tcpdump -i any -n -s 0 -v -G 60 -W 6 -w /tmp/omc/tcpdump/udm/001/20240817104241/part_%Y-%m-%d_%H:%M:%S.pcap > /tmp/omc/tcpdump/udm/001/20240817104241/tcpdump.log 2>&1 & echo $! - // sudo timeout 60m sudo tcpdump -i any -n -s 0 -v -w /tmp/omc/tcpdump/udm/001/20240817105440/part_2024-08-17_10:54:40.pcap > /tmp/omc/tcpdump/udm/001/20240817105440/tcpdump.log 2>&1 & echo $! - // - // timeout 超时60分钟后发送kill命令,1分钟后强制终止命令。tcpdump -G 文件轮转间隔时间(秒) -W 文件轮转保留最近数量 - // sudo timeout --kill-after=1m 60m sudo tcpdump -i any -n -s 0 -v -G 10 -W 7 -w /tmp/part_%Y%m%d%H%M%S.pcap > /tmp/part.log 2>&1 & echo $! - // sudo kill $(pgrep -P 722729) - outputPID, err := sshClient.RunCMD(sendCmd) - outputPID = strings.TrimSpace(outputPID) - if err != nil || strings.HasPrefix(outputPID, "stderr:") { - logger.Errorf("DumpStart err: %s => %s", outputPID, err.Error()) - return "", err - } - - // 检查进程 ps aux | grep tcpdump - // 强杀 sudo pkill tcpdump - pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) - dumpPIDMap.Store(pidKey, outputPID) - return taskCode, err -} - -// DumpStop 停止已存在抓包句柄 -func (s *TcpdumpImpl) DumpStop(neType, neId, taskCode string) (string, error) { - // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId || neInfo.IP == "" { - return "", fmt.Errorf("app.common.noNEInfo") - } - // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", err - } - defer sshClient.Close() - - // 是否存在执行过的进程 - pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) - pid, ok := dumpPIDMap.Load(pidKey) - if !ok || pid == "" { - return "", fmt.Errorf("tcpdump is not running") - } - defer dumpPIDMap.Delete(pidKey) - - // 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241 - neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) - // 命令拼装 - sendCmd := fmt.Sprintf("pids=$(pgrep -P %s) && [ -n \"$pids\" ] && sudo kill $pids;sudo timeout 2s cat %s/tcpdump.log", pid, neDirTemp) - // pids=$(pgrep -P 1914341) && [ -n "$pids" ] && sudo kill $pids;sudo timeout 2s cat tcpdump.log - output, err := sshClient.RunCMD(sendCmd) - if err != nil || strings.HasPrefix(output, "stderr:") { - logger.Warnf("DumpStop err: %s => %s", strings.TrimSpace(output), err.Error()) - return "", err - } - return output, nil -} - -// DumpDownload 抓包文件网元端复制到本地输出zip文件 -func (s *TcpdumpImpl) DumpDownload(neType, neId, taskCode string) (string, error) { - // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId || neInfo.IP == "" { - return "", fmt.Errorf("app.common.noNEInfo") - } - // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - localDirPath := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s", neTypeLower, neInfo.NeId) - if runtime.GOOS == "windows" { - localDirPath = fmt.Sprintf("C:%s", localDirPath) - } - - // 网元pcap目录 /tmp/omc/tcpdump/udm/001/20240817104241 - sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") - neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", neTypeLower, neInfo.NeId, taskCode) - // 网元端复制到本地 - localDirFilePath := filepath.Join(localDirPath, taskCode) - if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirFilePath); err != nil { - return "", fmt.Errorf("copy tcpdump file err") - } - - // 压缩zip文件名 - zipFileName := fmt.Sprintf("%s-%s-pcap-%s.zip", neTypeLower, neInfo.NeId, taskCode) - zipFilePath := filepath.Join(localDirPath, zipFileName) - if err := file.CompressZipByDir(zipFilePath, localDirFilePath); err != nil { - return "", fmt.Errorf("compress zip err") - } - - _ = os.RemoveAll(localDirFilePath) // 删除本地临时目录 - return zipFilePath, nil -} - -// UPFTrace UPF标准版内部抓包 -func (s *TcpdumpImpl) UPFTrace(neType, neId, cmdStr string) (string, error) { - // 命令检查 - if strings.Contains(cmdStr, "file") { - return "", fmt.Errorf("command cannot contain file") - } - - // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId || neInfo.IP == "" { - return "", fmt.Errorf("app.common.noNEInfo") - } - // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", err - } - defer sshClient.Close() - // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient("UPF", neInfo.NeId, 2) - if err != nil { - return "", err - } - defer telnetClient.Close() - - // 命令拼装 - fileName := fmt.Sprintf("%s_%s_part_%s.pcap ", neInfo.NeType, neInfo.NeId, time.Now().Format("20060102150405")) - pcapCmd := fmt.Sprintf("%s\r\n", cmdStr) - // 以off结尾是停止抓包,不需要写文件 - if !strings.Contains(cmdStr, "off") { - // pcap trace rx tx max 100000 intfc any file UPF_001_part_20240817164516.pcap - pcapCmd = fmt.Sprintf("%s file %s\r\n", cmdStr, fileName) - } - // 发送命令 UPF内部默认输出路径/tmp只能写文件名 - // pcap trace rx tx max 100000 intfc any file upf_test.pcap - // pcap trace rx tx off - output, err := telnetClient.RunCMD(pcapCmd) - if err != nil { - logger.Warnf("DumpUPF err: %s => %s", output, err.Error()) - return "", err - } - - // 结果截取 - arr := strings.Split(output, "\r\n") - if len(arr) == 2 { - return "", fmt.Errorf("trace pacp run failed") - } - if len(arr) > 3 { - resMsg := arr[2] - // pcap trace: unknown input `f file UPF_001_part_2024-08-19...' - // pcap trace: dispatch trace already enabled... - // pcap trace: dispatch trace already disabled... - // pcap trace: No packets captured... - // Write 100000 packets to /tmp/UPF_001_part_20240817164516.pcap, and stop capture... - if strings.Contains(resMsg, "unknown input") { - return "", fmt.Errorf("trace pacp unknown input") - } - if strings.Contains(resMsg, "already enabled") { - return "", fmt.Errorf("trace pacp already running") - } - if strings.Contains(resMsg, "already disabled") { - return "", fmt.Errorf("trace pacp not running") - } - if strings.Contains(resMsg, "No packets") { - return "", fmt.Errorf("trace pacp not packets") - } - if strings.Contains(resMsg, "packets to") { - matches := regexp.MustCompile(`(/tmp/[^,\s]+)`).FindStringSubmatch(resMsg) - if len(matches) == 0 { - return "", fmt.Errorf("file path not found") - } - return matches[0], nil - } - } - return "trace pacp running", nil -} diff --git a/src/modules/trace/service/trace_data.go b/src/modules/trace/service/trace_data.go new file mode 100644 index 0000000..4a9ee7c --- /dev/null +++ b/src/modules/trace/service/trace_data.go @@ -0,0 +1,54 @@ +package service + +import ( + "fmt" + + "be.ems/src/modules/trace/model" + "be.ems/src/modules/trace/repository" +) + +// 实例化数据层 TraceData 结构体 +var NewTraceData = &TraceData{ + traceDataRepository: repository.NewTraceData, +} + +// TraceData 跟踪_数据 服务层处理 +type TraceData struct { + // 跟踪_数据信息 + traceDataRepository *repository.TraceData +} + +// SelectPage 根据条件分页查询 +func (r *TraceData) SelectPage(query map[string]any) map[string]any { + return r.traceDataRepository.SelectPage(query) +} + +// SelectById 通过ID查询 +func (r *TraceData) SelectById(id string) model.TraceData { + tasks := r.traceDataRepository.SelectByIds([]string{id}) + if len(tasks) > 0 { + return tasks[0] + } + return model.TraceData{} +} + +// Insert 新增信息 +func (r *TraceData) Insert(task model.TraceData) string { + return r.traceDataRepository.Insert(task) +} + +// DeleteByIds 批量删除信息 +func (r *TraceData) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rows := r.traceDataRepository.SelectByIds(ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(rows) == len(ids) { + rows := r.traceDataRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go new file mode 100644 index 0000000..15f0997 --- /dev/null +++ b/src/modules/trace/service/trace_task.go @@ -0,0 +1,343 @@ +package service + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "net" + "strings" + + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/socket" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/trace/model" + "be.ems/src/modules/trace/repository" + wsService "be.ems/src/modules/ws/service" +) + +// 实例化数据层 TraceTask 结构体 +var NewTraceTask = &TraceTask{ + udpService: socket.SocketUDP{}, + traceTaskRepository: repository.NewTraceTask, + traceDataRepository: repository.NewTraceData, +} + +// TraceTask 跟踪任务 服务层处理 +type TraceTask struct { + // UDP服务对象 + udpService socket.SocketUDP + // 跟踪_任务数据信息 + traceTaskRepository *repository.TraceTask + // 跟踪_数据信息 + traceDataRepository *repository.TraceData +} + +// CreateUDP 创建UDP数据通道 +func (r *TraceTask) CreateUDP() error { + // 跟踪配置是否开启 + if v := config.Get("trace.enabled"); v != nil { + if !v.(bool) { + return nil + } + } + host := "127.0.0.1" + if v := config.Get("trace.host"); v != nil { + host = v.(string) + } + var port int64 = 33033 + if v := config.Get("trace.port"); v != nil { + port = parse.Number(v) + } + + // 初始化UDP服务 + r.udpService = socket.SocketUDP{Addr: host, Port: port} + if _, err := r.udpService.New(); err != nil { + return err + } + + // 接收处理UDP数据 + go r.udpService.Resolve(func(conn *net.UDPConn, err error) { + if err != nil { + logger.Errorf("UDP Resolve %s", err.Error()) + return + } + + // 读取数据 + buf := make([]byte, 2048) + n, addr, err := conn.ReadFromUDPAddrPort(buf) + if err != nil { + logger.Errorf("UDP Resolve ReadFromUDPAddrPort Error: %s", err.Error()) + return + } + + logger.Infof("socket UDP: %s", string(buf[:n])) + // logger.Infof("socket UDP Base64: %s", base64.StdEncoding.EncodeToString(buf[:n])) + mData, err := UDPDataHandler(buf, n) + if err != nil { + logger.Errorf("UDP Resolve UDPDataHandler Error: %s", err.Error()) + return + } + taskId := parse.Number(mData["taskId"]) + + // 插入数据库做记录 + r.traceDataRepository.Insert(model.TraceData{ + TaskId: taskId, + IMSI: mData["imsi"].(string), + SrcAddr: mData["srcAddr"].(string), + DstAddr: mData["dstAddr"].(string), + IfType: parse.Number(mData["ifType"]), + MsgType: parse.Number(mData["msgType"]), + MsgDirect: parse.Number(mData["msgDirect"]), + Length: parse.Number(mData["dataLen"]), + RawMsg: mData["dataInfo"].(string), + Timestamp: parse.Number(mData["timestamp"]), + DecMsg: mData["decMsg"].(string), + }) + + // 推送文件 + if v, ok := mData["pcapFile"]; ok && v != "" { + logger.Infof("pcapFile: %s", v) + wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE_NE, taskId), taskId) + } + + // 发送响应 + if _, err := conn.WriteToUDPAddrPort([]byte("udp>"), addr); err != nil { + logger.Errorf("UDP Resolve WriteToUDPAddrPort Error: %s", err.Error()) + } + }) + + // ============ 测试接收网元UDP发过来的数据 + // 初始化TCP服务 后续调整TODO + tcpService := socket.SocketTCP{Addr: host, Port: port + 1} + if _, err := tcpService.New(); err != nil { + return err + } + // 接收处理TCP数据 + go tcpService.Resolve(func(conn *net.Conn, err error) { + if err != nil { + logger.Errorf("TCP Resolve %s", err.Error()) + return + } + + c := (*conn) + // 读取数据 + buf := make([]byte, 2048) + n, err := c.Read(buf) + if err != nil { + logger.Errorf("TCP Resolve Read Error: %s", err.Error()) + return + } + + logger.Infof("socket TCP: %s", string(buf[:n])) + deData, _ := base64.StdEncoding.DecodeString(string(buf[:n])) + logger.Infof("socket TCP Base64: %s", deData) + mData, err := UDPDataHandler(deData, len(deData)) + if err != nil { + logger.Errorf("TCP Resolve UDPDataHandler Error: %s", err.Error()) + return + } + taskId := parse.Number(mData["taskId"]) + + // 插入数据库做记录 + r.traceDataRepository.Insert(model.TraceData{ + TaskId: taskId, + IMSI: mData["imsi"].(string), + SrcAddr: mData["srcAddr"].(string), + DstAddr: mData["dstAddr"].(string), + IfType: parse.Number(mData["ifType"]), + MsgType: parse.Number(mData["msgType"]), + MsgDirect: parse.Number(mData["msgDirect"]), + Length: parse.Number(mData["dataLen"]), + RawMsg: mData["dataInfo"].(string), + Timestamp: parse.Number(mData["timestamp"]), + DecMsg: mData["decMsg"].(string), + }) + + // 推送文件 + if v, ok := mData["pcapFile"]; ok && v != "" { + logger.Infof("pcapFile: %s", v) + wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE_NE, taskId), taskId) + } + + // 发送响应 + if _, err = c.Write([]byte("tcp>")); err != nil { + logger.Errorf("TCP Resolve Write Error: %s", err.Error()) + } + }) + return nil +} + +// CloseUDP 关闭UDP数据通道 +func (r *TraceTask) CloseUDP() { + r.udpService.Close() +} + +// SelectPage 根据条件分页查询 +func (r *TraceTask) SelectPage(query map[string]any) map[string]any { + return r.traceTaskRepository.SelectPage(query) +} + +// SelectById 通过ID查询 +func (r *TraceTask) SelectById(id string) model.TraceTask { + tasks := r.traceTaskRepository.SelectByIds([]string{id}) + if len(tasks) > 0 { + return tasks[0] + } + return model.TraceTask{} +} + +// Insert 新增信息 +func (r *TraceTask) Insert(task model.TraceTask) error { + // 跟踪配置是否开启 + if v := config.Get("trace.enabled"); v != nil { + if !v.(bool) { + return fmt.Errorf("tracking is not enabled") + } + } + host := "127.0.0.1" + if v := config.Get("trace.host"); v != nil { + host = v.(string) + } + var port int64 = 33033 + if v := config.Get("trace.port"); v != nil { + port = parse.Number(v) + } + task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) + + // 查询网元获取IP + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + if neInfo.NeId != task.NeId || neInfo.IP == "" { + return fmt.Errorf("app.common.noNEInfo") + } + traceId := r.traceTaskRepository.LastID() + 1 // 生成任务ID < 65535 + task.TraceId = fmt.Sprint(traceId) + + // 发送任务给网元 + data := map[string]any{ + "neType": neInfo.NeType, + "neId": neInfo.NeId, + "notifyUrl": task.NotifyUrl, + "id": traceId, + "startTime": date.ParseDateToStr(task.StartTime, date.YYYY_MM_DD_HH_MM_SS), + "endTime": date.ParseDateToStr(task.EndTime, date.YYYY_MM_DD_HH_MM_SS), + } + switch task.TraceType { + case "1": // Interface + data["traceType"] = "Interface" + data["interfaces"] = strings.Split(task.Interfaces, ",") + case "2": // Device + data["traceType"] = "Device" + data["ueIp"] = task.UeIp + data["srcIp"] = task.SrcIp + data["dstIp"] = task.DstIp + data["signalPort"] = task.SignalPort + task.UeIp = neInfo.IP + case "3": // UE + data["traceType"] = "UE" + data["imsi"] = task.IMSI + data["msisdn"] = task.MSISDN + default: + return fmt.Errorf("trace type is not disabled") + } + msg, err := neFetchlink.NeTraceAdd(neInfo, data) + if err != nil { + return err + } + s, _ := json.Marshal(msg) + task.FetchMsg = string(s) + + // 插入数据库 + r.traceTaskRepository.Insert(task) + return nil +} + +// Update 修改信息 +func (r *TraceTask) Update(task model.TraceTask) error { + // 跟踪配置是否开启 + if v := config.Get("trace.enabled"); v != nil { + if !v.(bool) { + return fmt.Errorf("tracking is not enabled") + } + } + host := "127.0.0.1" + if v := config.Get("trace.host"); v != nil { + host = v.(string) + } + var port int64 = 33033 + if v := config.Get("trace.port"); v != nil { + port = parse.Number(v) + } + task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) + + // 查询网元获取IP + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + if neInfo.NeId != task.NeId || neInfo.IP == "" { + return fmt.Errorf("app.common.noNEInfo") + } + + // 查询网元任务信息 + if msg, err := neFetchlink.NeTraceInfo(neInfo, task.TraceId); err == nil { + s, _ := json.Marshal(msg) + task.FetchMsg = string(s) + // 修改任务信息 + data := map[string]any{ + "neType": neInfo.NeType, + "neId": neInfo.NeId, + "notifyUrl": task.NotifyUrl, + "id": parse.Number(task.TraceId), + "startTime": date.ParseDateToStr(task.StartTime, date.YYYY_MM_DD_HH_MM_SS), + "endTime": date.ParseDateToStr(task.EndTime, date.YYYY_MM_DD_HH_MM_SS), + } + switch task.TraceType { + case "1": // Interface + data["traceType"] = "Interface" + data["interfaces"] = strings.Split(task.Interfaces, ",") + case "2": // Device + task.UeIp = neInfo.IP + data["traceType"] = "Device" + data["ueIp"] = task.UeIp + data["srcIp"] = task.SrcIp + data["dstIp"] = task.DstIp + data["signalPort"] = task.SignalPort + case "3": // UE + data["traceType"] = "UE" + data["imsi"] = task.IMSI + data["msisdn"] = task.MSISDN + default: + return fmt.Errorf("trace type is not disabled") + } + neFetchlink.NeTraceEdit(neInfo, data) + } + + // 更新数据库 + r.traceTaskRepository.Update(task) + return nil +} + +// DeleteByIds 批量删除信息 +func (r *TraceTask) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rows := r.traceTaskRepository.SelectByIds(ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(rows) == len(ids) { + // 停止任务 + for _, v := range rows { + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(v.NeType, v.NeId) + if neInfo.NeId != v.NeId || neInfo.IP == "" { + continue + } + neFetchlink.NeTraceDelete(neInfo, v.TraceId) + } + num := r.traceTaskRepository.DeleteByIds(ids) + return num, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go new file mode 100644 index 0000000..9eee384 --- /dev/null +++ b/src/modules/trace/service/trace_task_hlr.go @@ -0,0 +1,206 @@ +package service + +import ( + "encoding/json" + "fmt" + "path/filepath" + + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/ssh" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/trace/model" + "be.ems/src/modules/trace/repository" +) + +// 实例化数据层 TraceTaskHlr 结构体 +var NewTraceTaskHlr = &TraceTaskHlr{ + traceTaskHlrRepository: repository.NewTraceTaskHlr, + neInfoService: neService.NewNeInfo, +} + +// TraceTaskHlr 跟踪_任务给HRL网元 服务层处理 +type TraceTaskHlr struct { + traceTaskHlrRepository *repository.TraceTaskHlr // 跟踪_任务给HRL网元数据信息 + neInfoService *neService.NeInfo // 网元信息服务 +} + +// SelectPage 根据条件分页查询 +func (r *TraceTaskHlr) SelectPage(querys model.TraceTaskHlrQuery) map[string]any { + return r.traceTaskHlrRepository.SelectPage(querys) +} + +// SelectById 通过ID查询 +func (r *TraceTaskHlr) SelectById(id string) model.TraceTaskHlr { + tasks := r.traceTaskHlrRepository.SelectByIds([]string{id}) + if len(tasks) > 0 { + return tasks[0] + } + return model.TraceTaskHlr{} +} + +// Insert 新增信息 +func (r *TraceTaskHlr) Insert(task model.TraceTaskHlr) string { + return r.traceTaskHlrRepository.Insert(task) +} + +// Update 修改信息 +func (r *TraceTaskHlr) Update(task model.TraceTaskHlr) int64 { + return r.traceTaskHlrRepository.Update(task) +} + +// DeleteByIds 批量删除信息 +func (r *TraceTaskHlr) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rows := r.traceTaskHlrRepository.SelectByIds(ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(rows) == len(ids) { + // 停止任务 + neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "UDM"}, false, false) + for _, r := range rows { + if r.Status == "0" { + continue + } + for _, v := range neInfos { + neFetchlink.HLRTraceStop(v, map[string]any{ + "traceIDArray": []string{r.TraceId}, + }) + } + } + num := r.traceTaskHlrRepository.DeleteByIds(ids) + return num, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// Start 创建任务 +func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { + hlrList := []map[string]any{} + traceId := r.traceTaskHlrRepository.LastID() + 1 // 生成任务ID < 65535 + data := map[string]any{ + "traceID": traceId, + "imsi": task.IMSI, + "msisdn": task.MSISDN, + } + if task.StartTime > task.EndTime { + return "", fmt.Errorf("startTime must less than endTime") + } + if task.StartTime > 0 { + data["startTime"] = date.ParseDateToStr(task.StartTime, date.YYYY_MM_DDTHH_MM_SSZ) + } + if task.StartTime > 0 { + data["endTime"] = date.ParseDateToStr(task.EndTime, date.YYYY_MM_DDTHH_MM_SSZ) + } + + // 发送创建任务 + neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "UDM"}, false, false) + for _, neInfo := range neInfos { + hlrItem := map[string]any{ + "neType": neInfo.NeType, + "neId": neInfo.NeId, + "msg": "", + } + msg, err := neFetchlink.HLRTraceStart(neInfo, data) + if err != nil { + hlrItem["err"] = err.Error() + } else { + hlrItem["err"] = msg + } + hlrList = append(hlrList, hlrItem) + } + + msg, _ := json.Marshal(hlrList) + task.Msg = string(msg) + task.Status = "1" + task.TraceId = fmt.Sprint(traceId) + id := r.traceTaskHlrRepository.Insert(task) + if id == "" { + return "", fmt.Errorf("start task fail") + } + return id, nil +} + +// Stop 停止任务 +func (r *TraceTaskHlr) Stop(task model.TraceTaskHlr) error { + hlrList := []map[string]any{} + // 发送停止任务 + neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "UDM"}, false, false) + for _, neInfo := range neInfos { + hlrItem := map[string]any{ + "neType": neInfo.NeType, + "neId": neInfo.NeId, + "msg": "", + } + msg, err := neFetchlink.HLRTraceStop(neInfo, map[string]any{ + "traceIDArray": []string{task.TraceId}, + }) + if err != nil { + hlrItem["err"] = err.Error() + } else { + hlrItem["err"] = msg + } + hlrList = append(hlrList, hlrItem) + } + + msg, _ := json.Marshal(hlrList) + task.Msg = string(msg) + task.Status = "0" + rows := r.traceTaskHlrRepository.Update(task) + if rows <= 0 { + return fmt.Errorf("stop task fail") + } + return nil +} + +// File 任务文件 +func (r *TraceTaskHlr) File(traceId, dirPath string) ([]map[string]any, error) { + hlrList := []map[string]any{} + // 查询所有匹配的网元类型 + neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "UDM"}, false, false) + if len(neInfos) == 0 { + return nil, fmt.Errorf("not found network element") + } + + // 遍历多个网元主机获取文件 + for _, neInfo := range neInfos { + hlrItem := map[string]any{ + "neType": neInfo.NeType, + "neId": neInfo.NeId, + "neName": neInfo.NeName, + "err": "", + } + + // 网元主机的SSH客户端 + sshClient, err := r.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + hlrItem["err"] = "ssh link fail" + hlrList = append(hlrList, hlrItem) + continue + } + defer sshClient.Close() + + // 获取文件列表 + fileName := fmt.Sprintf("%s_%s", neInfo.NeName, traceId) + rows, err := ssh.FileList(sshClient, filepath.ToSlash(dirPath), fileName) + if err != nil { + hlrItem["err"] = "file not found" + hlrList = append(hlrList, hlrItem) + continue + } + + // 遍历组装 + for _, v := range rows { + if v.FileType == "file" { + hlrItem["fileName"] = v.FileName + hlrItem["filePath"] = filepath.ToSlash(filepath.Join(dirPath, v.FileName)) + hlrList = append(hlrList, hlrItem) + } + } + } + return hlrList, nil +} diff --git a/src/modules/trace/service/trace_task_udp_data.go b/src/modules/trace/service/trace_task_udp_data.go new file mode 100644 index 0000000..2f007f3 --- /dev/null +++ b/src/modules/trace/service/trace_task_udp_data.go @@ -0,0 +1,334 @@ +package service + +import ( + "encoding/base64" + "encoding/binary" + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "time" + + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" +) + +const ( + GTPU_V1_VERSION = 1 << 5 + GTPU_VER_MASK = 7 << 5 + GTPU_PT_GTP = 1 << 4 + GTPU_HEADER_LEN = 12 + GTPU_E_S_PB_BIT = 7 + GTPU_E_BI = 1 << 2 +) + +const ( + GTPU_HEADER_VERSION_INDEX = 0 + GTPU_HEADER_MSG_TYPE_INDEX = 1 + GTPU_HEADER_LENGTH_INDEX = 2 + GTPU_HEADER_TEID_INDEX = 4 +) + +type ExtHeader struct { + TaskId uint32 + IMSI string + IfType int + MsgType int + MsgDirect int // 0-recv,1-send + TimeStamp int64 + SrcIP string + DstIP string + SrcPort uint16 + DstPort uint16 + Proto int // Protocol + PPI int // only for SCTP + DataLen uint16 + DataInfo []byte +} + +// parseUDPData 解析UDP数据 +func parseUDPData(rvMsg []byte, rvLen int) (ExtHeader, error) { + var extHdr ExtHeader + // var tr dborm.TraceData + var off int + msg := rvMsg + + verFlags := msg[GTPU_HEADER_VERSION_INDEX] + + gtpuHdrLen := GTPU_HEADER_LEN + + localTeid := binary.BigEndian.Uint32(msg[GTPU_HEADER_TEID_INDEX:]) + + extHdr.TaskId = localTeid + + if (verFlags & GTPU_E_S_PB_BIT) != 0 { + if (verFlags & GTPU_E_BI) != 0 { + extTypeIndex := GTPU_HEADER_LEN - 1 + + extType := msg[extTypeIndex] + + if extType == 0xFE { + extHdr.IMSI = string(msg[extTypeIndex+2 : extTypeIndex+17]) + extHdr.IfType = int(msg[extTypeIndex+17]) + extHdr.MsgType = int(msg[extTypeIndex+18]) + extHdr.MsgDirect = int(msg[extTypeIndex+19]) + + extHdr.TimeStamp = time.Now().UTC().UnixMilli() + // extHdr.TimeStamp = int64(binary.BigEndian.Uint64(msg[extTypeIndex+19:])) + // fmt.Printf("ext info %v %s %d %d %d \n", msg[(extTypeIndex+2):(extTypeIndex+20)], extHdr.IMSI, extHdr.IfType, extHdr.MsgType, extHdr.MsgDirect) + // set offset of IP Packet + off = 40 + 4 + //src ip: msg+40+12 + extHdr.SrcIP = fmt.Sprintf("%d.%d.%d.%d", msg[off+12], msg[off+13], msg[off+14], msg[off+15]) + //dst ip: msg+40+12+4 + extHdr.DstIP = fmt.Sprintf("%d.%d.%d.%d", msg[off+16], msg[off+17], msg[off+18], msg[off+19]) + extHdr.SrcPort = uint16(binary.BigEndian.Uint16(msg[off+20:])) + extHdr.DstPort = uint16(binary.BigEndian.Uint16(msg[off+22:])) + // fmt.Printf("info %s:%d %s:%d \n", extHdr.SrcIP, extHdr.SrcPort, extHdr.DstIP, extHdr.DstPort) + // ip header start msg+40 + extHdr.DataLen = uint16(rvLen - off) + extHdr.DataInfo = make([]byte, int(rvLen-off)) + copy(extHdr.DataInfo, []byte(msg[off:])) + + // 132 SCTP + // 6 TCP + // 17 UDP + extHdr.Proto = int(msg[off+9]) + if extHdr.Proto == 132 { + extHdr.PPI = int(msg[off+47]) + extHdr.DataLen = uint16(binary.BigEndian.Uint16(msg[(off+34):]) - 16) + // fmt.Printf("dat len %d %d \n", extHdr.DataLen, extHdr.PPI) + } + } + + for extType != 0 && extTypeIndex < rvLen { + extLen := msg[extTypeIndex+1] << 2 + if extLen == 0 { + return extHdr, fmt.Errorf("error, extLen is zero") + } + + gtpuHdrLen += int(extLen) + extTypeIndex += int(extLen) + extType = msg[extTypeIndex] + } + } + } else { + gtpuHdrLen -= 4 + } + return extHdr, nil +} + +// UDPDataHandler UDP数据处理 +func UDPDataHandler(data []byte, n int) (map[string]any, error) { + extHdr, err := parseUDPData(data, n) + if err != nil { + return nil, err + } + if extHdr.TaskId == 0 || extHdr.DataLen < 1 { + return nil, fmt.Errorf("data error") + } + + m := map[string]any{ + "taskId": extHdr.TaskId, + "imsi": extHdr.IMSI, + "ifType": extHdr.IfType, + "srcAddr": fmt.Sprintf("%s:%d", extHdr.SrcIP, extHdr.SrcPort), + "dstAddr": fmt.Sprintf("%s:%d", extHdr.DstIP, extHdr.DstPort), + "msgType": extHdr.MsgType, + "msgDirect": extHdr.MsgDirect, + "timestamp": extHdr.TimeStamp, + "dataLen": extHdr.DataLen, + // "dataInfo": extHdr.DataInfo, + "decMsg": "", + } + // Base64 编码 + m["dataInfo"] = base64.StdEncoding.EncodeToString(extHdr.DataInfo) + + if extHdr.Proto == 6 { // TCP + // 取响应数据 + iplen := uint16(binary.BigEndian.Uint16(extHdr.DataInfo[2:])) + tcplen := uint16(iplen - 32 - 20) + hdrlen := uint16(binary.BigEndian.Uint16(extHdr.DataInfo[20+32+1:])) + offset := uint16(52) + // fmt.Printf("HTTP %d %d %d \n", iplen, tcplen, hdrlen) + if tcplen > (hdrlen + 9) { // has data + doffset := uint16(offset + hdrlen + 9) + datlen := uint16(binary.BigEndian.Uint16(extHdr.DataInfo[doffset+1:])) + // fmt.Printf("HTTP datlen %d \n", datlen) + m["decMsg"], _ = httpDataMsg(extHdr.DataInfo[offset+9:offset+9+hdrlen], extHdr.DataInfo[doffset+9:doffset+datlen+9]) + } else { + m["decMsg"], _ = httpDataMsg(extHdr.DataInfo[offset+9:hdrlen], nil) + } + } + + // pcap文件 + m["pcapFile"] = writePcap(extHdr) + return m, nil +} + +// =========== TCP协议Body =========== + +// httpDataMsg Http数据信息处理 +func httpDataMsg(header []byte, data []byte) (string, error) { + var remainSize = uint32(16 << 20) + var sawRegular bool + var invalid bool // pseudo header field errors + var Fields []hpack.HeaderField + + invalid = false + hdec := hpack.NewDecoder(4096, nil) + hdec.SetEmitEnabled(true) + hdec.SetMaxStringLength(int(16 << 20)) + hdec.SetEmitFunc(func(hf hpack.HeaderField) { + if !httpguts.ValidHeaderFieldValue(hf.Value) { + // Don't include the value in the error, because it may be sensitive. + invalid = true + } + isPseudo := strings.HasPrefix(hf.Name, ":") + if isPseudo { + if sawRegular { + invalid = true + } + } else { + sawRegular = true + if !validWireHeaderFieldName(hf.Name) { + invalid = true + } + } + + if invalid { + hdec.SetEmitEnabled(false) + return + } + + size := hf.Size() + if size > remainSize { + hdec.SetEmitEnabled(false) + //mh.Truncated = true + return + } + remainSize -= size + + Fields = append(Fields, hf) + }) + + // defer hdec.SetEmitFunc(func(hf hpack.HeaderField) {}) + + frag := header + if _, err := hdec.Write(frag); err != nil { + return "", err + } + + if err := hdec.Close(); err != nil { + return "", err + } + + // hdec.SetEmitFunc(func(hf hpack.HeaderField) {}) + + var headers []byte + var line string + for i := range Fields { + line = fmt.Sprintf("\"%s\":\"%s\",", Fields[i].Name, Fields[i].Value) + headers = append(headers, []byte(line)...) + } + + if len(data) > 0 { + return fmt.Sprintf("{ %s \"content\":%s }", string(headers), string(data)), nil + } else { + return fmt.Sprintf("{ %s }", string(headers)), nil + } +} + +// validWireHeaderFieldName 校验报文头字段名称 +func validWireHeaderFieldName(v string) bool { + if len(v) == 0 { + return false + } + for _, r := range v { + if !httpguts.IsTokenRune(r) { + return false + } + if 'A' <= r && r <= 'Z' { + return false + } + } + return true +} + +// =========== writePcap 写Pcap文件 =========== + +const magicMicroseconds = 0xA1B2C3D4 +const versionMajor = 2 +const versionMinor = 4 + +func writeEmptyPcap(filename string, timeStamp int64, length int, data []byte) error { + var err error + var file *os.File + if err := os.MkdirAll(filepath.Dir(filename), 0775); err != nil { + return err + } + if _, err = os.Stat(filename); os.IsNotExist(err) { + file, err = os.Create(filename) + // File Header + var fileHeaderBuf [24]byte + binary.LittleEndian.PutUint32(fileHeaderBuf[0:4], magicMicroseconds) + binary.LittleEndian.PutUint16(fileHeaderBuf[4:6], versionMajor) + binary.LittleEndian.PutUint16(fileHeaderBuf[6:8], versionMinor) + // bytes 8:12 stay 0 (timezone = UTC) + // bytes 12:16 stay 0 (sigfigs is always set to zero, according to + // http://wiki.wireshark.org/Development/LibpcapFileFormat + binary.LittleEndian.PutUint32(fileHeaderBuf[16:20], 0x00040000) + binary.LittleEndian.PutUint32(fileHeaderBuf[20:24], 0x00000071) + if _, err := file.Write(fileHeaderBuf[:]); err != nil { + return err + } + } else { + file, err = os.OpenFile(filename, os.O_WRONLY|os.O_APPEND, 0666) + } + if err != nil { + return err + } + defer file.Close() + + // Packet Header + var packetHeaderBuf [24]byte + t := time.UnixMilli(timeStamp) + if t.IsZero() { + t = time.Now() + } + secs := t.Unix() + usecs := t.Nanosecond() / 1000 + binary.LittleEndian.PutUint32(packetHeaderBuf[0:4], uint32(secs)) + binary.LittleEndian.PutUint32(packetHeaderBuf[4:8], uint32(usecs)) + binary.LittleEndian.PutUint32(packetHeaderBuf[8:12], uint32(length+16)) + binary.LittleEndian.PutUint32(packetHeaderBuf[12:16], uint32(length+16)) + if _, err := file.Write(packetHeaderBuf[:]); err != nil { + return err + } + + // 数据包内容的定义 + cooked := [...]byte{0x00, 0x00, 0x03, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00} + if _, err := file.Write(cooked[:]); err != nil { + return err + } + + // Packet Data + if _, err := file.Write(data); err != nil { + return err + } + return nil +} + +// writePcap 写Pcap文件并返回文件路径 +func writePcap(extHdr ExtHeader) string { + filePath := fmt.Sprintf("/tmp/omc/trace/task_%d.pcap", extHdr.TaskId) + if runtime.GOOS == "windows" { + filePath = fmt.Sprintf("C:%s", filePath) + } + err := writeEmptyPcap(filePath, extHdr.TimeStamp, int(extHdr.DataLen), extHdr.DataInfo) + if err != nil { + return "" + } + return filePath +} diff --git a/src/modules/trace/trace.go b/src/modules/trace/trace.go index 743c939..0fe3b74 100644 --- a/src/modules/trace/trace.go +++ b/src/modules/trace/trace.go @@ -1,10 +1,11 @@ package trace import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/framework/middleware/collectlogs" - "nms_cxy/src/modules/trace/controller" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/modules/trace/controller" + "be.ems/src/modules/trace/service" "github.com/gin-gonic/gin" ) @@ -13,29 +14,131 @@ import ( func Setup(router *gin.Engine) { logger.Infof("开始加载 ====> trace 模块路由") - traceGroup := router.Group("/trace") + // 启动时需要的初始参数 + InitLoad() // 信令抓包 - tcpdumpGroup := traceGroup.Group("/tcpdump") + tcpdumpGroup := router.Group("/trace/tcpdump") { tcpdumpGroup.POST("/start", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.tcpdump", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewTcpdump.DumpStart, + controller.NewTCPdump.DumpStart, ) tcpdumpGroup.POST("/stop", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.tcpdump", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewTcpdump.DumpStop, - ) - tcpdumpGroup.GET("/download", - middleware.PreAuthorize(nil), - controller.NewTcpdump.DumpDownload, + controller.NewTCPdump.DumpStop, ) tcpdumpGroup.POST("/upf", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.tcpdump", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewTcpdump.UPFTrace, + controller.NewTCPdump.UPFTrace, + ) + } + + // 信令跟踪 + packetGroup := router.Group("/trace/packet") + { + packetGroup.GET("/devices", + middleware.PreAuthorize(nil), + controller.NewPacket.Devices, + ) + packetGroup.POST("/start", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.packet", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewPacket.Start, + ) + packetGroup.POST("/stop", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.packet", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewPacket.Stop, + ) + packetGroup.PUT("/filter", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.packet", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewPacket.Filter, + ) + packetGroup.PUT("/keep-alive", + middleware.PreAuthorize(nil), + controller.NewPacket.KeepAlive, + ) + } + + // 跟踪任务 网元HLR (免登录) + taskHLRGroup := router.Group("/trace/task/hlr") + { + taskHLRGroup.GET("/list", + controller.NewTraceTaskHlr.List, + ) + taskHLRGroup.DELETE("/:ids", + controller.NewTraceTaskHlr.Remove, + ) + taskHLRGroup.POST("/start", + controller.NewTraceTaskHlr.Start, + ) + taskHLRGroup.POST("/stop", + controller.NewTraceTaskHlr.Stop, + ) + taskHLRGroup.POST("/file", + controller.NewTraceTaskHlr.File, + ) + taskHLRGroup.GET("/filePull", + controller.NewTraceTaskHlr.FilePull, + ) + } + + // 跟踪任务 + taskGroup := router.Group("/trace/task") + { + taskGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewTraceTask.List, + ) + taskGroup.GET("/:id", + middleware.PreAuthorize(nil), + controller.NewTraceTask.Info, + ) + taskGroup.POST("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.task", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewTraceTask.Add, + ) + taskGroup.PUT("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.task", collectlogs.BUSINESS_TYPE_UPDATE)), + controller.NewTraceTask.Edit, + ) + taskGroup.DELETE("/:ids", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.task", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewTraceTask.Remove, + ) + taskGroup.GET("/filePull", + middleware.PreAuthorize(nil), + controller.NewTraceTask.FilePull, + ) + } + + // 跟踪数据 + taskDataGroup := router.Group("/trace/data") + { + taskDataGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewTraceData.List, + ) + taskDataGroup.DELETE("/:ids", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.taskData", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewTraceData.Remove, ) } } + +// InitLoad 初始参数 +func InitLoad() { + // 创建跟踪任务信令数据通道UDP + if err := service.NewTraceTask.CreateUDP(); err != nil { + logger.Errorf("socket udp init fail: %s", err.Error()) + } +} diff --git a/src/modules/ws/controller/ws.go b/src/modules/ws/controller/ws.go index dc2fa5e..b0aece8 100644 --- a/src/modules/ws/controller/ws.go +++ b/src/modules/ws/controller/ws.go @@ -1,45 +1,32 @@ package controller import ( - "encoding/json" - "fmt" "strings" - "time" - neService "nms_cxy/src/modules/network_element/service" - - "nms_cxy/src/framework/i18n" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/ctx" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/utils/ssh" - "nms_cxy/src/framework/utils/telnet" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/ws/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/service" "github.com/gin-gonic/gin" ) // NewWSController 实例化控制层 WSController 结构体 var NewWSController = &WSController{ - wsService: service.NewWSImpl, - wsSendService: service.NewWSSendImpl, - neHostService: neService.NewNeHostImpl, - neInfoService: neService.NewNeInfoImpl, + wsService: service.NewWS, + wsSendService: service.NewWSSend, + wsReceiveService: service.NewWSReceive, } // WSController WebSocket通信 // // PATH /ws type WSController struct { - // WebSocket 服务 - wsService service.IWS - // WebSocket消息发送 服务 - wsSendService service.IWSSend - // 网元主机连接服务 - neHostService neService.INeHost - // 网元信息服务 - neInfoService neService.INeInfo + wsService *service.WS // WebSocket 服务 + wsSendService *service.WSSend // WebSocket消息发送 服务 + wsReceiveService *service.WSReceive // WebSocket消息接收 服务 } // WS 通用 @@ -76,7 +63,7 @@ func (s *WSController) WS(c *gin.Context) { wsClient := s.wsService.ClientCreate(loginUser.UserID, subGroupIDs, conn, nil) go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, service.ReceiveCommont) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Commont) // 等待停止信号 for value := range wsClient.StopChan { @@ -119,286 +106,3 @@ func (s *WSController) Test(c *gin.Context) { c.JSON(200, result.OkData(errMsgArr)) } - -// SSH 终端 -// -// GET /ssh?hostId=1&cols=80&rows=40 -func (s *WSController) SSH(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - HostId string `form:"hostId" binding:"required"` // 连接主机ID - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - if query.Cols < 80 || query.Cols > 400 { - query.Cols = 80 - } - if query.Rows < 40 || query.Rows > 1200 { - query.Rows = 40 - } - - // 登录用户信息 - loginUser, err := ctx.LoginUser(c) - if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) - return - } - - neHost := s.neHostService.SelectById(query.HostId) - if neHost.HostID != query.HostId || neHost.HostType != "ssh" { - // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) - return - } - - // 创建链接SSH客户端 - var connSSH ssh.ConnSSH - neHost.CopyTo(&connSSH) - var client *ssh.ConnSSH - var clientErr error - if neHost.AuthMode == "2" { - client, clientErr = connSSH.NewClientByLocalPrivate() - } else { - client, clientErr = connSSH.NewClient() - } - if clientErr != nil { - // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) - return - } - defer client.Close() - - // 创建SSH客户端会话 - clientSession, err := client.NewClientSession(query.Cols, query.Rows) - if err != nil { - // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) - return - } - defer clientSession.Close() - - // 将 HTTP 连接升级为 WebSocket 连接 - wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) - if wsConn == nil { - return - } - defer wsConn.Close() - - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) - go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, service.ReceiveShell) - - // 实时读取SSH消息直接输出 - msTicker := time.NewTicker(100 * time.Millisecond) - defer msTicker.Stop() - for { - select { - case ms := <-msTicker.C: - outputByte := clientSession.Read() - if len(outputByte) > 0 { - outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ - "requestId": fmt.Sprintf("ssh_%s_%d", neHost.HostID, ms.UnixMilli()), - "data": outputStr, - })) - wsClient.MsgChan <- msgByte - - // 退出ssh登录 - // if strings.LastIndex(outputStr, "logout\r\n") != -1 { - // time.Sleep(1 * time.Second) - // s.wsService.CloseClient(wsClient.ID) - // return - // } - } - case <-wsClient.StopChan: // 等待停止信号 - s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) - return - } - } -} - -// Telnet 终端 -// -// GET /telnet?hostId=1 -func (s *WSController) Telnet(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - HostId string `form:"hostId" binding:"required"` // 连接主机ID - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - if query.Cols < 120 || query.Cols > 400 { - query.Cols = 120 - } - if query.Rows < 128 || query.Rows > 1200 { - query.Rows = 128 - } - - // 登录用户信息 - loginUser, err := ctx.LoginUser(c) - if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) - return - } - - neHost := s.neHostService.SelectById(query.HostId) - if neHost.HostID != query.HostId || neHost.HostType != "telnet" { - // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) - return - } - - // 创建链接Telnet客户端 - var connTelnet telnet.ConnTelnet - neHost.CopyTo(&connTelnet) - client, err := connTelnet.NewClient() - if err != nil { - // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) - return - } - defer client.Close() - // 创建Telnet客户端会话 - clientSession, err := client.NewClientSession(query.Cols, query.Rows) - if err != nil { - // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) - return - } - defer clientSession.Close() - - // 将 HTTP 连接升级为 WebSocket 连接 - wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) - if wsConn == nil { - return - } - defer wsConn.Close() - - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) - go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, service.ReceiveTelnet) - - // 等待1秒,排空首次消息 - time.Sleep(1 * time.Second) - _ = clientSession.Read() - - // 实时读取Telnet消息直接输出 - msTicker := time.NewTicker(100 * time.Millisecond) - defer msTicker.Stop() - for { - select { - case ms := <-msTicker.C: - outputByte := clientSession.Read() - if len(outputByte) > 0 { - outputStr := strings.TrimRight(string(outputByte), "\x00") - msgByte, _ := json.Marshal(result.Ok(map[string]any{ - "requestId": fmt.Sprintf("telnet_%s_%d", neHost.HostID, ms.UnixMilli()), - "data": outputStr, - })) - wsClient.MsgChan <- msgByte - - // 退出telnet登录 - // if strings.LastIndex(outputStr, "logout\r\n") != -1 { - // time.Sleep(1 * time.Second) - // s.wsService.CloseClient(wsClient.ID) - // return - // } - } - case <-wsClient.StopChan: // 等待停止信号 - s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) - return - } - } -} - -// ShellView 终端交互式文件内容查看 -// -// GET /view -func (s *WSController) ShellView(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - NeType string `form:"neType" binding:"required"` - NeId string `form:"neId" binding:"required"` - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - if query.Cols < 120 || query.Cols > 400 { - query.Cols = 120 - } - if query.Rows < 40 || query.Rows > 1200 { - query.Rows = 40 - } - - // 登录用户信息 - loginUser, err := ctx.LoginUser(c) - if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) - return - } - - // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(query.NeType, query.NeId) - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) - return - } - defer sshClient.Close() - // ssh连接会话 - clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) - if err != nil { - c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) - return - } - defer clientSession.Close() - - // 将 HTTP 连接升级为 WebSocket 连接 - wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) - if wsConn == nil { - return - } - defer wsConn.Close() - - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) - go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, service.ReceiveShellView) - - // 等待1秒,排空首次消息 - time.Sleep(1 * time.Second) - _ = clientSession.Read() - - // 实时读取SSH消息直接输出 - msTicker := time.NewTicker(100 * time.Millisecond) - defer msTicker.Stop() - for { - select { - case ms := <-msTicker.C: - outputByte := clientSession.Read() - if len(outputByte) > 0 { - outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ - "requestId": fmt.Sprintf("view_%d", ms.UnixMilli()), - "data": outputStr, - })) - wsClient.MsgChan <- msgByte - } - case <-wsClient.StopChan: // 等待停止信号 - s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) - return - } - } -} diff --git a/src/modules/ws/controller/ws_redis.go b/src/modules/ws/controller/ws_redis.go new file mode 100644 index 0000000..febcd3c --- /dev/null +++ b/src/modules/ws/controller/ws_redis.go @@ -0,0 +1,69 @@ +package controller + +import ( + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// Redis 终端 +// +// GET /redis?hostId=1 +func (s *WSController) Redis(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + HostId string `form:"hostId" binding:"required"` // 连接主机ID + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + neHost := neService.NewNeHost.SelectById(query.HostId) + if neHost.HostID != query.HostId || neHost.HostType != "redis" { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + // 创建链接Redis客户端 + var connRedis redis.ConnRedis + neHost.CopyTo(&connRedis) + client, err := connRedis.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, client) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Redis) + + // 等待停止信号 + for value := range wsClient.StopChan { + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) + return + } +} diff --git a/src/modules/ws/controller/ws_ssh.go b/src/modules/ws/controller/ws_ssh.go new file mode 100644 index 0000000..db33b6b --- /dev/null +++ b/src/modules/ws/controller/ws_ssh.go @@ -0,0 +1,118 @@ +package controller + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// SSH 终端 +// +// GET /ssh?hostId=1&cols=80&rows=40 +func (s *WSController) SSH(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + HostId string `form:"hostId" binding:"required"` // 连接主机ID + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + if query.Cols < 80 || query.Cols > 400 { + query.Cols = 80 + } + if query.Rows < 40 || query.Rows > 1200 { + query.Rows = 40 + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + neHost := neService.NewNeHost.SelectById(query.HostId) + if neHost.HostID != query.HostId || neHost.HostType != "ssh" { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + // 创建链接SSH客户端 + var connSSH ssh.ConnSSH + neHost.CopyTo(&connSSH) + var client *ssh.ConnSSH + var clientErr error + if neHost.AuthMode == "2" { + client, clientErr = connSSH.NewClientByLocalPrivate() + } else { + client, clientErr = connSSH.NewClient() + } + if clientErr != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + + // 创建SSH客户端会话 + clientSession, err := client.NewClientSession(query.Cols, query.Rows) + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Shell) + + // 实时读取SSH消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("ssh_%s_%d", neHost.HostID, ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + + // 退出ssh登录 + // if strings.LastIndex(outputStr, "logout\r\n") != -1 { + // time.Sleep(1 * time.Second) + // s.wsService.CloseClient(wsClient.ID) + // return + // } + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/ws/controller/ws_telnet.go b/src/modules/ws/controller/ws_telnet.go new file mode 100644 index 0000000..34f5224 --- /dev/null +++ b/src/modules/ws/controller/ws_telnet.go @@ -0,0 +1,111 @@ +package controller + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// Telnet 终端 +// +// GET /telnet?hostId=1 +func (s *WSController) Telnet(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + HostId string `form:"hostId" binding:"required"` // 连接主机ID + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + if query.Cols < 120 || query.Cols > 400 { + query.Cols = 120 + } + if query.Rows < 128 || query.Rows > 1200 { + query.Rows = 128 + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + neHost := neService.NewNeHost.SelectById(query.HostId) + if neHost.HostID != query.HostId || neHost.HostType != "telnet" { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + // 创建链接Telnet客户端 + var connTelnet telnet.ConnTelnet + neHost.CopyTo(&connTelnet) + client, err := connTelnet.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + // 创建Telnet客户端会话 + clientSession, err := client.NewClientSession(query.Cols, query.Rows) + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Telnet) + + // 实时读取Telnet消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("telnet_%s_%d", neHost.HostID, ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + + // 退出telnet登录 + // if strings.LastIndex(outputStr, "logout\r\n") != -1 { + // time.Sleep(1 * time.Second) + // s.wsService.CloseClient(wsClient.ID) + // return + // } + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/ws/controller/ws_view.go b/src/modules/ws/controller/ws_view.go new file mode 100644 index 0000000..2b2594d --- /dev/null +++ b/src/modules/ws/controller/ws_view.go @@ -0,0 +1,97 @@ +package controller + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// ShellView 终端交互式文件内容查看 +// +// GET /view +func (s *WSController) ShellView(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeId string `form:"neId" binding:"required"` // 网元标识id + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + if query.Cols < 120 || query.Cols > 400 { + query.Cols = 120 + } + if query.Rows < 40 || query.Rows > 1200 { + query.Rows = 40 + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // ssh连接会话 + clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) + if err != nil { + c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.ShellView) + + // 等待1秒,排空首次消息 + time.Sleep(1 * time.Second) + _ = clientSession.Read() + + // 实时读取SSH消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("view_%d", ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/ws/model/net_connect.go b/src/modules/ws/model/net_connect.go index 945ede5..0c24689 100644 --- a/src/modules/ws/model/net_connect.go +++ b/src/modules/ws/model/net_connect.go @@ -6,15 +6,15 @@ import "github.com/shirou/gopsutil/v4/net" type NetConnectData struct { Type string `json:"type"` Status string `json:"status"` - Laddr net.Addr `json:"localaddr"` - Raddr net.Addr `json:"remoteaddr"` - PID int32 `json:"PID"` + Laddr net.Addr `json:"localAddr"` + Raddr net.Addr `json:"remoteAddr"` + PID int32 `json:"pid"` Name string `json:"name"` } // NetConnectQuery 网络连接进程查询 type NetConnectQuery struct { - Port int32 `json:"port"` - ProcessName string `json:"processName"` - ProcessID int32 `json:"processID"` + Port int32 `json:"port"` + Name string `json:"name"` + PID int32 `json:"pid"` } diff --git a/src/modules/ws/model/ps_process.go b/src/modules/ws/model/ps_process.go index e93247a..d52e833 100644 --- a/src/modules/ws/model/ps_process.go +++ b/src/modules/ws/model/ps_process.go @@ -2,37 +2,33 @@ package model // PsProcessData 进程数据 type PsProcessData struct { - PID int32 `json:"PID"` + PID int32 `json:"pid"` Name string `json:"name"` - PPID int32 `json:"PPID"` + PPID int32 `json:"ppid"` Username string `json:"username"` Status string `json:"status"` - StartTime string `json:"startTime"` + StartTime int64 `json:"startTime"` NumThreads int32 `json:"numThreads"` NumConnections int `json:"numConnections"` CpuPercent string `json:"cpuPercent"` - DiskRead string `json:"diskRead"` - DiskWrite string `json:"diskWrite"` - CmdLine string `json:"cmdLine"` + DiskRead uint64 `json:"diskRead"` + DiskWrite uint64 `json:"diskWrite"` - Rss string `json:"rss"` - VMS string `json:"vms"` - HWM string `json:"hwm"` - Data string `json:"data"` - Stack string `json:"stack"` - Locked string `json:"locked"` - Swap string `json:"swap"` + Rss uint64 `json:"rss"` + VMS uint64 `json:"vms"` + HWM uint64 `json:"hwm"` + Data uint64 `json:"data"` + Stack uint64 `json:"stack"` + Locked uint64 `json:"locked"` + Swap uint64 `json:"swap"` - CpuValue float64 `json:"cpuValue"` - RssValue uint64 `json:"rssValue"` - - Envs []string `json:"envs"` + CmdLine string `json:"cmdLine"` } // PsProcessQuery 进程查询 type PsProcessQuery struct { - Pid int32 `json:"pid"` + PID int32 `json:"pid"` Name string `json:"name"` Username string `json:"username"` } diff --git a/src/modules/ws/processor/cdr_connect.go b/src/modules/ws/processor/cdr_connect.go index e96c03f..5cfc777 100644 --- a/src/modules/ws/processor/cdr_connect.go +++ b/src/modules/ws/processor/cdr_connect.go @@ -4,11 +4,11 @@ import ( "encoding/json" "fmt" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/vo/result" - neDataModel "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" - neInfoService "nms_cxy/src/modules/network_element/service" + "be.ems/src/framework/logger" + "be.ems/src/framework/vo/result" + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neInfoService "be.ems/src/modules/network_element/service" ) // GetCDRConnectByIMS 获取CDR会话事件-IMS @@ -22,13 +22,13 @@ func GetCDRConnectByIMS(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventIMSImpl.SelectPage(query) + dataMap := neDataService.NewCDREventIMS.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -47,13 +47,13 @@ func GetCDRConnectBySMF(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventSMFImpl.SelectPage(query) + dataMap := neDataService.NewCDREventSMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -72,13 +72,13 @@ func GetCDRConnectBySMSC(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventSMSCImpl.SelectPage(query) + dataMap := neDataService.NewCDREventSMSC.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, diff --git a/src/modules/ws/processor/ne_state.go b/src/modules/ws/processor/ne_state.go index c24f585..bd4b144 100644 --- a/src/modules/ws/processor/ne_state.go +++ b/src/modules/ws/processor/ne_state.go @@ -4,10 +4,10 @@ import ( "encoding/json" "fmt" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/vo/result" - neFetchlink "nms_cxy/src/modules/network_element/fetch_link" - neService "nms_cxy/src/modules/network_element/service" + "be.ems/src/framework/logger" + "be.ems/src/framework/vo/result" + neFetchlink "be.ems/src/modules/network_element/fetch_link" + neService "be.ems/src/modules/network_element/service" ) // GetNeState 获取网元服务状态 @@ -28,7 +28,7 @@ func GetNeState(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } diff --git a/src/modules/ws/processor/net_connect.go b/src/modules/ws/processor/net_connect.go index 2a11a04..5e24243 100644 --- a/src/modules/ws/processor/net_connect.go +++ b/src/modules/ws/processor/net_connect.go @@ -5,10 +5,9 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/ws/model" - + "be.ems/src/framework/logger" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/model" "github.com/shirou/gopsutil/v4/net" "github.com/shirou/gopsutil/v4/process" ) @@ -30,13 +29,16 @@ func GetNetConnections(requestID string, data any) ([]byte, error) { continue } for _, conn := range connections { - if query.ProcessID > 0 && query.ProcessID != conn.Pid { + if query.PID > 0 && query.PID != conn.Pid { continue } proc, err := process.NewProcess(conn.Pid) if err == nil { - name, _ := proc.Name() - if name != "" && query.ProcessName != "" && !strings.Contains(name, query.ProcessName) { + name, err := proc.Name() + if err != nil { + continue + } + if query.Name != "" && !strings.Contains(name, query.Name) { continue } if query.Port > 0 && query.Port != int32(conn.Laddr.Port) && query.Port != int32(conn.Raddr.Port) { diff --git a/src/modules/ws/processor/ps_process.go b/src/modules/ws/processor/ps_process.go index 335b19a..a685eba 100644 --- a/src/modules/ws/processor/ps_process.go +++ b/src/modules/ws/processor/ps_process.go @@ -7,12 +7,9 @@ import ( "strings" "sync" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/date" - "nms_cxy/src/framework/utils/parse" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/ws/model" - + "be.ems/src/framework/logger" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/model" "github.com/shirou/gopsutil/v4/process" ) @@ -32,86 +29,68 @@ func GetProcessData(requestID string, data any) ([]byte, error) { return nil, err } - var ( - dataArr = []model.PsProcessData{} - resultMutex sync.Mutex - wg sync.WaitGroup - numWorkers = 4 - ) - - handleData := func(proc *process.Process) { + // 解析数据 + handleData := func(proc *process.Process) (model.PsProcessData, bool) { procData := model.PsProcessData{ PID: proc.Pid, } - if query.Pid > 0 && query.Pid != proc.Pid { - return - } - procName, err := proc.Name() - if procName == "" || err != nil { - return - } else { + if procName, err := proc.Name(); err == nil { procData.Name = procName } - if query.Name != "" && !strings.Contains(procData.Name, query.Name) { - return - } if username, err := proc.Username(); err == nil { procData.Username = username } + + // 查询过滤 + if query.PID > 0 && procData.PID != query.PID { + return procData, false + } + if query.Name != "" && !strings.Contains(procData.Name, query.Name) { + return procData, false + } if query.Username != "" && !strings.Contains(procData.Username, query.Username) { - return + return procData, false } procData.PPID, _ = proc.Ppid() - statusArray, _ := proc.Status() - if len(statusArray) > 0 { + if statusArray, err := proc.Status(); err == nil && len(statusArray) > 0 { procData.Status = strings.Join(statusArray, ",") } - createTime, procErr := proc.CreateTime() - if procErr == nil { - procData.StartTime = date.ParseDateToStr(createTime, date.YYYY_MM_DD_HH_MM_SS) + if createTime, err := proc.CreateTime(); err == nil { + procData.StartTime = createTime } procData.NumThreads, _ = proc.NumThreads() - procData.CpuValue, _ = proc.CPUPercent() - procData.CpuPercent = fmt.Sprintf("%.2f", procData.CpuValue) + "%" + if connections, err := proc.Connections(); err == nil { + procData.NumConnections = len(connections) + } + cpuPercent, _ := proc.CPUPercent() + procData.CpuPercent = fmt.Sprintf("%.2f", cpuPercent) menInfo, procErr := proc.MemoryInfo() if procErr == nil { - procData.Rss = parse.Bit(float64(menInfo.RSS)) - procData.Data = parse.Bit(float64(menInfo.Data)) - procData.VMS = parse.Bit(float64(menInfo.VMS)) - procData.HWM = parse.Bit(float64(menInfo.HWM)) - procData.Stack = parse.Bit(float64(menInfo.Stack)) - procData.Locked = parse.Bit(float64(menInfo.Locked)) - procData.Swap = parse.Bit(float64(menInfo.Swap)) - - procData.RssValue = menInfo.RSS - } else { - procData.Rss = "--" - procData.Data = "--" - procData.VMS = "--" - procData.HWM = "--" - procData.Stack = "--" - procData.Locked = "--" - procData.Swap = "--" - - procData.RssValue = 0 + procData.Rss = menInfo.RSS + procData.Data = menInfo.Data + procData.VMS = menInfo.VMS + procData.HWM = menInfo.HWM + procData.Stack = menInfo.Stack + procData.Locked = menInfo.Locked + procData.Swap = menInfo.Swap } - ioStat, procErr := proc.IOCounters() - if procErr == nil { - procData.DiskWrite = parse.Bit(float64(ioStat.WriteBytes)) - procData.DiskRead = parse.Bit(float64(ioStat.ReadBytes)) - } else { - procData.DiskWrite = "--" - procData.DiskRead = "--" + if ioStat, err := proc.IOCounters(); err == nil { + procData.DiskWrite = ioStat.WriteBytes + procData.DiskRead = ioStat.ReadBytes } procData.CmdLine, _ = proc.Cmdline() - procData.Envs, _ = proc.Environ() - resultMutex.Lock() - dataArr = append(dataArr, procData) - resultMutex.Unlock() + return procData, true } + var ( + dataArr = []model.PsProcessData{} + mu sync.Mutex + wg sync.WaitGroup + numWorkers = 4 + ) + chunkSize := (len(processes) + numWorkers - 1) / numWorkers for i := 0; i < numWorkers; i++ { wg.Add(1) @@ -123,9 +102,15 @@ func GetProcessData(requestID string, data any) ([]byte, error) { go func(start, end int) { defer wg.Done() + localDataArr := make([]model.PsProcessData, 0, end-start) // 本地切片避免竞态 for j := start; j < end; j++ { - handleData(processes[j]) + if data, ok := handleData(processes[j]); ok { + localDataArr = append(localDataArr, data) + } } + mu.Lock() + dataArr = append(dataArr, localDataArr...) + mu.Unlock() }(start, end) } diff --git a/src/modules/ws/processor/shell_command.go b/src/modules/ws/processor/shell_command.go index d356bba..38f9f58 100644 --- a/src/modules/ws/processor/shell_command.go +++ b/src/modules/ws/processor/shell_command.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - "nms_cxy/src/framework/logger" + "be.ems/src/framework/logger" ) // ParseCat 解析拼装cat命令 diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index fc393e6..f690381 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -4,10 +4,10 @@ import ( "encoding/json" "fmt" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/vo/result" - neDataModel "nms_cxy/src/modules/network_data/model" - neDataService "nms_cxy/src/modules/network_data/service" + "be.ems/src/framework/logger" + "be.ems/src/framework/vo/result" + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" ) // GetUEConnectByAMF 获取UE会话事件-AMF @@ -20,7 +20,7 @@ func GetUEConnectByAMF(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventAMFImpl.SelectPage(query) + dataMap := neDataService.NewUEEventAMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -38,7 +38,7 @@ func GetUEConnectByMME(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventMMEImpl.SelectPage(query) + dataMap := neDataService.NewUEEventMME.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, diff --git a/src/modules/ws/processor/upf_total_flow.go b/src/modules/ws/processor/upf_total_flow.go index 8502245..0186dcd 100644 --- a/src/modules/ws/processor/upf_total_flow.go +++ b/src/modules/ws/processor/upf_total_flow.go @@ -4,10 +4,10 @@ import ( "encoding/json" "fmt" - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/vo/result" - neDataService "nms_cxy/src/modules/network_data/service" - neService "nms_cxy/src/modules/network_element/service" + "be.ems/src/framework/logger" + "be.ems/src/framework/vo/result" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" ) // GetUPFTotalFlow 获取UPF-总流量数 N3上行 N6下行 单位比特(bit) @@ -29,12 +29,12 @@ func GetUPFTotalFlow(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } - dataMap := neDataService.NewPerfKPIImpl.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) + dataMap := neDataService.NewPerfKPI.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, diff --git a/src/modules/ws/service/ws.go b/src/modules/ws/service/ws.go index 5e34eb0..728dd60 100644 --- a/src/modules/ws/service/ws.go +++ b/src/modules/ws/service/ws.go @@ -1,33 +1,212 @@ package service import ( + "encoding/json" "net/http" + "sync" + "time" - "nms_cxy/src/modules/ws/model" - + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/generate" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/model" "github.com/gorilla/websocket" ) -// IWS WebSocket通信 服务层接口 -type IWS interface { - // UpgraderWs http升级ws请求 - UpgraderWs(w http.ResponseWriter, r *http.Request) *websocket.Conn +var ( + wsClients sync.Map // ws客户端 [clientId: client] + wsUsers sync.Map // ws用户对应的多个客户端id [uid:clientIds] + wsGroup sync.Map // ws组对应的多个客户端id [groupId:clientIds] +) - // ClientCreate 客户端新建 - // - // uid 登录用户ID - // groupIDs 用户订阅组 - // conn ws连接实例 - // childConn 子连接实例 - ClientCreate(uid string, groupIDs []string, conn *websocket.Conn, childConn any) *model.WSClient +// NewWS 实例化服务层 WS 结构体 +var NewWS = &WS{} - // ClientClose 客户端关闭 - ClientClose(clientID string) +// WS WebSocket通信 服务层处理 +type WS struct{} - // ClientReadListen 客户端读取消息监听 - // receiveType 根据接收类型进行消息处理 - ClientReadListen(wsClient *model.WSClient, receiveType int) - - // ClientWriteListen 客户端写入消息监听 - ClientWriteListen(wsClient *model.WSClient) +// UpgraderWs http升级ws请求 +func (s *WS) UpgraderWs(w http.ResponseWriter, r *http.Request) *websocket.Conn { + wsUpgrader := websocket.Upgrader{ + Subprotocols: []string{"omc-ws"}, + // 设置消息发送缓冲区大小(byte),如果这个值设置得太小,可能会导致服务端在发送大型消息时遇到问题 + WriteBufferSize: 1024, + // 消息包启用压缩 + EnableCompression: true, + // ws握手超时时间 + HandshakeTimeout: 5 * time.Second, + // ws握手过程中允许跨域 + CheckOrigin: func(r *http.Request) bool { + return true + }, + } + conn, err := wsUpgrader.Upgrade(w, r, nil) + if err != nil { + logger.Errorf("ws Upgrade err: %s", err.Error()) + } + return conn +} + +// ClientCreate 客户端新建 +// +// uid 登录用户ID +// groupIDs 用户订阅组 +// conn ws连接实例 +// childConn 子连接实例 +func (s *WS) ClientCreate(uid string, groupIDs []string, conn *websocket.Conn, childConn any) *model.WSClient { + // clientID也可以用其他方式生成,只要能保证在所有服务端中都能保证唯一即可 + clientID := generate.Code(16) + + wsClient := &model.WSClient{ + ID: clientID, + Conn: conn, + LastHeartbeat: time.Now().UnixMilli(), + BindUid: uid, + SubGroup: groupIDs, + MsgChan: make(chan []byte, 100), + StopChan: make(chan struct{}, 1), // 卡死循环标记 + ChildConn: childConn, + } + + // 存入客户端 + wsClients.Store(clientID, wsClient) + + // 存入用户持有客户端 + if uid != "" { + if v, ok := wsUsers.Load(uid); ok { + uidClientIds := v.(*[]string) + *uidClientIds = append(*uidClientIds, clientID) + } else { + wsUsers.Store(uid, &[]string{clientID}) + } + } + + // 存入用户订阅组 + if uid != "" && len(groupIDs) > 0 { + for _, groupID := range groupIDs { + if v, ok := wsGroup.Load(groupID); ok { + groupClientIds := v.(*[]string) + *groupClientIds = append(*groupClientIds, clientID) + } else { + wsGroup.Store(groupID, &[]string{clientID}) + } + } + } + + return wsClient +} + +// ClientClose 客户端关闭 +func (s *WS) ClientClose(clientID string) { + v, ok := wsClients.Load(clientID) + if !ok { + return + } + + client := v.(*model.WSClient) + defer func() { + client.MsgChan <- []byte("ws:close") + client.StopChan <- struct{}{} + client.Conn.Close() + wsClients.Delete(clientID) + }() + + // 客户端断线时自动踢出Uid绑定列表 + if client.BindUid != "" { + if v, ok := wsUsers.Load(client.BindUid); ok { + uidClientIds := v.(*[]string) + if len(*uidClientIds) > 0 { + tempClientIds := make([]string, 0, len(*uidClientIds)) + for _, v := range *uidClientIds { + if v != client.ID { + tempClientIds = append(tempClientIds, v) + } + } + *uidClientIds = tempClientIds + } + } + } + + // 客户端断线时自动踢出已加入的组 + if len(client.SubGroup) > 0 { + for _, groupID := range client.SubGroup { + v, ok := wsGroup.Load(groupID) + if !ok { + continue + } + groupClientIds := v.(*[]string) + if len(*groupClientIds) > 0 { + tempClientIds := make([]string, 0, len(*groupClientIds)) + for _, v := range *groupClientIds { + if v != client.ID { + tempClientIds = append(tempClientIds, v) + } + } + *groupClientIds = tempClientIds + } + } + } +} + +// ClientReadListen 客户端读取消息监听 +// receiveFn 接收函数进行消息处理 +func (s *WS) ClientReadListen(wsClient *model.WSClient, receiveFn func(*model.WSClient, model.WSRequest)) { + defer func() { + if err := recover(); err != nil { + logger.Errorf("ws ReadMessage Panic Error: %v", err) + } + }() + for { + // 读取消息 + messageType, msg, err := wsClient.Conn.ReadMessage() + if err != nil { + logger.Warnf("ws ReadMessage UID %s err: %s", wsClient.BindUid, err.Error()) + s.ClientClose(wsClient.ID) + return + } + // fmt.Println(messageType, string(msg)) + + // 文本 只处理文本json + if messageType == websocket.TextMessage { + var reqMsg model.WSRequest + if err := json.Unmarshal(msg, &reqMsg); err != nil { + msgByte, _ := json.Marshal(result.ErrMsg("message format json error")) + wsClient.MsgChan <- msgByte + continue + } + // 接收器处理 + go receiveFn(wsClient, reqMsg) + } + } +} + +// ClientWriteListen 客户端写入消息监听 +// wsClient.MsgChan <- msgByte 写入消息 +func (s *WS) ClientWriteListen(wsClient *model.WSClient) { + defer func() { + if err := recover(); err != nil { + logger.Errorf("ws WriteMessage Panic Error: %v", err) + } + }() + // 发客户端id确认是否连接 + msgByte, _ := json.Marshal(result.OkData(map[string]string{ + "clientId": wsClient.ID, + })) + wsClient.MsgChan <- msgByte + // 消息发送监听 + for msg := range wsClient.MsgChan { + // 关闭句柄 + if string(msg) == "ws:close" { + wsClient.Conn.WriteMessage(websocket.CloseMessage, []byte{}) + return + } + // 发送消息 + err := wsClient.Conn.WriteMessage(websocket.TextMessage, msg) + if err != nil { + logger.Warnf("ws WriteMessage UID %s err: %s", wsClient.BindUid, err.Error()) + s.ClientClose(wsClient.ID) + return + } + wsClient.LastHeartbeat = time.Now().UnixMilli() + } } diff --git a/src/modules/ws/service/ws.impl.go b/src/modules/ws/service/ws.impl.go deleted file mode 100644 index 6d20b14..0000000 --- a/src/modules/ws/service/ws.impl.go +++ /dev/null @@ -1,221 +0,0 @@ -package service - -import ( - "encoding/json" - "net/http" - "sync" - "time" - - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/generate" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/ws/model" - - "github.com/gorilla/websocket" -) - -var ( - wsClients sync.Map // ws客户端 [clientId: client] - wsUsers sync.Map // ws用户对应的多个客户端id [uid:clientIds] - wsGroup sync.Map // ws组对应的多个客户端id [groupId:clientIds] -) - -// NewWSImpl 实例化服务层 WSImpl 结构体 -var NewWSImpl = &WSImpl{} - -// WSImpl WebSocket通信 服务层处理 -type WSImpl struct{} - -// UpgraderWs http升级ws请求 -func (s *WSImpl) UpgraderWs(w http.ResponseWriter, r *http.Request) *websocket.Conn { - wsUpgrader := websocket.Upgrader{ - Subprotocols: []string{"omc-ws"}, - // 设置消息发送缓冲区大小(byte),如果这个值设置得太小,可能会导致服务端在发送大型消息时遇到问题 - WriteBufferSize: 1024, - // 消息包启用压缩 - EnableCompression: true, - // ws握手超时时间 - HandshakeTimeout: 5 * time.Second, - // ws握手过程中允许跨域 - CheckOrigin: func(r *http.Request) bool { - return true - }, - } - conn, err := wsUpgrader.Upgrade(w, r, nil) - if err != nil { - logger.Errorf("ws Upgrade err: %s", err.Error()) - } - return conn -} - -// ClientCreate 客户端新建 -// -// uid 登录用户ID -// groupIDs 用户订阅组 -// conn ws连接实例 -// childConn 子连接实例 -func (s *WSImpl) ClientCreate(uid string, groupIDs []string, conn *websocket.Conn, childConn any) *model.WSClient { - // clientID也可以用其他方式生成,只要能保证在所有服务端中都能保证唯一即可 - clientID := generate.Code(16) - - wsClient := &model.WSClient{ - ID: clientID, - Conn: conn, - LastHeartbeat: time.Now().UnixMilli(), - BindUid: uid, - SubGroup: groupIDs, - MsgChan: make(chan []byte, 100), - StopChan: make(chan struct{}, 1), // 卡死循环标记 - ChildConn: childConn, - } - - // 存入客户端 - wsClients.Store(clientID, wsClient) - - // 存入用户持有客户端 - if uid != "" { - if v, ok := wsUsers.Load(uid); ok { - uidClientIds := v.(*[]string) - *uidClientIds = append(*uidClientIds, clientID) - } else { - wsUsers.Store(uid, &[]string{clientID}) - } - } - - // 存入用户订阅组 - if uid != "" && len(groupIDs) > 0 { - for _, groupID := range groupIDs { - if v, ok := wsGroup.Load(groupID); ok { - groupClientIds := v.(*[]string) - *groupClientIds = append(*groupClientIds, clientID) - } else { - wsGroup.Store(groupID, &[]string{clientID}) - } - } - } - - return wsClient -} - -// ClientClose 客户端关闭 -func (s *WSImpl) ClientClose(clientID string) { - v, ok := wsClients.Load(clientID) - if !ok { - return - } - - client := v.(*model.WSClient) - defer func() { - client.MsgChan <- []byte("ws:close") - client.StopChan <- struct{}{} - client.Conn.Close() - wsClients.Delete(clientID) - }() - - // 客户端断线时自动踢出Uid绑定列表 - if client.BindUid != "" { - if v, ok := wsUsers.Load(client.BindUid); ok { - uidClientIds := v.(*[]string) - if len(*uidClientIds) > 0 { - tempClientIds := make([]string, 0, len(*uidClientIds)) - for _, v := range *uidClientIds { - if v != client.ID { - tempClientIds = append(tempClientIds, v) - } - } - *uidClientIds = tempClientIds - } - } - } - - // 客户端断线时自动踢出已加入的组 - if len(client.SubGroup) > 0 { - for _, groupID := range client.SubGroup { - v, ok := wsGroup.Load(groupID) - if !ok { - continue - } - groupClientIds := v.(*[]string) - if len(*groupClientIds) > 0 { - tempClientIds := make([]string, 0, len(*groupClientIds)) - for _, v := range *groupClientIds { - if v != client.ID { - tempClientIds = append(tempClientIds, v) - } - } - *groupClientIds = tempClientIds - } - } - } -} - -// ClientReadListen 客户端读取消息监听 -// receiveType 根据接收类型进行消息处理 -func (s *WSImpl) ClientReadListen(wsClient *model.WSClient, receiveType int) { - defer func() { - if err := recover(); err != nil { - logger.Errorf("ws ReadMessage Panic Error: %v", err) - } - }() - for { - // 读取消息 - messageType, msg, err := wsClient.Conn.ReadMessage() - if err != nil { - logger.Warnf("ws ReadMessage UID %s err: %s", wsClient.BindUid, err.Error()) - s.ClientClose(wsClient.ID) - return - } - // fmt.Println(messageType, string(msg)) - - // 文本 只处理文本json - if messageType == websocket.TextMessage { - var reqMsg model.WSRequest - if err := json.Unmarshal(msg, &reqMsg); err != nil { - msgByte, _ := json.Marshal(result.ErrMsg("message format json error")) - wsClient.MsgChan <- msgByte - continue - } - // 接收器处理 - switch receiveType { - case ReceiveCommont: - go NewWSReceiveImpl.Commont(wsClient, reqMsg) - case ReceiveShell: - go NewWSReceiveImpl.Shell(wsClient, reqMsg) - case ReceiveShellView: - go NewWSReceiveImpl.ShellView(wsClient, reqMsg) - case ReceiveTelnet: - go NewWSReceiveImpl.Telnet(wsClient, reqMsg) - } - } - } -} - -// ClientWriteListen 客户端写入消息监听 -func (s *WSImpl) ClientWriteListen(wsClient *model.WSClient) { - defer func() { - if err := recover(); err != nil { - logger.Errorf("ws WriteMessage Panic Error: %v", err) - } - }() - // 发客户端id确认是否连接 - msgByte, _ := json.Marshal(result.OkData(map[string]string{ - "clientId": wsClient.ID, - })) - wsClient.MsgChan <- msgByte - // 消息发送监听 - for msg := range wsClient.MsgChan { - // 关闭句柄 - if string(msg) == "ws:close" { - wsClient.Conn.WriteMessage(websocket.CloseMessage, []byte{}) - return - } - // 发送消息 - err := wsClient.Conn.WriteMessage(websocket.TextMessage, msg) - if err != nil { - logger.Warnf("ws WriteMessage UID %s err: %s", wsClient.BindUid, err.Error()) - s.ClientClose(wsClient.ID) - return - } - wsClient.LastHeartbeat = time.Now().UnixMilli() - } -} diff --git a/src/modules/ws/service/ws_receive.go b/src/modules/ws/service/ws_receive.go index 1f5d242..1b3b516 100644 --- a/src/modules/ws/service/ws_receive.go +++ b/src/modules/ws/service/ws_receive.go @@ -1,25 +1,334 @@ package service -import "nms_cxy/src/modules/ws/model" +import ( + "encoding/json" + "fmt" + "io" + "reflect" + "strings" + "time" -const ( - ReceiveCommont = iota // Commont 接收通用业务处理 - ReceiveShell // Shell 接收终端交互业务处理 - ReceiveShellView // ShellView 接收查看文件终端交互业务处理 - ReceiveTelnet // Telnet 接收终端交互业务处理 + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/model" + "be.ems/src/modules/ws/processor" ) -// IWSReceive WebSocket消息接收处理 服务层接口 -type IWSReceive interface { - // Commont 接收通用业务处理 - Commont(client *model.WSClient, reqMsg model.WSRequest) +// 实例化服务层 WSReceive 结构体 +var NewWSReceive = &WSReceive{} - // Shell 接收终端交互业务处理 - Shell(client *model.WSClient, reqMsg model.WSRequest) +// WSReceive WebSocket消息接收处理 服务层处理 +type WSReceive struct{} - // ShellView 接收查看文件终端交互业务处理 - ShellView(client *model.WSClient, reqMsg model.WSRequest) - - // Telnet 接收终端交互业务处理 - Telnet(client *model.WSClient, reqMsg model.WSRequest) +// close 关闭服务连接 +func (s *WSReceive) close(client *model.WSClient) { + // 主动关闭 + resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + client.MsgChan <- resultByte + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + NewWS.ClientClose(client.ID) +} + +// Commont 接收通用业务处理 +func (s *WSReceive) Commont(client *model.WSClient, reqMsg model.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws Commont UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + s.close(client) + return + case "ps": + resByte, err = processor.GetProcessData(reqMsg.RequestID, reqMsg.Data) + case "net": + resByte, err = processor.GetNetConnections(reqMsg.RequestID, reqMsg.Data) + case "ims_cdr": + resByte, err = processor.GetCDRConnectByIMS(reqMsg.RequestID, reqMsg.Data) + case "smf_cdr": + resByte, err = processor.GetCDRConnectBySMF(reqMsg.RequestID, reqMsg.Data) + case "smsc_cdr": + resByte, err = processor.GetCDRConnectBySMSC(reqMsg.RequestID, reqMsg.Data) + case "amf_ue": + resByte, err = processor.GetUEConnectByAMF(reqMsg.RequestID, reqMsg.Data) + case "mme_ue": + resByte, err = processor.GetUEConnectByMME(reqMsg.RequestID, reqMsg.Data) + case "upf_tf": + resByte, err = processor.GetUPFTotalFlow(reqMsg.RequestID, reqMsg.Data) + case "ne_state": + resByte, err = processor.GetNeState(reqMsg.RequestID, reqMsg.Data) + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws Commont UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// Shell 接收终端交互业务处理 +func (s *WSReceive) Shell(client *model.WSClient, reqMsg model.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + s.close(client) + return + case "ssh": + // SSH会话消息接收写入会话 + command := reqMsg.Data.(string) + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write(command) + case "resize": + // SSH会话窗口重置 + msgByte, _ := json.Marshal(reqMsg.Data) + var data struct { + Cols int `json:"cols"` + Rows int `json:"rows"` + } + err = json.Unmarshal(msgByte, &data) + if err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + err = sshClientSession.Session.WindowChange(data.Rows, data.Cols) + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// ShellView 接收查看文件终端交互业务处理 +func (s *WSReceive) ShellView(client *model.WSClient, reqMsg model.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws ShellView UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + s.close(client) + return + case "cat", "tail": + var command string + if reqMsg.Type == "cat" { + command, err = processor.ParseCat(reqMsg.Data) + } + if reqMsg.Type == "tail" { + command, err = processor.ParseTail(reqMsg.Data) + } + if command != "" && err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write(command) + } + case "ctrl-c": + // 模拟按下 Ctrl+C + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write("\u0003\n") + case "resize": + // 会话窗口重置 + msgByte, _ := json.Marshal(reqMsg.Data) + var data struct { + Cols int `json:"cols"` + Rows int `json:"rows"` + } + err = json.Unmarshal(msgByte, &data) + if err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + err = sshClientSession.Session.WindowChange(data.Rows, data.Cols) + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws ShellView UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// Telnet 接收终端交互业务处理 +func (s *WSReceive) Telnet(client *model.WSClient, reqMsg model.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + s.close(client) + return + case "telnet": + // Telnet会话消息接收写入会话 + command := reqMsg.Data.(string) + telnetClientSession := client.ChildConn.(*telnet.TelnetClientSession) + _, err = telnetClientSession.Write(command) + case "resize": + // Telnet会话窗口重置 + msgByte, _ := json.Marshal(reqMsg.Data) + var data struct { + Cols int `json:"cols"` + Rows int `json:"rows"` + } + err = json.Unmarshal(msgByte, &data) + if err == nil { + // telnetClientSession := client.ChildConn.(*telnet.TelnetClientSession) + // _ = telnetClientSession.WindowChange(data.Rows, data.Cols) + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// Redis 接收终端交互业务处理 +func (s *WSReceive) Redis(client *model.WSClient, reqMsg model.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + s.close(client) + return + case "redis": + // Redis会话消息接收写入会话 + command := fmt.Sprint(reqMsg.Data) + redisClientSession := client.ChildConn.(*redis.ConnRedis) + output, err := redisClientSession.RunCMD(command) + dataStr := "" + if err != nil { + dataStr = fmt.Sprintf("%s \r\n", err.Error()) + } else { + // 获取结果的反射类型 + resultType := reflect.TypeOf(output) + switch resultType.Kind() { + case reflect.Slice: + // 如果是切片类型需要进一步判断是否是 []string 或 []interface{} + if resultType.Elem().Kind() == reflect.String { + dataStr = fmt.Sprintf("%s \r\n", strings.Join(output.([]string), "\r\n")) + } else if resultType.Elem().Kind() == reflect.Interface { + arr := []string{} + for _, v := range output.([]any) { + arr = append(arr, fmt.Sprintf("%s", v)) + } + dataStr = fmt.Sprintf("%s \r\n", strings.Join(arr, "\r\n")) + } + case reflect.Ptr: + dataStr = "\r\n" + case reflect.String, reflect.Int64: + dataStr = fmt.Sprintf("%s \r\n", output) + default: + dataStr = fmt.Sprintf("%s \r\n", output) + } + } + resByte, _ = json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": dataStr, + })) + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } } diff --git a/src/modules/ws/service/ws_receive.impl.go b/src/modules/ws/service/ws_receive.impl.go deleted file mode 100644 index d036268..0000000 --- a/src/modules/ws/service/ws_receive.impl.go +++ /dev/null @@ -1,259 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "io" - "time" - - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/utils/ssh" - "nms_cxy/src/framework/utils/telnet" - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/ws/model" - "nms_cxy/src/modules/ws/processor" -) - -// 实例化服务层 WSReceiveImpl 结构体 -var NewWSReceiveImpl = &WSReceiveImpl{} - -// WSReceiveImpl WebSocket消息接收处理 服务层处理 -type WSReceiveImpl struct{} - -// Commont 接收通用业务处理 -func (s *WSReceiveImpl) close(client *model.WSClient) { - // 主动关闭 - resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) - client.MsgChan <- resultByte - // 等待1s后关闭连接 - time.Sleep(1 * time.Second) - NewWSImpl.ClientClose(client.ID) -} - -// Commont 接收通用业务处理 -func (s *WSReceiveImpl) Commont(client *model.WSClient, reqMsg model.WSRequest) { - // 必传requestId确认消息 - if reqMsg.RequestID == "" { - msg := "message requestId is required" - logger.Infof("ws Commont UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) - client.MsgChan <- msgByte - return - } - - var resByte []byte - var err error - - switch reqMsg.Type { - case "close": - s.close(client) - return - case "ps": - resByte, err = processor.GetProcessData(reqMsg.RequestID, reqMsg.Data) - case "net": - resByte, err = processor.GetNetConnections(reqMsg.RequestID, reqMsg.Data) - case "ims_cdr": - resByte, err = processor.GetCDRConnectByIMS(reqMsg.RequestID, reqMsg.Data) - case "smf_cdr": - resByte, err = processor.GetCDRConnectBySMF(reqMsg.RequestID, reqMsg.Data) - case "smsc_cdr": - resByte, err = processor.GetCDRConnectBySMSC(reqMsg.RequestID, reqMsg.Data) - case "amf_ue": - resByte, err = processor.GetUEConnectByAMF(reqMsg.RequestID, reqMsg.Data) - case "mme_ue": - resByte, err = processor.GetUEConnectByMME(reqMsg.RequestID, reqMsg.Data) - case "upf_tf": - resByte, err = processor.GetUPFTotalFlow(reqMsg.RequestID, reqMsg.Data) - case "ne_state": - resByte, err = processor.GetNeState(reqMsg.RequestID, reqMsg.Data) - default: - err = fmt.Errorf("message type %s not supported", reqMsg.Type) - } - - if err != nil { - logger.Warnf("ws Commont UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) - client.MsgChan <- msgByte - return - } - if len(resByte) > 0 { - client.MsgChan <- resByte - } -} - -// Shell 接收终端交互业务处理 -func (s *WSReceiveImpl) Shell(client *model.WSClient, reqMsg model.WSRequest) { - // 必传requestId确认消息 - if reqMsg.RequestID == "" { - msg := "message requestId is required" - logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) - client.MsgChan <- msgByte - return - } - - var resByte []byte - var err error - - switch reqMsg.Type { - case "close": - s.close(client) - return - case "ssh": - // SSH会话消息接收写入会话 - command := reqMsg.Data.(string) - sshClientSession := client.ChildConn.(*ssh.SSHClientSession) - _, err = sshClientSession.Write(command) - case "ssh_resize": - // SSH会话窗口重置 - msgByte, _ := json.Marshal(reqMsg.Data) - var data struct { - Cols int `json:"cols"` - Rows int `json:"rows"` - } - err = json.Unmarshal(msgByte, &data) - if err == nil { - sshClientSession := client.ChildConn.(*ssh.SSHClientSession) - err = sshClientSession.Session.WindowChange(data.Rows, data.Cols) - } - default: - err = fmt.Errorf("message type %s not supported", reqMsg.Type) - } - - if err != nil { - logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) - client.MsgChan <- msgByte - if err == io.EOF { - // 等待1s后关闭连接 - time.Sleep(1 * time.Second) - client.StopChan <- struct{}{} - } - return - } - if len(resByte) > 0 { - client.MsgChan <- resByte - } -} - -// ShellView 接收查看文件终端交互业务处理 -func (s *WSReceiveImpl) ShellView(client *model.WSClient, reqMsg model.WSRequest) { - // 必传requestId确认消息 - if reqMsg.RequestID == "" { - msg := "message requestId is required" - logger.Infof("ws ShellView UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) - client.MsgChan <- msgByte - return - } - - var resByte []byte - var err error - - switch reqMsg.Type { - case "close": - s.close(client) - return - case "cat", "tail": - var command string - if reqMsg.Type == "cat" { - command, err = processor.ParseCat(reqMsg.Data) - } - if reqMsg.Type == "tail" { - command, err = processor.ParseTail(reqMsg.Data) - } - if command != "" && err == nil { - sshClientSession := client.ChildConn.(*ssh.SSHClientSession) - _, err = sshClientSession.Write(command) - } - case "ctrl-c": - // 模拟按下 Ctrl+C - sshClientSession := client.ChildConn.(*ssh.SSHClientSession) - _, err = sshClientSession.Write("\u0003\n") - case "resize": - // 会话窗口重置 - msgByte, _ := json.Marshal(reqMsg.Data) - var data struct { - Cols int `json:"cols"` - Rows int `json:"rows"` - } - err = json.Unmarshal(msgByte, &data) - if err == nil { - sshClientSession := client.ChildConn.(*ssh.SSHClientSession) - err = sshClientSession.Session.WindowChange(data.Rows, data.Cols) - } - default: - err = fmt.Errorf("message type %s not supported", reqMsg.Type) - } - - if err != nil { - logger.Warnf("ws ShellView UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) - client.MsgChan <- msgByte - if err == io.EOF { - // 等待1s后关闭连接 - time.Sleep(1 * time.Second) - client.StopChan <- struct{}{} - } - return - } - if len(resByte) > 0 { - client.MsgChan <- resByte - } -} - -// Telnet 接收终端交互业务处理 -func (s *WSReceiveImpl) Telnet(client *model.WSClient, reqMsg model.WSRequest) { - // 必传requestId确认消息 - if reqMsg.RequestID == "" { - msg := "message requestId is required" - logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) - client.MsgChan <- msgByte - return - } - - var resByte []byte - var err error - - switch reqMsg.Type { - case "close": - s.close(client) - return - case "telnet": - // Telnet会话消息接收写入会话 - command := reqMsg.Data.(string) - telnetClientSession := client.ChildConn.(*telnet.TelnetClientSession) - _, err = telnetClientSession.Write(command) - case "telnet_resize": - // Telnet会话窗口重置 - msgByte, _ := json.Marshal(reqMsg.Data) - var data struct { - Cols int `json:"cols"` - Rows int `json:"rows"` - } - err = json.Unmarshal(msgByte, &data) - if err == nil { - telnetClientSession := client.ChildConn.(*telnet.TelnetClientSession) - err = telnetClientSession.WindowChange(data.Rows, data.Cols) - _ = telnetClientSession.Read() - } - default: - err = fmt.Errorf("message type %s not supported", reqMsg.Type) - } - - if err != nil { - logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) - client.MsgChan <- msgByte - if err == io.EOF { - // 等待1s后关闭连接 - time.Sleep(1 * time.Second) - client.StopChan <- struct{}{} - } - return - } - if len(resByte) > 0 { - client.MsgChan <- resByte - } -} diff --git a/src/modules/ws/service/ws_send.go b/src/modules/ws/service/ws_send.go index 91e48b1..4d02414 100644 --- a/src/modules/ws/service/ws_send.go +++ b/src/modules/ws/service/ws_send.go @@ -1,10 +1,89 @@ package service -// IWSSend WebSocket消息发送处理 服务层接口 -type IWSSend interface { - // ByClientID 给已知客户端发消息 - ByClientID(clientID string, data any) error +import ( + "encoding/json" + "fmt" - // ByGroupID 给订阅组的客户端发送消息 - ByGroupID(gid string, data any) error + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/model" +) + +// 订阅组指定编号为支持服务器向客户端主动推送数据 +const ( + // 组号-其他 + GROUP_OTHER = "0" + // 组号-跟踪任务网元数据变更 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 + GROUP_KPI_C = "20_" + // 组号-IMS_CDR会话事件 1005_neId + GROUP_IMS_CDR = "1005_" + // 组号-SMF_CDR会话事件 1006_neId + GROUP_SMF_CDR = "1006_" + // 组号-SMSC_CDR会话事件 1007_neId + GROUP_SMSC_CDR = "1007_" + // 组号-AMF_UE会话事件 + GROUP_AMF_UE = "1010" + // 组号-MME_UE会话事件 1011_neId + GROUP_MME_UE = "1011_" +) + +// 实例化服务层 WSSend 结构体 +var NewWSSend = &WSSend{} + +// WSSend WebSocket消息发送处理 服务层处理 +type WSSend struct{} + +// ByClientID 给已知客户端发消息 +func (s *WSSend) ByClientID(clientID string, data any) error { + v, ok := wsClients.Load(clientID) + if !ok { + return fmt.Errorf("no fount client ID: %s", clientID) + } + + dataByte, err := json.Marshal(result.OkData(data)) + if err != nil { + return err + } + + client := v.(*model.WSClient) + if len(client.MsgChan) > 90 { + NewWS.ClientClose(client.ID) + return fmt.Errorf("msg chan over 90 will close client ID: %s", clientID) + } + client.MsgChan <- dataByte + return nil +} + +// ByGroupID 给订阅组的客户端发送消息 +func (s *WSSend) ByGroupID(groupID string, data any) error { + clientIds, ok := wsGroup.Load(groupID) + if !ok { + return fmt.Errorf("no fount Group ID: %s", groupID) + } + + // 检查组内是否有客户端 + ids := clientIds.(*[]string) + if len(*ids) == 0 { + return fmt.Errorf("no members in the group") + } + + // 遍历给客户端发消息 + for _, clientId := range *ids { + err := s.ByClientID(clientId, map[string]any{ + "groupId": groupID, + "data": data, + }) + if err != nil { + continue + } + } + + return nil } diff --git a/src/modules/ws/service/ws_send.impl.go b/src/modules/ws/service/ws_send.impl.go deleted file mode 100644 index 9be1243..0000000 --- a/src/modules/ws/service/ws_send.impl.go +++ /dev/null @@ -1,85 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - - "nms_cxy/src/framework/vo/result" - "nms_cxy/src/modules/ws/model" -) - -// 订阅组指定编号为支持服务器向客户端主动推送数据 -const ( - // 组号-其他 - GROUP_OTHER = "0" - // 组号-指标通用 10_neType_neId - GROUP_KPI = "10_" - // 组号-指标UPF 12_neId - GROUP_KPI_UPF = "12_" - // 组号-自定义KPI指标20_neType_neId - GROUP_KPI_C = "20_" - // 组号-IMS_CDR会话事件 1005_neId - GROUP_IMS_CDR = "1005_" - // 组号-SMF_CDR会话事件 1006_neId - GROUP_SMF_CDR = "1006_" - // 组号-SMSC_CDR会话事件 1007_neId - GROUP_SMSC_CDR = "1007_" - // 组号-AMF_UE会话事件 - GROUP_AMF_UE = "1010" - // 组号-MME_UE会话事件 1011_neId - GROUP_MME_UE = "1011_" -) - -// 实例化服务层 WSSendImpl 结构体 -var NewWSSendImpl = &WSSendImpl{} - -// IWSSend WebSocket消息发送处理 服务层处理 -type WSSendImpl struct{} - -// ByClientID 给已知客户端发消息 -func (s *WSSendImpl) ByClientID(clientID string, data any) error { - v, ok := wsClients.Load(clientID) - if !ok { - return fmt.Errorf("no fount client ID: %s", clientID) - } - - dataByte, err := json.Marshal(result.OkData(data)) - if err != nil { - return err - } - - client := v.(*model.WSClient) - if len(client.MsgChan) > 90 { - NewWSImpl.ClientClose(client.ID) - return fmt.Errorf("msg chan over 90 will close client ID: %s", clientID) - } - client.MsgChan <- dataByte - return nil -} - -// ByGroupID 给订阅组的客户端发送消息 -func (s *WSSendImpl) ByGroupID(groupID string, data any) error { - clientIds, ok := wsGroup.Load(groupID) - if !ok { - return fmt.Errorf("no fount Group ID: %s", groupID) - } - - // 检查组内是否有客户端 - ids := clientIds.(*[]string) - if len(*ids) == 0 { - return fmt.Errorf("no members in the group") - } - - // 遍历给客户端发消息 - for _, clientId := range *ids { - err := s.ByClientID(clientId, map[string]any{ - "groupId": groupID, - "data": data, - }) - if err != nil { - continue - } - } - - return nil -} diff --git a/src/modules/ws/ws.go b/src/modules/ws/ws.go index c7f566c..35e63f8 100644 --- a/src/modules/ws/ws.go +++ b/src/modules/ws/ws.go @@ -1,10 +1,10 @@ package ws import ( - "nms_cxy/src/framework/logger" - "nms_cxy/src/framework/middleware" - "nms_cxy/src/framework/middleware/collectlogs" - "nms_cxy/src/modules/ws/controller" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/modules/ws/controller" "github.com/gin-gonic/gin" ) @@ -35,6 +35,11 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), controller.NewWSController.Telnet, ) + wsGroup.GET("/redis", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewWSController.Redis, + ) wsGroup.GET("/view", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)),