From 78bd110b03af890e6ec890e091335cc5c0d5d756 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 18 Mar 2024 15:22:47 +0800 Subject: [PATCH] =?UTF-8?q?marge:=20=E5=90=88=E5=B9=B6=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E5=8C=85=E5=90=8D=E5=8F=98=E6=9B=B4be.ems?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/aaaa/aaaa.go | 10 +- features/cdr/cdrevent.go | 12 +- features/cm/exec_linux.go | 2 +- features/cm/exec_windows.go | 2 +- features/cm/license.go | 265 ++++++++++-- features/cm/ne.go | 50 +-- features/cm/param.go | 47 +- features/cm/software.go | 10 +- features/dbrest/backup.go | 10 +- features/dbrest/dbrest.go | 12 +- features/event/event.go | 10 +- features/file/file.go | 12 +- features/file/service.go | 2 +- features/firewall/api_firewall.go | 88 ---- features/firewall/model/firewall.go | 13 - features/firewall/model/firewall_vo.go | 64 --- features/firewall/repo/repo_firewall.go | 133 ------ features/firewall/service/service_firewall.go | 207 --------- features/fm/alarm.go | 54 ++- features/fm/email.go | 6 +- features/fm/smsforward.go | 155 ++++++- features/fm/ucpcli.go | 60 +++ features/handle/handle.go | 14 +- features/lm/logbak.go | 8 +- features/maintenance/maintenance.go | 10 +- features/mml/mml.go | 226 ++++++++-- features/monitor/monitor/monitor.go | 8 +- features/monitor/monitor/task.go | 6 +- features/monitor/psnet/psnet.go | 10 +- features/nbi/nbi.go | 14 +- features/nbi/snmp.go | 6 +- features/pm/performance.go | 12 +- features/security/account.go | 30 +- features/security/service/service_account.go | 10 +- features/sm/backup.go | 6 +- features/state/getstate.go | 14 +- features/state/state_linux.go | 2 +- features/state/sysinfo.go | 2 +- features/sys_config/api_sys_config.go | 16 +- .../sys_config/service/repo_sys_config.go | 22 +- .../sys_config/service/service_sys_config.go | 6 +- features/sys_dict_data/api_sys_dict_data.go | 18 +- .../sys_dict_data/repo/repo_sys_dict_data.go | 14 +- .../service/service_sys_dict_data.go | 6 +- features/sys_dict_type/api_sys_dict_type.go | 16 +- .../sys_dict_type/repo/repo_sys_dict_type.go | 16 +- .../service/service_sys_dict_type.go | 12 +- features/sys_menu/api_sys_menu.go | 20 +- features/sys_menu/service/repo_sys_menu.go | 16 +- features/sys_menu/service/service_sys_menu.go | 14 +- features/sys_role/api_sys_role.go | 18 +- features/sys_role/service/repo_sys_role.go | 16 +- features/sys_role/service/service_sys_role.go | 6 +- features/sys_role_menu/repo_sys_role_menu.go | 6 +- features/sys_user/api_sys_user.go | 22 +- features/sys_user/model/sys_user.go | 2 +- features/sys_user/service/repo_sys_user.go | 20 +- features/sys_user/service/service_sys_user.go | 4 +- features/sys_user_role/repo_sys_user_role.go | 6 +- features/trace/tcpdump.go | 16 +- features/trace/trace.go | 12 +- features/udm_user/api_udm_user.go | 44 +- features/udm_user/repo/repo_udm_auth_user.go | 8 +- features/udm_user/repo/repo_udm_sub_user.go | 8 +- .../udm_user/service/service_redis_data.go | 4 +- .../udm_user/service/service_udm_auth_user.go | 4 +- .../udm_user/service/service_udm_sub_user.go | 4 +- features/ue/ue.go | 23 +- go.mod | 62 +-- go.sum | 156 ++----- lib/core/account/account.go | 12 +- lib/core/cmd/cmd.go | 201 --------- lib/core/datasource/datasource.go | 2 +- lib/core/file/csv.go | 88 ---- lib/core/file/ssh.go | 49 --- lib/core/file/txt.go | 79 ---- lib/core/mml_client/mml_client.go | 2 +- lib/core/redis/redis.go | 358 ---------------- lib/core/utils/ctx/ctx.go | 49 ++- lib/core/utils/date/date.go | 2 +- lib/core/utils/firewall/client.go | 34 -- lib/core/utils/firewall/client/firewalld.go | 209 --------- lib/core/utils/firewall/client/info.go | 20 - lib/core/utils/firewall/client/ufw.go | 238 ----------- lib/core/vo/login_user.go | 2 +- lib/core/vo/treeselect.go | 2 +- lib/dborm/dborm.go | 22 +- lib/midware/arrow_ip_addr.go | 4 +- lib/midware/authorize.go | 14 +- lib/midware/midhandle.go | 6 +- lib/midware/mml_log.go | 10 +- lib/midware/operate_log.go | 14 +- lib/mmlp/parse.go | 10 +- lib/oauth/oauth.go | 2 +- lib/routes/routes.go | 62 +-- lib/run/exec_linux.go | 2 +- lib/run/exec_wasm.go | 2 +- lib/run/exec_windows.go | 2 +- lib/services/file.go | 2 +- lib/services/services.go | 10 +- lib/session/session.go | 6 +- lib/wsinfo/process_data.go | 2 +- restagent/config/config.go | 14 +- restagent/config/map.go | 2 +- restagent/dev.yaml | 104 +++-- restagent/etc/certs/ca_cert.pem | 18 - restagent/etc/certs/omc_pri.key.aes_en | Bin 1680 -> 0 bytes restagent/etc/certs/omc_pub.key | 9 - restagent/etc/certs/private_key.pem | 27 -- restagent/etc/certs/public_key.pem | 8 - restagent/etc/certs/rootca.crt | 30 -- restagent/etc/certs/rootca.pem | 30 -- restagent/etc/certs/tsa-omc.crt | 26 -- restagent/etc/certs/tsa-omc.pem | 26 -- restagent/etc/certs/tsa-omc_pri.key | 27 -- restagent/etc/certs/tsa-omc_pri.pem | 27 -- restagent/etc/restconf-t.yaml | 8 +- restagent/etc/restconf.yaml | 15 +- restagent/license/upf/upf_1350015_system.ini | Bin 3724 -> 0 bytes restagent/makefile | 4 +- restagent/restagent.go | 26 +- src/app.go | 26 +- .../template/excel/user_import_template.xlsx | Bin 9400 -> 0 bytes src/configuration.go | 10 +- src/framework/config/config.go | 2 +- .../config/config/config.default.yaml | 9 +- src/framework/config/config/config.prod.yaml | 2 +- src/framework/constants/token/token.go | 3 + .../constants/uploadsubpath/uploadsubpath.go | 4 + src/framework/cron/cron_test.go | 2 +- src/framework/cron/log.go | 6 +- src/framework/datasource/datasource.go | 4 +- src/framework/errorcatch/errorcatch.go | 6 +- src/framework/i18n/i18n.go | 2 +- src/framework/logger/writer.go | 18 +- .../middleware/collectlogs/operate_log.go | 81 ++-- src/framework/middleware/cors.go | 2 +- src/framework/middleware/pre_authorize.go | 13 +- src/framework/middleware/rate_limit.go | 12 +- src/framework/middleware/repeat/repeat.go | 12 +- src/framework/middleware/report.go | 2 +- src/framework/middleware/security/csp.go | 4 +- src/framework/middleware/security/hsts.go | 2 +- src/framework/middleware/security/noopen.go | 2 +- src/framework/middleware/security/nosniff.go | 2 +- src/framework/middleware/security/referer.go | 4 +- src/framework/middleware/security/xframe.go | 2 +- .../middleware/security/xss_protection.go | 2 +- src/framework/redis/redis.go | 4 +- src/framework/{ => utils}/cmd/cmd.go | 59 +-- src/framework/utils/crypto/aes.go | 88 ++++ .../framework/utils/crypto/bcrypt.go | 0 src/framework/utils/crypto/crypto.go | 20 - src/framework/utils/ctx/ctx.go | 23 +- src/framework/utils/date/date.go | 2 +- src/framework/utils/fetch/fetch.go | 40 +- src/framework/utils/file/csv.go | 6 +- src/framework/utils/file/excel.go | 6 +- src/framework/utils/file/file.go | 14 +- src/framework/utils/file/json.go | 108 +++++ src/framework/utils/file/txt.go | 23 +- src/framework/utils/file/utils.go | 2 +- src/framework/utils/file/zip.go | 111 +++++ src/framework/utils/generate/generate.go | 2 +- src/framework/utils/ip2region/ip2region.go | 2 +- src/framework/utils/ping/ping.go | 139 ++++++ src/framework/utils/repo/repo.go | 15 +- src/framework/utils/ssh/files.go | 8 +- src/framework/utils/ssh/scp.go | 4 +- src/framework/utils/ssh/ssh.go | 245 +++++++++++ src/framework/utils/telnet/telnet.go | 218 ++++++++++ src/framework/utils/token/token.go | 14 +- src/framework/vo/loginuser.go | 2 +- src/framework/vo/result/result.go | 2 +- src/framework/vo/treeselect.go | 2 +- src/lib_features/account/account.go | 10 +- src/lib_features/config/config.go | 6 +- src/lib_features/session/session.go | 4 +- src/modules/chart/chart.go | 8 +- src/modules/chart/controller/chart_graph.go | 8 +- src/modules/chart/repository/chart_graph.go | 2 +- .../chart/repository/chart_graph.impl.go | 10 +- src/modules/chart/service/chart_graph.impl.go | 6 +- src/modules/common/common.go | 6 +- src/modules/common/controller/account.go | 24 +- src/modules/common/controller/captcha.go | 16 +- src/modules/common/controller/common.go | 8 +- src/modules/common/controller/file.go | 12 +- src/modules/common/controller/index.go | 4 +- src/modules/common/controller/register.go | 16 +- src/modules/common/service/account.go | 2 +- src/modules/common/service/account.impl.go | 20 +- src/modules/common/service/commont.impl.go | 6 +- src/modules/common/service/register.impl.go | 12 +- .../backupEtcFromNE/backupEtcFromNE.go | 145 ------- src/modules/crontask/crontask.go | 4 +- .../delExpiredNeBackup/delExpiredNeBackup.go | 94 ---- .../deleteExpiredRecord.go | 88 ---- .../backupEtcFromNE/backupEtcFromNE.go | 10 +- .../delExpiredNeBackup/delExpiredNeBackup.go | 6 +- .../deleteExpiredRecord.go | 6 +- .../genNeStateAlarm/genNeStateAlarm.go | 12 +- .../getStateFromNE/getStateFromNE.go | 8 +- .../monitor_sys_resource.go | 6 +- src/modules/crontask/processor/processor.go | 14 +- src/modules/monitor/controller/monitor.go | 8 +- src/modules/monitor/controller/sys_cache.go | 12 +- src/modules/monitor/controller/sys_job.go | 16 +- src/modules/monitor/controller/sys_job_log.go | 18 +- .../monitor/controller/sys_user_online.go | 16 +- src/modules/monitor/controller/system_info.go | 4 +- src/modules/monitor/monitor.go | 14 +- src/modules/monitor/processor/bar/bar.go | 4 +- src/modules/monitor/processor/foo/foo.go | 4 +- src/modules/monitor/processor/processor.go | 8 +- .../monitor/processor/simple/simple.go | 4 +- src/modules/monitor/repository/monitor.go | 2 +- .../monitor/repository/monitor.impl.go | 6 +- src/modules/monitor/repository/sys_job.go | 2 +- .../monitor/repository/sys_job.impl.go | 17 +- src/modules/monitor/repository/sys_job_log.go | 2 +- .../monitor/repository/sys_job_log.impl.go | 12 +- src/modules/monitor/service/monitor.impl.go | 8 +- src/modules/monitor/service/sys_job.go | 2 +- src/modules/monitor/service/sys_job.impl.go | 8 +- src/modules/monitor/service/sys_job_log.go | 2 +- .../monitor/service/sys_job_log.impl.go | 4 +- .../monitor/service/sys_user_online.go | 4 +- .../monitor/service/sys_user_online.impl.go | 4 +- .../monitor/service/system_info.impl.go | 4 +- src/modules/net_element/controller/ne_info.go | 39 -- src/modules/net_element/model/ne_info.go | 19 - src/modules/net_element/net_element.go | 23 - src/modules/net_element/repository/ne_info.go | 11 - .../net_element/repository/ne_info.impl.go | 69 --- src/modules/net_element/service/ne_info.go | 9 - .../net_element/service/ne_info.impl.go | 22 - src/modules/network_data/controller/alarm.go | 81 ++++ src/modules/network_data/controller/amf.go | 45 +- src/modules/network_data/controller/ims.go | 45 +- .../network_data/controller/perf_kpi.go | 14 +- src/modules/network_data/controller/upf.go | 10 +- src/modules/network_data/model/alarm.go | 57 +++ src/modules/network_data/model/cdr_event.go | 8 +- src/modules/network_data/model/ue_event.go | 7 +- src/modules/network_data/network_data.go | 43 +- src/modules/network_data/repository/alarm.go | 15 + .../network_data/repository/alarm.impl.go | 194 +++++++++ .../network_data/repository/cdr_event.go | 8 +- .../network_data/repository/cdr_event.impl.go | 53 ++- .../network_data/repository/perf_kpi.go | 2 +- .../network_data/repository/perf_kpi.impl.go | 6 +- .../network_data/repository/ue_event.go | 8 +- .../network_data/repository/ue_event.impl.go | 49 ++- src/modules/network_data/service/alarm.go | 12 + .../network_data/service/alarm.impl.go | 40 ++ src/modules/network_data/service/cdr_event.go | 5 +- .../network_data/service/cdr_event.impl.go | 22 +- src/modules/network_data/service/perf_kpi.go | 2 +- .../network_data/service/perf_kpi.impl.go | 14 +- src/modules/network_data/service/ue_event.go | 5 +- .../network_data/service/ue_event.impl.go | 22 +- .../network_element/controller/ne_action.go | 19 +- .../network_element/controller/ne_host.go | 356 +++++++++++++++ .../network_element/controller/ne_host_cmd.go | 152 +++++++ .../network_element/controller/ne_info.go | 222 ++++++++-- .../network_element/controller/ne_software.go | 180 ++++++++ .../network_element/controller/ne_version.go | 150 +++++++ .../network_element/controller/perf_kpi.go | 77 ---- .../network_element/controller/udm_auth.go | 31 +- .../network_element/controller/udm_sub.go | 31 +- src/modules/network_element/model/ne_host.go | 40 ++ .../network_element/model/ne_host_cmd.go | 20 + src/modules/network_element/model/ne_info.go | 18 +- .../network_element/model/ne_software.go | 21 + .../network_element/model/ne_version.go | 23 + src/modules/network_element/model/perf_kpi.go | 23 - .../network_element/network_element.go | 203 ++++++++- .../network_element/repository/ne_host.go | 27 ++ .../repository/ne_host.impl.go | 404 ++++++++++++++++++ .../network_element/repository/ne_host_cmd.go | 27 ++ .../repository/ne_host_cmd.impl.go | 306 +++++++++++++ .../network_element/repository/ne_info.go | 24 +- .../repository/ne_info.impl.go | 269 +++++++++++- .../network_element/repository/ne_software.go | 27 ++ .../repository/ne_software.impl.go | 323 ++++++++++++++ .../network_element/repository/ne_version.go | 27 ++ .../repository/ne_version.impl.go | 331 ++++++++++++++ .../network_element/repository/perf_kpi.go | 12 - .../repository/perf_kpi.impl.go | 90 ---- .../network_element/repository/udm_auth.go | 2 +- .../repository/udm_auth.impl.go | 10 +- .../network_element/repository/udm_sub.go | 2 +- .../repository/udm_sub.impl.go | 10 +- .../network_element/service/ne_direct_link.go | 44 +- .../network_element/service/ne_host.go | 30 ++ .../network_element/service/ne_host.impl.go | 92 ++++ .../network_element/service/ne_host_cmd.go | 27 ++ .../service/ne_host_cmd.impl.go | 80 ++++ .../network_element/service/ne_info.go | 33 +- .../network_element/service/ne_info.impl.go | 216 +++++++++- .../network_element/service/ne_software.go | 33 ++ .../service/ne_software.impl.go | 97 +++++ .../network_element/service/ne_version.go | 30 ++ .../service/ne_version.impl.go | 91 ++++ .../network_element/service/perf_kpi.go | 12 - .../network_element/service/perf_kpi.impl.go | 38 -- .../network_element/service/udm_auth.go | 2 +- .../network_element/service/udm_auth.impl.go | 6 +- .../network_element/service/udm_sub.go | 2 +- .../network_element/service/udm_sub.impl.go | 6 +- src/modules/system/controller/sys_config.go | 14 +- src/modules/system/controller/sys_dept.go | 14 +- .../system/controller/sys_dict_data.go | 14 +- .../system/controller/sys_dict_type.go | 16 +- .../system/controller/sys_log_login.go | 18 +- .../system/controller/sys_log_operate.go | 16 +- src/modules/system/controller/sys_menu.go | 20 +- src/modules/system/controller/sys_notice.go | 127 ------ src/modules/system/controller/sys_post.go | 14 +- src/modules/system/controller/sys_profile.go | 26 +- src/modules/system/controller/sys_role.go | 16 +- src/modules/system/controller/sys_user.go | 24 +- src/modules/system/repository/sys_config.go | 2 +- .../system/repository/sys_config.impl.go | 25 +- src/modules/system/repository/sys_dept.go | 2 +- .../system/repository/sys_dept.impl.go | 16 +- .../system/repository/sys_dict_data.go | 2 +- .../system/repository/sys_dict_data.impl.go | 17 +- .../system/repository/sys_dict_type.go | 2 +- .../system/repository/sys_dict_type.impl.go | 19 +- .../system/repository/sys_log_login.go | 2 +- .../system/repository/sys_log_login.impl.go | 16 +- .../system/repository/sys_log_operate.go | 2 +- .../system/repository/sys_log_operate.impl.go | 16 +- src/modules/system/repository/sys_menu.go | 2 +- .../system/repository/sys_menu.impl.go | 18 +- src/modules/system/repository/sys_notice.go | 24 -- .../system/repository/sys_notice.impl.go | 297 ------------- src/modules/system/repository/sys_post.go | 2 +- .../system/repository/sys_post.impl.go | 17 +- src/modules/system/repository/sys_role.go | 2 +- .../system/repository/sys_role.impl.go | 19 +- .../system/repository/sys_role_dept.go | 2 +- .../system/repository/sys_role_dept.impl.go | 8 +- .../system/repository/sys_role_menu.go | 2 +- .../system/repository/sys_role_menu.impl.go | 10 +- src/modules/system/repository/sys_user.go | 2 +- .../system/repository/sys_user.impl.go | 21 +- .../system/repository/sys_user_post.go | 2 +- .../system/repository/sys_user_post.impl.go | 10 +- .../system/repository/sys_user_role.go | 2 +- .../system/repository/sys_user_role.impl.go | 10 +- src/modules/system/service/sys_config.go | 2 +- src/modules/system/service/sys_config.impl.go | 8 +- src/modules/system/service/sys_dept.go | 4 +- src/modules/system/service/sys_dept.impl.go | 8 +- src/modules/system/service/sys_dict_data.go | 2 +- .../system/service/sys_dict_data.impl.go | 4 +- src/modules/system/service/sys_dict_type.go | 2 +- .../system/service/sys_dict_type.impl.go | 10 +- src/modules/system/service/sys_log_login.go | 2 +- .../system/service/sys_log_login.impl.go | 4 +- src/modules/system/service/sys_log_operate.go | 2 +- .../system/service/sys_log_operate.impl.go | 4 +- src/modules/system/service/sys_menu.go | 4 +- src/modules/system/service/sys_menu.impl.go | 14 +- src/modules/system/service/sys_notice.go | 24 -- src/modules/system/service/sys_notice.impl.go | 73 ---- src/modules/system/service/sys_post.go | 2 +- src/modules/system/service/sys_post.impl.go | 4 +- src/modules/system/service/sys_role.go | 2 +- src/modules/system/service/sys_role.impl.go | 4 +- src/modules/system/service/sys_user.go | 2 +- src/modules/system/service/sys_user.impl.go | 6 +- src/modules/system/system.go | 12 +- src/modules/trace/controller/tcpdump.go | 8 +- src/modules/trace/service/tcpdump.impl.go | 10 +- src/modules/trace/trace.go | 8 +- src/modules/ws/controller/ws.go | 211 ++++++++- src/modules/ws/model/ws.go | 3 +- src/modules/ws/processor/cdr_connect.go | 8 +- src/modules/ws/processor/ne_state.go | 6 +- src/modules/ws/processor/net_connect.go | 6 +- src/modules/ws/processor/ps_process.go | 10 +- src/modules/ws/processor/ue_connect.go | 8 +- src/modules/ws/processor/upf_total_flow.go | 8 +- src/modules/ws/service/ws.go | 13 +- src/modules/ws/service/ws.impl.go | 25 +- src/modules/ws/service/ws_receive.go | 6 +- src/modules/ws/service/ws_receive.impl.go | 53 ++- src/modules/ws/service/ws_send.impl.go | 4 +- src/modules/ws/ws.go | 21 +- 393 files changed, 7870 insertions(+), 5170 deletions(-) delete mode 100644 features/firewall/api_firewall.go delete mode 100644 features/firewall/model/firewall.go delete mode 100644 features/firewall/model/firewall_vo.go delete mode 100644 features/firewall/repo/repo_firewall.go delete mode 100644 features/firewall/service/service_firewall.go create mode 100644 features/fm/ucpcli.go delete mode 100644 lib/core/cmd/cmd.go delete mode 100644 lib/core/file/csv.go delete mode 100644 lib/core/file/ssh.go delete mode 100644 lib/core/file/txt.go delete mode 100644 lib/core/redis/redis.go delete mode 100644 lib/core/utils/firewall/client.go delete mode 100644 lib/core/utils/firewall/client/firewalld.go delete mode 100644 lib/core/utils/firewall/client/info.go delete mode 100644 lib/core/utils/firewall/client/ufw.go delete mode 100644 restagent/etc/certs/ca_cert.pem delete mode 100644 restagent/etc/certs/omc_pri.key.aes_en delete mode 100644 restagent/etc/certs/omc_pub.key delete mode 100644 restagent/etc/certs/private_key.pem delete mode 100644 restagent/etc/certs/public_key.pem delete mode 100644 restagent/etc/certs/rootca.crt delete mode 100644 restagent/etc/certs/rootca.pem delete mode 100644 restagent/etc/certs/tsa-omc.crt delete mode 100644 restagent/etc/certs/tsa-omc.pem delete mode 100644 restagent/etc/certs/tsa-omc_pri.key delete mode 100644 restagent/etc/certs/tsa-omc_pri.pem delete mode 100644 restagent/license/upf/upf_1350015_system.ini delete mode 100644 src/assets/template/excel/user_import_template.xlsx rename src/framework/{ => utils}/cmd/cmd.go (95%) create mode 100644 src/framework/utils/crypto/aes.go rename lib/core/utils/crypto/crypto.go => src/framework/utils/crypto/bcrypt.go (100%) delete mode 100644 src/framework/utils/crypto/crypto.go create mode 100644 src/framework/utils/file/json.go create mode 100644 src/framework/utils/file/zip.go create mode 100644 src/framework/utils/ping/ping.go create mode 100644 src/framework/utils/ssh/ssh.go create mode 100644 src/framework/utils/telnet/telnet.go delete mode 100644 src/modules/crontask/backupEtcFromNE/backupEtcFromNE.go delete mode 100644 src/modules/crontask/delExpiredNeBackup/delExpiredNeBackup.go delete mode 100644 src/modules/crontask/deleteExpiredRecord/deleteExpiredRecord.go delete mode 100644 src/modules/net_element/controller/ne_info.go delete mode 100644 src/modules/net_element/model/ne_info.go delete mode 100644 src/modules/net_element/net_element.go delete mode 100644 src/modules/net_element/repository/ne_info.go delete mode 100644 src/modules/net_element/repository/ne_info.impl.go delete mode 100644 src/modules/net_element/service/ne_info.go delete mode 100644 src/modules/net_element/service/ne_info.impl.go create mode 100644 src/modules/network_data/controller/alarm.go create mode 100644 src/modules/network_data/model/alarm.go create mode 100644 src/modules/network_data/repository/alarm.go create mode 100644 src/modules/network_data/repository/alarm.impl.go create mode 100644 src/modules/network_data/service/alarm.go create mode 100644 src/modules/network_data/service/alarm.impl.go create mode 100644 src/modules/network_element/controller/ne_host.go create mode 100644 src/modules/network_element/controller/ne_host_cmd.go create mode 100644 src/modules/network_element/controller/ne_software.go create mode 100644 src/modules/network_element/controller/ne_version.go delete mode 100644 src/modules/network_element/controller/perf_kpi.go create mode 100644 src/modules/network_element/model/ne_host.go create mode 100644 src/modules/network_element/model/ne_host_cmd.go create mode 100644 src/modules/network_element/model/ne_software.go create mode 100644 src/modules/network_element/model/ne_version.go delete mode 100644 src/modules/network_element/model/perf_kpi.go create mode 100644 src/modules/network_element/repository/ne_host.go create mode 100644 src/modules/network_element/repository/ne_host.impl.go create mode 100644 src/modules/network_element/repository/ne_host_cmd.go create mode 100644 src/modules/network_element/repository/ne_host_cmd.impl.go create mode 100644 src/modules/network_element/repository/ne_software.go create mode 100644 src/modules/network_element/repository/ne_software.impl.go create mode 100644 src/modules/network_element/repository/ne_version.go create mode 100644 src/modules/network_element/repository/ne_version.impl.go delete mode 100644 src/modules/network_element/repository/perf_kpi.go delete mode 100644 src/modules/network_element/repository/perf_kpi.impl.go create mode 100644 src/modules/network_element/service/ne_host.go create mode 100644 src/modules/network_element/service/ne_host.impl.go create mode 100644 src/modules/network_element/service/ne_host_cmd.go create mode 100644 src/modules/network_element/service/ne_host_cmd.impl.go create mode 100644 src/modules/network_element/service/ne_software.go create mode 100644 src/modules/network_element/service/ne_software.impl.go create mode 100644 src/modules/network_element/service/ne_version.go create mode 100644 src/modules/network_element/service/ne_version.impl.go delete mode 100644 src/modules/network_element/service/perf_kpi.go delete mode 100644 src/modules/network_element/service/perf_kpi.impl.go delete mode 100644 src/modules/system/controller/sys_notice.go delete mode 100644 src/modules/system/repository/sys_notice.go delete mode 100644 src/modules/system/repository/sys_notice.impl.go delete mode 100644 src/modules/system/service/sys_notice.go delete mode 100644 src/modules/system/service/sys_notice.impl.go diff --git a/features/aaaa/aaaa.go b/features/aaaa/aaaa.go index 8b10720..26c0370 100644 --- a/features/aaaa/aaaa.go +++ b/features/aaaa/aaaa.go @@ -9,11 +9,11 @@ import ( "github.com/go-resty/resty/v2" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/lib/oauth" - "ems.agt/lib/services" - "ems.agt/restagent/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 50599f7..90437bd 100644 --- a/features/cdr/cdrevent.go +++ b/features/cdr/cdrevent.go @@ -5,12 +5,12 @@ import ( "io" "net/http" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" - wsService "ems.agt/src/modules/ws/service" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" + wsService "be.ems/src/modules/ws/service" ) var ( diff --git a/features/cm/exec_linux.go b/features/cm/exec_linux.go index 088fd86..b8b7b36 100644 --- a/features/cm/exec_linux.go +++ b/features/cm/exec_linux.go @@ -9,7 +9,7 @@ import ( "os/exec" "time" - "ems.agt/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 0c1d038..9e151bf 100644 --- a/features/cm/exec_windows.go +++ b/features/cm/exec_windows.go @@ -9,7 +9,7 @@ import ( "os/exec" "time" - "ems.agt/lib/log" + "be.ems/lib/log" ) func ExecCmd(command string) error { diff --git a/features/cm/license.go b/features/cm/license.go index ad2cf1e..1c045dd 100644 --- a/features/cm/license.go +++ b/features/cm/license.go @@ -7,11 +7,12 @@ import ( "os" "os/exec" "strings" + "time" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "github.com/gorilla/mux" ) @@ -153,6 +154,22 @@ func DeleteLcenseFile(w http.ResponseWriter, r *http.Request) { 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... ") @@ -207,7 +224,7 @@ func UploadLicenseFileData(w http.ResponseWriter, r *http.Request) { var licenseFileName, comment string - // 处理软件rpm/deb文件 + // 处理license文件 if len(licFile) > 0 { file := licFile[0] // 打开文件 @@ -279,39 +296,213 @@ func UploadLicenseFileData(w http.ResponseWriter, r *http.Request) { return } - switch neTypeLower { - case "omc": - restartCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh restart", config.GetYamlConfig().NE.OmcDir) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.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 - } - } + /* + // 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, diff --git a/features/cm/ne.go b/features/cm/ne.go index 16e96f2..708749f 100644 --- a/features/cm/ne.go +++ b/features/cm/ne.go @@ -10,21 +10,19 @@ import ( "strings" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" - tokenConst "ems.agt/src/framework/constants/token" - neService "ems.agt/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" ) var ( - UriParamOmcNeConfig = config.DefaultUriPrefix + "/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig" - UriOmcNeConfig = config.DefaultUriPrefix + "/systemManagement/v1/elementType/omc/objectType/config/omcNeConfig" // NE CM export/import NeCmUri = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm" // NE info @@ -36,11 +34,9 @@ var ( // nf instance action uri, action: start/stop/restart UriNeInstance = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/instance/{action}" - CustomUriParamOmcNeConfig = config.UriPrefix + "/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig" - CustomUriOmcNeConfig = config.UriPrefix + "/systemManagement/v1/elementType/omc/objectType/config/omcNeConfig" - CustomNeCmUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm" - CustomUriNeInfo = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo" - CustomUriNeCmFile = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}" + CustomNeCmUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm" + CustomUriNeInfo = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo" + CustomUriNeCmFile = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}" // service action uri, action: start/stop/restart CustomUriNeService = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/service/{action}" // nf instance action uri, action: start/stop/restart @@ -170,7 +166,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } else { hostUri := global.CombineHostUri(neInfo.Ip, neInfo.Port) //hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - apiUri := fmt.Sprintf(UriParamOmcNeConfig, strings.ToLower(neInfo.NeType)) + apiUri := fmt.Sprintf("%s/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", config.DefaultUriPrefix, strings.ToLower(neInfo.NeType)) requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri) log.Debug("requestURI2NF:", requestURI2NF) @@ -280,7 +276,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } else { hostUri := global.CombineHostUri(neInfo.Ip, neInfo.Port) //hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - apiUri := fmt.Sprintf(UriParamOmcNeConfig, neTypeLower) + apiUri := fmt.Sprintf("%s/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", config.DefaultUriPrefix, neTypeLower) requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri) log.Debug("requestURI2NF:", requestURI2NF) @@ -338,28 +334,6 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } } -func PutOMCNeConfig(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to io.ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := new(dborm.NeInfo) - _ = json.Unmarshal(body, neInfo) - neInfo.NeType = strings.ToUpper(neType) - - services.ResponseStatusOK204NoContent(w) -} - func DeleteNeInfo(w http.ResponseWriter, r *http.Request) { log.Debug("DeleteNeInfo processing... ") diff --git a/features/cm/param.go b/features/cm/param.go index aa396f8..679bd25 100644 --- a/features/cm/param.go +++ b/features/cm/param.go @@ -1,18 +1,20 @@ package cm import ( - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "strings" + + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "encoding/json" "fmt" "io" "net/http" - tokenConst "ems.agt/src/framework/constants/token" + tokenConst "be.ems/src/framework/constants/token" "github.com/go-resty/resty/v2" "github.com/gorilla/mux" ) @@ -163,8 +165,14 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) { services.ResponseNotFound404UriNotExist(w, r) return } - neId := services.GetUriParamString(r, "ne_id", ",", false, false) + // OMC配置接口 /api/rest/systemManagement/v1/elementType/omc/objectType/config/omcNeConfig + if v, ok := vars["paraName"]; ok && v == "omcNeConfig" && strings.ToLower(neType) == "omc" { + PutOMCNeConfig(w, r) + return + } + + neId := services.GetUriParamString(r, "ne_id", ",", false, false) // no, _ := strconv.ParseInt(neId, 10, 64) neInfo, err := dborm.XormGetNeInfo(neType, neId) if err != nil { @@ -199,6 +207,31 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) { services.ResponseWithJson(w, http.StatusNoContent, response) } +// PutOMCNeConfig 网元OMC配置 +// +// 目前没配置,返回204 +func PutOMCNeConfig(w http.ResponseWriter, r *http.Request) { + // vars := mux.Vars(r) + // neType := vars["elementTypeValue"] + // if neType == "" { + // log.Error("elementTypeValue is empty") + // services.ResponseNotFound404UriNotExist(w, r) + // return + // } + // body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + // if err != nil { + // log.Error("Failed to io.ReadAll:", err) + // services.ResponseNotFound404UriNotExist(w, r) + // return + // } + + // neInfo := new(dborm.NeInfo) + // _ = json.Unmarshal(body, neInfo) + // neInfo.NeType = strings.ToUpper(neType) + + services.ResponseStatusOK204NoContent(w) +} + func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) { log.Debug("DeleteParamConfigToNF processing... ") diff --git a/features/cm/software.go b/features/cm/software.go index 2df85ef..d4ec7ed 100644 --- a/features/cm/software.go +++ b/features/cm/software.go @@ -10,11 +10,11 @@ import ( "strconv" "strings" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/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 f8cfb05..3bf7bb7 100644 --- a/features/dbrest/backup.go +++ b/features/dbrest/backup.go @@ -10,11 +10,11 @@ import ( "path/filepath" "time" - "ems.agt/lib/core/conf" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/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 d467979..91f5177 100644 --- a/features/dbrest/dbrest.go +++ b/features/dbrest/dbrest.go @@ -9,12 +9,12 @@ import ( "strings" "time" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/lib/core/utils/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 fbfbf1f..c0cb25c 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -5,11 +5,11 @@ import ( "io" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - wsService "ems.agt/src/modules/ws/service" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + wsService "be.ems/src/modules/ws/service" "github.com/gin-gonic/gin" ) diff --git a/features/file/file.go b/features/file/file.go index 815daca..4374d4c 100644 --- a/features/file/file.go +++ b/features/file/file.go @@ -5,12 +5,12 @@ import ( "net/http" "path/filepath" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/dborm" - "ems.agt/lib/file" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/dborm" + "be.ems/lib/file" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "github.com/gorilla/mux" "github.com/shirou/gopsutil/disk" ) diff --git a/features/file/service.go b/features/file/service.go index 9fc3ec6..3742b7a 100644 --- a/features/file/service.go +++ b/features/file/service.go @@ -8,7 +8,7 @@ import ( "path/filepath" "strings" - "ems.agt/lib/file" + "be.ems/lib/file" "github.com/spf13/afero" ) diff --git a/features/firewall/api_firewall.go b/features/firewall/api_firewall.go deleted file mode 100644 index e35caa6..0000000 --- a/features/firewall/api_firewall.go +++ /dev/null @@ -1,88 +0,0 @@ -package firewall - -import ( - "net/http" - - "ems.agt/features/firewall/model" - "ems.agt/features/firewall/service" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/services" - "ems.agt/restagent/config" -) - -// 防火墙管理接口添加到路由 -func Routers() []services.RouterItem { - // 实例化控制层 FirewallApi 结构体 - var apis = &FirewallApi{ - firewallService: *service.NewServiceFirewall, - } - - rs := [...]services.RouterItem{ - { - Method: "GET", - Pattern: "/base", - Handler: apis.BaseInfo, - Middleware: nil, //midware.Authorize(nil), - }, - { - Method: "POST", - Pattern: "/rule", - Handler: apis.Rule, - Middleware: nil, //midware.Authorize(nil), - }, - // 添加更多的 Router 对象... - } - - // 生成两组前缀路由 - rsPrefix := []services.RouterItem{} - for _, v := range rs { - path := "/firewallManage/{apiVersion}" + v.Pattern - // 固定前缀 - v.Pattern = config.DefaultUriPrefix + path - rsPrefix = append(rsPrefix, v) - // 可配置 - v.Pattern = config.UriPrefix + path - rsPrefix = append(rsPrefix, v) - } - return rsPrefix -} - -// 防火墙管理 -// -// PATH /firewallManage -type FirewallApi struct { - firewallService service.ServiceFirewall -} - -// 获取防火墙基础信息 -// -// GET /base -func (s *FirewallApi) BaseInfo(w http.ResponseWriter, r *http.Request) { - data, err := s.firewallService.LoadBaseInfo() - if err != nil { - ctx.JSON(w, 200, result.ErrMsg(err.Error())) - return - } - - ctx.JSON(w, 200, result.OkData(data)) -} - -// 获取防火墙规则列表分页 -// -// GET /rule -func (s *FirewallApi) Rule(w http.ResponseWriter, r *http.Request) { - var body model.RuleQuerys - err := ctx.ShouldBindJSON(r, &body) - if err != nil || body.Type == "" { - ctx.JSON(w, 400, result.CodeMsg(400, "parameter error")) - return - } - data, err := s.firewallService.RulePage(body) - if err != nil { - ctx.JSON(w, 400, result.ErrMsg(err.Error())) - return - } - - ctx.JSON(w, 200, result.OkData(data)) -} diff --git a/features/firewall/model/firewall.go b/features/firewall/model/firewall.go deleted file mode 100644 index 782aa89..0000000 --- a/features/firewall/model/firewall.go +++ /dev/null @@ -1,13 +0,0 @@ -package model - -type Firewall struct { - ID int64 `json:"id" xorm:"id"` - CreatedAt int64 `json:"createdAt" xorm:"created_at"` - UpdatedAt int64 `json:"updatedAt" xorm:"updated_at"` - Type string `json:"type" xorm:"type"` - Port string `json:"port" xorm:"port"` - Protocol string `json:"protocol" xorm:"protocol"` - Address string `json:"address" xorm:"address"` - Strategy string `json:"strategy" xorm:"strategy"` - Description string `json:"description" xorm:"description"` -} diff --git a/features/firewall/model/firewall_vo.go b/features/firewall/model/firewall_vo.go deleted file mode 100644 index d4e3553..0000000 --- a/features/firewall/model/firewall_vo.go +++ /dev/null @@ -1,64 +0,0 @@ -package model - -type FirewallBaseInfo struct { - Name string `json:"name"` - Status string `json:"status"` - Version string `json:"version"` - PingStatus string `json:"pingStatus"` -} - -type RuleQuerys struct { - PageNum int `json:"pageNum" validate:"required,number"` - PageSize int `json:"pageSize" validate:"required,number"` - Info string `json:"info"` - Status string `json:"status"` - Strategy string `json:"strategy"` - Type string `json:"type" validate:"required"` -} - -type FirewallOperation struct { - Operation string `json:"operation" validate:"required,oneof=start stop disablePing enablePing"` -} - -type PortRuleOperate struct { - Operation string `json:"operation" validate:"required,oneof=add remove"` - Address string `json:"address"` - Port string `json:"port" validate:"required"` - Protocol string `json:"protocol" validate:"required,oneof=tcp udp tcp/udp"` - Strategy string `json:"strategy" validate:"required,oneof=accept drop"` - - Description string `json:"description"` -} - -type UpdateFirewallDescription struct { - Type string `json:"type"` - Address string `json:"address"` - Port string `json:"port"` - Protocol string `json:"protocol"` - Strategy string `json:"strategy" validate:"required,oneof=accept drop"` - - Description string `json:"description"` -} - -type AddrRuleOperate struct { - Operation string `json:"operation" validate:"required,oneof=add remove"` - Address string `json:"address" validate:"required"` - Strategy string `json:"strategy" validate:"required,oneof=accept drop"` - - Description string `json:"description"` -} - -type PortRuleUpdate struct { - OldRule PortRuleOperate `json:"oldRule"` - NewRule PortRuleOperate `json:"newRule"` -} - -type AddrRuleUpdate struct { - OldRule AddrRuleOperate `json:"oldRule"` - NewRule AddrRuleOperate `json:"newRule"` -} - -type BatchRuleOperate struct { - Type string `json:"type" validate:"required"` - Rules []PortRuleOperate `json:"rules"` -} diff --git a/features/firewall/repo/repo_firewall.go b/features/firewall/repo/repo_firewall.go deleted file mode 100644 index e95a056..0000000 --- a/features/firewall/repo/repo_firewall.go +++ /dev/null @@ -1,133 +0,0 @@ -package repo - -import ( - "strings" - - "ems.agt/features/firewall/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/log" -) - -// 实例化数据层 RepoFirewall 结构体 -var NewRepoFirewall = &RepoFirewall{ - selectSql: `select - id, created_at, updated_at, type, port, protocol, address, strategy, description - from monitor_firewall`, - - resultMap: map[string]string{ - "id": "ID", - "created_at": "CreatedAt", - "updated_at": "UpdatedAt", - "type": "Type", - "port": "Port", - "protocol": "Protocol", - "address": "Address", - "strategy": "Strategy", - "description": "Description", - }, -} - -// RepoFirewall 防火墙 数据层处理 -type RepoFirewall struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *RepoFirewall) convertResultRows(rows []map[string]any) []model.Firewall { - arr := make([]model.Firewall, 0) - for _, row := range rows { - UdmUser := model.Firewall{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - datasource.SetFieldValue(&UdmUser, keyMapper, value) - } - } - arr = append(arr, UdmUser) - } - return arr -} - -// List 根据实体查询 -func (r *RepoFirewall) List(f model.Firewall) []model.Firewall { - // 查询条件拼接 - var conditions []string - var params []any - if f.Type != "" { - conditions = append(conditions, "type = ?") - params = append(params, f.Type) - } - if f.Protocol != "" { - conditions = append(conditions, "protocol = ?") - params = append(params, f.Protocol) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - log.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增实体 -func (r *RepoFirewall) Insert(f model.Firewall) int64 { - results, err := datasource.DefaultDB().Table("monitor_firewall").Insert(f) - if err != nil { - return results - } - return results -} - -// Update 修改更新 -func (r *RepoFirewall) Update(f model.Firewall) int64 { - // 查询先 - var fd model.Firewall - if f.Type == "port" { - has, err := datasource.DefaultDB().Table("monitor_firewall").Where("type = ? AND port = ? AND protocol = ? AND address = ? AND strategy = ?", "port", f.Port, f.Protocol, f.Address, f.Strategy).Get(&fd) - if !has || err != nil { - return 0 - } - } else { - has, err := datasource.DefaultDB().Table("monitor_firewall").Where("type = ? AND address = ? AND strategy = ?", "address", f.Address, f.Strategy).Get(&fd) - if !has || err != nil { - return 0 - } - } - f.ID = fd.ID - - results, err := datasource.DefaultDB().Table("monitor_firewall").Where("id = ?", f.ID).Update(f) - if err != nil { - return 0 - } - return results -} - -// Delete 删除实体 -func (r *RepoFirewall) Delete(id int64) int64 { - results, err := datasource.DefaultDB().Table("u_sub_user").Where("id = ?", id).Delete() - if err != nil { - return results - } - return results -} - -// DeleteFirewallRecord 删除实体 -func (r *RepoFirewall) DeleteFirewallRecord(fType, port, protocol, address, strategy string) int64 { - results, err := datasource.DefaultDB().Table("u_sub_user").Where("type = ? AND port = ? AND protocol = ? AND address = ? AND strategy = ?", fType, port, protocol, address, strategy).Delete() - if err != nil { - return results - } - return results -} diff --git a/features/firewall/service/service_firewall.go b/features/firewall/service/service_firewall.go deleted file mode 100644 index 62579a2..0000000 --- a/features/firewall/service/service_firewall.go +++ /dev/null @@ -1,207 +0,0 @@ -package service - -import ( - "fmt" - "os" - "strconv" - "strings" - - "ems.agt/features/firewall/model" - "ems.agt/features/firewall/repo" - "ems.agt/lib/core/cmd" - "ems.agt/lib/core/utils/firewall" - fireClient "ems.agt/lib/core/utils/firewall/client" - "ems.agt/lib/core/utils/scan" -) - -// 实例化服务层 ServiceFirewall 结构体 -var NewServiceFirewall = &ServiceFirewall{ - repoFirewall: *repo.NewRepoFirewall, -} - -// ServiceFirewall 防火墙 服务层处理 -type ServiceFirewall struct { - repoFirewall repo.RepoFirewall -} - -// LoadBaseInfo 获取防火墙基础信息 -func (s *ServiceFirewall) LoadBaseInfo() (model.FirewallBaseInfo, error) { - var baseInfo model.FirewallBaseInfo - baseInfo.PingStatus = s.pingStatus() - baseInfo.Status = "not running" - baseInfo.Version = "-" - baseInfo.Name = "-" - client, err := firewall.NewFirewallClient() - if err != nil { - if err.Error() == "no such type" { - return baseInfo, nil - } - return baseInfo, err - } - baseInfo.Name = client.Name() - baseInfo.Status, err = client.Status() - if err != nil { - return baseInfo, err - } - if baseInfo.Status == "not running" { - return baseInfo, err - } - baseInfo.Version, err = client.Version() - if err != nil { - return baseInfo, err - } - return baseInfo, nil -} - -// LoadBaseInfo 获取防火墙基础信息 -func (s *ServiceFirewall) RulePage(querys model.RuleQuerys) (map[string]any, error) { - var ( - datas []fireClient.FireInfo - backDatas []fireClient.FireInfo - ) - - data := map[string]any{ - "total": 0, - "rows": backDatas, - } - - client, err := firewall.NewFirewallClient() - if err != nil { - return data, err - } - if querys.Type == "port" { - ports, err := client.ListPort() - if err != nil { - return data, err - } - if len(querys.Info) != 0 { - for _, port := range ports { - if strings.Contains(port.Port, querys.Info) { - datas = append(datas, port) - } - } - } else { - datas = ports - } - } else { - addrs, err := client.ListAddress() - if err != nil { - return data, err - } - if len(querys.Info) != 0 { - for _, addr := range addrs { - if strings.Contains(addr.Address, querys.Info) { - datas = append(datas, addr) - } - } - } else { - datas = addrs - } - } - - var datasFilterStatus []fireClient.FireInfo - if len(querys.Status) != 0 { - for _, data := range datas { - portItem, _ := strconv.Atoi(data.Port) - if querys.Status == "free" && !scan.ScanPortWithProto(portItem, data.Protocol) { - datasFilterStatus = append(datasFilterStatus, data) - } - if querys.Status == "used" && scan.ScanPortWithProto(portItem, data.Protocol) { - datasFilterStatus = append(datasFilterStatus, data) - } - } - } else { - datasFilterStatus = datas - } - var datasFilterStrategy []fireClient.FireInfo - if len(querys.Strategy) != 0 { - for _, data := range datasFilterStatus { - if querys.Strategy == data.Strategy { - datasFilterStrategy = append(datasFilterStrategy, data) - } - } - } else { - datasFilterStrategy = datasFilterStatus - } - - total, start, end := len(datasFilterStrategy), (querys.PageNum-1)*querys.PageSize, querys.PageNum*querys.PageSize - if start > total { - backDatas = make([]fireClient.FireInfo, 0) - } else { - if end >= total { - end = total - } - backDatas = datasFilterStrategy[start:end] - } - - datasFromDB := s.repoFirewall.List(model.Firewall{}) - for i := 0; i < len(backDatas); i++ { - for _, des := range datasFromDB { - if querys.Type != des.Type { - continue - } - if backDatas[i].Port == des.Port && querys.Type == "port" && - backDatas[i].Protocol == des.Protocol && - backDatas[i].Strategy == des.Strategy && - backDatas[i].Address == des.Address { - backDatas[i].Description = des.Description - break - } - if querys.Type == "address" && backDatas[i].Strategy == des.Strategy && backDatas[i].Address == des.Address { - backDatas[i].Description = des.Description - break - } - } - } - - if querys.Type == "port" { - for i := 0; i < len(backDatas); i++ { - port, _ := strconv.Atoi(backDatas[i].Port) - backDatas[i].IsUsed = scan.ScanPort(port) - if backDatas[i].Protocol == "udp" { - backDatas[i].IsUsed = scan.ScanUDPPort(port) - continue - } - } - } - go s.cleanUnUsedData(client) - - return data, nil -} - -func (s *ServiceFirewall) pingStatus() string { - if _, err := os.Stat("/etc/sysctl.conf"); err != nil { - return "None" - } - sudo := cmd.SudoHandleCmd() - command := fmt.Sprintf("%s cat /etc/sysctl.conf | grep net/ipv4/icmp_echo_ignore_all= ", sudo) - stdout, _ := cmd.Exec(command) - if stdout == "net/ipv4/icmp_echo_ignore_all=1\n" { - return "Enable" - } - return "Disable" -} - -func (s *ServiceFirewall) cleanUnUsedData(client firewall.FirewallClient) { - list, _ := client.ListPort() - addressList, _ := client.ListAddress() - list = append(list, addressList...) - if len(list) == 0 { - return - } - records := s.repoFirewall.List(model.Firewall{}) - if len(records) == 0 { - return - } - for _, item := range list { - for i := 0; i < len(records); i++ { - if records[i].Port == item.Port && records[i].Protocol == item.Protocol && records[i].Strategy == item.Strategy && records[i].Address == item.Address { - records = append(records[:i], records[i+1:]...) - } - } - } - - for _, record := range records { - _ = s.repoFirewall.Delete(record.ID) - } -} diff --git a/features/fm/alarm.go b/features/fm/alarm.go index c8d537e..6a61081 100644 --- a/features/fm/alarm.go +++ b/features/fm/alarm.go @@ -10,11 +10,11 @@ import ( "strings" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/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" @@ -115,6 +115,27 @@ var ( CustomUriAlarmsFmt = config.UriPrefix + "/faultManagement/v1/elementType/%s/objectType/alarms" ) +var client = resty.New() + +func init() { + /* + client. + SetTimeout(10 * time.Second). + SetRetryCount(1). + SetRetryWaitTime(1 * time.Second). + SetRetryMaxWaitTime(2 * time.Second). + SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) { + return 0, errors.New("quota exceeded") + }) + */ + client. + SetTimeout(time.Duration(500 * time.Millisecond)) + // SetRetryCount(1). + // SetRetryWaitTime(time.Duration(1 * time.Second)). + // SetRetryMaxWaitTime(time.Duration(2 * time.Second)) + //client.SetTimeout(2 * time.Second) +} + var xEngine *xorm.Engine type DatabaseClient struct { @@ -439,8 +460,8 @@ func PostAlarmFromNF(w http.ResponseWriter, r *http.Request) { if err = AlarmEmailForward(&alarmData); err != nil { log.Error("Failed to AlarmEmailForward:", err) } - if err = AlarmForwardBySMS(&alarmData); err != nil { - log.Error("Failed to AlarmForwardBySMS:", err) + if err = AlarmForwardBySMSC(&alarmData); err != nil { + log.Error("Failed to AlarmForwardBySMSC:", err) } } } @@ -482,7 +503,7 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { apiUri := fmt.Sprintf(UriAlarmsFmt, strings.ToLower(ne.NeType)) requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri) log.Debug("requestURI2NF: Get ", requestURI2NF) - client := resty.New() + // client := resty.New() response, err := client.R(). EnableTrace(). SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). @@ -498,7 +519,12 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { switch response.StatusCode() { case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: body := response.Body() - log.Debug("Request body:", string(body)) + if len(body) == 0 || body == nil { + log.Infof("Empty alarm body from neType=%s, neId=%s", ne.NeType, ne.NeId) + //services.ResponseInternalServerError500ProcessError(w, err) + continue + } + //log.Debug("Request body:", string(body)) err = json.Unmarshal(body, &alarmArray) if err != nil { @@ -518,7 +544,7 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { continue } if alarmArray == nil { - log.Info("Not found sync alarms, neType=%s, neId=%s", ne.NeType, ne.NeId) + log.Infof("Not found sync alarms, neType=%s, neId=%s", ne.NeType, ne.NeId) //services.ResponseInternalServerError500ProcessError(w, err) continue } @@ -536,7 +562,7 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { Where("ne_type=? and ne_id=? and alarm_id=? and alarm_status=1", alarmData.NeType, alarmData.NeId, alarmData.AlarmId). Exist() if err == nil || !exist { - log.Info("Not found active alarm: ne_id=%s, alarm_id=%s", alarmData.NeId, alarmData.AlarmId) + log.Infof("Not found active alarm: ne_id=%s, alarm_id=%s", alarmData.NeId, alarmData.AlarmId) continue } alarmData.ClearType = ClearTypeAutoClear @@ -708,8 +734,8 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { if err = AlarmEmailForward(&alarmData); err != nil { log.Error("Failed to AlarmEmailForward:", err) } - if err = AlarmForwardBySMS(&alarmData); err != nil { - log.Error("Failed to AlarmForwardBySMS:", err) + if err = AlarmForwardBySMSC(&alarmData); err != nil { + log.Error("Failed to AlarmForwardBySMSC:", err) } } } @@ -717,5 +743,5 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { } } } - services.ResponseStatusOK200Null(w) + services.ResponseStatusOK204NoContent(w) } diff --git a/features/fm/email.go b/features/fm/email.go index 2b87f41..01cf8a4 100644 --- a/features/fm/email.go +++ b/features/fm/email.go @@ -6,9 +6,9 @@ import ( "fmt" "strings" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/restagent/config" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/restagent/config" "gopkg.in/gomail.v2" ) diff --git a/features/fm/smsforward.go b/features/fm/smsforward.go index c58e6e5..635a05c 100644 --- a/features/fm/smsforward.go +++ b/features/fm/smsforward.go @@ -5,10 +5,14 @@ import ( "fmt" "net/http" "net/url" + "time" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/restagent/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" ) func AlarmForwardBySMS(alarmData *Alarm) error { @@ -80,8 +84,8 @@ func AlarmForwardBySMS(alarmData *Alarm) error { // 解析响应 if resp.StatusCode == http.StatusOK { - log.Info("SMS sent successfully!") - operResult := fmt.Sprintf("SMS sent successfully!") + operResult := "SMS sent successfully!" + log.Info(operResult) forwardLog.OperResult = operResult affected, err := dborm.XormInsertAlarmForwardLog(forwardLog) if err != nil && affected <= 0 { @@ -101,3 +105,144 @@ func AlarmForwardBySMS(alarmData *Alarm) error { } return nil } + +func AlarmForwardBySMPP(alarmData *Alarm) error { + log.Info("AlarmForwardBySMPP processing... ") + + auth := gosmpp.Auth{ + SMSC: config.GetYamlConfig().Alarm.SMSC.Addr, + SystemID: config.GetYamlConfig().Alarm.SMSC.UserName, + Password: config.GetYamlConfig().Alarm.SMSC.Password, + SystemType: "", + } + + // conn, err := gosmpp.NonTLSDialer(auth.SMSC) + // connection := gosmpp.NewConnection(conn) + + trans, err := gosmpp.NewSession( + gosmpp.TXConnector(gosmpp.NonTLSDialer, auth), + gosmpp.Settings{ + ReadTimeout: 2 * time.Second, + + OnPDU: func(p pdu.PDU, _ bool) { + log.Debug("%+v", p) + }, + + OnSubmitError: func(_ pdu.PDU, err error) { + log.Error(err) + }, + + OnRebindingError: func(err error) { + log.Error(err) + }, + + OnClosed: func(state gosmpp.State) { + log.Error(state) + }, + }, -1) + if err != nil { + log.Error(err) + return err + } + defer func() { + _ = trans.Close() + }() + + 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 + } + // sending SMS(s) + for _, toUser := range *toUsers { + forwardLog := &dborm.AlarmForwardLog{ + NeType: alarmData.NeType, + NeID: alarmData.NeId, + AlarmID: alarmData.AlarmId, + AlarmTitle: alarmData.AlarmTitle, + AlarmSeq: alarmData.AlarmSeq, + EventTime: alarmData.EventTime, + ToUser: toUser, + } + message := alarmData.AlarmTitle + "from" + alarmData.NeType + alarmData.NeId + "at" + alarmData.EventTime + if err = trans.Transceiver().Submit(newSubmitSM(toUser, message)); err != nil { + operResult := fmt.Sprintf("Failed to submit short message:%v", err) + log.Error(operResult) + forwardLog.OperResult = operResult + } else { + operResult := "SMS sent successfully!" + log.Trace(operResult) + forwardLog.OperResult = operResult + } + + affected, err := dborm.XormInsertAlarmForwardLog(forwardLog) + if err != nil && affected <= 0 { + log.Error("Failed to insert data:", err) + continue + } + } + 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 { + // build up submitSM + srcAddr := pdu.NewAddress() + srcAddr.SetTon(5) + srcAddr.SetNpi(0) + _ = srcAddr.SetAddress("alarm notification:") + + destAddr := pdu.NewAddress() + destAddr.SetTon(1) + destAddr.SetNpi(1) + _ = destAddr.SetAddress(phoneNumber) + + submitSM := pdu.NewSubmitSM().(*pdu.SubmitSM) + submitSM.SourceAddr = srcAddr + submitSM.DestAddr = destAddr + _ = submitSM.Message.SetMessageWithEncoding(message, data.UCS2) + submitSM.ProtocolID = 0 + submitSM.RegisteredDelivery = 1 + submitSM.ReplaceIfPresentFlag = 0 + submitSM.EsmClass = 0 + + return submitSM +} diff --git a/features/fm/ucpcli.go b/features/fm/ucpcli.go new file mode 100644 index 0000000..94581d5 --- /dev/null +++ b/features/fm/ucpcli.go @@ -0,0 +1,60 @@ +package fm + +import ( + "fmt" + "strings" + + "be.ems/lib/log" + "be.ems/restagent/config" + "github.com/chzyer/readline" + "github.com/go-gsm/ucp" +) + +func AlarmForwardBySMSC(alarmData *Alarm) error { + opt := &ucp.Options{ + Addr: config.GetYamlConfig().Alarm.SMSC.Addr, + User: config.GetYamlConfig().Alarm.SMSC.UserName, + Password: config.GetYamlConfig().Alarm.SMSC.Password, + AccessCode: "", + } + + client := ucp.New(opt) + if err := client.Connect(); err != nil { + log.Error("Failed to connect:", err) + return err + } + defer client.Close() + + reader, _ := readline.New(">>> ") + defer reader.Close() + + for { + fmt.Print(">>> ") + lines, _ := reader.Readline() + fields := strings.Fields(lines) + + if len(fields) == 1 { + // exit CLI + if fields[0] == "exit" { + return nil + } + // display help message + if fields[0] == "help" { + log.Trace("\n\tSend a 'message' to 'receiver' with a 'sender' mask\n\t>>> sender receiver message\n\n\tExit the cli\n\t>>> exit\n") + } + } + + // sender receiver message... + if len(fields) >= 3 { + sender := fields[0] + receiver := fields[1] + message := strings.Join(fields[2:], " ") + ids, err := client.Send(sender, receiver, message) + if err != nil { + log.Error(err) + } else { + log.Debug("%v", ids) + } + } + } +} diff --git a/features/handle/handle.go b/features/handle/handle.go index 5c71b00..654fd16 100644 --- a/features/handle/handle.go +++ b/features/handle/handle.go @@ -8,17 +8,17 @@ import ( "strconv" "strings" - "ems.agt/lib/dborm" + "be.ems/lib/dborm" "github.com/gorilla/mux" g "github.com/gosnmp/gosnmp" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/oauth" - "ems.agt/lib/services" - "ems.agt/lib/session" - "ems.agt/restagent/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/logbak.go b/features/lm/logbak.go index 9a7703e..aa65696 100644 --- a/features/lm/logbak.go +++ b/features/lm/logbak.go @@ -6,10 +6,10 @@ import ( "os/exec" "time" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/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/maintenance/maintenance.go b/features/maintenance/maintenance.go index e297671..49dcd06 100644 --- a/features/maintenance/maintenance.go +++ b/features/maintenance/maintenance.go @@ -10,11 +10,11 @@ import ( "runtime" "time" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/disk" "github.com/shirou/gopsutil/mem" diff --git a/features/mml/mml.go b/features/mml/mml.go index b7ec90e..ad025b1 100644 --- a/features/mml/mml.go +++ b/features/mml/mml.go @@ -10,20 +10,21 @@ import ( "strings" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/mmlp" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/mmlp" + "be.ems/lib/services" + "be.ems/restagent/config" - tokenConst "ems.agt/src/framework/constants/token" + tokenConst "be.ems/src/framework/constants/token" "github.com/gorilla/mux" ) // const ( // //经过测试,linux下,延时需要大于100ms // TIME_DELAY_AFTER_WRITE = 200 +// TIME_DEAD_LINE = 10 // ) type Response struct { @@ -37,25 +38,150 @@ type MMLRequest struct { var ( // MML interface UriMML = config.DefaultUriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" + UriMML2 = config.DefaultUriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml2" UriMMLDiscard = config.DefaultUriPrefix + "/opeartionManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" UriNeOmMml = config.DefaultUriPrefix + "/omManagement/{apiVersion}/mml/{netype}/{neid}" UriOmMmlExt = config.DefaultUriPrefix + "/{managedType}/{apiVersion}/elementType/OMC/objectType/mml" UriOmMmlInt = config.DefaultUriPrefix + "/omManagement/{apiVersion}/mml/{neType}/{neId}" CustomUriMML = config.UriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" + CustomUriMML2 = config.UriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml2" CustomUriNeOmMml = config.UriPrefix + "/omManagement/{apiVersion}/mml/{netype}/{neid}" CustomUriOmMmlExt = config.UriPrefix + "/opeartionManagement/{apiVersion}/elementType/OMC/objectType/mml" CustomUriOmMmlInt = config.UriPrefix + "/omManagement/{apiVersion}/mml/{neType}/{neId}" ) -// 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) -// } -// } +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 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) + return + } + + var buf [20 * 1024]byte + //buf := make([]byte, 0) + var n int + var mmlResult []string + port2 := 5002 + if config.GetYamlConfig().MML.Port2 != 0 { + port2 = config.GetYamlConfig().MML.Port2 + } + + if neInfo != nil { + hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, port2) + 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} + services.ResponseWithJson(w, http.StatusOK, response) +} func PostMMLToNF(w http.ResponseWriter, r *http.Request) { log.Debug("PostMMLToNF processing... ") @@ -66,14 +192,14 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { 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) - } + // 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) @@ -242,9 +368,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { if err != nil { log.Error("Failed to write:", err) mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return + //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) @@ -253,9 +380,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { if err != nil { log.Error("Failed to write:", err) mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return + //response := Response{mmlResult} + //services.ResponseWithJson(w, http.StatusOK, response) + //return + continue } time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) @@ -263,9 +391,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { if err != nil { log.Error("Failed to read:", err) mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return + //response := Response{mmlResult} + //services.ResponseWithJson(w, http.StatusOK, response) + //return + continue } log.Trace(string(buf[0 : n-len(neType)-2])) @@ -327,7 +456,7 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { services.ResponseWithJson(w, http.StatusOK, response) return } - log.Debug(string(buf[0:n])) + log.Trace(string(buf[0:n])) _, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\r\n")) if err != nil { @@ -377,9 +506,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { if err != nil { log.Error("Failed to write:", err) mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue } time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) @@ -387,9 +517,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { if err != nil { log.Error("Failed to read:", err) mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue } log.Trace(string(buf[0 : n-len(neType)-2])) @@ -397,7 +528,6 @@ func PostMMLToNF(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]`) - // upf telnet buffer只能读取一次,需要去掉前面的多余字符 result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") result = re2.ReplaceAllString(result, "") mmlResult = append(mmlResult, result) @@ -466,9 +596,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { if err != nil { log.Error("Failed to write:", err) mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue } time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) @@ -476,9 +607,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { if err != nil { log.Error("Failed to read:", err) mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return + // 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]`) // 匹配包含␛的控制字符 @@ -533,7 +665,7 @@ func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { hostUri := fmt.Sprintf("http://%s:%s", neInfo.Ip, neInfo.Port) omcMmlVar := &mmlp.MmlVar{ - Version: "16.1.1", + Version: global.Version, Output: mmlp.DefaultFormatType, MmlHome: config.GetYamlConfig().MML.MmlHome, Limit: 50, diff --git a/features/monitor/monitor/monitor.go b/features/monitor/monitor/monitor.go index 7ce950d..4409e7d 100644 --- a/features/monitor/monitor/monitor.go +++ b/features/monitor/monitor/monitor.go @@ -6,10 +6,10 @@ import ( "strings" "time" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/dborm" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/dborm" + "be.ems/lib/services" + "be.ems/restagent/config" "github.com/shirou/gopsutil/disk" "github.com/shirou/gopsutil/net" ) diff --git a/features/monitor/monitor/task.go b/features/monitor/monitor/task.go index a8185c3..a30521a 100644 --- a/features/monitor/monitor/task.go +++ b/features/monitor/monitor/task.go @@ -6,9 +6,9 @@ import ( "strconv" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/restagent/config" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/restagent/config" "github.com/robfig/cron/v3" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" diff --git a/features/monitor/psnet/psnet.go b/features/monitor/psnet/psnet.go index 78877bc..fa0ca82 100644 --- a/features/monitor/psnet/psnet.go +++ b/features/monitor/psnet/psnet.go @@ -6,11 +6,11 @@ import ( "net/http" "time" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/lib/wsinfo" - "ems.agt/restagent/config" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/lib/wsinfo" + "be.ems/restagent/config" "github.com/gorilla/websocket" "github.com/shirou/gopsutil/process" ) diff --git a/features/nbi/nbi.go b/features/nbi/nbi.go index a6a8aab..86721f4 100644 --- a/features/nbi/nbi.go +++ b/features/nbi/nbi.go @@ -6,17 +6,17 @@ import ( "net/http" "strings" - "ems.agt/lib/dborm" + "be.ems/lib/dborm" "github.com/go-resty/resty/v2" "github.com/gorilla/mux" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/oauth" - "ems.agt/lib/services" - "ems.agt/lib/session" - "ems.agt/restagent/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" ) type ErrorOAuthResponse struct { diff --git a/features/nbi/snmp.go b/features/nbi/snmp.go index 38c9c5c..9317561 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" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" ) func init() { diff --git a/features/pm/performance.go b/features/pm/performance.go index efde586..096e021 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -10,14 +10,14 @@ import ( "strconv" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "be.ems/restagent/config" "xorm.io/xorm" - wsService "ems.agt/src/modules/ws/service" + wsService "be.ems/src/modules/ws/service" "github.com/go-resty/resty/v2" _ "github.com/go-sql-driver/mysql" "github.com/gorilla/mux" diff --git a/features/security/account.go b/features/security/account.go index 0e593d8..0681bc8 100644 --- a/features/security/account.go +++ b/features/security/account.go @@ -10,21 +10,21 @@ import ( "strings" "time" - "ems.agt/features/security/service" - sysConfigService "ems.agt/features/sys_config/service" - "ems.agt/lib/core/account" - "ems.agt/lib/core/cache" - "ems.agt/lib/core/constants/cachekey" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/oauth" - "ems.agt/lib/services" - "ems.agt/restagent/config" - srcConfig "ems.agt/src/framework/config" - "ems.agt/src/framework/redis" + "be.ems/features/security/service" + sysConfigService "be.ems/features/sys_config/service" + "be.ems/lib/core/account" + "be.ems/lib/core/cache" + "be.ems/lib/core/constants/cachekey" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/vo/result" + "be.ems/lib/dborm" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/lib/services" + "be.ems/restagent/config" + srcConfig "be.ems/src/framework/config" + "be.ems/src/framework/redis" "github.com/mojocn/base64Captcha" ) diff --git a/features/security/service/service_account.go b/features/security/service/service_account.go index ace6d82..28aa2c8 100644 --- a/features/security/service/service_account.go +++ b/features/security/service/service_account.go @@ -1,11 +1,11 @@ package service import ( - menuService "ems.agt/features/sys_menu/service" - roleService "ems.agt/features/sys_role/service" - userService "ems.agt/features/sys_user/service" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/core/vo" + menuService "be.ems/features/sys_menu/service" + roleService "be.ems/features/sys_role/service" + userService "be.ems/features/sys_user/service" + "be.ems/lib/core/utils/parse" + "be.ems/lib/core/vo" ) // 实例化服务层 ServiceAccount 结构体 diff --git a/features/sm/backup.go b/features/sm/backup.go index fbfd923..2216a85 100644 --- a/features/sm/backup.go +++ b/features/sm/backup.go @@ -8,9 +8,9 @@ import ( "os/exec" "time" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/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 1955a42..3092542 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" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" - tokenConst "ems.agt/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 { @@ -756,6 +756,8 @@ func GetStateFromNF(w http.ResponseWriter, r *http.Request) { result["ipAddress"] = ne.Ip 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) diff --git a/features/state/state_linux.go b/features/state/state_linux.go index 7722431..4a4419f 100644 --- a/features/state/state_linux.go +++ b/features/state/state_linux.go @@ -11,7 +11,7 @@ import ( "syscall" "time" - "ems.agt/lib/log" + "be.ems/lib/log" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/mem" diff --git a/features/state/sysinfo.go b/features/state/sysinfo.go index 9aa9080..a9d0519 100644 --- a/features/state/sysinfo.go +++ b/features/state/sysinfo.go @@ -1,7 +1,7 @@ package state import ( - "ems.agt/lib/log" + "be.ems/lib/log" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/disk" "github.com/shirou/gopsutil/host" diff --git a/features/sys_config/api_sys_config.go b/features/sys_config/api_sys_config.go index c3eae1f..b8cbb5f 100644 --- a/features/sys_config/api_sys_config.go +++ b/features/sys_config/api_sys_config.go @@ -5,14 +5,14 @@ import ( "net/http" "strings" - "ems.agt/features/sys_config/model" - "ems.agt/features/sys_config/service" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/midware" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/features/sys_config/model" + "be.ems/features/sys_config/service" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/utils/parse" + "be.ems/lib/core/vo/result" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/restagent/config" ) // 参数配置信息接口添加到路由 diff --git a/features/sys_config/service/repo_sys_config.go b/features/sys_config/service/repo_sys_config.go index 5b8ecdb..c406526 100644 --- a/features/sys_config/service/repo_sys_config.go +++ b/features/sys_config/service/repo_sys_config.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "ems.agt/features/sys_config/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/date" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/features/sys_config/model" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/date" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoSysConfig 结构体 @@ -181,11 +181,7 @@ func (r *RepoSysConfig) SelectConfigValueByKey(configKey string) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } @@ -230,11 +226,7 @@ func (r *RepoSysConfig) CheckUniqueConfig(sysConfig model.SysConfig) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/features/sys_config/service/service_sys_config.go b/features/sys_config/service/service_sys_config.go index 2e39ba1..ede49ab 100644 --- a/features/sys_config/service/service_sys_config.go +++ b/features/sys_config/service/service_sys_config.go @@ -3,9 +3,9 @@ package service import ( "errors" - "ems.agt/features/sys_config/model" - "ems.agt/lib/core/cache" - "ems.agt/lib/core/constants/cachekey" + "be.ems/features/sys_config/model" + "be.ems/lib/core/cache" + "be.ems/lib/core/constants/cachekey" ) // 实例化服务层 ServiceSysConfig 结构体 diff --git a/features/sys_dict_data/api_sys_dict_data.go b/features/sys_dict_data/api_sys_dict_data.go index 128c236..748ed55 100644 --- a/features/sys_dict_data/api_sys_dict_data.go +++ b/features/sys_dict_data/api_sys_dict_data.go @@ -5,15 +5,15 @@ import ( "net/http" "strings" - "ems.agt/features/sys_dict_data/model" - sysDictDataService "ems.agt/features/sys_dict_data/service" - sysDictTypeService "ems.agt/features/sys_dict_type/service" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/midware" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/features/sys_dict_data/model" + sysDictDataService "be.ems/features/sys_dict_data/service" + sysDictTypeService "be.ems/features/sys_dict_type/service" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/utils/parse" + "be.ems/lib/core/vo/result" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/restagent/config" ) // 字典类型对应的字典数据信息接口添加到路由 diff --git a/features/sys_dict_data/repo/repo_sys_dict_data.go b/features/sys_dict_data/repo/repo_sys_dict_data.go index 6ae2631..02b0b37 100644 --- a/features/sys_dict_data/repo/repo_sys_dict_data.go +++ b/features/sys_dict_data/repo/repo_sys_dict_data.go @@ -5,10 +5,10 @@ import ( "strings" "time" - "ems.agt/features/sys_dict_data/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/features/sys_dict_data/model" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoSysDictData 结构体 @@ -215,11 +215,7 @@ func (r *RepoSysDictData) CheckUniqueDictData(sysDictData model.SysDictData) str return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/features/sys_dict_data/service/service_sys_dict_data.go b/features/sys_dict_data/service/service_sys_dict_data.go index 1dba4e9..68a2cff 100644 --- a/features/sys_dict_data/service/service_sys_dict_data.go +++ b/features/sys_dict_data/service/service_sys_dict_data.go @@ -3,9 +3,9 @@ package service import ( "errors" - "ems.agt/features/sys_dict_data/model" - "ems.agt/features/sys_dict_data/repo" - sysDictTypeService "ems.agt/features/sys_dict_type/service" + "be.ems/features/sys_dict_data/model" + "be.ems/features/sys_dict_data/repo" + sysDictTypeService "be.ems/features/sys_dict_type/service" ) // 实例化服务层 ServiceSysDictData 结构体 diff --git a/features/sys_dict_type/api_sys_dict_type.go b/features/sys_dict_type/api_sys_dict_type.go index d3f8cdd..d378070 100644 --- a/features/sys_dict_type/api_sys_dict_type.go +++ b/features/sys_dict_type/api_sys_dict_type.go @@ -5,14 +5,14 @@ import ( "net/http" "strings" - "ems.agt/features/sys_dict_type/model" - sysDictTypeService "ems.agt/features/sys_dict_type/service" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/midware" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/features/sys_dict_type/model" + sysDictTypeService "be.ems/features/sys_dict_type/service" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/utils/parse" + "be.ems/lib/core/vo/result" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/restagent/config" ) // 字典类型信息接口添加到路由 diff --git a/features/sys_dict_type/repo/repo_sys_dict_type.go b/features/sys_dict_type/repo/repo_sys_dict_type.go index 5e88e99..261f648 100644 --- a/features/sys_dict_type/repo/repo_sys_dict_type.go +++ b/features/sys_dict_type/repo/repo_sys_dict_type.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "ems.agt/features/sys_dict_type/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/date" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/features/sys_dict_type/model" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/date" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoSysDictType 结构体 @@ -227,11 +227,7 @@ func (r *RepoSysDictType) CheckUniqueDictType(sysDictType model.SysDictType) str return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/features/sys_dict_type/service/service_sys_dict_type.go b/features/sys_dict_type/service/service_sys_dict_type.go index 400aaba..66674a1 100644 --- a/features/sys_dict_type/service/service_sys_dict_type.go +++ b/features/sys_dict_type/service/service_sys_dict_type.go @@ -5,12 +5,12 @@ import ( "errors" "fmt" - sysDictDataModel "ems.agt/features/sys_dict_data/model" - sysDictDataRepo "ems.agt/features/sys_dict_data/repo" - sysDictTypeModel "ems.agt/features/sys_dict_type/model" - "ems.agt/features/sys_dict_type/repo" - "ems.agt/lib/core/cache" - "ems.agt/lib/core/constants/cachekey" + sysDictDataModel "be.ems/features/sys_dict_data/model" + sysDictDataRepo "be.ems/features/sys_dict_data/repo" + sysDictTypeModel "be.ems/features/sys_dict_type/model" + "be.ems/features/sys_dict_type/repo" + "be.ems/lib/core/cache" + "be.ems/lib/core/constants/cachekey" ) // 实例化服务层 ServiceSysDictType 结构体 diff --git a/features/sys_menu/api_sys_menu.go b/features/sys_menu/api_sys_menu.go index e7f644b..b949a15 100644 --- a/features/sys_menu/api_sys_menu.go +++ b/features/sys_menu/api_sys_menu.go @@ -4,16 +4,16 @@ import ( "fmt" "net/http" - "ems.agt/features/sys_menu/consts" - "ems.agt/features/sys_menu/model" - "ems.agt/features/sys_menu/service" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/utils/regular" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/midware" - "ems.agt/lib/services" - "ems.agt/restagent/config" - srcConfig "ems.agt/src/framework/config" + "be.ems/features/sys_menu/consts" + "be.ems/features/sys_menu/model" + "be.ems/features/sys_menu/service" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/utils/regular" + "be.ems/lib/core/vo/result" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/restagent/config" + srcConfig "be.ems/src/framework/config" ) // 菜单接口添加到路由 diff --git a/features/sys_menu/service/repo_sys_menu.go b/features/sys_menu/service/repo_sys_menu.go index eae567d..1b8f50a 100644 --- a/features/sys_menu/service/repo_sys_menu.go +++ b/features/sys_menu/service/repo_sys_menu.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "ems.agt/features/sys_menu/consts" - "ems.agt/features/sys_menu/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/features/sys_menu/consts" + "be.ems/features/sys_menu/model" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoSysMenu 结构体 @@ -469,11 +469,7 @@ func (r *RepoSysMenu) CheckUniqueMenu(sysMenu model.SysMenu) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/features/sys_menu/service/service_sys_menu.go b/features/sys_menu/service/service_sys_menu.go index 7ca1fd6..0da85e3 100644 --- a/features/sys_menu/service/service_sys_menu.go +++ b/features/sys_menu/service/service_sys_menu.go @@ -4,13 +4,13 @@ import ( "encoding/base64" "strings" - "ems.agt/features/sys_menu/consts" - "ems.agt/features/sys_menu/model" - sysRoleService "ems.agt/features/sys_role/service" - sysrolemenu "ems.agt/features/sys_role_menu" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/core/utils/regular" - "ems.agt/lib/core/vo" + "be.ems/features/sys_menu/consts" + "be.ems/features/sys_menu/model" + sysRoleService "be.ems/features/sys_role/service" + sysrolemenu "be.ems/features/sys_role_menu" + "be.ems/lib/core/utils/parse" + "be.ems/lib/core/utils/regular" + "be.ems/lib/core/vo" ) // 实例化服务层 ServiceSysMenu 结构体 diff --git a/features/sys_role/api_sys_role.go b/features/sys_role/api_sys_role.go index 57a11c0..ec43a1e 100644 --- a/features/sys_role/api_sys_role.go +++ b/features/sys_role/api_sys_role.go @@ -5,15 +5,15 @@ import ( "net/http" "strings" - "ems.agt/features/sys_role/model" - "ems.agt/features/sys_role/service" - userService "ems.agt/features/sys_user/service" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/midware" - "ems.agt/lib/services" - "ems.agt/restagent/config" + "be.ems/features/sys_role/model" + "be.ems/features/sys_role/service" + userService "be.ems/features/sys_user/service" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/utils/parse" + "be.ems/lib/core/vo/result" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/restagent/config" ) // 角色接口添加到路由 diff --git a/features/sys_role/service/repo_sys_role.go b/features/sys_role/service/repo_sys_role.go index 5997d67..c4182ac 100644 --- a/features/sys_role/service/repo_sys_role.go +++ b/features/sys_role/service/repo_sys_role.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "ems.agt/features/sys_role/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/date" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/features/sys_role/model" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/date" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoSysRole 结构体 @@ -356,11 +356,7 @@ func (r *RepoSysRole) CheckUniqueRole(sysRole model.SysRole) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/features/sys_role/service/service_sys_role.go b/features/sys_role/service/service_sys_role.go index b5a8d1f..33d89be 100644 --- a/features/sys_role/service/service_sys_role.go +++ b/features/sys_role/service/service_sys_role.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" - "ems.agt/features/sys_role/model" - sysrolemenu "ems.agt/features/sys_role_menu" - sysuserrole "ems.agt/features/sys_user_role" + "be.ems/features/sys_role/model" + sysrolemenu "be.ems/features/sys_role_menu" + sysuserrole "be.ems/features/sys_user_role" ) // 实例化服务层 ServiceSysRole 结构体 diff --git a/features/sys_role_menu/repo_sys_role_menu.go b/features/sys_role_menu/repo_sys_role_menu.go index 02dc826..fb11cf5 100644 --- a/features/sys_role_menu/repo_sys_role_menu.go +++ b/features/sys_role_menu/repo_sys_role_menu.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoSysRoleMenu 结构体 diff --git a/features/sys_user/api_sys_user.go b/features/sys_user/api_sys_user.go index 93018c4..69b748c 100644 --- a/features/sys_user/api_sys_user.go +++ b/features/sys_user/api_sys_user.go @@ -5,17 +5,17 @@ import ( "net/http" "strings" - sysRoleModel "ems.agt/features/sys_role/model" - sysRoleService "ems.agt/features/sys_role/service" - sysUserModel "ems.agt/features/sys_user/model" - "ems.agt/features/sys_user/service" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/midware" - "ems.agt/lib/services" - "ems.agt/restagent/config" - srcConfig "ems.agt/src/framework/config" + sysRoleModel "be.ems/features/sys_role/model" + sysRoleService "be.ems/features/sys_role/service" + sysUserModel "be.ems/features/sys_user/model" + "be.ems/features/sys_user/service" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/utils/parse" + "be.ems/lib/core/vo/result" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/restagent/config" + srcConfig "be.ems/src/framework/config" ) // 用户接口添加到路由 diff --git a/features/sys_user/model/sys_user.go b/features/sys_user/model/sys_user.go index b7a0259..1f5f108 100644 --- a/features/sys_user/model/sys_user.go +++ b/features/sys_user/model/sys_user.go @@ -1,6 +1,6 @@ package model -import "ems.agt/features/sys_role/model" +import "be.ems/features/sys_role/model" type SysUser struct { Id string `json:"id" xorm:"pk 'id' autoincr"` diff --git a/features/sys_user/service/repo_sys_user.go b/features/sys_user/service/repo_sys_user.go index 1dff7c8..de55949 100644 --- a/features/sys_user/service/repo_sys_user.go +++ b/features/sys_user/service/repo_sys_user.go @@ -5,13 +5,13 @@ import ( "strings" "time" - sysRoleModel "ems.agt/features/sys_role/model" - sysUserModel "ems.agt/features/sys_user/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/date" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" - "ems.agt/src/framework/utils/crypto" + sysRoleModel "be.ems/features/sys_role/model" + sysUserModel "be.ems/features/sys_user/model" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/date" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" + "be.ems/src/framework/utils/crypto" ) // 实例化数据层 RepoSysUser 结构体 @@ -572,11 +572,7 @@ func (r *RepoSysUser) CheckUniqueUser(sysUser sysUserModel.SysUser) string { log.Errorf("query err %v", err) } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/features/sys_user/service/service_sys_user.go b/features/sys_user/service/service_sys_user.go index d128490..e5021fc 100644 --- a/features/sys_user/service/service_sys_user.go +++ b/features/sys_user/service/service_sys_user.go @@ -4,8 +4,8 @@ import ( "errors" "fmt" - sysUserModel "ems.agt/features/sys_user/model" - sysuserrole "ems.agt/features/sys_user_role" + sysUserModel "be.ems/features/sys_user/model" + sysuserrole "be.ems/features/sys_user_role" ) // 实例化服务层 ServiceSysUser 结构体 diff --git a/features/sys_user_role/repo_sys_user_role.go b/features/sys_user_role/repo_sys_user_role.go index 97585a1..66a6cec 100644 --- a/features/sys_user_role/repo_sys_user_role.go +++ b/features/sys_user_role/repo_sys_user_role.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoSysUserRole 结构体 diff --git a/features/trace/tcpdump.go b/features/trace/tcpdump.go index a4c6b4a..e2f8765 100644 --- a/features/trace/tcpdump.go +++ b/features/trace/tcpdump.go @@ -7,14 +7,14 @@ import ( "strings" "time" - "ems.agt/lib/core/conf" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/restagent/config" - "ems.agt/src/framework/cmd" - "ems.agt/src/framework/utils/ssh" + "be.ems/lib/core/conf" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/vo/result" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/restagent/config" + "be.ems/src/framework/utils/cmd" + "be.ems/src/framework/utils/ssh" ) var ( diff --git a/features/trace/trace.go b/features/trace/trace.go index b22382c..eec2472 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" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/run" - "ems.agt/lib/services" - "ems.agt/restagent/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/udm_user/api_udm_user.go b/features/udm_user/api_udm_user.go index 7a6fae7..40918e4 100644 --- a/features/udm_user/api_udm_user.go +++ b/features/udm_user/api_udm_user.go @@ -7,20 +7,20 @@ import ( "strings" "time" - "ems.agt/features/udm_user/model" - "ems.agt/features/udm_user/service" - "ems.agt/lib/core/conf" - mmlclient "ems.agt/lib/core/mml_client" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/lib/midware" - "ems.agt/lib/services" - "ems.agt/restagent/config" - "ems.agt/src/framework/middleware/collectlogs" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/ssh" + "be.ems/features/udm_user/model" + "be.ems/features/udm_user/service" + "be.ems/lib/core/conf" + mmlclient "be.ems/lib/core/mml_client" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/vo/result" + "be.ems/lib/dborm" + "be.ems/lib/log" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/restagent/config" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/ssh" ) // UDM 用户信息接口添加到路由 @@ -516,7 +516,7 @@ func (s *UdmUserApi) UdmAuthUserExport(w http.ResponseWriter, r *http.Request) { data = append(data, []string{v.Imsi, v.Ki, v.AlgoIndex, v.Amf, v.Opc}) } // 输出到文件 - err := file.WriterCSVFile(data, filePath) + err := file.WriterFileCSV(data, filePath) if err != nil { ctx.JSON(w, 200, result.ErrMsg(err.Error())) return @@ -530,7 +530,7 @@ func (s *UdmUserApi) UdmAuthUserExport(w http.ResponseWriter, r *http.Request) { data = append(data, []string{v.Imsi, v.Ki, v.AlgoIndex, v.Amf, v.Opc}) } // 输出到文件 - err = file.WriterTxtFile(data, filePath) + err = file.WriterFileTXT(data, ",", filePath) if err != nil { ctx.JSON(w, 200, result.ErrMsg(err.Error())) return @@ -597,12 +597,12 @@ func (s *UdmUserApi) UdmAuthUserImport(w http.ResponseWriter, r *http.Request) { // 命令ok时 if strings.Contains(data, "ok") { if strings.HasSuffix(fileHeader.Filename, ".csv") { - data := file.ReadCSVFile(localPath) + data := file.ReadFileCSV(localPath) neId = "" go s.authUser.InsertCSV(neId, data) } if strings.HasSuffix(fileHeader.Filename, ".txt") { - data := file.ReadTxtFile(localPath) + data := file.ReadFileTXT(",", localPath) neId = "" go s.authUser.InsertTxt(neId, data) } @@ -1116,7 +1116,7 @@ func (s *UdmUserApi) UdmSubUserExport(w http.ResponseWriter, r *http.Request) { 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}) } // 输出到文件 - err = file.WriterCSVFile(data, filePath) + err = file.WriterFileCSV(data, filePath) if err != nil { ctx.JSON(w, 200, result.ErrMsg(err.Error())) return @@ -1131,7 +1131,7 @@ func (s *UdmUserApi) UdmSubUserExport(w http.ResponseWriter, r *http.Request) { 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}) } // 输出到文件 - err = file.WriterTxtFile(data, filePath) + err = file.WriterFileTXT(data, ",", filePath) if err != nil { ctx.JSON(w, 200, result.ErrMsg(err.Error())) return @@ -1197,12 +1197,12 @@ func (s *UdmUserApi) UdmSubUserImport(w http.ResponseWriter, r *http.Request) { // 命令ok时 if strings.Contains(data, "ok") { if strings.HasSuffix(fileHeader.Filename, ".csv") { - data := file.ReadCSVFile(localPath) + data := file.ReadFileCSV(localPath) neId = "" go s.subUser.InsertCSV(neId, data) } if strings.HasSuffix(fileHeader.Filename, ".txt") { - data := file.ReadTxtFile(localPath) + data := file.ReadFileTXT(",", localPath) neId = "" go s.subUser.InsertTxt(neId, data) } diff --git a/features/udm_user/repo/repo_udm_auth_user.go b/features/udm_user/repo/repo_udm_auth_user.go index daaeaa4..9c38877 100644 --- a/features/udm_user/repo/repo_udm_auth_user.go +++ b/features/udm_user/repo/repo_udm_auth_user.go @@ -4,10 +4,10 @@ import ( "strconv" "strings" - "ems.agt/features/udm_user/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/features/udm_user/model" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoUdmAuthUser 结构体 diff --git a/features/udm_user/repo/repo_udm_sub_user.go b/features/udm_user/repo/repo_udm_sub_user.go index 4530f37..03c90a5 100644 --- a/features/udm_user/repo/repo_udm_sub_user.go +++ b/features/udm_user/repo/repo_udm_sub_user.go @@ -5,10 +5,10 @@ import ( "strconv" "strings" - "ems.agt/features/udm_user/model" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/log" + "be.ems/features/udm_user/model" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/parse" + "be.ems/lib/log" ) // 实例化数据层 RepoUdmSubUser 结构体 diff --git a/features/udm_user/service/service_redis_data.go b/features/udm_user/service/service_redis_data.go index 9d1a84b..8687fbe 100644 --- a/features/udm_user/service/service_redis_data.go +++ b/features/udm_user/service/service_redis_data.go @@ -3,8 +3,8 @@ package service import ( "strings" - "ems.agt/features/udm_user/model" - "ems.agt/src/framework/redis" + "be.ems/features/udm_user/model" + "be.ems/src/framework/redis" ) // phoneImsiList 获取所有imsi diff --git a/features/udm_user/service/service_udm_auth_user.go b/features/udm_user/service/service_udm_auth_user.go index 5cd1e9c..5023f4c 100644 --- a/features/udm_user/service/service_udm_auth_user.go +++ b/features/udm_user/service/service_udm_auth_user.go @@ -4,8 +4,8 @@ import ( "fmt" "strconv" - "ems.agt/features/udm_user/model" - "ems.agt/features/udm_user/repo" + "be.ems/features/udm_user/model" + "be.ems/features/udm_user/repo" ) // 实例化服务层 ServiceUdmAuthUser 结构体 diff --git a/features/udm_user/service/service_udm_sub_user.go b/features/udm_user/service/service_udm_sub_user.go index 51dfe16..6a2d218 100644 --- a/features/udm_user/service/service_udm_sub_user.go +++ b/features/udm_user/service/service_udm_sub_user.go @@ -5,8 +5,8 @@ import ( "strconv" "strings" - "ems.agt/features/udm_user/model" - "ems.agt/features/udm_user/repo" + "be.ems/features/udm_user/model" + "be.ems/features/udm_user/repo" ) // 实例化服务层 ServiceUdmSubUser 结构体 diff --git a/features/ue/ue.go b/features/ue/ue.go index a49dc3f..e8e93d7 100644 --- a/features/ue/ue.go +++ b/features/ue/ue.go @@ -8,12 +8,12 @@ import ( "strings" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/services" - "ems.agt/restagent/config" - tokenConst "ems.agt/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" "github.com/go-resty/resty/v2" "github.com/gorilla/mux" ) @@ -354,6 +354,7 @@ func PostPCFUserInfo(w http.ResponseWriter, r *http.Request) { services.ResponseNotFound404UriNotExist(w, r) return } + client.SetTimeout(1 * time.Minute) resp, err := client.R(). EnableTrace(). SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}). @@ -426,6 +427,7 @@ func PutPCFUserInfo(w http.ResponseWriter, r *http.Request) { services.ResponseNotFound404UriNotExist(w, r) return } + client.SetTimeout(1 * time.Minute) resp, err := client.R(). EnableTrace(). SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}). @@ -504,9 +506,11 @@ func DeletePCFUserInfo(w http.ResponseWriter, r *http.Request) { services.ResponseInternalServerError500ProcessError(w, err) return } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) + w.WriteHeader(resp.StatusCode()) + w.Write(resp.Body()) + // var response services.MapResponse + // _ = json.Unmarshal(resp.Body(), &response) + // services.ResponseWithJson(w, resp.StatusCode(), response) return } } @@ -761,6 +765,7 @@ func GetUEInfoFileExportNF(w http.ResponseWriter, r *http.Request) { log.Debug("requestURI2NF:", requestURI2NF) + client.SetTimeout(3 * time.Minute) resp, err := client.R(). EnableTrace(). SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}). diff --git a/go.mod b/go.mod index 36c6a25..59f2b71 100644 --- a/go.mod +++ b/go.mod @@ -1,39 +1,36 @@ -module ems.agt +module be.ems go 1.21 toolchain go1.21.0 require ( + github.com/chzyer/readline v1.5.1 github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dlclark/regexp2 v1.10.0 github.com/gin-gonic/gin v1.9.1 - github.com/go-admin-team/go-admin-core/sdk v1.5.1 + github.com/go-gsm/ucp v0.0.1 github.com/go-resty/resty/v2 v2.7.0 github.com/go-sql-driver/mysql v1.7.1 github.com/golang-jwt/jwt/v5 v5.0.0 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 github.com/gosnmp/gosnmp v1.35.0 - github.com/jasonlvhit/gocron v0.0.1 github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f + github.com/linxGnu/gosmpp v0.2.0 github.com/matoous/go-nanoid/v2 v2.0.0 - github.com/metaleap/go-xsd v0.0.0-20180330193350-61f7638f502f github.com/mojocn/base64Captcha v1.3.5 github.com/mssola/user_agent v0.6.0 github.com/patrickmn/go-cache v2.1.0+incompatible + github.com/prometheus-community/pro-bing v0.4.0 github.com/redis/go-redis/v9 v9.1.0 - github.com/reiver/go-telnet v0.0.0-20180421082511-9ff0b2ab096e github.com/robfig/cron/v3 v3.0.1 github.com/shirou/gopsutil v3.21.11+incompatible github.com/shirou/gopsutil/v3 v3.23.7 github.com/spf13/afero v1.9.5 github.com/spf13/viper v1.16.0 github.com/xuri/excelize/v2 v2.7.1 - github.com/xuri/xgen v0.0.0-20230702070049-db840e1a4605 - github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b - golang.org/x/crypto v0.16.0 - golang.org/x/term v0.15.0 + golang.org/x/crypto 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.1 @@ -42,74 +39,52 @@ require ( ) require ( - github.com/creack/pty v1.1.9 // indirect - github.com/go-admin-team/go-admin-core v1.3.12-0.20221121065133-27b7dbe27a8f // indirect + github.com/go-gsm/charset v1.0.0 // indirect + github.com/mattn/go-sqlite3 v1.14.15 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.21.1 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/time v0.1.0 // indirect ) require ( - github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible // indirect - github.com/bsm/redislock v0.8.2 // indirect - github.com/bytedance/go-tagexpr/v2 v2.7.12 // indirect github.com/bytedance/sonic v1.9.1 // indirect - github.com/casbin/casbin/v2 v2.54.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/chanxuehong/rand v0.0.0-20201110082127-2f19a1bdd973 // indirect - github.com/chanxuehong/wechat v0.0.0-20201110083048-0180211b69fd // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect - github.com/fatih/color v1.13.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/git-chglog/git-chglog v0.0.0-20190611050339-63a4e637021f // indirect - github.com/go-admin-team/redisqueue/v2 v2.0.0-20221119141731-97c556b0d5b7 // indirect - github.com/go-forks/fsnotify v1.4.7 // indirect github.com/go-ole/go-ole v1.2.6 // 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.14.0 // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect - github.com/go-redis/redis/v9 v9.0.0-rc.1 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.2 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/henrylee2cn/ameda v1.4.10 // indirect - github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect - github.com/imdario/mergo v0.3.9 // indirect github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 // indirect github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/goveralls v0.0.2 // indirect - github.com/metaleap/go-util v0.0.0-20180330192724-a09253046f73 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // 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 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/nsqio/go-nsq v1.0.8 // indirect - github.com/nyaruka/phonenumbers v1.0.55 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/reiver/go-oi v1.0.0 // indirect github.com/richardlehane/mscfb v1.0.4 // indirect github.com/richardlehane/msoleps v1.0.3 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -119,25 +94,20 @@ require ( github.com/tebeka/strftime v0.1.5 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect - github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect - github.com/urfave/cli v1.22.1 // indirect github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/image v0.5.0 // indirect - golang.org/x/net v0.19.0 - golang.org/x/sys v0.15.0 // indirect + golang.org/x/net v0.21.0 + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 golang.org/x/tools v0.16.1 // indirect google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/AlecAivazis/survey.v1 v1.8.5 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/kyokomi/emoji.v1 v1.5.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect ) diff --git a/go.sum b/go.sum index 00b3ebe..2680b44 100644 --- a/go.sum +++ b/go.sum @@ -41,11 +41,8 @@ gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0p 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/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -71,33 +68,27 @@ github.com/bsm/ginkgo/v2 v2.9.5 h1:rtVBYPs3+TC5iLUVOis1B9tjLTup7Cj5IfzosKtvTJ0= github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/bsm/redislock v0.8.2 h1:W0aDRjt6FNmAZovbG2fPyjl1YZZdlqMkCKKCffJew1o= -github.com/bsm/redislock v0.8.2/go.mod h1:tC0JZxZCdJN4DCB31cGxgjgf/ye1R4LLNJQd5ecjg08= -github.com/bytedance/go-tagexpr/v2 v2.7.12 h1:qL2f0j11S8DHQsUWUA6aacLNBcbPTbNKuzVjaW4kF/M= -github.com/bytedance/go-tagexpr/v2 v2.7.12/go.mod h1:cKpo/rwg2Y5Njs8SX3FspMWEhAWCaF4xUr5LJYXibSU= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/casbin/casbin/v2 v2.54.0 h1:NFQ3Xkw6rfbD/rwEHMVRHVP5gUxhNQKdcZCb53pwSrA= -github.com/casbin/casbin/v2 v2.54.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chanxuehong/rand v0.0.0-20201110082127-2f19a1bdd973 h1:Js/7nHtkpvUW62passc9FOflXyLQDjSoYclkFeDdTEM= -github.com/chanxuehong/rand v0.0.0-20201110082127-2f19a1bdd973/go.mod h1:9+sJ9zvvkXC5sPjPEZM3Jpb9n2Q2VtcrGZly0UHYF5I= -github.com/chanxuehong/util v0.0.0-20200304121633-ca8141845b13/go.mod h1:XEYt99iTxMqkv+gW85JX/DdUINHUe43Sbe5AtqSaDAQ= -github.com/chanxuehong/wechat v0.0.0-20201110083048-0180211b69fd h1:TM3wjEWel4U31J72dlhnwCBqPC0+FA0Ejm2NCbn5a5U= -github.com/chanxuehong/wechat v0.0.0-20201110083048-0180211b69fd/go.mod h1:/dvhOIRCjjiZu6NV0QTTiMcc5XwoORbxfDSsRY2IfaM= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -112,11 +103,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -143,8 +130,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= @@ -160,19 +145,13 @@ 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.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/git-chglog/git-chglog v0.0.0-20190611050339-63a4e637021f h1:8l4Aw3Jmx0pLKYMkY+1b6yBPgE+rzRtA5T3vqFyI2Z8= -github.com/git-chglog/git-chglog v0.0.0-20190611050339-63a4e637021f/go.mod h1:Dcsy1kii/xFyNad5JqY/d0GO5mu91sungp5xotbm3Yk= -github.com/go-admin-team/go-admin-core v1.3.12-0.20221121065133-27b7dbe27a8f h1:2xHpluWqY/ZlYoUpOU8VwDponYSnukRDhkOr7rk3ffU= -github.com/go-admin-team/go-admin-core v1.3.12-0.20221121065133-27b7dbe27a8f/go.mod h1:a9/XW1rCChPLVJ3bST13hB6R8YfVjYeF0GYjb8If6Yg= -github.com/go-admin-team/go-admin-core/sdk v1.5.1 h1:U1VaXuMrMmeLiQyJipqnTxHE84vspaK++wkTWfYpcOI= -github.com/go-admin-team/go-admin-core/sdk v1.5.1/go.mod h1:yNoHmYZtGc1WFWZwhAop0sSyZhsrsSGqvje2yvClXjE= -github.com/go-admin-team/redisqueue/v2 v2.0.0-20221119141731-97c556b0d5b7 h1:p1cq6CN47zEbDt8EWBX3mOZpIa4zVwHCrXcy0NwD+So= -github.com/go-admin-team/redisqueue/v2 v2.0.0-20221119141731-97c556b0d5b7/go.mod h1:XGwBJD4aMmHSoJFPKs4vcW4Y5s+8MV1gHR+P0Uxe9Eg= -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-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gsm/charset v1.0.0 h1:6k6LOKHtxgCPXE15X0unRewjOksyhmHBIp6x7qLQ6Ls= +github.com/go-gsm/charset v1.0.0/go.mod h1:sC8+2VpAM2sZDlxv11MxWIZiuf8MipOgM/hCYsRQRps= +github.com/go-gsm/ucp v0.0.1 h1:vM5ly5iRNGMGGiVx4K3+puF9AhpwkC76BkiV9LFv0bw= +github.com/go-gsm/ucp v0.0.1/go.mod h1:58/PrXWFcmaQyZ5p/Dp2YiCnhlVx0HdKXFGmqiVO/mI= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -189,11 +168,6 @@ 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.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-redis/redis/v9 v9.0.0-rc.1 h1:/+bS+yeUnanqAbuD3QwlejzQZ+4eqgfUtFTG4b+QnXs= -github.com/go-redis/redis/v9 v9.0.0-rc.1/go.mod h1:8et+z03j0l8N+DvsVnclzjf3Dl/pFHgRk+2Ct1qw66A= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -212,7 +186,6 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= @@ -230,8 +203,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -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.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -247,9 +218,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -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.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -284,16 +252,15 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -330,20 +297,10 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4= -github.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk= -github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4= -github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0= -github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= @@ -393,8 +350,6 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jasonlvhit/gocron v0.0.1 h1:qTt5qF3b3srDjeOIR4Le1LfeyvoYzJlYpqvG7tJX5YU= -github.com/jasonlvhit/gocron v0.0.1/go.mod h1:k9a3TV8VcU73XZxfVHCHWMWF9SOqgoku0/QlY2yvlA4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -411,13 +366,11 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 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/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= @@ -431,7 +384,6 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -451,6 +403,8 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/gosmpp v0.2.0 h1:GVZdnO8pUsOrhFF092RQ2II+6RW5F2kLDlbCH+NBp7s= +github.com/linxGnu/gosmpp v0.2.0/go.mod h1:UpJwpDhL0yq05gUqaLwZ8+Qc7qy1pl35EjxWtRLW6ks= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -463,9 +417,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -473,22 +424,13 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -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/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -520,30 +462,20 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nsqio/go-nsq v1.0.8 h1:3L2F8tNLlwXXlp2slDUrUWSBn2O3nMh8R1/KEDFTHPk= -github.com/nsqio/go-nsq v1.0.8/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY= 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/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg= -github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= 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.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= 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.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= 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.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/onsi/gomega v1.21.1 h1:OB/euWYIExnPBohllTicTHmGTrMaqJ67nIu80j0/uEM= github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= @@ -559,7 +491,6 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= @@ -577,6 +508,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus-community/pro-bing v0.4.0 h1:YMbv+i08gQz97OZZBwLyvmmQEEzyfyrrjEaAchdy3R4= +github.com/prometheus-community/pro-bing v0.4.0/go.mod h1:b7wRYZtCcPmt4Sz319BykUU241rWLe1VFXyiyWK/dH4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -596,10 +529,6 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY= github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= -github.com/reiver/go-oi v1.0.0 h1:nvECWD7LF+vOs8leNGV/ww+F2iZKf3EYjYZ527turzM= -github.com/reiver/go-oi v1.0.0/go.mod h1:RrDBct90BAhoDTxB1fenZwfykqeGvhI6LsNfStJoEkI= -github.com/reiver/go-telnet v0.0.0-20180421082511-9ff0b2ab096e h1:quuzZLi72kkJjl+f5AQ93FMcadG19WkS7MO6TXFOSas= -github.com/reiver/go-telnet v0.0.0-20180421082511-9ff0b2ab096e/go.mod h1:+5vNVvEWwEIx86DB9Ke/+a5wBI464eDRo3eF0LcfpWg= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= @@ -617,8 +546,6 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= @@ -638,9 +565,7 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= @@ -664,7 +589,6 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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= @@ -684,22 +608,16 @@ 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/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df h1:Y2l28Jr3vOEeYtxfVbMtVfOdAwuUqWaP9fvNKiBVeXY= -github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df/go.mod h1:pnyouUty/nBr/zm3GYwTIt+qFTLWbdjeLjZmJdzJOu8= 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.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c= @@ -708,8 +626,6 @@ github.com/xuri/excelize/v2 v2.7.1 h1:gm8q0UCAyaTt3MEF5wWMjVdmthm2EHAWesGSKS9tdV github.com/xuri/excelize/v2 v2.7.1/go.mod h1:qc0+2j4TvAUrBw36ATtcTeC1VCM0fFdAXZOmcF4nTpY= github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M= github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= -github.com/xuri/xgen v0.0.0-20230702070049-db840e1a4605 h1:urU5p/tQOOUd9B0c6O+6aBk7udJI5HcN4VYmX2tMTcI= -github.com/xuri/xgen v0.0.0-20230702070049-db840e1a4605/go.mod h1:tBkmlRf8JH62H5fAW+BPFj0LNZWRmKglWTLFfpXhhbg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -719,8 +635,6 @@ github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFi github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b h1:VfPXB/wCGGt590QhD1bOpv2J/AmC/RJNTg/Q59HKSB0= -github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b/go.mod h1:IZpXDfkJ6tWD3PhBK5YzgQT+xJWh7OsdwiG8hA2MkO4= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -747,7 +661,6 @@ golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= @@ -766,8 +679,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -812,6 +725,7 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -848,15 +762,13 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -878,7 +790,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/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/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -936,11 +849,9 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/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-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -950,15 +861,15 @@ 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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -975,10 +886,11 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1140,11 +1052,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/AlecAivazis/survey.v1 v1.8.5 h1:QoEEmn/d5BbuPIL2qvXwzJdttFFhRQFkaq+tEKb7SMI= -gopkg.in/AlecAivazis/survey.v1 v1.8.5/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= @@ -1161,8 +1070,6 @@ gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkp gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/kyokomi/emoji.v1 v1.5.1 h1:beetH5mWDMzFznJ+Qzd5KVHp79YKhVUMcdO8LpRLeGw= -gopkg.in/kyokomi/emoji.v1 v1.5.1/go.mod h1:N9AZ6hi1jHOPn34PsbpufQZUcKftSD7WgS2pgpmH4Lg= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -1172,10 +1079,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -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.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= diff --git a/lib/core/account/account.go b/lib/core/account/account.go index 53f12c8..81d5853 100644 --- a/lib/core/account/account.go +++ b/lib/core/account/account.go @@ -5,12 +5,12 @@ import ( "strconv" "time" - sysMenuService "ems.agt/features/sys_menu/service" - sysRoleService "ems.agt/features/sys_role/service" - "ems.agt/lib/core/cache" - "ems.agt/lib/core/vo" - "ems.agt/lib/dborm" - srcConfig "ems.agt/src/framework/config" + sysMenuService "be.ems/features/sys_menu/service" + sysRoleService "be.ems/features/sys_role/service" + "be.ems/lib/core/cache" + "be.ems/lib/core/vo" + "be.ems/lib/dborm" + srcConfig "be.ems/src/framework/config" ) // 登录缓存用户信息 diff --git a/lib/core/cmd/cmd.go b/lib/core/cmd/cmd.go deleted file mode 100644 index 085494d..0000000 --- a/lib/core/cmd/cmd.go +++ /dev/null @@ -1,201 +0,0 @@ -package cmd - -import ( - "bytes" - "context" - "fmt" - "os/exec" - "strings" - "time" -) - -func Exec(cmdStr string) (string, error) { - ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) - defer cancel() - cmd := exec.Command("bash", "-c", cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if ctx.Err() == context.DeadlineExceeded { - return "", fmt.Errorf("errCmdTimeout %v", err) - } - if err != nil { - errMsg := "" - if len(stderr.String()) != 0 { - errMsg = fmt.Sprintf("stderr: %s", stderr.String()) - } - if len(stdout.String()) != 0 { - if len(errMsg) != 0 { - errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) - } else { - errMsg = fmt.Sprintf("stdout: %s", stdout.String()) - } - } - return errMsg, err - } - return stdout.String(), nil -} - -func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - cmd := exec.Command("bash", "-c", cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if ctx.Err() == context.DeadlineExceeded { - return "", fmt.Errorf("errCmdTimeout %v", err) - } - if err != nil { - errMsg := "" - if len(stderr.String()) != 0 { - errMsg = fmt.Sprintf("stderr: %s", stderr.String()) - } - if len(stdout.String()) != 0 { - if len(errMsg) != 0 { - errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) - } else { - errMsg = fmt.Sprintf("stdout: %s", stdout.String()) - } - } - return errMsg, err - } - return stdout.String(), nil -} - -func ExecCronjobWithTimeOut(cmdStr string, workdir string, timeout time.Duration) (string, error) { - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - cmd := exec.Command("bash", "-c", cmdStr) - cmd.Dir = workdir - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if ctx.Err() == context.DeadlineExceeded { - return "", fmt.Errorf("errCmdTimeout %v", err) - } - - errMsg := "" - if len(stderr.String()) != 0 { - errMsg = fmt.Sprintf("stderr:\n %s", stderr.String()) - } - if len(stdout.String()) != 0 { - if len(errMsg) != 0 { - errMsg = fmt.Sprintf("%s \n\n; stdout:\n %s", errMsg, stdout.String()) - } else { - errMsg = fmt.Sprintf("stdout:\n %s", stdout.String()) - } - } - return errMsg, err -} - -func Execf(cmdStr string, a ...interface{}) (string, error) { - cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...)) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if err != nil { - errMsg := "" - if len(stderr.String()) != 0 { - errMsg = fmt.Sprintf("stderr: %s", stderr.String()) - } - if len(stdout.String()) != 0 { - if len(errMsg) != 0 { - errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) - } else { - errMsg = fmt.Sprintf("stdout: %s", stdout.String()) - } - } - return errMsg, err - } - return stdout.String(), nil -} - -func ExecWithCheck(name string, a ...string) (string, error) { - cmd := exec.Command(name, a...) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if err != nil { - errMsg := "" - if len(stderr.String()) != 0 { - errMsg = fmt.Sprintf("stderr: %s", stderr.String()) - } - if len(stdout.String()) != 0 { - if len(errMsg) != 0 { - errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) - } else { - errMsg = fmt.Sprintf("stdout: %s", stdout.String()) - } - } - return errMsg, err - } - return stdout.String(), nil -} - -func ExecScript(scriptPath, workDir string) (string, error) { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) - defer cancel() - cmd := exec.Command("bash", scriptPath) - cmd.Dir = workDir - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if ctx.Err() == context.DeadlineExceeded { - return "", fmt.Errorf("errCmdTimeout %v", err) - } - if err != nil { - errMsg := "" - if len(stderr.String()) != 0 { - errMsg = fmt.Sprintf("stderr: %s", stderr.String()) - } - if len(stdout.String()) != 0 { - if len(errMsg) != 0 { - errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) - } else { - errMsg = fmt.Sprintf("stdout: %s", stdout.String()) - } - } - return errMsg, err - } - return stdout.String(), nil -} - -func CheckIllegal(args ...string) bool { - if args == nil { - return false - } - for _, arg := range args { - if strings.Contains(arg, "&") || strings.Contains(arg, "|") || strings.Contains(arg, ";") || - strings.Contains(arg, "$") || strings.Contains(arg, "'") || strings.Contains(arg, "`") || - strings.Contains(arg, "(") || strings.Contains(arg, ")") || strings.Contains(arg, "\"") { - return true - } - } - return false -} - -func HasNoPasswordSudo() bool { - cmd2 := exec.Command("sudo", "-n", "ls") - err2 := cmd2.Run() - return err2 == nil -} - -func SudoHandleCmd() string { - cmd := exec.Command("sudo", "-n", "ls") - if err := cmd.Run(); err == nil { - return "sudo " - } - return "" -} - -func Which(name string) bool { - _, err := exec.LookPath(name) - return err == nil -} diff --git a/lib/core/datasource/datasource.go b/lib/core/datasource/datasource.go index cde0a71..1ef16af 100644 --- a/lib/core/datasource/datasource.go +++ b/lib/core/datasource/datasource.go @@ -4,7 +4,7 @@ import ( "database/sql" "regexp" - "ems.agt/lib/dborm" + "be.ems/lib/dborm" "xorm.io/xorm" ) diff --git a/lib/core/file/csv.go b/lib/core/file/csv.go deleted file mode 100644 index 1473a79..0000000 --- a/lib/core/file/csv.go +++ /dev/null @@ -1,88 +0,0 @@ -package file - -import ( - "encoding/csv" - "os" - "path/filepath" - "strings" - - "ems.agt/lib/log" -) - -// 写入CSV文件,需要转换数据 -// 例如: -// data := [][]string{} -// data = append(data, []string{"姓名", "年龄", "城市"}) -// data = append(data, []string{"1", "2", "3"}) -// err := file.WriterCSVFile(data, filePath) -func WriterCSVFile(data [][]string, filePath string) error { - // 获取文件所在的目录路径 - dirPath := filepath.Dir(filePath) - - // 确保文件夹路径存在 - err := os.MkdirAll(dirPath, os.ModePerm) - if err != nil { - log.Errorf("创建文件夹失败 CreateFile %v", err) - } - - // 创建或打开文件 - file, err := os.Create(filePath) - if err != nil { - return err - } - defer file.Close() - - // 创建CSV编写器 - writer := csv.NewWriter(file) - defer writer.Flush() - - // 写入数据 - for _, row := range data { - writer.Write(row) - } - return nil -} - -// 读取CSV文件,转换map数据 -func ReadCSVFile(filePath string) []map[string]string { - // 创建 map 存储 CSV 数据 - arr := make([]map[string]string, 0) - - // 打开 CSV 文件 - file, err := os.Open(filePath) - if err != nil { - log.Fatal("无法打开 CSV 文件:", err) - return arr - } - defer file.Close() - - // 创建 CSV Reader - reader := csv.NewReader(file) - - // 读取 CSV 头部行 - header, err := reader.Read() - if err != nil { - log.Fatal("无法读取 CSV 头部行:", err) - return arr - } - - // 遍历 CSV 数据行 - for { - // 读取一行数据 - record, err := reader.Read() - if err != nil { - // 到达文件末尾或遇到错误时退出循环 - break - } - - // 将 CSV 数据插入到 map 中 - data := make(map[string]string) - for i, value := range record { - key := strings.ToLower(header[i]) - data[key] = value - } - arr = append(arr, data) - } - - return arr -} diff --git a/lib/core/file/ssh.go b/lib/core/file/ssh.go deleted file mode 100644 index c33a717..0000000 --- a/lib/core/file/ssh.go +++ /dev/null @@ -1,49 +0,0 @@ -package file - -import ( - "fmt" - "os" - "os/exec" - "path/filepath" - - "ems.agt/lib/core/conf" - "ems.agt/lib/log" -) - -// 网元NE 文件复制到远程文件 -func FileSCPLocalToNe(neIp, localPath, nePath string) error { - usernameNe := conf.Get("ne.user").(string) - // scp /path/to/local/file.txt user@remote-server:/path/to/remote/directory/ - neDir := fmt.Sprintf("%s@%s:%s", usernameNe, neIp, nePath) - cmd := exec.Command("scp", "-r", localPath, neDir) - out, err := cmd.CombinedOutput() - if err != nil { - return err - } - log.Infof("FileSCPLocalToNe %s", string(out)) - return nil -} - -// 网元NE 远程文件复制到本地文件 -func FileSCPNeToLocal(neIp, nePath, localPath string) error { - // 获取文件所在的目录路径 - dirPath := filepath.Dir(localPath) - - // 确保文件夹路径存在 - err := os.MkdirAll(dirPath, os.ModePerm) - if err != nil { - log.Errorf("创建文件夹失败 CreateFile %v", err) - return err - } - - usernameNe := conf.Get("ne.user").(string) - // scp user@remote-server:/path/to/remote/directory/ /path/to/local/file.txt - neDir := fmt.Sprintf("%s@%s:%s", usernameNe, neIp, nePath) - cmd := exec.Command("scp", "-r", neDir, localPath) - out, err := cmd.CombinedOutput() - if err != nil { - return err - } - log.Infof("FileSCPNeToLocal %s", string(out)) - return nil -} diff --git a/lib/core/file/txt.go b/lib/core/file/txt.go deleted file mode 100644 index 1690e3e..0000000 --- a/lib/core/file/txt.go +++ /dev/null @@ -1,79 +0,0 @@ -package file - -import ( - "bufio" - "fmt" - "os" - "path/filepath" - "strings" - - "ems.agt/lib/log" -) - -// 写入Txt文件用,号分割 需要转换数据 -// 例如: -// data := [][]string{} -// data = append(data, []string{"姓名", "年龄", "城市"}) -// data = append(data, []string{"1", "2", "3"}) -// err := file.WriterCSVFile(data, filePath) -func WriterTxtFile(data [][]string, filePath string) error { - // 获取文件所在的目录路径 - dirPath := filepath.Dir(filePath) - - // 确保文件夹路径存在 - err := os.MkdirAll(dirPath, os.ModePerm) - if err != nil { - log.Errorf("创建文件夹失败 CreateFile %v", err) - } - - // 创建或打开文件 - file, err := os.Create(filePath) - if err != nil { - return err - } - defer file.Close() - - // 创建一个 Writer 对象,用于将数据写入文件 - writer := bufio.NewWriter(file) - for _, row := range data { - line := strings.Join(row, ",") - fmt.Fprintln(writer, line) - } - - // 将缓冲区中的数据刷新到文件中 - err = writer.Flush() - if err != nil { - log.Errorf("刷新缓冲区时发生错误:", err) - return err - } - return nil -} - -// 读取Txt文件,用,号分割 转换数组数据 -func ReadTxtFile(filePath string) [][]string { - // 创建 map 存储 CSV 数据 - arr := make([][]string, 0) - - // 打开文本文件 - file, err := os.Open(filePath) - if err != nil { - log.Fatal("无法打开文件:", err) - return arr - } - defer file.Close() - - // 创建一个 Scanner 对象,用于逐行读取文件内容 - scanner := bufio.NewScanner(file) - if scanner.Err() != nil { - log.Fatal("读取文件时出错:", scanner.Err()) - return arr - } - - for scanner.Scan() { - line := scanner.Text() - fields := strings.Split(line, ",") - arr = append(arr, fields) - } - - return arr -} diff --git a/lib/core/mml_client/mml_client.go b/lib/core/mml_client/mml_client.go index 2ac642f..a004024 100644 --- a/lib/core/mml_client/mml_client.go +++ b/lib/core/mml_client/mml_client.go @@ -7,7 +7,7 @@ import ( "net" "time" - "ems.agt/lib/core/conf" + "be.ems/lib/core/conf" ) // 定义MMLClient结构体 diff --git a/lib/core/redis/redis.go b/lib/core/redis/redis.go deleted file mode 100644 index d459778..0000000 --- a/lib/core/redis/redis.go +++ /dev/null @@ -1,358 +0,0 @@ -package redis - -import ( - "context" - "fmt" - "strings" - "time" - - "ems.agt/lib/core/conf" - "ems.agt/lib/log" - "github.com/redis/go-redis/v9" -) - -// Redis连接实例 -var rdbMap = make(map[string]*redis.Client) - -// 声明定义限流脚本命令 -var rateLimitCommand = redis.NewScript(` -local key = KEYS[1] -local time = tonumber(ARGV[1]) -local count = tonumber(ARGV[2]) -local current = redis.call('get', key); -if current and tonumber(current) >= count then - return tonumber(current); -end -current = redis.call('incr', key) -if tonumber(current) == 1 then - redis.call('expire', key, time) -end -return tonumber(current);`) - -// 连接Redis实例 -func Connect() { - ctx := context.Background() - // 读取数据源配置 - datasource := conf.Get("redis.dataSource").(map[string]any) - for k, v := range datasource { - client := v.(map[string]any) - // 创建连接 - address := fmt.Sprintf("%s:%d", client["host"], client["port"]) - rdb := redis.NewClient(&redis.Options{ - Addr: address, - Password: client["password"].(string), - DB: client["db"].(int), - }) - // 测试数据库连接 - pong, err := rdb.Ping(ctx).Result() - if err != nil { - log.Fatalf("failed error ping redis %s %d is %v", client["host"], client["db"], err) - continue - } - log.Infof("redis %s %d %s connection is successful.", client["host"], client["db"], pong) - rdbMap[k] = rdb - } -} - -// 关闭Redis实例 -func Close() { - for _, rdb := range rdbMap { - if err := rdb.Close(); err != nil { - log.Errorf("fatal error db close: %s", err) - } - } -} - -// 获取默认实例 -func DefaultRDB() *redis.Client { - source := conf.Get("redis.defaultDataSourceName").(string) - return rdbMap[source] -} - -// 获取实例 -func RDB(source string) *redis.Client { - return rdbMap[source] -} - -// Info 获取redis服务信息 -func Info(source string) map[string]map[string]string { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - info, err := rdb.Info(ctx).Result() - if err != nil { - return map[string]map[string]string{} - } - infoObj := make(map[string]map[string]string) - lines := strings.Split(info, "\r\n") - label := "" - for _, line := range lines { - if strings.Contains(line, "#") { - label = strings.Fields(line)[len(strings.Fields(line))-1] - label = strings.ToLower(label) - infoObj[label] = make(map[string]string) - continue - } - kvArr := strings.Split(line, ":") - if len(kvArr) >= 2 { - key := strings.TrimSpace(kvArr[0]) - value := strings.TrimSpace(kvArr[len(kvArr)-1]) - infoObj[label][key] = value - } - } - return infoObj -} - -// KeySize 获取redis当前连接可用键Key总数信息 -func KeySize(source string) int64 { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - size, err := rdb.DBSize(ctx).Result() - if err != nil { - return 0 - } - return size -} - -// CommandStats 获取redis命令状态信息 -func CommandStats(source string) []map[string]string { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - commandstats, err := rdb.Info(ctx, "commandstats").Result() - if err != nil { - return []map[string]string{} - } - statsObjArr := make([]map[string]string, 0) - lines := strings.Split(commandstats, "\r\n") - for _, line := range lines { - if !strings.HasPrefix(line, "cmdstat_") { - continue - } - kvArr := strings.Split(line, ":") - key := kvArr[0] - valueStr := kvArr[len(kvArr)-1] - statsObj := make(map[string]string) - statsObj["name"] = key[8:] - statsObj["value"] = valueStr[6:strings.Index(valueStr, ",usec=")] - statsObjArr = append(statsObjArr, statsObj) - } - return statsObjArr -} - -// 获取键的剩余有效时间(秒) -func GetExpire(source string, key string) (float64, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - ttl, err := rdb.TTL(ctx, key).Result() - if err != nil { - return 0, err - } - return ttl.Seconds(), nil -} - -// 获得缓存数据的key列表 -func GetKeys(source string, pattern string) ([]string, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - // 初始化变量 - var keys []string - var cursor uint64 = 0 - ctx := context.Background() - // 循环遍历获取匹配的键 - for { - // 使用 SCAN 命令获取匹配的键 - batchKeys, nextCursor, err := rdb.Scan(ctx, cursor, pattern, 100).Result() - if err != nil { - log.Errorf("Failed to scan keys: %v", err) - return keys, err - } - cursor = nextCursor - keys = append(keys, batchKeys...) - // 当 cursor 为 0,表示遍历完成 - if cursor == 0 { - break - } - } - return keys, nil -} - -// 批量获得缓存数据 -func GetBatch(source string, keys []string) ([]any, error) { - if len(keys) == 0 { - return []any{}, fmt.Errorf("not keys") - } - - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - // 获取缓存数据 - result, err := rdb.MGet(context.Background(), keys...).Result() - if err != nil { - log.Errorf("Failed to get batch data: %v", err) - return []any{}, err - } - return result, nil -} - -// 获得缓存数据 -func Get(source, key string) (string, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - value, err := rdb.Get(ctx, key).Result() - if err == redis.Nil || err != nil { - return "", err - } - return value, nil -} - -// 获得缓存数据Hash -func GetHash(source, key string) (map[string]string, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - value, err := rdb.HGetAll(ctx, key).Result() - if err == redis.Nil || err != nil { - return map[string]string{}, err - } - return value, nil -} - -// 判断是否存在 -func Has(source string, keys ...string) (bool, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - exists, err := rdb.Exists(ctx, keys...).Result() - if err != nil { - return false, err - } - return exists >= 1, nil -} - -// 设置缓存数据 -func Set(source, key string, value any) (bool, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - err := rdb.Set(ctx, key, value, 0).Err() - if err != nil { - log.Errorf("redis lua script err %v", err) - return false, err - } - return true, nil -} - -// 设置缓存数据与过期时间 -func SetByExpire(source, key string, value any, expiration time.Duration) (bool, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - err := rdb.Set(ctx, key, value, expiration).Err() - if err != nil { - log.Errorf("redis lua script err %v", err) - return false, err - } - return true, nil -} - -// 删除单个 -func Del(source string, key string) (bool, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - err := rdb.Del(ctx, key).Err() - if err != nil { - log.Errorf("redis lua script err %v", err) - return false, err - } - return true, nil -} - -// 删除多个 -func DelKeys(source string, keys []string) (bool, error) { - if len(keys) == 0 { - return false, fmt.Errorf("no keys") - } - - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - err := rdb.Del(ctx, keys...).Err() - if err != nil { - log.Errorf("redis lua script err %v", err) - return false, err - } - return true, nil -} - -// 限流查询并记录 -func RateLimit(source, limitKey string, time, count int64) (int64, error) { - // 数据源 - rdb := DefaultRDB() - if source != "" { - rdb = RDB(source) - } - - ctx := context.Background() - result, err := rateLimitCommand.Run(ctx, rdb, []string{limitKey}, time, count).Result() - if err != nil { - log.Errorf("redis lua script err %v", err) - return 0, err - } - return result.(int64), err -} diff --git a/lib/core/utils/ctx/ctx.go b/lib/core/utils/ctx/ctx.go index 2fed7d5..dfbbe92 100644 --- a/lib/core/utils/ctx/ctx.go +++ b/lib/core/utils/ctx/ctx.go @@ -10,10 +10,11 @@ import ( "path/filepath" "strings" - "ems.agt/lib/core/vo" - commonConstants "ems.agt/src/framework/constants/common" - tokenConst "ems.agt/src/framework/constants/token" + "be.ems/lib/core/vo" + commonConstants "be.ems/src/framework/constants/common" + tokenConst "be.ems/src/framework/constants/token" "github.com/gorilla/mux" + "golang.org/x/text/language" ) // Param 地址栏参数{id} @@ -31,6 +32,11 @@ func GetQuery(r *http.Request, key string) string { return r.URL.Query().Get(key) } +// GetHeader 请求头参数 +func GetHeader(r *http.Request, key string) string { + return r.Header.Get(key) +} + // QueryMap 查询参数转换Map func QueryMap(r *http.Request) map[string]any { queryValues := r.URL.Query() @@ -41,6 +47,16 @@ func QueryMap(r *http.Request) map[string]any { return queryParams } +// ShouldBindQuery 查询参数读取json请求结构团体 +func ShouldBindQuery(r *http.Request, args any) error { + queryParams := QueryMap(r) + body, err := json.Marshal(queryParams) + if err != nil { + return err + } + return json.Unmarshal(body, args) +} + // 读取json请求结构团体 func ShouldBindJSON(r *http.Request, args any) error { body, err := io.ReadAll(io.LimitReader(r.Body, 1<<20)) // 设置较大的长度,例如 1<<20 (1MB) @@ -118,7 +134,32 @@ func Authorization(r *http.Request) string { return arr[1] } -// 定义自定义类型作为键 +// AcceptLanguage 解析客户端接收语言 zh:中文 en: 英文 +func AcceptLanguage(r *http.Request) string { + preferredLanguage := language.English + + // Query请求查询 + if v := GetQuery(r, "language"); v != "" { + tags, _, _ := language.ParseAcceptLanguage(v) + if len(tags) > 0 { + preferredLanguage = tags[0] + } + } + // Header请求头 + if v := GetHeader(r, "Accept-Language"); v != "" { + tags, _, _ := language.ParseAcceptLanguage(v) + if len(tags) > 0 { + preferredLanguage = tags[0] + } + } + + // 只取前缀 + lang := preferredLanguage.String() + arr := strings.Split(lang, "-") + return arr[0] +} + +// ContextKey 定义自定义类型作为键 type ContextKey string // LoginUser 登录用户信息需要Authorize中间件 diff --git a/lib/core/utils/date/date.go b/lib/core/utils/date/date.go index e0893fb..d6235ea 100644 --- a/lib/core/utils/date/date.go +++ b/lib/core/utils/date/date.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "ems.agt/lib/log" + "be.ems/lib/log" ) const ( diff --git a/lib/core/utils/firewall/client.go b/lib/core/utils/firewall/client.go deleted file mode 100644 index 5e88704..0000000 --- a/lib/core/utils/firewall/client.go +++ /dev/null @@ -1,34 +0,0 @@ -package firewall - -import ( - "errors" - "os" - - "ems.agt/lib/core/utils/firewall/client" -) - -type FirewallClient interface { - Name() string // ufw firewalld - Start() error - Stop() error - Reload() error - Status() (string, error) // running not running - Version() (string, error) - - ListPort() ([]client.FireInfo, error) - ListAddress() ([]client.FireInfo, error) - - Port(port client.FireInfo, operation string) error - RichRules(rule client.FireInfo, operation string) error - PortForward(info client.Forward, operation string) error -} - -func NewFirewallClient() (FirewallClient, error) { - if _, err := os.Stat("/usr/sbin/firewalld"); err == nil { - return client.NewFirewalld() - } - if _, err := os.Stat("/usr/sbin/ufw"); err == nil { - return client.NewUfw() - } - return nil, errors.New("no such type") -} diff --git a/lib/core/utils/firewall/client/firewalld.go b/lib/core/utils/firewall/client/firewalld.go deleted file mode 100644 index d026e4e..0000000 --- a/lib/core/utils/firewall/client/firewalld.go +++ /dev/null @@ -1,209 +0,0 @@ -package client - -import ( - "fmt" - "strings" - "sync" - - "ems.agt/lib/core/cmd" -) - -type Firewall struct{} - -func NewFirewalld() (*Firewall, error) { - return &Firewall{}, nil -} - -func (f *Firewall) Name() string { - return "firewalld" -} - -func (f *Firewall) Status() (string, error) { - stdout, _ := cmd.Exec("firewall-cmd --state") - if stdout == "running\n" { - return "running", nil - } - return "not running", nil -} - -func (f *Firewall) Version() (string, error) { - stdout, err := cmd.Exec("firewall-cmd --version") - if err != nil { - return "", fmt.Errorf("load the firewall version failed, err: %s", stdout) - } - return strings.ReplaceAll(stdout, "\n ", ""), nil -} - -func (f *Firewall) Start() error { - stdout, err := cmd.Exec("systemctl start firewalld") - if err != nil { - return fmt.Errorf("enable the firewall failed, err: %s", stdout) - } - return nil -} - -func (f *Firewall) Stop() error { - stdout, err := cmd.Exec("systemctl stop firewalld") - if err != nil { - return fmt.Errorf("stop the firewall failed, err: %s", stdout) - } - return nil -} - -func (f *Firewall) Reload() error { - stdout, err := cmd.Exec("firewall-cmd --reload") - if err != nil { - return fmt.Errorf("reload firewall failed, err: %s", stdout) - } - return nil -} - -func (f *Firewall) ListPort() ([]FireInfo, error) { - var wg sync.WaitGroup - var datas []FireInfo - wg.Add(2) - go func() { - defer wg.Done() - stdout, err := cmd.Exec("firewall-cmd --zone=public --list-ports") - if err != nil { - return - } - ports := strings.Split(strings.ReplaceAll(stdout, "\n", ""), " ") - for _, port := range ports { - if len(port) == 0 { - continue - } - var itemPort FireInfo - if strings.Contains(port, "/") { - itemPort.Port = strings.Split(port, "/")[0] - itemPort.Protocol = strings.Split(port, "/")[1] - } - itemPort.Strategy = "accept" - datas = append(datas, itemPort) - } - }() - - go func() { - defer wg.Done() - stdout1, err := cmd.Exec("firewall-cmd --zone=public --list-rich-rules") - if err != nil { - return - } - rules := strings.Split(stdout1, "\n") - for _, rule := range rules { - if len(rule) == 0 { - continue - } - itemRule := f.loadInfo(rule) - if len(itemRule.Port) != 0 && itemRule.Family == "ipv4" { - datas = append(datas, itemRule) - } - } - }() - wg.Wait() - return datas, nil -} - -func (f *Firewall) ListAddress() ([]FireInfo, error) { - stdout, err := cmd.Exec("firewall-cmd --zone=public --list-rich-rules") - if err != nil { - return nil, err - } - var datas []FireInfo - rules := strings.Split(stdout, "\n") - for _, rule := range rules { - if len(rule) == 0 { - continue - } - itemRule := f.loadInfo(rule) - if len(itemRule.Port) == 0 && len(itemRule.Address) != 0 { - datas = append(datas, itemRule) - } - } - return datas, nil -} - -func (f *Firewall) Port(port FireInfo, operation string) error { - if cmd.CheckIllegal(operation, port.Protocol, port.Port) { - return fmt.Errorf("errCmdIllegal %v", port) - } - - stdout, err := cmd.Execf("firewall-cmd --zone=public --%s-port=%s/%s --permanent", operation, port.Port, port.Protocol) - if err != nil { - return fmt.Errorf("%s port failed, err: %s", operation, stdout) - } - return nil -} - -func (f *Firewall) RichRules(rule FireInfo, operation string) error { - if cmd.CheckIllegal(operation, rule.Address, rule.Protocol, rule.Port, rule.Strategy) { - return fmt.Errorf("errCmdIllegal %v", rule) - } - ruleStr := "" - if strings.Contains(rule.Address, "-") { - std, err := cmd.Execf("firewall-cmd --permanent --new-ipset=%s --type=hash:ip", rule.Address) - if err != nil { - return fmt.Errorf("add new ipset failed, err: %s", std) - } - std2, err := cmd.Execf("firewall-cmd --permanent --ipset=%s --add-entry=%s", rule.Address, rule.Address) - if err != nil { - return fmt.Errorf("add entry to ipset failed, err: %s", std2) - } - if err := f.Reload(); err != nil { - return err - } - ruleStr = fmt.Sprintf("rule source ipset=%s %s", rule.Address, rule.Strategy) - } else { - ruleStr = "rule family=ipv4 " - if len(rule.Address) != 0 { - ruleStr += fmt.Sprintf("source address=%s ", rule.Address) - } - if len(rule.Port) != 0 { - ruleStr += fmt.Sprintf("port port=%s ", rule.Port) - } - if len(rule.Protocol) != 0 { - ruleStr += fmt.Sprintf("protocol=%s ", rule.Protocol) - } - ruleStr += rule.Strategy - } - stdout, err := cmd.Execf("firewall-cmd --zone=public --%s-rich-rule '%s' --permanent", operation, ruleStr) - if err != nil { - return fmt.Errorf("%s rich rules failed, err: %s", operation, stdout) - } - return nil -} - -func (f *Firewall) PortForward(info Forward, operation string) error { - ruleStr := fmt.Sprintf("firewall-cmd --%s-forward-port=port=%s:proto=%s:toport=%s --permanent", operation, info.Port, info.Protocol, info.Target) - if len(info.Address) != 0 { - ruleStr = fmt.Sprintf("firewall-cmd --%s-forward-port=port=%s:proto=%s:toaddr=%s:toport=%s --permanent", operation, info.Port, info.Protocol, info.Address, info.Target) - } - - stdout, err := cmd.Exec(ruleStr) - if err != nil { - return fmt.Errorf("%s port forward failed, err: %s", operation, stdout) - } - return nil -} - -func (f *Firewall) loadInfo(line string) FireInfo { - var itemRule FireInfo - ruleInfo := strings.Split(strings.ReplaceAll(line, "\"", ""), " ") - for _, item := range ruleInfo { - switch { - case strings.Contains(item, "family="): - itemRule.Family = strings.ReplaceAll(item, "family=", "") - case strings.Contains(item, "ipset="): - itemRule.Address = strings.ReplaceAll(item, "ipset=", "") - case strings.Contains(item, "address="): - itemRule.Address = strings.ReplaceAll(item, "address=", "") - case strings.Contains(item, "port="): - itemRule.Port = strings.ReplaceAll(item, "port=", "") - case strings.Contains(item, "protocol="): - itemRule.Protocol = strings.ReplaceAll(item, "protocol=", "") - case item == "accept" || item == "drop" || item == "reject": - itemRule.Strategy = item - } - } - return itemRule -} diff --git a/lib/core/utils/firewall/client/info.go b/lib/core/utils/firewall/client/info.go deleted file mode 100644 index 86cc86e..0000000 --- a/lib/core/utils/firewall/client/info.go +++ /dev/null @@ -1,20 +0,0 @@ -package client - -type FireInfo struct { - Family string `json:"family"` // ipv4 ipv6 - Address string `json:"address"` // Anywhere - Port string `json:"port"` - Protocol string `json:"protocol"` // tcp udp tcp/udp - Strategy string `json:"strategy"` // accept drop - - APPName string `json:"appName"` - IsUsed bool `json:"isUsed"` - Description string `json:"description"` -} - -type Forward struct { - Protocol string `json:"protocol"` - Address string `json:"address"` - Port string `json:"port"` - Target string `json:"target"` -} diff --git a/lib/core/utils/firewall/client/ufw.go b/lib/core/utils/firewall/client/ufw.go deleted file mode 100644 index 4729488..0000000 --- a/lib/core/utils/firewall/client/ufw.go +++ /dev/null @@ -1,238 +0,0 @@ -package client - -import ( - "fmt" - "strings" - - "ems.agt/lib/core/cmd" -) - -type Ufw struct { - CmdStr string -} - -func NewUfw() (*Ufw, error) { - var ufw Ufw - if cmd.HasNoPasswordSudo() { - ufw.CmdStr = "sudo ufw" - } else { - ufw.CmdStr = "ufw" - } - return &ufw, nil -} - -func (f *Ufw) Name() string { - return "ufw" -} - -func (f *Ufw) Status() (string, error) { - stdout, _ := cmd.Execf("%s status | grep Status", f.CmdStr) - if stdout == "Status: active\n" { - return "running", nil - } - stdout1, _ := cmd.Execf("%s status | grep 状态", f.CmdStr) - if stdout1 == "状态: 激活\n" { - return "running", nil - } - return "not running", nil -} - -func (f *Ufw) Version() (string, error) { - stdout, err := cmd.Execf("%s version | grep ufw", f.CmdStr) - if err != nil { - return "", fmt.Errorf("load the firewall status failed, err: %s", stdout) - } - info := strings.ReplaceAll(stdout, "\n", "") - return strings.ReplaceAll(info, "ufw ", ""), nil -} - -func (f *Ufw) Start() error { - stdout, err := cmd.Execf("echo y | %s enable", f.CmdStr) - if err != nil { - return fmt.Errorf("enable the firewall failed, err: %s", stdout) - } - return nil -} - -func (f *Ufw) Stop() error { - stdout, err := cmd.Execf("%s disable", f.CmdStr) - if err != nil { - return fmt.Errorf("stop the firewall failed, err: %s", stdout) - } - return nil -} - -func (f *Ufw) Reload() error { - return nil -} - -func (f *Ufw) ListPort() ([]FireInfo, error) { - stdout, err := cmd.Execf("%s status verbose", f.CmdStr) - if err != nil { - return nil, err - } - portInfos := strings.Split(stdout, "\n") - var datas []FireInfo - isStart := false - for _, line := range portInfos { - if strings.HasPrefix(line, "-") { - isStart = true - continue - } - if !isStart { - continue - } - itemFire := f.loadInfo(line, "port") - if len(itemFire.Port) != 0 && itemFire.Port != "Anywhere" && !strings.Contains(itemFire.Port, ".") { - itemFire.Port = strings.ReplaceAll(itemFire.Port, ":", "-") - datas = append(datas, itemFire) - } - } - return datas, nil -} - -func (f *Ufw) ListAddress() ([]FireInfo, error) { - stdout, err := cmd.Execf("%s status verbose", f.CmdStr) - if err != nil { - return nil, err - } - portInfos := strings.Split(stdout, "\n") - var datas []FireInfo - isStart := false - for _, line := range portInfos { - if strings.HasPrefix(line, "-") { - isStart = true - continue - } - if !isStart { - continue - } - if !strings.Contains(line, " IN") { - continue - } - itemFire := f.loadInfo(line, "address") - if strings.Contains(itemFire.Port, ".") { - itemFire.Address += ("-" + itemFire.Port) - itemFire.Port = "" - } - if len(itemFire.Port) == 0 && len(itemFire.Address) != 0 { - datas = append(datas, itemFire) - } - } - return datas, nil -} - -func (f *Ufw) Port(port FireInfo, operation string) error { - switch port.Strategy { - case "accept": - port.Strategy = "allow" - case "drop": - port.Strategy = "deny" - default: - return fmt.Errorf("unsupport strategy %s", port.Strategy) - } - if cmd.CheckIllegal(port.Protocol, port.Port) { - return fmt.Errorf("errCmdIllegal %v", port) - } - - command := fmt.Sprintf("%s %s %s", f.CmdStr, port.Strategy, port.Port) - if operation == "remove" { - command = fmt.Sprintf("%s delete %s %s", f.CmdStr, port.Strategy, port.Port) - } - if len(port.Protocol) != 0 { - command += fmt.Sprintf("/%s", port.Protocol) - } - stdout, err := cmd.Exec(command) - if err != nil { - return fmt.Errorf("%s port failed, err: %s", operation, stdout) - } - return nil -} - -func (f *Ufw) RichRules(rule FireInfo, operation string) error { - switch rule.Strategy { - case "accept": - rule.Strategy = "allow" - case "drop": - rule.Strategy = "deny" - default: - return fmt.Errorf("unsupport strategy %s", rule.Strategy) - } - - if cmd.CheckIllegal(operation, rule.Protocol, rule.Address, rule.Port) { - return fmt.Errorf("errCmdIllegal %v", rule) - } - - ruleStr := fmt.Sprintf("%s %s ", f.CmdStr, rule.Strategy) - if operation == "remove" { - ruleStr = fmt.Sprintf("%s delete %s ", f.CmdStr, rule.Strategy) - } - if len(rule.Protocol) != 0 { - ruleStr += fmt.Sprintf("proto %s ", rule.Protocol) - } - if strings.Contains(rule.Address, "-") { - ruleStr += fmt.Sprintf("from %s to %s ", strings.Split(rule.Address, "-")[0], strings.Split(rule.Address, "-")[1]) - } else { - ruleStr += fmt.Sprintf("from %s ", rule.Address) - } - if len(rule.Port) != 0 { - ruleStr += fmt.Sprintf("to any port %s ", rule.Port) - } - - stdout, err := cmd.Exec(ruleStr) - if err != nil { - return fmt.Errorf("%s rich rules failed, err: %s", operation, stdout) - } - return nil -} - -func (f *Ufw) PortForward(info Forward, operation string) error { - ruleStr := fmt.Sprintf("firewall-cmd --%s-forward-port=port=%s:proto=%s:toport=%s --permanent", operation, info.Port, info.Protocol, info.Target) - if len(info.Address) != 0 { - ruleStr = fmt.Sprintf("firewall-cmd --%s-forward-port=port=%s:proto=%s:toaddr=%s:toport=%s --permanent", operation, info.Port, info.Protocol, info.Address, info.Target) - } - - stdout, err := cmd.Exec(ruleStr) - if err != nil { - return fmt.Errorf("%s port forward failed, err: %s", operation, stdout) - } - if err := f.Reload(); err != nil { - return err - } - return nil -} - -func (f *Ufw) loadInfo(line string, fireType string) FireInfo { - fields := strings.Fields(line) - var itemInfo FireInfo - if len(fields) < 4 { - return itemInfo - } - if fields[1] == "(v6)" { - return itemInfo - } - if fields[0] == "Anywhere" && fireType != "port" { - itemInfo.Strategy = "drop" - if fields[1] == "ALLOW" { - itemInfo.Strategy = "accept" - } - itemInfo.Address = fields[3] - return itemInfo - } - if strings.Contains(fields[0], "/") { - itemInfo.Port = strings.Split(fields[0], "/")[0] - itemInfo.Protocol = strings.Split(fields[0], "/")[1] - } else { - itemInfo.Port = fields[0] - itemInfo.Protocol = "tcp/udp" - } - itemInfo.Family = "ipv4" - if fields[1] == "ALLOW" { - itemInfo.Strategy = "accept" - } else { - itemInfo.Strategy = "drop" - } - itemInfo.Address = fields[3] - - return itemInfo -} diff --git a/lib/core/vo/login_user.go b/lib/core/vo/login_user.go index 4a36331..1d4c977 100644 --- a/lib/core/vo/login_user.go +++ b/lib/core/vo/login_user.go @@ -1,7 +1,7 @@ package vo import ( - "ems.agt/lib/dborm" + "be.ems/lib/dborm" ) // LoginUser 登录用户身份权限信息对象 diff --git a/lib/core/vo/treeselect.go b/lib/core/vo/treeselect.go index 4af3187..2677626 100644 --- a/lib/core/vo/treeselect.go +++ b/lib/core/vo/treeselect.go @@ -1,6 +1,6 @@ package vo -// import sysmenu "ems.agt/features/sys_menu" +// import sysmenu "be.ems/features/sys_menu" // TreeSelect 树结构实体类 type TreeSelect struct { diff --git a/lib/dborm/dborm.go b/lib/dborm/dborm.go index 209b64e..102e410 100644 --- a/lib/dborm/dborm.go +++ b/lib/dborm/dborm.go @@ -10,9 +10,9 @@ import ( "strings" - "ems.agt/features/sys_role/model" - "ems.agt/lib/log" - "ems.agt/lib/oauth" + "be.ems/features/sys_role/model" + "be.ems/lib/log" + "be.ems/lib/oauth" _ "github.com/go-sql-driver/mysql" "xorm.io/xorm" @@ -228,12 +228,12 @@ func XormGetNeInfo(neType string, neId string) (*NeInfo, error) { log.Debug("XormGetNeInfo processing... ") neInfo := new(NeInfo) - has, err := xEngine.Where("status in ('0','3') and ne_type=? and ne_id=?", strings.ToUpper(neType), neId).Get(neInfo) + has, err := xEngine.Where("ne_type=? and ne_id=?", strings.ToUpper(neType), neId).Get(neInfo) if err != nil { log.Error("Failed to get table ne_info from database:", err) return nil, err } else if !has { - log.Infof("Not found ne_info from database, status in ('0','3'), neType=%s, neId=%s", neType, neId) + log.Infof("Not found ne_info from database, neType=%s, neId=%s", neType, neId) return nil, nil } @@ -245,12 +245,12 @@ func XormGetNeInfoByRmUID(neType string, rmUID string) (*NeInfo, error) { log.Debug("XormGetNeInfoByRmUID processing... ") neInfo := new(NeInfo) - has, err := xEngine.Where("status in ('0','3') and ne_type=? and rm_uid=?", strings.ToUpper(neType), rmUID).Get(neInfo) + has, err := xEngine.Where("ne_type=? and rm_uid=?", strings.ToUpper(neType), rmUID).Get(neInfo) if err != nil { log.Error("Failed to get table ne_info from database:", err) return nil, err } else if !has { - log.Infof("Not found ne_info from database, status in ('0','3'), neType=%s, neId=%s", neType, rmUID) + log.Infof("Not found ne_info from database, neType=%s, neId=%s", neType, rmUID) return nil, nil } @@ -262,7 +262,7 @@ func XormGetAllNeInfo(nes *[]NeInfo) (*[]NeInfo, error) { log.Debug("XormGetAllNeInfo processing... ") ne := new(NeInfo) - rows, err := xEngine.Table("ne_info").Where("status in ('0','3')").Rows(ne) + rows, err := xEngine.Table("ne_info").Rows(ne) if err != nil { log.Error("Failed to get table ne_info from database:", err) return nil, err @@ -284,7 +284,7 @@ func XormGetNeInfoByNeType(neType string, nes *[]NeInfo) error { log.Debug("XormGetNeInfoByNeType processing... ") ne := new(NeInfo) - rows, err := xEngine.Table("ne_info").Where("status in ('0','3') and ne_type=?", neType).Rows(ne) + rows, err := xEngine.Table("ne_info").Where("ne_type=?", neType).Rows(ne) if err != nil { log.Error("Failed to get table ne_info from database:", err) return err @@ -310,12 +310,12 @@ func XormGetNeInfo2(neType string, neIDs []string, nes *[]NeInfo) error { var err error if len(neIDs) == 0 { rows, err = xEngine.Table("ne_info"). - Where("status in ('0','3') and ne_type=?", neType). + Where("ne_type=?", neType). Rows(ne) } else { rows, err = xEngine.Table("ne_info"). In("ne_id", neIDs). - And("status in ('0','3') and ne_type=?", neType). + And("ne_type=?", neType). Rows(ne) } if err != nil { diff --git a/lib/midware/arrow_ip_addr.go b/lib/midware/arrow_ip_addr.go index 57f47c7..98c2946 100644 --- a/lib/midware/arrow_ip_addr.go +++ b/lib/midware/arrow_ip_addr.go @@ -6,8 +6,8 @@ import ( "strings" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/services" + "be.ems/lib/dborm" + "be.ems/lib/services" ) // 登录策略限制登录时间和访问ip范围 diff --git a/lib/midware/authorize.go b/lib/midware/authorize.go index f8f4f18..152709b 100644 --- a/lib/midware/authorize.go +++ b/lib/midware/authorize.go @@ -5,13 +5,13 @@ import ( "fmt" "net/http" - "ems.agt/lib/core/cache" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/vo" - "ems.agt/lib/core/vo/result" - "ems.agt/lib/dborm" - commonConstants "ems.agt/src/framework/constants/common" - tokenUtils "ems.agt/src/framework/utils/token" + "be.ems/lib/core/cache" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/vo" + "be.ems/lib/core/vo/result" + "be.ems/lib/dborm" + commonConstants "be.ems/src/framework/constants/common" + tokenUtils "be.ems/src/framework/utils/token" ) // Authorize 用户身份授权认证校验 diff --git a/lib/midware/midhandle.go b/lib/midware/midhandle.go index 506ee70..ca7e366 100644 --- a/lib/midware/midhandle.go +++ b/lib/midware/midhandle.go @@ -4,9 +4,9 @@ import ( "net/http" "strings" - "ems.agt/lib/log" - "ems.agt/lib/services" - tokenConst "ems.agt/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 6a41713..a28be1b 100644 --- a/lib/midware/mml_log.go +++ b/lib/midware/mml_log.go @@ -9,11 +9,11 @@ import ( "strings" "time" - "ems.agt/lib/core/datasource" - "ems.agt/lib/core/utils/ctx" - "ems.agt/lib/core/utils/date" - "ems.agt/lib/dborm" - "ems.agt/lib/log" + "be.ems/lib/core/datasource" + "be.ems/lib/core/utils/ctx" + "be.ems/lib/core/utils/date" + "be.ems/lib/dborm" + "be.ems/lib/log" ) // LogMML mml操作日志搜集 diff --git a/lib/midware/operate_log.go b/lib/midware/operate_log.go index 7a70868..6b00eb0 100644 --- a/lib/midware/operate_log.go +++ b/lib/midware/operate_log.go @@ -11,13 +11,13 @@ import ( "strings" "time" - "ems.agt/lib/core/utils/parse" - "ems.agt/lib/dborm" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/middleware/collectlogs" - "ems.agt/src/framework/utils/ip2region" - "ems.agt/src/modules/system/model" - "ems.agt/src/modules/system/service" + "be.ems/lib/core/utils/parse" + "be.ems/lib/dborm" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/framework/utils/ip2region" + "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 75d4bb2..ded9c02 100644 --- a/lib/mmlp/parse.go +++ b/lib/mmlp/parse.go @@ -11,11 +11,11 @@ import ( "strconv" "strings" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/run" - tokenConst "ems.agt/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" ) diff --git a/lib/oauth/oauth.go b/lib/oauth/oauth.go index 4cabf08..2d45603 100644 --- a/lib/oauth/oauth.go +++ b/lib/oauth/oauth.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "ems.agt/lib/log" + "be.ems/lib/log" "github.com/dgrijalva/jwt-go" "golang.org/x/crypto/bcrypt" diff --git a/lib/routes/routes.go b/lib/routes/routes.go index d2c94e3..2023bda 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -5,33 +5,33 @@ import ( // "log" - "ems.agt/features/aaaa" - "ems.agt/features/cdr" - "ems.agt/features/cm" - "ems.agt/features/dbrest" - "ems.agt/features/file" - "ems.agt/features/fm" - "ems.agt/features/lm" - "ems.agt/features/mml" - "ems.agt/features/monitor/monitor" - "ems.agt/features/monitor/psnet" - "ems.agt/features/nbi" - "ems.agt/features/pm" - "ems.agt/features/security" - "ems.agt/features/sm" - "ems.agt/features/state" - sysconfig "ems.agt/features/sys_config" - sysdictdata "ems.agt/features/sys_dict_data" - sysdicttype "ems.agt/features/sys_dict_type" - sysmenu "ems.agt/features/sys_menu" - sysrole "ems.agt/features/sys_role" - sysuser "ems.agt/features/sys_user" - "ems.agt/features/trace" - udmuser "ems.agt/features/udm_user" - "ems.agt/features/ue" - "ems.agt/lib/midware" - "ems.agt/lib/services" - "ems.agt/src/framework/middleware/collectlogs" + "be.ems/features/aaaa" + "be.ems/features/cdr" + "be.ems/features/cm" + "be.ems/features/dbrest" + "be.ems/features/file" + "be.ems/features/fm" + "be.ems/features/lm" + "be.ems/features/mml" + "be.ems/features/monitor/monitor" + "be.ems/features/monitor/psnet" + "be.ems/features/nbi" + "be.ems/features/pm" + "be.ems/features/security" + "be.ems/features/sm" + "be.ems/features/state" + sysconfig "be.ems/features/sys_config" + sysdictdata "be.ems/features/sys_dict_data" + sysdicttype "be.ems/features/sys_dict_type" + sysmenu "be.ems/features/sys_menu" + sysrole "be.ems/features/sys_role" + sysuser "be.ems/features/sys_user" + "be.ems/features/trace" + udmuser "be.ems/features/udm_user" + "be.ems/features/ue" + "be.ems/lib/midware" + "be.ems/lib/services" + "be.ems/src/framework/middleware/collectlogs" "github.com/gorilla/mux" ) @@ -166,9 +166,6 @@ func init() { Register("PUT", cm.CustomUriNeInfo, cm.PutNeInfo, nil) Register("DELETE", cm.CustomUriNeInfo, cm.DeleteNeInfo, nil) - Register("PUT", cm.UriOmcNeConfig, cm.PutOMCNeConfig, nil) - Register("PUT", cm.CustomUriOmcNeConfig, cm.PutOMCNeConfig, nil) - //ne service action handle Register("POST", cm.UriNeService, cm.PostNeServiceAction, nil) //ne service action handle @@ -177,9 +174,12 @@ func init() { Register("POST", mml.UriMML, mml.PostMMLToNF, midware.LogMML) Register("POST", mml.UriMMLDiscard, mml.PostMMLToNF, nil) Register("POST", mml.UriOmMmlExt, mml.PostMMLToOMC, midware.LogMML) - Register("POST", mml.CustomUriMML, mml.PostMMLToNF, midware.LogMML) Register("POST", mml.CustomUriOmMmlExt, mml.PostMMLToOMC, midware.LogMML) + // post mml2 (standard upf port=5002) + Register("POST", mml.UriMML2, mml.PostMML2ToNF, midware.LogMML) + Register("POST", mml.CustomUriMML2, mml.PostMML2ToNF, midware.LogMML) + // Northbound Get NRM Register("GET", nbi.GetNRMUri, nbi.NBIGetNRMFromNF, nil) diff --git a/lib/run/exec_linux.go b/lib/run/exec_linux.go index 33d20d3..e36f89e 100644 --- a/lib/run/exec_linux.go +++ b/lib/run/exec_linux.go @@ -7,7 +7,7 @@ import ( "bytes" "os/exec" - "ems.agt/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 cf5bfd5..9633073 100644 --- a/lib/run/exec_wasm.go +++ b/lib/run/exec_wasm.go @@ -6,7 +6,7 @@ package run import ( "os/exec" - "ems.agt/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 c79d9a7..1af2b97 100644 --- a/lib/run/exec_windows.go +++ b/lib/run/exec_windows.go @@ -6,7 +6,7 @@ package run import ( "os/exec" - "ems.agt/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 1484103..439f814 100644 --- a/lib/services/file.go +++ b/lib/services/file.go @@ -11,7 +11,7 @@ import ( "strconv" "strings" - "ems.agt/lib/log" + "be.ems/lib/log" ) const ( diff --git a/lib/services/services.go b/lib/services/services.go index a5deefa..149e3f5 100644 --- a/lib/services/services.go +++ b/lib/services/services.go @@ -16,11 +16,11 @@ import ( "strconv" "strings" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/lib/oauth" - "ems.agt/restagent/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 c2d0967..a953cfc 100644 --- a/lib/session/session.go +++ b/lib/session/session.go @@ -11,9 +11,9 @@ import ( "sync" "time" - "ems.agt/lib/log" - "ems.agt/lib/oauth" - "ems.agt/restagent/config" + "be.ems/lib/log" + "be.ems/lib/oauth" + "be.ems/restagent/config" ) // SessionMgr session manager diff --git a/lib/wsinfo/process_data.go b/lib/wsinfo/process_data.go index 0a35778..e19aa62 100644 --- a/lib/wsinfo/process_data.go +++ b/lib/wsinfo/process_data.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "ems.agt/lib/log" + "be.ems/lib/log" "github.com/shirou/gopsutil/v3/host" "github.com/shirou/gopsutil/v3/net" "github.com/shirou/gopsutil/v3/process" diff --git a/restagent/config/config.go b/restagent/config/config.go index 7dcd0c9..39cb6ee 100644 --- a/restagent/config/config.go +++ b/restagent/config/config.go @@ -5,8 +5,8 @@ import ( "os" "strings" - "ems.agt/lib/global" - "ems.agt/lib/log" + "be.ems/lib/global" + "be.ems/lib/log" "gopkg.in/yaml.v3" ) @@ -92,18 +92,24 @@ type YamlConfig struct { User string `yaml:"user"` Password string `yaml:"password"` TlsSkipVerify bool `yaml:"tlsSkipVerify"` - } `json:"email"` + } `yaml:"email"` SMS struct { ApiURL string `yaml:"apiURL"` AccessKeyID string `yaml:"AccessKeyID"` AccessKeySecret string `yaml:"accessKeySecret"` SignName string `yaml:"signName"` TemplateCode string `yaml:"templateCode"` - } `json:"sms"` + } `yaml:"sms"` + SMSC struct { + Addr string `yaml:"addr"` + UserName string `yaml:"userName"` + Password string `yaml:"password"` + } `yaml:"smsc"` } `yaml:"alarm"` MML struct { Port int `yaml:"port"` + Port2 int `yaml:"port2"` Sleep int64 `yaml:"sleep"` DeadLine int64 `yaml:"deadLine"` User string `yaml:"user"` diff --git a/restagent/config/map.go b/restagent/config/map.go index 50a28c7..4c01279 100644 --- a/restagent/config/map.go +++ b/restagent/config/map.go @@ -6,7 +6,7 @@ import ( "gopkg.in/yaml.v3" - "ems.agt/lib/global" + "be.ems/lib/global" ) type Uri2Object struct { diff --git a/restagent/dev.yaml b/restagent/dev.yaml index 20399e3..c7924e1 100644 --- a/restagent/dev.yaml +++ b/restagent/dev.yaml @@ -6,76 +6,95 @@ logger: file: "../temp/log/restagent.log" level: "trace" duration: 24 - count: 2 + 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: 3186 + ipv6: + port: 33040 - ipv4: 0.0.0.0 - ipv6: - port: 3187 + ipv6: + port: 33443 scheme: https - caFile: ./etc/certs/rootca.crt - certFile: ./etc/certs/tsa-omc.crt - keyFile: ./etc/certs/tsa-omc_pri.key + 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:/local.git/fe.ems" - listen: - - addr: :8080 + rootDir: d:/local.git/fe.ems.vue3/dist + listen: + - addr: :80 schema: http - - addr: :8443 + - addr: :443 scheme: https - caFile: ./etc/certs/rootca.crt - certFile: ./etc/certs/tsa-omc.crt - keyFile: ./etc/certs/tsa-omc_pri.key + 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: "192.168.2.166" - port: 33066 - name: "omc_db_dev" - backup: "../temp/database" + # password: 1000omc@kp! + # host: "192.168.8.103" + # port: 33066 + name: omc_db + backup: d:/local.git/be.ems/restagent/database + password: "root@1234" + host: "192.168.5.59" + port: 3306 # Redis 缓存数据,数据源声明全小写 redis: dataSource: # OMC系统使用库 default: - port: 3189 # Redis port - host: "192.168.2.166" # Redis host + port: 6379 # Redis port + host: "192.168.5.59" # Redis host password: "redis@1234" db: 10 # Redis db_num # UDM网元用户库 udmuser: - port: 3189 # Redis port - host: "192.168.2.166" - password: "redis@1234" + port: 6379 # Redis port + host: "192.168.13.140" + password: "" 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 user: admin password: admin - mmlHome: "../temp/mmlhome" + mmlHome: ./mmlhome upload: /home/agtuser +# NE config ne: - user: root + user: agtuser 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: @@ -88,37 +107,46 @@ omc: vendor: "" dn: 4600 chk2ne: false - sn: 13750650 + sn: "-" checksign: false + rootDir: ./ + binDir: ./bin backup: ./backup upload: ./upload - frontUpload: C:\AMP\Probject\ems_frontend\upload + frontUpload: d:/local.git/fe.ems/upload frontTraceDir: d:/local.git/fe.ems/trace software: ./software license: ./license - gtpUri: gtp:192.168.2.119:2152 + gtpUri: gtp:192.168.2.219:2152 checkContentType: false testMode: false rbacMode: true - runDir: + runDir: + cmdTimeout: 120 # Alarm module setting # Forward interface: -# email/sms +# email/sms alarm: forwardAlarm: true email: - smtp: smtp@xxx.com.cn + smtp: mail.agrandtech.com port: 25 - user: smtpuser - password: smtpuser@omc + user: smtpext@agrandtech.com + password: "1000smtp@omc!" + # TLS skip verify: true/false + tlsSkipVerify: true sms: apiURL: http://smsc.xxx.com.cn/ accessKeyID: xxxx accessKeySecret: xxxx signName: xxx SMSC templateCode: 1000 - + smsc: + addr: "192.168.14.211:2775" + userName: OMC + password: "123456" + #User authorized information # crypt: mysql/md5/bcrypt # token: true/false to check accessToken @@ -133,7 +161,7 @@ auth: publicKey: ./etc/certs/omc_pub.key privateKey: ./etc/certs/omc_pri.key -# Parameter for limit number +# 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 @@ -150,4 +178,4 @@ params: testConfig: enabled: true - file: ./etc/testconfig.yaml \ No newline at end of file + file: ./etc/testconfig.yaml diff --git a/restagent/etc/certs/ca_cert.pem b/restagent/etc/certs/ca_cert.pem deleted file mode 100644 index 828a843..0000000 --- a/restagent/etc/certs/ca_cert.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC4jCCAcqgAwIBAgICB+cwDQYJKoZIhvcNAQELBQAwEjEQMA4GA1UEAxMHUm9v -dCBDQTAeFw0yMzA4MTIxODA5MzZaFw0zMzA4MTIxODA5MzZaMBIxEDAOBgNVBAMT -B1Jvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUTcFiT1GT -Zq9ROKTuWm6IfFthO6ysthEKevwkgJGDRCwF+K6rx3j7izTDfLkXum5OPbcd/yiE -B40Yrq9X2ckX260xG9PjDmGUaq8q5sza85Gg2hrW6wiLF9y8yYK3/v7716d0y6st -jt71pH554R98m0zHkbkmrFEagWR5cEoVM6MPZp2wdDnOFBBRiB1BrbHMpAFiKJ6s -oqm1yhUwCeeR/Hs09JF8KfOFhV4qAEVvE1cviHucCEvLBaG6xBzbKvYV2iOPu6u2 -o818wphqmSZYoj3/O4/EyVgvj1VdSqmkTSudiiIhLAa8/2JKrW1v7wFQjRkwNwdf -h6UR5liIUwk7AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBRtEF/Jyw6Zz3v0K5uA6aMOr9LXRTANBgkqhkiG9w0BAQsF -AAOCAQEAErmFo6JjEoFZv8R2gwNUq7ln+YEh2hX4myLlNDfTpYeGnn2Ge70Kmb0o -dkSyanDd9tGImcbEOttWAYve3vetvN3g+GONbf5pV7ClIbVV5MsjN/aGwj/TQWhu -ttmfu9IV2b5HyFEM61eoHVrNoWiNpbNHTu5D/XF8sg5JkseTnJF06foykzAx28i6 -JcttunYn5SoWTIS9Ydu07X7uBcTeFBcKfH0xg4QlsNppiM5lIxBbp0WjQ8jyWw+b -Lyef4N6hmiaOf6P6qwaVZkEBhK6MVf1zadURuUSWAkhwGFjA7IbjbJ7OfYLXkYp3 -mIrXQzjxz6AfyOcY/FsgcaDLf5xbYw== ------END CERTIFICATE----- diff --git a/restagent/etc/certs/omc_pri.key.aes_en b/restagent/etc/certs/omc_pri.key.aes_en deleted file mode 100644 index cc22ab63db1d46a9a8de2883178f6decbc42ebe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmV;B25&0n;$bqP5np zVs4dS$vzJ)1)kK}fv|g1+d(`oF|I~U2g{y|5ME3m6RV3_yG)3JqS7E^v7yul^cR%? zY!;ug>C)0lnH~Z#6urZNC)(*!v)M?Tt91#Mn2%1wrSnu+h=;aQbB+uf|5f?e_xz%p zYgoF{kb52T`Khm&jQpOmw(YL&HsJyXK($m7TUfAeex}2qA%DcFOKK4{hiFCfgC zOXKt?3exdK+xTOIDxwSz!qfOPbFs(5H+~8=MfL;I98-iip-7shj^jg{{Y3r0%Npq6`Q^G@^ut>GYpiDE{vRca2u?LPY6WxWK9rfEB)Ff(s3PH z?bpG>W2xozwOC`2k?>a#K&I7IhP0&S#z0e`Tcz>1OvyX+!cy*Z)l8m?D8UJKRp(x& zd;KqT6x?%qAnSxn3|qJWb83o_80d*@n&rJ(D@5bRM=et;482sbQ-b`vTN-};qPoDt z98-yeaLZPDM8%}5NUF_h(BsI^{2&8s}J((?L%)_v~F z>^S-z&_9kraHx|NS42E==7jJjFC-Sen14fChw$8P2q=%nhMxx5lmorc_ULEN(|SNO z*g&3R2pA7|8^2>-yTO|{il-Wm%Y}Di|AFM*_nruDV2!t4nv6)eN-?$Pcsncx)*!;2 zm*hU(_BV+r2b$G!Dm&ofL)2R@98o@OjrLWOF_ z8f2+4JXx(lPRDL)3c=@OT%r!IeS#mx1cd5hhRn20yxKrEYeU@+R*?({ss(pb#8lj> zFBZg}AGAICo8ptVYLE6#GgSL)J_nbeZ)q0OmGIBN8H?Kr;>?)?E^Nn3L5dV|!O1mF z3#C8RoS0fE_y4glO~Zvs7s@MquWhHy$%K3v?q=$$(^8ZMX_{HMiIMk35 zN$ZB=6oH2#*H|P8Q%Z}qc%=x9KPm1YnAd!wW$ss;z`@B+GGmT}6 z71a(}uYl`&;G)$^loQs*qYhe5HgIT`DY(FjJqc)$?bzgA=8A;e7SA#n$-x z%Ub_TIoTanjhMXcDUh9xG&E_)%Dc(>cd=RVE&H;nt$Q^?yCaI1GYmg?#PB|UsTP+x z%s?{f)KB!<*|(tgnKmM4aRVl%yy$L*8xxU6SlfmKVSzo&#$v_rjh#lY1(pG@zF$Ol z40NhnxVRe%J*>V{5}bU}__N|rAEwLZityUUCj3YUScydSG3D!YbBE(HUKmP`Qe1pl zl@C0F;O>4^(3c3|5;Nw zSJo)*PMY@)3D;F8B&O#k32}mBa3jOa=^t%Hn?}wOn3afy$UsU}9ug#4f%Nq2>Kncl ar?zZizb61*JnuG-KzqbaNJ-rZHD6wR6+dVI diff --git a/restagent/etc/certs/omc_pub.key b/restagent/etc/certs/omc_pub.key deleted file mode 100644 index 4f0922c..0000000 --- a/restagent/etc/certs/omc_pub.key +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA10O52xwLqvwrrof3Ckso -QAXgQOMfIHB5HfrJYrd31tJlJbFw+bR1JHXIAdqh9Cz+H0ir8KfBXS/U2XgI5fbI -upkzg3cRv86nuksGtrKHzi9Q7lYYzGWVW9Tc/hcvdibG6XwLSNYemFN6JrOa5mZ7 -IabtZLuPRwFCBx2XC/dg45wxrGWIe7fbw2SpGId76erwSn/oKJtoy5Ash7LrOkp6 -lu8L0QQNfs9cRntjf4aQo99ppWvUF0H6OFBsGymwRfPRtWqLiwK824zrpXKMLFX3 -e4FjFO7WQNR1spOuL0bH+Ym1cEPYUn8LJN9OaiodjEXc1pM1E5MHWXGMhnhiE9q3 -jwIDAQAB ------END PUBLIC KEY----- diff --git a/restagent/etc/certs/private_key.pem b/restagent/etc/certs/private_key.pem deleted file mode 100644 index 334940a..0000000 --- a/restagent/etc/certs/private_key.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAlE3BYk9Rk2avUTik7lpuiHxbYTusrLYRCnr8JICRg0QsBfiu -q8d4+4s0w3y5F7puTj23Hf8ohAeNGK6vV9nJF9utMRvT4w5hlGqvKubM2vORoNoa -1usIixfcvMmCt/7++9endMurLY7e9aR+eeEffJtMx5G5JqxRGoFkeXBKFTOjD2ad -sHQ5zhQQUYgdQa2xzKQBYiierKKptcoVMAnnkfx7NPSRfCnzhYVeKgBFbxNXL4h7 -nAhLywWhusQc2yr2Fdojj7urtqPNfMKYapkmWKI9/zuPxMlYL49VXUqppE0rnYoi -ISwGvP9iSq1tb+8BUI0ZMDcHX4elEeZYiFMJOwIDAQABAoIBAFVJVhIsXVRwdBg4 -hBkS5ogVRBPp1obIeYpWadSwH36m4M5aUlE1eKzoRGK7wlIUA8V5FmroxysOkKUG -KI5UD6Jp0fLw9uyX46QPqkb4zgyIkFI5u7+nEJW1Flt3Y3Ze7dJ1FbdEPWAIzs3j -WFzNC2eEhCYs9pZ3+HhOuzJfUitYU6ts83tazSms+7E027e/v2ubtYOzluEoj4YK -MM+ocqJOlXUOhyTATDaLs4fM567bwwFeriODQqmMIhXLf3HiBPfPYhoAlwPUV51L -bAjIPwG2/jy0yXPenYOUqSMP1i+XkyTL4eVqOLLQUI+BsEaToS8M7Lf4KRQE0vQm -uAkEA9ECgYEAxCsKXtkYXrma8UziSJgQBj88TfACyuYZBPkpBFJhffPVOreYzqmn -gsE38oHlLhCrezsxvScivS/Cwt7kgBTE9r6xmH8y2f0P3PNmtazQCqovG1gsNZ1t -9PZQmxbVUfx/7KRJ1Q5zX3x5C0P2c6XYv/1h/SQQ8PYXDhRxWZFVSikCgYEAwYlt -AoP8j6yHDMk10vJd0fKT1lztcHcQLvH3HQn2kHci2GCxySvcac49hpXTDeNdUzcQ -I9UWo1MggNojME3WHUTiZD5DYUzuNUBTkc0kMHWy79/YNAzvF9312MSyJ0NlytBQ -ISh0z0sPSxDjW+XCi/8LGu1rrremBqvh0rNIrMMCgYEAt+C8VNHcZRZHpX3y8icP -hjuKFGgwxe3Pb/j5uKJb3ktMCUEFjFo8uXTSM5AMuhRIGTgQVIS1rG5zemSh/Wj6 -g2uWXyKEEQ+D6hGBqjP1wrlpdJE+x3btFdw5DFbn2HT9mF0bFAn6nXu4npWzEw5X -UQd67WT8OFIEpF8HLPTs5JkCgYBQlL6dmITU8Vm9mh1d+mnT23NwgnqeJATJ9xcT -sS1HE0Of4grEHw4Dw8pcOg+JLcyStE91C+kEEb1ryOdz2kS3JRI5+K6nWZeo9mKV -R1u1DZx2QbZMXcJDJriRC7y9mlNMsZVbaPPRx4fTknGHts9c6NEf4hC+y1pGVtSM -nPc6bwKBgQCrtb6srow9o0acH7mMmieDuqvT8DQ6rHWoizgneZTuvIo6SPO6nRnR -jfgfQkqr9IiLh9awSblQEN9fnddog7a1yS4cUZueiP5dmtFvp4B9Scnt+BoHpOLk -rrU2i7grAye4Cd003+pqhSERGCKSzb3fTSYiMypKsxeH2bs8nrRu2A== ------END RSA PRIVATE KEY----- diff --git a/restagent/etc/certs/public_key.pem b/restagent/etc/certs/public_key.pem deleted file mode 100644 index a85d9e4..0000000 --- a/restagent/etc/certs/public_key.pem +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN RSA PUBLIC KEY----- -MIIBCgKCAQEAlE3BYk9Rk2avUTik7lpuiHxbYTusrLYRCnr8JICRg0QsBfiuq8d4 -+4s0w3y5F7puTj23Hf8ohAeNGK6vV9nJF9utMRvT4w5hlGqvKubM2vORoNoa1usI -ixfcvMmCt/7++9endMurLY7e9aR+eeEffJtMx5G5JqxRGoFkeXBKFTOjD2adsHQ5 -zhQQUYgdQa2xzKQBYiierKKptcoVMAnnkfx7NPSRfCnzhYVeKgBFbxNXL4h7nAhL -ywWhusQc2yr2Fdojj7urtqPNfMKYapkmWKI9/zuPxMlYL49VXUqppE0rnYoiISwG -vP9iSq1tb+8BUI0ZMDcHX4elEeZYiFMJOwIDAQAB ------END RSA PUBLIC KEY----- diff --git a/restagent/etc/certs/rootca.crt b/restagent/etc/certs/rootca.crt deleted file mode 100644 index 2255c6b..0000000 --- a/restagent/etc/certs/rootca.crt +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFKTCCAxGgAwIBAgIUIN48tRvspOjaIxbavyrZ/M7IvacwDQYJKoZIhvcNAQEL -BQAwHjELMAkGA1UEBhMCQ04xDzANBgNVBAMMBlJvb3RDQTAgFw0yMzA4MjIwMzQw -MDVaGA8yMTIzMDcyOTAzNDAwNVowHjELMAkGA1UEBhMCQ04xDzANBgNVBAMMBlJv -b3RDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALzyKbRc0hIDXsnI -Yo0DLjfGexwFmhgE6jFR6EWc4V2jVenkTrEahzpKYkhf2SrnEZuuZN/XU0JDAzUE -k8sNF6AUQOAQ6rwaHLB8ZZVEbl8F49F376RGAicg/AzIPytL1ebT1WR8YxoQgd6i -+B7H+6zcKDS8RREwpuVngNdVJ7/mUsxDFPVGpOsQQUsEdkZb/S7txRktHYBAXmiX -fZFC6aL/L9tXKJDcDiTQTyRuA08+uzFxgCF6/8XL8PD8+i8FzZLl0enadDy4ZiLA -pk+vrFmre+ETHHPf4lI1Ptz3fPNsvCS1HO73SJTgpGK0zpcvB32EqPuhPEKy33C0 -dsY+CQcuACvhEk1EQjsSXkuoaPCV/aCmBhS3AMMRuD+73rs9G2DbJQc2KTkyiqM6 -FO9MNGKUHDIEE9O8iBqagBZ7XXqwcf0zr+YdjT47RAM31uROKBECipc0BOSEHJ3w -sjMjLvqDHpP5NeoTnAIVt6djGQK8AWRKuICCtJ59llSmAMWjvsT4VD6ooVRln6ye -j6tLzlnmZvtxEmdOXL/Y7A/HnEb+uAtifsOvZUw/CQpdHRsrUdNUSOozTW/uXgp3 -5lHx9B6HWuxOGagxaaLhD8W5TsqjdSc2BqX23Up/p84RaLrwHjXaesTq7Y/Ckd8T -wIfUc2HtdtFt7YrBr3pkJeI/HjcNAgMBAAGjXTBbMB0GA1UdDgQWBBSr39jHWOmo -14F/m0G/Irn6oVwNTzAfBgNVHSMEGDAWgBSr39jHWOmo14F/m0G/Irn6oVwNTzAM -BgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAE+Br -fsui1ac9meqmgTPnwG91GhqITmVBKwLpwJ3vNHqU/6SOlsw31GZ689kxpOYsMh19 -PwYQ9OYQmz2LGbiVgf3m/mG9S4dnGQecqEAt0WBgYOOJ+tWwmtaDa1y1KEKJIGx2 -R4NYmlihSqobgl3f7/WWtwZM9BZCFAubh757gOiDFDgTukbJxfFVIRy8MVWg5Voz -KZK1toIVI617SignK65L4JbdEPgnD803vYsmn+Mk5PvKLVd1jB/M/Sqxd1W7gqr5 -nIT+WRJIs4SONQkxEP3e5aO2OQyify37a9P1IW8bPOtvZeQKnTSMIwVVyQV+Y6Az -4+a74ngLRAgk4ek9wycIHtv9ZzN0o6vwWBQ73DqyLLY2IVX/8LtrNO6LE9TpoMCa -tGVLZ1M5d1/eVYZC60y/lst/MRUyGgvB9tjiaNxo0Ni9quFifPAq/zx9AWo+7nIP -0RAahOvRZE5NM5LmgaVvMTXYflkfBXChDwL0gXa6rBt5y3/htZ8Cw1Tqi1v3Kv1s -hnD+zMD/Okrp76ZA/N2wib0p1Is1t+CFGdcmFOVEzkxXK37RreWay3cmdlTrzF5P -8kGivh2WApouy97rrhJo7R8rpUplD37Z5SiqtlOfBUaGIzpVapz19UTN5OTq10xo -yBSUGoQ/AGchVrHobdLPTgJNWU/L4QEPloEOGxg= ------END CERTIFICATE----- diff --git a/restagent/etc/certs/rootca.pem b/restagent/etc/certs/rootca.pem deleted file mode 100644 index 2255c6b..0000000 --- a/restagent/etc/certs/rootca.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFKTCCAxGgAwIBAgIUIN48tRvspOjaIxbavyrZ/M7IvacwDQYJKoZIhvcNAQEL -BQAwHjELMAkGA1UEBhMCQ04xDzANBgNVBAMMBlJvb3RDQTAgFw0yMzA4MjIwMzQw -MDVaGA8yMTIzMDcyOTAzNDAwNVowHjELMAkGA1UEBhMCQ04xDzANBgNVBAMMBlJv -b3RDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALzyKbRc0hIDXsnI -Yo0DLjfGexwFmhgE6jFR6EWc4V2jVenkTrEahzpKYkhf2SrnEZuuZN/XU0JDAzUE -k8sNF6AUQOAQ6rwaHLB8ZZVEbl8F49F376RGAicg/AzIPytL1ebT1WR8YxoQgd6i -+B7H+6zcKDS8RREwpuVngNdVJ7/mUsxDFPVGpOsQQUsEdkZb/S7txRktHYBAXmiX -fZFC6aL/L9tXKJDcDiTQTyRuA08+uzFxgCF6/8XL8PD8+i8FzZLl0enadDy4ZiLA -pk+vrFmre+ETHHPf4lI1Ptz3fPNsvCS1HO73SJTgpGK0zpcvB32EqPuhPEKy33C0 -dsY+CQcuACvhEk1EQjsSXkuoaPCV/aCmBhS3AMMRuD+73rs9G2DbJQc2KTkyiqM6 -FO9MNGKUHDIEE9O8iBqagBZ7XXqwcf0zr+YdjT47RAM31uROKBECipc0BOSEHJ3w -sjMjLvqDHpP5NeoTnAIVt6djGQK8AWRKuICCtJ59llSmAMWjvsT4VD6ooVRln6ye -j6tLzlnmZvtxEmdOXL/Y7A/HnEb+uAtifsOvZUw/CQpdHRsrUdNUSOozTW/uXgp3 -5lHx9B6HWuxOGagxaaLhD8W5TsqjdSc2BqX23Up/p84RaLrwHjXaesTq7Y/Ckd8T -wIfUc2HtdtFt7YrBr3pkJeI/HjcNAgMBAAGjXTBbMB0GA1UdDgQWBBSr39jHWOmo -14F/m0G/Irn6oVwNTzAfBgNVHSMEGDAWgBSr39jHWOmo14F/m0G/Irn6oVwNTzAM -BgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAE+Br -fsui1ac9meqmgTPnwG91GhqITmVBKwLpwJ3vNHqU/6SOlsw31GZ689kxpOYsMh19 -PwYQ9OYQmz2LGbiVgf3m/mG9S4dnGQecqEAt0WBgYOOJ+tWwmtaDa1y1KEKJIGx2 -R4NYmlihSqobgl3f7/WWtwZM9BZCFAubh757gOiDFDgTukbJxfFVIRy8MVWg5Voz -KZK1toIVI617SignK65L4JbdEPgnD803vYsmn+Mk5PvKLVd1jB/M/Sqxd1W7gqr5 -nIT+WRJIs4SONQkxEP3e5aO2OQyify37a9P1IW8bPOtvZeQKnTSMIwVVyQV+Y6Az -4+a74ngLRAgk4ek9wycIHtv9ZzN0o6vwWBQ73DqyLLY2IVX/8LtrNO6LE9TpoMCa -tGVLZ1M5d1/eVYZC60y/lst/MRUyGgvB9tjiaNxo0Ni9quFifPAq/zx9AWo+7nIP -0RAahOvRZE5NM5LmgaVvMTXYflkfBXChDwL0gXa6rBt5y3/htZ8Cw1Tqi1v3Kv1s -hnD+zMD/Okrp76ZA/N2wib0p1Is1t+CFGdcmFOVEzkxXK37RreWay3cmdlTrzF5P -8kGivh2WApouy97rrhJo7R8rpUplD37Z5SiqtlOfBUaGIzpVapz19UTN5OTq10xo -yBSUGoQ/AGchVrHobdLPTgJNWU/L4QEPloEOGxg= ------END CERTIFICATE----- diff --git a/restagent/etc/certs/tsa-omc.crt b/restagent/etc/certs/tsa-omc.crt deleted file mode 100644 index d119e0e..0000000 --- a/restagent/etc/certs/tsa-omc.crt +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEYDCCAkigAwIBAgIUGZ67LDulO9kcRtwAwQGEC1oV5NUwDQYJKoZIhvcNAQEL -BQAwHjELMAkGA1UEBhMCQ04xDzANBgNVBAMMBlJvb3RDQTAeFw0yMzA4MjIwMzQw -MjVaFw0yMzA4MjMwMzQwMjVaMDwxCzAJBgNVBAYTAkNOMQ0wCwYDVQQKDARUZXN0 -MR4wHAYDVQQDDBVUaW1lc3RhbXAgQ2VydGlmaWNhdGUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQC1vnKPYHUYPQSvGmfgSxZQley/hvJZyY9dun3hYv1P -h5PydHqkwM6t6wS+f9WTm2RyCvfRJrwn356gKm3DoDePs7T2kIEwnljMFRT8HDEC -SujKz2MBBW/b9eU6Bz9sQ4XHmSTVE/mJF4DiMRxmflUPZ+Mis80XbpFO91tdhDHZ -f0RX5D9ihaS/WTnkOV+ISMxxK1PB/zITlxAk15irYsMM8dCq0iUy/B3+bcGH1YzL -aKqbFw+nrm6NTxYLo4q3ERtLl49l9UXXcoNMvB70fk6i4kXrn7+AEdb3SPCFX0hb -qxUbCrLLDWf5x5JM9+49tkyQ7N36TSj92Q+05jp/f1MdAgMBAAGjeDB2MB0GA1Ud -DgQWBBRghFzHbuyke/ayjjVJuSgPKzwfRTAfBgNVHSMEGDAWgBSr39jHWOmo14F/ -m0G/Irn6oVwNTzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIGwDAWBgNVHSUB -Af8EDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOCAgEAAvKfbV0s2AGHKgEX -X33/N5nV8v109fjmQ0tzN1UvnamxYQLpgCLILN0yeWP4E5LKmzPWnTXG10woEasp -pAtXqYtgZZbvfqlkaryS5IJ73F6uO0hJK7iUswnpGxm9fxS04hhvsx3YRQnaaJ0m -Ek5JpXNsdQVN87iyGtnzp1uHY2csdyw9XDCQxDDXJ3hvLBthHAADeX+h8JX7G3xc -u85ON+w/rVIJIMpPQKg5gvNVzA/krebToSmOS6+f2O1UUj4PxwPPfBHugepzZYpF -grWy1vzz2DAZdNQs39c10a5/C5VrH77V++SoQBfYzCAI7YhA/L6ONIKW4nP3zFX3 -zMmevHYR/WzQlN8twJhyAx7Y6AEjZNnfS2CvZj6UWvVUFbcVD5N9qgLuZxdDezQt -RAsVcSN5q5FURl99oi3X9sGoq/rI47MEU96hSG4pfiBTlt6VbYyWvBLeRWLccLPi -KtvV3wd6F8bqp+U2d/XQFTyQ5jfZcrCVvIesv4euTq+kTypjjjLadgzsy56ivoAx -UvjcJFZ2HVoKpv1SusOMsgg5nZf4lhE5zxYQOtEwzhOXv4U81ctIVHOKYZdDefWm -wC7dTtH9NxaWQZu07Y27wihkBARdnW1azgWorwzKYcGFT+pwrAPRUScj/vqsJkUH -KagSCD6B6qh4zSj0UANX3V6QcfQ= ------END CERTIFICATE----- diff --git a/restagent/etc/certs/tsa-omc.pem b/restagent/etc/certs/tsa-omc.pem deleted file mode 100644 index d119e0e..0000000 --- a/restagent/etc/certs/tsa-omc.pem +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEYDCCAkigAwIBAgIUGZ67LDulO9kcRtwAwQGEC1oV5NUwDQYJKoZIhvcNAQEL -BQAwHjELMAkGA1UEBhMCQ04xDzANBgNVBAMMBlJvb3RDQTAeFw0yMzA4MjIwMzQw -MjVaFw0yMzA4MjMwMzQwMjVaMDwxCzAJBgNVBAYTAkNOMQ0wCwYDVQQKDARUZXN0 -MR4wHAYDVQQDDBVUaW1lc3RhbXAgQ2VydGlmaWNhdGUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQC1vnKPYHUYPQSvGmfgSxZQley/hvJZyY9dun3hYv1P -h5PydHqkwM6t6wS+f9WTm2RyCvfRJrwn356gKm3DoDePs7T2kIEwnljMFRT8HDEC -SujKz2MBBW/b9eU6Bz9sQ4XHmSTVE/mJF4DiMRxmflUPZ+Mis80XbpFO91tdhDHZ -f0RX5D9ihaS/WTnkOV+ISMxxK1PB/zITlxAk15irYsMM8dCq0iUy/B3+bcGH1YzL -aKqbFw+nrm6NTxYLo4q3ERtLl49l9UXXcoNMvB70fk6i4kXrn7+AEdb3SPCFX0hb -qxUbCrLLDWf5x5JM9+49tkyQ7N36TSj92Q+05jp/f1MdAgMBAAGjeDB2MB0GA1Ud -DgQWBBRghFzHbuyke/ayjjVJuSgPKzwfRTAfBgNVHSMEGDAWgBSr39jHWOmo14F/ -m0G/Irn6oVwNTzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIGwDAWBgNVHSUB -Af8EDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOCAgEAAvKfbV0s2AGHKgEX -X33/N5nV8v109fjmQ0tzN1UvnamxYQLpgCLILN0yeWP4E5LKmzPWnTXG10woEasp -pAtXqYtgZZbvfqlkaryS5IJ73F6uO0hJK7iUswnpGxm9fxS04hhvsx3YRQnaaJ0m -Ek5JpXNsdQVN87iyGtnzp1uHY2csdyw9XDCQxDDXJ3hvLBthHAADeX+h8JX7G3xc -u85ON+w/rVIJIMpPQKg5gvNVzA/krebToSmOS6+f2O1UUj4PxwPPfBHugepzZYpF -grWy1vzz2DAZdNQs39c10a5/C5VrH77V++SoQBfYzCAI7YhA/L6ONIKW4nP3zFX3 -zMmevHYR/WzQlN8twJhyAx7Y6AEjZNnfS2CvZj6UWvVUFbcVD5N9qgLuZxdDezQt -RAsVcSN5q5FURl99oi3X9sGoq/rI47MEU96hSG4pfiBTlt6VbYyWvBLeRWLccLPi -KtvV3wd6F8bqp+U2d/XQFTyQ5jfZcrCVvIesv4euTq+kTypjjjLadgzsy56ivoAx -UvjcJFZ2HVoKpv1SusOMsgg5nZf4lhE5zxYQOtEwzhOXv4U81ctIVHOKYZdDefWm -wC7dTtH9NxaWQZu07Y27wihkBARdnW1azgWorwzKYcGFT+pwrAPRUScj/vqsJkUH -KagSCD6B6qh4zSj0UANX3V6QcfQ= ------END CERTIFICATE----- diff --git a/restagent/etc/certs/tsa-omc_pri.key b/restagent/etc/certs/tsa-omc_pri.key deleted file mode 100644 index 530f70b..0000000 --- a/restagent/etc/certs/tsa-omc_pri.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAtb5yj2B1GD0Erxpn4EsWUJXsv4byWcmPXbp94WL9T4eT8nR6 -pMDOresEvn/Vk5tkcgr30Sa8J9+eoCptw6A3j7O09pCBMJ5YzBUU/BwxAkroys9j -AQVv2/XlOgc/bEOFx5kk1RP5iReA4jEcZn5VD2fjIrPNF26RTvdbXYQx2X9EV+Q/ -YoWkv1k55DlfiEjMcStTwf8yE5cQJNeYq2LDDPHQqtIlMvwd/m3Bh9WMy2iqmxcP -p65ujU8WC6OKtxEbS5ePZfVF13KDTLwe9H5OouJF65+/gBHW90jwhV9IW6sVGwqy -yw1n+ceSTPfuPbZMkOzd+k0o/dkPtOY6f39THQIDAQABAoIBADgq2YDSEJ4jDXWI -NZ4t1oGlM/ulGvUAw9v1rL2hOCQCBIkj0ltkcvtw7JBrNXhex9Yu6ZOr4u53v7BE -LJQOyd0RbtXcpvB9n3fC9C9ODx9kQzmaikBgi8dw4Rzj7Ifq/kdHXwizGaVyrBQ7 -lUlfta4DL0EkTDf3pdS/wW7PUhCjLPEPH6GqkDilsIGGudDT5pqUVB/fkLq4rPl4 -QhQixDCwTtesPMeMMCy+bjB5hojRzENZ9ste4eSpF0BJQyUjKLWkyCPjFZKtM1l8 -C+fZT/tVeyMkGpOXywhtuYSaAeoeaqrPjvMzN1H3slx0i9J6lIS/T+94jXuA5Zbw -iXR6GAkCgYEA4D6K02Nnu1vk/NnhqK8AiP9gWUxArGaQ8BKkhAXEi7/oLhRfnJE0 -eNgmZLKk4pMZmC9tf5WiBXdcHDZwjxequi02AtdU4p0emStJ7L/if3YLdWKCOdjw -3jkMdtHmQRT3bUFppKkH4n+EAg08QOT1HLoFVmcfKkjZQ9igbfFoAx8CgYEAz3sn -G6ZpF7wbxdWyPxuko9O8r9V6xFa6pWpuy5X1rVXUEy4u7pwn3D7xgOT3v83HdkIG -aRlIR8YbEcekpO+hqRPljvm3zYDsEXs4I1fBmnxSrO9aX0IImEabTCTuRAUZRGMe -Vzrk2rqCmuO0zDmBN+/uxqlK5us3wAguO+vbPkMCgYAgSIC9/BKkA4/M4yU8nq0q -C/H4CSVKbJ2zIkvzAc2Q/PjVIXO+W509RIkKeDmKsPi/UxylgIpJ1Sw6l4/O2e5n -TTj4Yb3DvjD4hiXnYpyeEwWFScBLybKrm3Ty6jcG6ZjRbthhr0AGWKtNjFA/W3b6 -QsGf9cqj0McOoHJAQb/iqwKBgH9c0+bvQjflqw7IXUDMEUbX5U3yuAfqTWzZZuXm -Sgd7VlHn2btzdCyJHurGoybEhRqc8R52/J3CiD9j1DfDOfN2WUZpGGE4MLGSeCWJ -6ziP9Jhf3ZP4DxqazR3y1ag/kQEf7zIQ3wc90oqOGR/8dMwHpwWgSnByF6jz3J2/ -7LfNAoGBAMJsi2nJF3jzWwZLY9pQQ2/Icdojk0yUE0a9skdh5R6MjpzwQ3FydbB0 -PxUxfJlAjS06kV/URo11AdQZXm/QKyb8uJPyRppJ7DZ0vsiDWysElqUHX/E/H6kI -QaQvePQ59HcgkJVh9wFI5blHtTyMrGR76kmZN5ClL05ITkqdnWJp ------END RSA PRIVATE KEY----- diff --git a/restagent/etc/certs/tsa-omc_pri.pem b/restagent/etc/certs/tsa-omc_pri.pem deleted file mode 100644 index 530f70b..0000000 --- a/restagent/etc/certs/tsa-omc_pri.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAtb5yj2B1GD0Erxpn4EsWUJXsv4byWcmPXbp94WL9T4eT8nR6 -pMDOresEvn/Vk5tkcgr30Sa8J9+eoCptw6A3j7O09pCBMJ5YzBUU/BwxAkroys9j -AQVv2/XlOgc/bEOFx5kk1RP5iReA4jEcZn5VD2fjIrPNF26RTvdbXYQx2X9EV+Q/ -YoWkv1k55DlfiEjMcStTwf8yE5cQJNeYq2LDDPHQqtIlMvwd/m3Bh9WMy2iqmxcP -p65ujU8WC6OKtxEbS5ePZfVF13KDTLwe9H5OouJF65+/gBHW90jwhV9IW6sVGwqy -yw1n+ceSTPfuPbZMkOzd+k0o/dkPtOY6f39THQIDAQABAoIBADgq2YDSEJ4jDXWI -NZ4t1oGlM/ulGvUAw9v1rL2hOCQCBIkj0ltkcvtw7JBrNXhex9Yu6ZOr4u53v7BE -LJQOyd0RbtXcpvB9n3fC9C9ODx9kQzmaikBgi8dw4Rzj7Ifq/kdHXwizGaVyrBQ7 -lUlfta4DL0EkTDf3pdS/wW7PUhCjLPEPH6GqkDilsIGGudDT5pqUVB/fkLq4rPl4 -QhQixDCwTtesPMeMMCy+bjB5hojRzENZ9ste4eSpF0BJQyUjKLWkyCPjFZKtM1l8 -C+fZT/tVeyMkGpOXywhtuYSaAeoeaqrPjvMzN1H3slx0i9J6lIS/T+94jXuA5Zbw -iXR6GAkCgYEA4D6K02Nnu1vk/NnhqK8AiP9gWUxArGaQ8BKkhAXEi7/oLhRfnJE0 -eNgmZLKk4pMZmC9tf5WiBXdcHDZwjxequi02AtdU4p0emStJ7L/if3YLdWKCOdjw -3jkMdtHmQRT3bUFppKkH4n+EAg08QOT1HLoFVmcfKkjZQ9igbfFoAx8CgYEAz3sn -G6ZpF7wbxdWyPxuko9O8r9V6xFa6pWpuy5X1rVXUEy4u7pwn3D7xgOT3v83HdkIG -aRlIR8YbEcekpO+hqRPljvm3zYDsEXs4I1fBmnxSrO9aX0IImEabTCTuRAUZRGMe -Vzrk2rqCmuO0zDmBN+/uxqlK5us3wAguO+vbPkMCgYAgSIC9/BKkA4/M4yU8nq0q -C/H4CSVKbJ2zIkvzAc2Q/PjVIXO+W509RIkKeDmKsPi/UxylgIpJ1Sw6l4/O2e5n -TTj4Yb3DvjD4hiXnYpyeEwWFScBLybKrm3Ty6jcG6ZjRbthhr0AGWKtNjFA/W3b6 -QsGf9cqj0McOoHJAQb/iqwKBgH9c0+bvQjflqw7IXUDMEUbX5U3yuAfqTWzZZuXm -Sgd7VlHn2btzdCyJHurGoybEhRqc8R52/J3CiD9j1DfDOfN2WUZpGGE4MLGSeCWJ -6ziP9Jhf3ZP4DxqazR3y1ag/kQEf7zIQ3wc90oqOGR/8dMwHpwWgSnByF6jz3J2/ -7LfNAoGBAMJsi2nJF3jzWwZLY9pQQ2/Icdojk0yUE0a9skdh5R6MjpzwQ3FydbB0 -PxUxfJlAjS06kV/URo11AdQZXm/QKyb8uJPyRppJ7DZ0vsiDWysElqUHX/E/H6kI -QaQvePQ59HcgkJVh9wFI5blHtTyMrGR76kmZN5ClL05ITkqdnWJp ------END RSA PRIVATE KEY----- diff --git a/restagent/etc/restconf-t.yaml b/restagent/etc/restconf-t.yaml index 6ea8d46..ff7f7b6 100644 --- a/restagent/etc/restconf-t.yaml +++ b/restagent/etc/restconf-t.yaml @@ -3,7 +3,7 @@ # duration: rotation time with xx hours, example: 1/12/24 hours # count: rotation count of log, default is 30 rotation logger: - file: d:/local.git/ems.agt/restagent/log/restagent-t.log + file: d:/local.git/be.ems/restagent/log/restagent-t.log level: trace duration: 24 count: 2 @@ -13,10 +13,10 @@ logger: rest: - ipv4: 0.0.0.0 ipv6: - port: 3030 + port: 33030 - ipv4: 0.0.0.0 ipv6: - port: 6060 + port: 36060 database: type: mysql @@ -25,7 +25,7 @@ database: host: 127.0.0.1 port: 33066 name: omc_db - backup: d:/local.git/ems.agt/restagent/database + backup: d:/local.git/be.ems/restagent/database # Redis 缓存数据,数据源声明全小写 redis: diff --git a/restagent/etc/restconf.yaml b/restagent/etc/restconf.yaml index 6f4d4ed..a19d796 100644 --- a/restagent/etc/restconf.yaml +++ b/restagent/etc/restconf.yaml @@ -3,7 +3,7 @@ # duration: rotation time with xx hours, example: 1/12/24 hours # count: rotation count of log, default is 30 rotation logger: - file: d:/local.git/ems.agt/restagent/log/restagent.log + file: d:/local.git/be.ems/restagent/log/restagent.log level: trace duration: 24 count: 2 @@ -15,10 +15,10 @@ logger: rest: - ipv4: 0.0.0.0 ipv6: - port: 3040 + port: 33040 - ipv4: 0.0.0.0 ipv6: - port: 3443 + port: 33443 scheme: https clientAuthType: 0 caFile: ./etc/certs/omc-ca.crt @@ -45,7 +45,7 @@ database: # host: "192.168.8.103" # port: 33066 name: omc_db - backup: d:/local.git/ems.agt/restagent/database + backup: d:/local.git/be.ems/restagent/database password: "root@1234" host: "192.168.5.59" port: 3306 @@ -72,6 +72,7 @@ redis: # deadLine: timeout for io read and write (second) mml: port: 4100 + port2: 5002 sleep: 200 deadLine: 10 user: admin @@ -127,7 +128,7 @@ omc: # Forward interface: # email/sms alarm: - forwardAlarm: false + forwardAlarm: true email: smtp: mail.agrandtech.com port: 25 @@ -141,6 +142,10 @@ alarm: accessKeySecret: xxxx signName: xxx SMSC templateCode: 1000 + smsc: + addr: "192.168.14.211:2775" + userName: OMC + password: "123456" #User authorized information # crypt: mysql/md5/bcrypt diff --git a/restagent/license/upf/upf_1350015_system.ini b/restagent/license/upf/upf_1350015_system.ini deleted file mode 100644 index 53ea81a064f1cffb3c640d49048b8382031db16c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3724 zcmZ>9HgR)tG;pync5*g0Ff-#|U|?WmVrF0j(!>Cq>X?AKfs!Ee1k^Dx$ZVK6h>Z@i zDm}w9?_7vn`;Px&)teyJqpLb2c3+9Lnm_4~&cr}r?-TiZ_P6a2ZZP?+dghqkZEtk_ zL!6&5#NAJ^^QE_SEcMa8^^{_RhM57daIpvt%1NHOLd&sehTXPZw}KC9x|kj6(_cT# zygTZh(GVC7fzc2c4S^970yx`~1K@v)vahd!N0|nsskQ87OE(z+(%MUln>h{;MH8yfL;jQUuxAJ2ERim|;JB0sqUa zo_ppq3j_eb0SN%0|J}^M-k!XM19&dV|c4HC$K=a@9N7X!;4CX_uN>xg1bUl^^dQfq-u!W245~ zsGboWO@lxqM{8w8ny&@##B_G`*D^M7K*A=5Ru9 zS}aY^Q}#U%BEUM;Bm|iYJ}(fo-h^af`M&C6X>_zGnpvBvh6xhMdr!MGvBNF5mJWCQ z=gQ97T~Ni!3qh!v1s%!#fMv!(O+|Blgexvxf!uXX*lhyGS?SNYt<&?Jqr7q?{tF=3CxUVm5k754FF6SM+tmp%~nh)$^{GDARJCMmEy-bqlc& zIgXhMm^c^;)=lAY-ieW$-obY5Qv;#DI&V$PDYKdTD0hudCfIpcod3>yqLyQ!lp+hL z5+{SyHdPJJJ#FTuydC`pVe8GxU>fH5ZJDH5;3)DvE@Z(F|FDoa83G9?GqL7m#i3CQ zhCH$}p>xkv?tn*zmyBd#KH`pPMsYZQ=N@Y;c{KUkRN(QmjX=3jGog{KrW=$_?te1A zRbPlp{lGZt1LIi#VBFc!$z{uicdyHnQ%MrQXs5q2d1$X&- ze1=|0(5&Ls;cLmUQE~2lP;&pue2VoYoy1{J)w6_e5UA)!wZ=t+>jH2?b5)s;L(^(5 z`vnw3tzm>;7;NpzqtvjbT$Z~W;VnS+UtBbW%%}Y#CZTN^7xLa{R!&BFpuJu~i{uU; z@RvbC5J51mD3iVz!$Z|}i^#d9FIU;KHglO9TX%}s!}9*&VGzOuXD6r4Ef;B+Sz^9# z6iA;Ld@}foR^%h_G&QN%by;qU1tP;bsMuTY@cFJe-r9*_2~%8wHnm0SGWJMlTzPi! zSL8+jFCt|}6&e6gL;(Qs|IPLn zg!OTzCf*F#&Pkv*;cdS__uQtX5|^IT6NdpC&p@n_nvb0{0N-G)P`=w_62DH8@xvD$ z1{9*ffNcD9Q!@z0w}<*wMQ(7@7bq=8Ksu+fxOL{eGj^t1X(>d}9Cld!d zd692&xbg5Vc?<|;zEj4g$2?@yZ=}hp-fNax1o4E%Ru9Wnm$l}NwUCo<=8}a4a>b#C z!(0q)34cSfqP|l*yMZ=qsX8(n=mam)?$1P_+_$yJ;G3x!cra8}TBR|(P|I&)KjA`N zKrcb3er3@B6>LPxjbKhHkF(H52K=;VtYK=(%H2qFZpbL)(hoFD2DP?f;NqWp(m};w z7BBsT3eA>n1jiOe9Ly|0!TD*EWk6G`Sq%lZ#1A1*W{?UbAhH=F$l||HnB_DIzv?k16BLcGxM5_;No`80`6}vR&!$z z`ENr``_4 zH?u(s1S8~Vv1P%B3S6U^{ykel%bED=a{vId2VIo_ZYNuBR|APgi}@8Y2V|TgaF5Qg zHq5>#6f7Y`B~5rrXK05tQUL5q3tgZy^uZb_0iptwJcjAc8Q|5Pu}Y#bw~f=aQ{*!F z8`4b7<$gt67b0J-5pyaEU7>1g!rcW2Z(A{pGx zGDDxBg-(zzxO)^{+ZJ--dlH$vkvY2m`%pNF)G%I-56KkjEcTJl^OJ#4Dt+Y;og-j6 zP64x-TN?RJvX$pUPM+YlMhb)8ud$M?YeGG^m3;RWr>oulc6v;ix5!Iob!*wKc8g8d zw-Y~#53R3qzXlZpb?#mi3n%23CTwl4Ajx5^r-XzS^y>u)b`z$)!{|+tK+p*gg>ei|Q zPTtiX%At111U=lI$BXb_6;4L`-5KYVX#R`0pHD1WIz2xf^yixuZwWFi-IO<6m|mVt zmFIQKyS|00QHWNd65#Jhm}l)`G3q}h!;)Z)-??QQ;d+~0{dM`Ce9SAq{=P<*q>nas z@filEl%a4nsaq6lq&utAjOhDsklX7CvLC=xvb<{)9xmg|{+&hq3dz2#8fY*_Z-Ru< zN_$(4`;uvN^?lzLH-nNhWUL)9emz)gTbzXzXs8tPhg zFDsfvCS_lh4(Mw@!BmEve`MX}=1=i5qT(faMHHiDh?z6+9Re=xEXW_d0D*|tpZ4qq72H1^@E`laqI~(U+ zT-^ZBTSt_oqJz`#j1N|8zG40xVi4R zvS|#N&!6>fF0MM+4^JcV^J6kH1+F$uj@QOs32rqpv_mCG4>GGo{5y#w1OpvmTOc{(PTA?S5Eu;p`i)B&-yW^Uc~ilVixK1`wE1%qGJ zPRsPSOiepRvL!_yYiEIaQ2;m?8`(2W_c3<_LW-2x5l>jM3MVbcb5S7Y)9dr2 zvZz25zk+}pcoq7{sbSgdjtx*CrX}nRdhfJ2h-b?$Y!?Y3C7Q)VSFl5**4oxV{WJK4 zkd)-0l4Qi)ki3pU<=v2IM{?L+nFY6m)Mgv16hYc_OeeN9wtG#AQ)^6eqv*J650o@_ z-ZgQn+Segm|N5-=RJkU81=Q>ZJsX_gO0I|occ2YQ*+}=2bg3!$RT_RiTkLn~URvv@ zb4OL{@W46{q#5Dokg+qG#@S{3-YC-i#{Ayr^KjbPkGZLhTo{FuF3TJLM*@#|=LRS^khyk2g$g zg%4A=3woa5^vhUH+n5HZqwQu=qqvaJl!+L!cf+kpDY`vMcyrs-$~~TL!KxbEbj$=# zGsjJ4AZr>w?GkIw2>Uwr<~Hy_aeNRiQczqDT~;$#gIiu$~gtTCV6w=yImWF6C1fM(Xv_;k)R5x?VfF7 zDnsnmY`%$Yck>2|PjmeVnkT9>;p+Gtn(ywTI>jAPT#9FfR8(lqzo$FhY`Q>6QweEw zXSVDU2~a&7k5;7C5+irJ#F5OfyNIBX=?dB-!`OnD%8oA<7NOWArj+V_)6YC6q*6+j zs%3)&y^>Bj1*_pc)gwH*PqEeu4L2%V&zcQP_kjr-s%pDbP1Ac`!Z3q8${*Q|WhZNP zgX)iIRcT4*ONMb2o}cuJo#IHX9J}1)wv;1J#ARU0|7-9M2eAr#9HLI_pU*$#Hhj!! zPGn_i!m$eWB_N|ESm9AdnM5v{kn8^hcATDe9^z64vx_;-urt0^(itl?oJ5Y``hwXX z!Ra0_0qhuN8bHmIIWJnT#?!0;$-Z8R!t zVJ}F}m%=Yv(yrAB)0!cFKi0Ywjis>X;chr1F~jqKzRr2ye3`ChUw`{TSEbZC>2>GX zSMQVYkCt2G9TG{*z4RC1ASKyQ3?)w8O=IvdKA9sd|NyB96wI@5a}rr zcLNp9RT;#(pB`vTYN|mAlV_g#eT*BPeTj#9b;?b-4Z+bqUt2T1&bP<~-`WJ+EK_^i z%P7f!>6)||HJC82Hg{jG`@Ug!jF{qcjMwfl4$R>2w_ISLzA?fJ9Q~}5cK8v@;M1iZ zsjGVRP3ODW_gmhs1aqgFnyaR6{}Kyy6DJc-tBYz-{Tk#w9gT?2(kT=rG=Xr!G0tc9 zFTGf6V|vYQX8=LxVT9lo0bl{)Ho+#b7iihd+m|URG&+#V1}D}3wlUALwVCZk6jnRK zhXTA~P(wz5Q)uFPOd=tnlICk+2M?ZRlO2cunn0b2zM`sSy|asfhKHejtU0m@Oa zLm}e1a;;?g7`u20=zwkj~!u%MAw!Y`)8oHrEI9oQ*Zj{@lV8^%_*;Ti$_U1H7k~xx71a1ri!!cK^UK^)BAAuG*S%Wc}nbMXFml`Mo))&OzL^E765gC$GV?wQ|&+ zKQyuB+m4TT@-Zn^aFwU`aDX#I5EEGnOE$&3>Kg5Ok~SVD`!lp*yKRzerF4?uI{>PO zyxGz@AJg+BVAwXERNECEgEQyE5rFwMn3itVN}t`H@`PprtOPk1Fwjc_2!7>amOv`s zlp4c`a{GZIZQ_+YFfHc2kOT>DSc!l?6dSCVBY8652%VJM330rD;-9QQ1Iz@R zzPc4FgIxrCDbUV!blWD@$|A9%Hq(cEVYPxAnyweKr~hsd@n-lS*sVhR+5C&oh0h_) zg)@PGv!C$jGCn*6dozAPHF_*iNmk^MLO?S9Rq;@Pq>wO$ns4j7nypJ;D{8p}I{@yU!?v+Bf;Dzoh}6j9WP#nnXJ zVdovAq?>HUacu7DY=BOc+nA?(U}A-J!YA3xUpz|HSqZjSGCvn6VB_+a9; zQQ)(3>c(NIQ9DRNAL~q>?I6f~sECm?hj!EAPUw`?2;sIClImR1VuJ5_7vwXIjA7Ik zB_5Z^0_jCeWz0`55{mpPhaG}>+Aps9)^Jeuuv}Ih2k|Wh;Ld!{11t$|-b_H9CCame z$&pX9V;4~cbZ$l-M32R)P3Kz`NaqQl*^Y;mbG|v*IXU*EEB@$7-W~LgSW+HfN(qy9 z@BPyIYEYq1Fv6I$={@q|dV0c0-;xqn!tonD`FjV~AJ_56@gZiJUTn7$c!*iT=Ap{; zDkbrF)j5q43f^@QPkpTYu_*y6SnF8t>7PX)wL-EH zCn8h}C4)N`JRc-}nR!DM4WEHxraX$@bhG9t3-0;&2@Od(35gi!A0c%;P>6yKt}z_1%S?-ynm)>`;= zEo)Utz!Bo?i&VJq%+lo0e&VbU!ArlcPY7)6}G{e2T!J}x~j7RwTeec^S`!-W6WrF3Y(Jq zY|n-exfMblw#8hZwS3N4IEGJRW7SiZ)6EW?iOdNr;!Xd~Dm&hgsi2G-*^oMY}x z>7omLG2UO#1e-_h6tBMYYh8tv1z{AZxXfVN#kswt+J&n~qQ0uaD8;07{*H2;{RG@v z{0hftQ#1f7pYTGonZ(v*#fzzV$@S~mUOwzV+%qq0bi_J7r)g$vgt?eeRBd^9v;Gq#M9qQT=^N5x^R0@c1U!ajLZST?tNtR4X>|Ka)2qOBmL$|Kd z4WL_Xl5gl2249le59+^q51?^#px$pDM-t zn5f=E!pSAnA4Mp@e7yC2OY3+})s>C1LDW_y!V0Y$_uRNpU#5m->@sv$P0dn)cIe2E zlG#2!^mN&P6n{?5l=q<7OUx_e?ujDfzDgeXs1GbWJkfp=^H`=fw6n8%%-^FPIQgXw zNZtf+dVc4yQ3^{{74hAMeGS<++Y#SYq*tz^e3v1Wt(;V{xs&r^s`#|m{49u!&P*m* zo=xA}iaK%O-O=5dQw20`{1;_&v$8qn7 z)J)}I!Uq>1dlGvIkr_oKM{c?&Er7@qg20M__bl3D1q3A8UL59Q@CXIsz{|4N0wPtG z30(_r7+8zV@SNS#}K6}T^!_r+@xgyrP z?VMBYCM15kR%EN9T<mq!3wqa~{~`KjlbkCK#*7m)a8J(I%Qso}ewYd?PGi5RQCNv#{3~2c z%H?L-(p%$t!Ua-Y*1YHje`h6sA-f)zCZ(gdZt4sEk|m83Q0}VsZP4}Ke;8f|25i1e zm}Q~>>%3JSW(#>i8*eePqpB#B`GQkCpI6X`JbwkubVy05DIeR$D80M60r2k}r@ld-tA#t-E7A$z6a`PZIQl zvDo#$bNPP-$^S&>#!)u@{sWC)ALt}_I6kcJ-)4WmnE%D@gW84Mbr{eXFyiGf8pSG+ zuG^J0Rq6>aqW3X3gp<)qtI6#7ppoVDP8&Hhu=$X>e{P}fa2$=w(uhUTn3o2b>56L{ zwh8qRjX5jS=BPRX0wq%N3;p3?HOaI_lFWD|6s-e-ah3tGZWYy(z8!4@6zq;F>uHjB zo+jEPkxi6G{MHcP?Wr$lrSNP~X!e>~F~lKu{l3xYbrtGT_VoelQ6jutl-#x;Z?79g z7uQ4&EbfMEsIXp$yEaa6x4f=nUh+xl#X#yY!;3avuQ(6B2rcB!ROI~R=yB2?-yCSc z)-rr}_>C718&9gX1;?6>W)JHe<)L!>s0C_?+Sxjp*gEN{y4#yL>O8LZ(u96_NLK9N zbE>BHk6P?1_6Cs#`YR@d6su6qh zQp3g8fS!8^ z$p;rTzmA?h87oW@B0!SCP#vx=5lZxbrL?#Xte3)5Hw;y5QV&JGHmM>L*-Ct>dvgmC$V<(&$Bx9pl70UDdo zNB!NG`R6|ezqD7C8M#4gdl``tS-x@*n5vcL)DjZF~$lzuV&m2CL_P0?= l.maxSize { - l.rotateFile(currTime.Format("20060102_150405")) + l.rotateFile(currTime.Format("2006-01-02_150405")) } else if time.Since(fileInfo.ModTime()).Hours() > 24 { - l.rotateFile(fileInfo.ModTime().Format("20060102")) + l.rotateFile(fileInfo.ModTime().Format("2006-01-02")) } time.AfterFunc(1*time.Minute, l.checkFile) @@ -100,7 +100,7 @@ func (l *Logger) checkFile() { func (l *Logger) rotateFile(timeFormat string) { l.fileHandle.Close() - newFileName := fmt.Sprintf("%s-%s", l.fileName, timeFormat) + newFileName := fmt.Sprintf("%s.%s", l.fileName, timeFormat) newFilePath := filepath.Join(l.filePath, newFileName) oldfilePath := filepath.Join(l.filePath, l.fileName) @@ -134,14 +134,18 @@ func (l *Logger) removeOldFile(oldFileDate time.Time) { } for _, file := range files { - idx := strings.LastIndex(file.Name(), ".log-") + // 跳过非指定日志文件名 + if !strings.HasPrefix(file.Name(), l.fileName+".") { + continue + } + idx := strings.LastIndex(file.Name(), ".") if idx == -1 { continue } - dateStr := file.Name()[idx+5 : idx+13] + dateStr := file.Name()[idx+1 : idx+11] // 解析日期字符串 - fileDate, err := time.Parse("20060102", dateStr) + fileDate, err := time.Parse("2006-01-02", dateStr) if err != nil { l.Errorf("logger RemoveOldFile Parse err: %v", err.Error()) continue diff --git a/src/framework/middleware/collectlogs/operate_log.go b/src/framework/middleware/collectlogs/operate_log.go index 7d344b0..49ec04f 100644 --- a/src/framework/middleware/collectlogs/operate_log.go +++ b/src/framework/middleware/collectlogs/operate_log.go @@ -3,16 +3,17 @@ package collectlogs import ( "encoding/json" "fmt" + "reflect" "strings" "time" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" ) @@ -83,14 +84,6 @@ func OptionNew(title, businessType string) Options { } } -// 敏感属性字段进行掩码 -var maskProperties []string = []string{ - "password", - "oldPassword", - "newPassword", - "confirmPassword", -} - // OperateLog 访问操作日志记录 // // 请在用户身份授权认证校验后使用以便获取登录用户信息 @@ -136,15 +129,8 @@ func OperateLog(options Options) gin.HandlerFunc { // 是否需要保存request,参数和值 if options.IsSaveRequestData { params := ctx.RequestParamsMap(c) - for k, v := range params { - // 敏感属性字段进行掩码 - for _, s := range maskProperties { - if s == k { - params[k] = parse.SafeContent(v.(string)) - break - } - } - } + // 敏感属性字段进行掩码 + processSensitiveFields(params) jsonStr, _ := json.Marshal(params) paramsStr := string(jsonStr) if len(paramsStr) > 2000 { @@ -182,3 +168,50 @@ func OperateLog(options Options) gin.HandlerFunc { service.NewSysLogOperateImpl.InsertSysLogOperate(operLog) } } + +// 敏感属性字段进行掩码 +var maskProperties []string = []string{ + "password", + "privateKey", + "privatePassword", + "passPhrase", + "oldPassword", + "newPassword", + "confirmPassword", +} + +// processSensitiveFields 处理敏感属性字段 +func processSensitiveFields(obj interface{}) { + val := reflect.ValueOf(obj) + + switch val.Kind() { + case reflect.Map: + for _, key := range val.MapKeys() { + value := val.MapIndex(key) + keyStr := key.Interface().(string) + + // 遍历是否敏感属性 + hasMaskKey := false + for _, v := range maskProperties { + if v == keyStr { + hasMaskKey = true + break + } + } + + if hasMaskKey { + valueStr := value.Interface().(string) + if len(valueStr) > 100 { + valueStr = valueStr[0:100] + } + val.SetMapIndex(key, reflect.ValueOf(parse.SafeContent(valueStr))) + } else { + processSensitiveFields(value.Interface()) + } + } + case reflect.Slice, reflect.Array: + for i := 0; i < val.Len(); i++ { + processSensitiveFields(val.Index(i).Interface()) + } + } +} diff --git a/src/framework/middleware/cors.go b/src/framework/middleware/cors.go index 12a15a2..7630153 100644 --- a/src/framework/middleware/cors.go +++ b/src/framework/middleware/cors.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "ems.agt/src/framework/config" + "be.ems/src/framework/config" "github.com/gin-gonic/gin" ) diff --git a/src/framework/middleware/pre_authorize.go b/src/framework/middleware/pre_authorize.go index 240ee72..d840a9f 100644 --- a/src/framework/middleware/pre_authorize.go +++ b/src/framework/middleware/pre_authorize.go @@ -3,12 +3,12 @@ package middleware import ( "strings" - AdminConstants "ems.agt/src/framework/constants/admin" - commonConstants "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/i18n" - ctxUtils "ems.agt/src/framework/utils/ctx" - tokenUtils "ems.agt/src/framework/utils/token" - "ems.agt/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" ) @@ -21,6 +21,7 @@ var URL_WHITE_LIST = []string{ "/omcNeConfig", "/cdrEvent", "/upload-ue", + "/oauth/token", } // PreAuthorize 用户身份授权认证校验 diff --git a/src/framework/middleware/rate_limit.go b/src/framework/middleware/rate_limit.go index 3390622..368028d 100644 --- a/src/framework/middleware/rate_limit.go +++ b/src/framework/middleware/rate_limit.go @@ -5,12 +5,12 @@ import ( "strings" "time" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/redis" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/ip2region" - "ems.agt/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 c9891a0..1d08c59 100644 --- a/src/framework/middleware/repeat/repeat.go +++ b/src/framework/middleware/repeat/repeat.go @@ -5,12 +5,12 @@ import ( "strconv" "time" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/redis" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/ip2region" - "ems.agt/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 74b3a5e..680e7ba 100644 --- a/src/framework/middleware/report.go +++ b/src/framework/middleware/report.go @@ -3,7 +3,7 @@ package middleware import ( "time" - "ems.agt/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 3d76c81..3746811 100644 --- a/src/framework/middleware/security/csp.go +++ b/src/framework/middleware/security/csp.go @@ -1,8 +1,8 @@ package security import ( - "ems.agt/src/framework/config" - "ems.agt/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 4feb37c..61837d7 100644 --- a/src/framework/middleware/security/hsts.go +++ b/src/framework/middleware/security/hsts.go @@ -3,7 +3,7 @@ package security import ( "fmt" - "ems.agt/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 e0b5a76..e75f588 100644 --- a/src/framework/middleware/security/noopen.go +++ b/src/framework/middleware/security/noopen.go @@ -1,7 +1,7 @@ package security import ( - "ems.agt/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 f8ca6aa..4bd13ad 100644 --- a/src/framework/middleware/security/nosniff.go +++ b/src/framework/middleware/security/nosniff.go @@ -1,7 +1,7 @@ package security import ( - "ems.agt/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 8f55bb2..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" - "ems.agt/src/framework/config" - "ems.agt/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 9fae200..6a5f367 100644 --- a/src/framework/middleware/security/xframe.go +++ b/src/framework/middleware/security/xframe.go @@ -1,7 +1,7 @@ package security import ( - "ems.agt/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 88502cc..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 ( - "ems.agt/src/framework/config" + "be.ems/src/framework/config" "github.com/gin-gonic/gin" ) diff --git a/src/framework/redis/redis.go b/src/framework/redis/redis.go index 604d538..32576f3 100644 --- a/src/framework/redis/redis.go +++ b/src/framework/redis/redis.go @@ -6,8 +6,8 @@ import ( "strings" "time" - "ems.agt/src/framework/config" - "ems.agt/src/framework/logger" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" "github.com/redis/go-redis/v9" ) diff --git a/src/framework/cmd/cmd.go b/src/framework/utils/cmd/cmd.go similarity index 95% rename from src/framework/cmd/cmd.go rename to src/framework/utils/cmd/cmd.go index f4d7032..f26919f 100644 --- a/src/framework/cmd/cmd.go +++ b/src/framework/utils/cmd/cmd.go @@ -37,34 +37,6 @@ func Exec(cmdStr string) (string, error) { return stdout.String(), nil } -func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - cmd := exec.Command("bash", "-c", cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if ctx.Err() == context.DeadlineExceeded { - return "", fmt.Errorf("errCmdTimeout %v", err) - } - if err != nil { - errMsg := "" - if len(stderr.String()) != 0 { - errMsg = fmt.Sprintf("stderr: %s", stderr.String()) - } - if len(stdout.String()) != 0 { - if len(errMsg) != 0 { - errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) - } else { - errMsg = fmt.Sprintf("stdout: %s", stdout.String()) - } - } - return errMsg, err - } - return stdout.String(), nil -} - func ExecCronjobWithTimeOut(cmdStr string, workdir string, timeout time.Duration) (string, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -92,6 +64,7 @@ func ExecCronjobWithTimeOut(cmdStr string, workdir string, timeout time.Duration return errMsg, err } +// Execf 本地执行命令 列如:("ssh %s@%s", "user", "localhost") func Execf(cmdStr string, a ...interface{}) (string, error) { cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...)) var stdout, stderr bytes.Buffer @@ -115,6 +88,36 @@ func Execf(cmdStr string, a ...interface{}) (string, error) { return stdout.String(), nil } +// ExecWithTimeOut 本地执行命令超时退出 列如:("ssh user@localhost", 20*time.Second) +func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + cmd := exec.Command("bash", "-c", cmdStr) + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err := cmd.Run() + if ctx.Err() == context.DeadlineExceeded { + return "", fmt.Errorf("errCmdTimeout %v", err) + } + if err != nil { + errMsg := "" + if len(stderr.String()) != 0 { + errMsg = fmt.Sprintf("stderr: %s", stderr.String()) + } + if len(stdout.String()) != 0 { + if len(errMsg) != 0 { + errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) + } else { + errMsg = fmt.Sprintf("stdout: %s", stdout.String()) + } + } + return errMsg, err + } + return stdout.String(), nil +} + +// ExecWithCheck 执行命令程序带参数 例如:("ls", "-r", "-l", "-s") func ExecWithCheck(name string, a ...string) (string, error) { cmd := exec.Command(name, a...) var stdout, stderr bytes.Buffer diff --git a/src/framework/utils/crypto/aes.go b/src/framework/utils/crypto/aes.go new file mode 100644 index 0000000..4db36ac --- /dev/null +++ b/src/framework/utils/crypto/aes.go @@ -0,0 +1,88 @@ +package crypto + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/base64" + "fmt" + "io" +) + +// aesKey 字符串AES加解密密钥 +const aesKey = "AGT66VfY4SMaiT97" + +// StringEncryptByAES 字符串AES加密 +func StringEncryptByAES(text string) (string, error) { + if len(text) == 0 { + return "", nil + } + pass := []byte(text) + xpass, err := aesEncryptWithSalt([]byte(aesKey), pass) + if err == nil { + pass64 := base64.StdEncoding.EncodeToString(xpass) + return pass64, err + } + return "", err +} + +// StringDecryptByAES 字符串AES解密 +func StringDecryptByAES(text string) (string, error) { + if len(text) == 0 { + return "", nil + } + bytesPass, err := base64.StdEncoding.DecodeString(text) + if err != nil { + return "", err + } + var tpass []byte + tpass, err = aesDecryptWithSalt([]byte(aesKey), bytesPass) + if err == nil { + result := string(tpass[:]) + return result, err + } + return "", err +} + +// aesEncryptWithSalt AES加密 +func aesEncryptWithSalt(key, plaintext []byte) ([]byte, error) { + blockSize := aes.BlockSize + padding := blockSize - len(plaintext)%blockSize + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + plaintext = append(plaintext, padtext...) + + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + ciphertext := make([]byte, blockSize+len(plaintext)) + iv := ciphertext[0:blockSize] + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + return nil, err + } + cbc := cipher.NewCBCEncrypter(block, iv) + cbc.CryptBlocks(ciphertext[blockSize:], plaintext) + return ciphertext, nil +} + +// aesDecryptWithSalt AES解密 +func aesDecryptWithSalt(key, ciphertext []byte) ([]byte, error) { + blockSize := aes.BlockSize + var block cipher.Block + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + if len(ciphertext) < blockSize { + return nil, fmt.Errorf("iciphertext too short") + } + iv := ciphertext[:blockSize] + ciphertext = ciphertext[blockSize:] + cbc := cipher.NewCBCDecrypter(block, iv) + cbc.CryptBlocks(ciphertext, ciphertext) + length := len(ciphertext) + unpadding := int(ciphertext[len(ciphertext)-1]) + ciphertext = ciphertext[:(length - unpadding)] + return ciphertext, nil +} diff --git a/lib/core/utils/crypto/crypto.go b/src/framework/utils/crypto/bcrypt.go similarity index 100% rename from lib/core/utils/crypto/crypto.go rename to src/framework/utils/crypto/bcrypt.go diff --git a/src/framework/utils/crypto/crypto.go b/src/framework/utils/crypto/crypto.go deleted file mode 100644 index c242f7f..0000000 --- a/src/framework/utils/crypto/crypto.go +++ /dev/null @@ -1,20 +0,0 @@ -package crypto - -import ( - "golang.org/x/crypto/bcrypt" -) - -// BcryptHash Bcrypt密码加密 -func BcryptHash(originStr string) string { - hash, err := bcrypt.GenerateFromPassword([]byte(originStr), bcrypt.DefaultCost) - if err != nil { - return "" - } - return string(hash) -} - -// BcryptCompare Bcrypt密码匹配检查 -func BcryptCompare(originStr, hashStr string) bool { - err := bcrypt.CompareHashAndPassword([]byte(hashStr), []byte(originStr)) - return err == nil -} diff --git a/src/framework/utils/ctx/ctx.go b/src/framework/utils/ctx/ctx.go index b005e13..fd7503c 100644 --- a/src/framework/utils/ctx/ctx.go +++ b/src/framework/utils/ctx/ctx.go @@ -4,13 +4,13 @@ import ( "fmt" "strings" - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/constants/roledatascope" - "ems.agt/src/framework/constants/token" - "ems.agt/src/framework/utils/ip2region" - "ems.agt/src/framework/utils/ua" - "ems.agt/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" @@ -65,6 +65,15 @@ func IPAddrLocation(c *gin.Context) (string, string) { // Authorization 解析请求头 func Authorization(c *gin.Context) string { + // Query请求查询 + if authQuery, ok := c.GetQuery(token.ACCESS_TOKEN); ok && authQuery != "" { + return authQuery + } + // Header请求头 + if authHeader := c.GetHeader(token.ACCESS_TOKEN); authHeader != "" { + return authHeader + } + // Query请求查询 if authQuery, ok := c.GetQuery(token.RESPONSE_FIELD); ok && authQuery != "" { return authQuery diff --git a/src/framework/utils/date/date.go b/src/framework/utils/date/date.go index c8cfa69..533bf09 100644 --- a/src/framework/utils/date/date.go +++ b/src/framework/utils/date/date.go @@ -3,7 +3,7 @@ package date import ( "time" - "ems.agt/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 2150440..008b557 100644 --- a/src/framework/utils/fetch/fetch.go +++ b/src/framework/utils/fetch/fetch.go @@ -72,21 +72,23 @@ func Post(url string, data url.Values, headers map[string]string) ([]byte, error } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, errors.New(resp.Status) - } - body, err := io.ReadAll(resp.Body) if err != nil { return nil, err } + if resp.StatusCode != http.StatusOK { + return body, errors.New(resp.Status) + } + return body, nil } // PostJSON 发送 POST 请求,并将请求体序列化为 JSON 格式 func PostJSON(url string, data any, headers map[string]string) ([]byte, error) { - client := &http.Client{} + client := &http.Client{ + Timeout: 3 * time.Second, // 超时时间 + } jsonData, err := json.Marshal(data) if err != nil { @@ -110,15 +112,15 @@ func PostJSON(url string, data any, headers map[string]string) ([]byte, error) { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, errors.New(resp.Status) - } - body, err := io.ReadAll(resp.Body) if err != nil { return nil, err } + if resp.StatusCode != http.StatusOK { + return body, errors.New(resp.Status) + } + return body, nil } @@ -177,7 +179,9 @@ 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{} + client := &http.Client{ + Timeout: 3 * time.Second, // 超时时间 + } jsonData, err := json.Marshal(data) if err != nil { @@ -199,15 +203,15 @@ func PutJSON(url string, data any, headers map[string]string) ([]byte, error) { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, errors.New(resp.Status) - } - body, err := io.ReadAll(resp.Body) if err != nil { return nil, err } + if resp.StatusCode != http.StatusOK { + return body, errors.New(resp.Status) + } + return body, nil } @@ -230,14 +234,14 @@ func Delete(url string, headers map[string]string) ([]byte, error) { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, errors.New(resp.Status) - } - body, err := io.ReadAll(resp.Body) if err != nil { return nil, err } + if resp.StatusCode != http.StatusOK { + return body, errors.New(resp.Status) + } + return body, nil } diff --git a/src/framework/utils/file/csv.go b/src/framework/utils/file/csv.go index 0e33b51..6591ff8 100644 --- a/src/framework/utils/file/csv.go +++ b/src/framework/utils/file/csv.go @@ -6,7 +6,7 @@ import ( "path/filepath" "strings" - "ems.agt/src/framework/logger" + "be.ems/src/framework/logger" ) // 写入CSV文件,需要转换数据 @@ -15,7 +15,7 @@ import ( // data = append(data, []string{"姓名", "年龄", "城市"}) // data = append(data, []string{"1", "2", "3"}) // err := file.WriterCSVFile(data, filePath) -func WriterCSVFile(data [][]string, filePath string) error { +func WriterFileCSV(data [][]string, filePath string) error { // 获取文件所在的目录路径 dirPath := filepath.Dir(filePath) @@ -44,7 +44,7 @@ func WriterCSVFile(data [][]string, filePath string) error { } // 读取CSV文件,转换map数据 -func ReadCSVFile(filePath string) []map[string]string { +func ReadFileCSV(filePath string) []map[string]string { // 创建 map 存储 CSV 数据 arr := make([]map[string]string, 0) diff --git a/src/framework/utils/file/excel.go b/src/framework/utils/file/excel.go index a501f66..7441680 100644 --- a/src/framework/utils/file/excel.go +++ b/src/framework/utils/file/excel.go @@ -7,9 +7,9 @@ import ( "path/filepath" "time" - "ems.agt/src/framework/constants/uploadsubpath" - "ems.agt/src/framework/logger" - "ems.agt/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 77d25a8..4077816 100644 --- a/src/framework/utils/file/file.go +++ b/src/framework/utils/file/file.go @@ -11,13 +11,13 @@ import ( "strings" "time" - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/uploadsubpath" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/generate" - "ems.agt/src/framework/utils/parse" - "ems.agt/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 new file mode 100644 index 0000000..88217c9 --- /dev/null +++ b/src/framework/utils/file/json.go @@ -0,0 +1,108 @@ +package file + +import ( + "bufio" + "encoding/json" + "fmt" + "os" + "path/filepath" + + "be.ems/src/framework/logger" +) + +// WriterFileJSON 写入JSON文件 +func WriterFileJSON(data any, filePath string) error { + // 获取文件所在的目录路径 + dirPath := filepath.Dir(filePath) + + // 确保文件夹路径存在 + err := os.MkdirAll(dirPath, os.ModePerm) + if err != nil { + logger.Errorf("CreateFile MkdirAll %v", err) + } + + // 创建或打开文件 + file, err := os.Create(filePath) + if err != nil { + return err + } + defer file.Close() + + // 创建 JSON 编码器 + encoder := json.NewEncoder(file) + + // 将数据编码并写入文件 + err = encoder.Encode(data) + if err != nil { + return err + } + + return nil +} + +// WriterFileJSONLine 写入JSON文件用 一行一个JSON +func WriterFileJSONLine(data []any, filePath string) error { + // 获取文件所在的目录路径 + dirPath := filepath.Dir(filePath) + + // 确保文件夹路径存在 + err := os.MkdirAll(dirPath, os.ModePerm) + if err != nil { + logger.Errorf("CreateFile MkdirAll %v", err) + } + + // 创建或打开文件 + file, err := os.Create(filePath) + if err != nil { + return err + } + defer file.Close() + + // 创建一个 Writer 对象,用于将数据写入文件 + writer := bufio.NewWriter(file) + for _, row := range data { + jsonData, err := json.Marshal(row) + if err != nil { + return err + } + + // 写入 JSON 字符串到文件,并换行 + fmt.Fprintln(writer, string(jsonData)) + } + + // 将缓冲区中的数据刷新到文件中 + err = writer.Flush() + if err != nil { + logger.Errorf("CreateFile Flush %v", err) + return err + } + return nil +} + +// ReadFileJSONLine 读取行JSON文件 一行一个JSON +func ReadFileJSONLine(filePath string) []string { + // 创建 map 存储数据 + arr := make([]string, 0) + + // 打开文本文件 + file, err := os.Open(filePath) + if err != nil { + logger.Errorf("OpenFile Open %v", err) + return arr + } + defer file.Close() + + // 创建一个 Scanner 对象,用于逐行读取文件内容 + scanner := bufio.NewScanner(file) + if scanner.Err() != nil { + logger.Errorf("OpenFile NewScanner %v", scanner.Err()) + return arr + } + + for scanner.Scan() { + line := scanner.Text() + arr = append(arr, line) + } + + return arr +} diff --git a/src/framework/utils/file/txt.go b/src/framework/utils/file/txt.go index bb09144..d509fd8 100644 --- a/src/framework/utils/file/txt.go +++ b/src/framework/utils/file/txt.go @@ -7,16 +7,17 @@ import ( "path/filepath" "strings" - "ems.agt/src/framework/logger" + "be.ems/src/framework/logger" ) -// 写入Txt文件用,号分割 需要转换数据 +// WriterFileTXT 写入txt文件 sep 分割符号 需要转换数据 +// // 例如: // data := [][]string{} // data = append(data, []string{"姓名", "年龄", "城市"}) // data = append(data, []string{"1", "2", "3"}) -// err := file.WriterCSVFile(data, filePath) -func WriterTxtFile(data [][]string, filePath string) error { +// err := file.WriterFileTXT(data, filePath) +func WriterFileTXT(data [][]string, sep string, filePath string) error { // 获取文件所在的目录路径 dirPath := filepath.Dir(filePath) @@ -36,7 +37,7 @@ func WriterTxtFile(data [][]string, filePath string) error { // 创建一个 Writer 对象,用于将数据写入文件 writer := bufio.NewWriter(file) for _, row := range data { - line := strings.Join(row, ",") + line := strings.Join(row, sep) fmt.Fprintln(writer, line) } @@ -49,15 +50,15 @@ func WriterTxtFile(data [][]string, filePath string) error { return nil } -// 读取Txt文件,用,号分割 转换数组数据 -func ReadTxtFile(filePath string) [][]string { - // 创建 map 存储 CSV 数据 +// ReadFileTXT 读取Txt文件,sep 分割符号 转换数组数据 +func ReadFileTXT(sep string, filePath string) [][]string { + // 创建 map 存储数据 arr := make([][]string, 0) // 打开文本文件 file, err := os.Open(filePath) if err != nil { - logger.Errorf("ReadTxtFile Open %v", err) + logger.Errorf("OpenFile Open %v", err) return arr } defer file.Close() @@ -65,13 +66,13 @@ func ReadTxtFile(filePath string) [][]string { // 创建一个 Scanner 对象,用于逐行读取文件内容 scanner := bufio.NewScanner(file) if scanner.Err() != nil { - logger.Errorf("ReadTxtFile NewScanner %v", scanner.Err()) + logger.Errorf("OpenFile NewScanner %v", scanner.Err()) return arr } for scanner.Scan() { line := scanner.Text() - fields := strings.Split(line, ",") + fields := strings.Split(line, sep) arr = append(arr, fields) } diff --git a/src/framework/utils/file/utils.go b/src/framework/utils/file/utils.go index efd1bf7..fbb05fe 100644 --- a/src/framework/utils/file/utils.go +++ b/src/framework/utils/file/utils.go @@ -9,7 +9,7 @@ import ( "sort" "strconv" - "ems.agt/src/framework/logger" + "be.ems/src/framework/logger" ) // transferToNewFile 读取目标文件转移到新路径下 diff --git a/src/framework/utils/file/zip.go b/src/framework/utils/file/zip.go new file mode 100644 index 0000000..e2d8f7a --- /dev/null +++ b/src/framework/utils/file/zip.go @@ -0,0 +1,111 @@ +package file + +import ( + "archive/zip" + "fmt" + "io" + "os" + "path/filepath" +) + +// CompressZipByFile 将单文件添加到 ZIP 压缩文件 +func CompressZipByFile(zipFilePath, filePath string) error { + // 创建一个新的 ZIP 文件 + newZipFile, err := os.Create(zipFilePath) + if err != nil { + return fmt.Errorf("创建 ZIP 文件失败: %w", err) + } + defer newZipFile.Close() + + // 创建 ZIP 写入器 + zipWriter := zip.NewWriter(newZipFile) + defer zipWriter.Close() + + fileToCompress, err := os.Open(filePath) + if err != nil { + return fmt.Errorf("打开文件失败: %w", err) + } + defer fileToCompress.Close() + + // 获取文件信息 + fileInfo, err := fileToCompress.Stat() + if err != nil { + return fmt.Errorf("获取文件信息失败: %w", err) + } + + // 创建文件头 + header, err := zip.FileInfoHeader(fileInfo) + if err != nil { + return fmt.Errorf("创建文件头失败: %w", err) + } + + // 设置文件头中的名称 + header.Name = fileInfo.Name() + + // 创建文件在 ZIP 中的写入器 + writer, err := zipWriter.CreateHeader(header) + if err != nil { + return fmt.Errorf("创建文件写入器失败: %w", err) + } + + // 将文件内容复制到 ZIP 文件中 + _, err = io.Copy(writer, fileToCompress) + if err != nil { + return fmt.Errorf("将文件内容复制到 ZIP 失败: %w", err) + } + + return nil +} + +// CompressZipByDir 将目录下文件添加到 ZIP 压缩文件 +func CompressZipByDir(zipFilePath, dirPath string) error { + // 创建输出文件 + zipWriter, err := os.Create(zipFilePath) + if err != nil { + return err + } + defer zipWriter.Close() + + // 创建 zip.Writer + zipWriterObj := zip.NewWriter(zipWriter) + defer zipWriterObj.Close() + + // 遍历目录下的所有文件和子目录 + err = filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // 忽略目录 + if info.IsDir() { + return nil + } + + // 创建文件条目 + relativePath, err := filepath.Rel(dirPath, path) + if err != nil { + return err + } + fileEntry, err := zipWriterObj.Create(relativePath) + if err != nil { + return err + } + + // 打开文件 + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + // 写入文件内容到 ZIP 文件 + _, err = io.Copy(fileEntry, file) + if err != nil { + return err + } + + return nil + }) + + return err +} diff --git a/src/framework/utils/generate/generate.go b/src/framework/utils/generate/generate.go index f7ca157..f76c7f5 100644 --- a/src/framework/utils/generate/generate.go +++ b/src/framework/utils/generate/generate.go @@ -4,7 +4,7 @@ import ( "math/rand" "time" - "ems.agt/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 b62890c..0dc48f3 100644 --- a/src/framework/utils/ip2region/ip2region.go +++ b/src/framework/utils/ip2region/ip2region.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "ems.agt/src/framework/logger" + "be.ems/src/framework/logger" ) // 网络地址(内网) diff --git a/src/framework/utils/ping/ping.go b/src/framework/utils/ping/ping.go new file mode 100644 index 0000000..24635d1 --- /dev/null +++ b/src/framework/utils/ping/ping.go @@ -0,0 +1,139 @@ +package ping + +import ( + "encoding/json" + "fmt" + "runtime" + "time" + + probing "github.com/prometheus-community/pro-bing" +) + +// Ping 探针发包参数 +type Ping struct { + DesAddr string `json:"desAddr"` // 目的 IP 地址(字符串类型,必填) + VRFName string `json:"vrfName"` // VRF 名称(字符串类型,可选) + DSCP int `json:"dscp"` // DSCP 优先级(整数类型,可选,取值范围:0-63,默认值:0) + SrcAddr string `json:"srcAddr"` // 源 IP 地址(字符串类型,可选) + SendInterval int `json:"sendInterval"` // 发包间隔(整数类型,可选,单位:毫秒,取值范围:10-10000,默认值:1000) + TTL int `json:"ttl"` // TTL(整数类型,可选,取值范围:1-255,默认值:255) + SentPkts int `json:"sentPkts"` // 发包数(整数类型,可选,取值范围:1-65535,默认值:5) + Size int `json:"size"` // 报文大小(整数类型,可选,取值范围:36-8192,默认值:36) + TimeOut int `json:"timeOut"` // 报文超时时间(整数类型,可选,单位:秒,取值范围:1-60,默认值:2) +} + +// CopyFrom 将map复制到当前同key名的结构体 +func (p *Ping) CopyFrom(from any) error { + b, err := json.Marshal(from) + if err != nil { + return err + } + if err = json.Unmarshal(b, p); err != nil { + return err + } + return nil +} + +// setDefaultValue 设置默认值 +func (p *Ping) setDefaultValue() { + if p.SendInterval < 10 || p.SendInterval > 10000 { + p.SendInterval = 1000 + } + if p.TTL < 1 || p.TTL > 255 { + p.TTL = 255 + } + if p.SentPkts < 1 || p.SentPkts > 65535 { + p.SentPkts = 5 + } + if p.Size < 36 || p.Size > 8192 { + p.Size = 36 + } + if p.DSCP < 0 || p.DSCP > 63 { + p.DSCP = 0 + } + if p.TimeOut < 1 || p.TimeOut > 60 { + p.TimeOut = 2 + } +} + +// Statistics ping数据结果 +func (p *Ping) Statistics() (*probing.Statistics, 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.SendInterval) * time.Millisecond + pinger.TTL = p.TTL + pinger.Count = p.SentPkts + pinger.Size = p.Size + pinger.Timeout = time.Duration(p.TimeOut) * time.Second + + // 设置特权模式(需要管理员权限) + if runtime.GOOS == "windows" { + pinger.SetPrivileged(true) + } + err = pinger.Run() + if err != nil { + fmt.Println(err) + return nil, err + } + + return pinger.Statistics(), nil +} + +// StatsInfo ping基本信息 +func (p *Ping) StatsInfo() (map[string]any, error) { + stats, err := p.Statistics() + if err != nil { + return nil, err + } + return map[string]any{ + "minTime": stats.MinRtt.Milliseconds(), // 最小时延(整数类型,可选,单位:毫秒) + "maxTime": stats.MaxRtt.Milliseconds(), // 最大时延(整数类型,可选,单位:毫秒) + "avgTime": stats.AvgRtt.Milliseconds(), // 平均时延(整数类型,可选,单位:毫秒) + "lossRate": int64(stats.PacketLoss), // 丢包率(整数类型,可选,单位:%) + "jitter": stats.StdDevRtt.Milliseconds(), // 时延抖动(整数类型,可选,单位:毫秒) + }, nil +} + +// StatsInfo ping探测发送的所有往返时间 +func (p *Ping) StatsRtt() (map[string][]map[string]any, error) { + stats, err := p.Statistics() + if err != nil { + return nil, err + } + data := map[string][]map[string]any{ + // hopList 节点列表 + "hopList": { + { + // hopIndex 序号 + "hopIndex": 1, + // probeList 探测信息列表 + "probeList": []map[string]any{ + { + "probeIndex": 1, // probeIndex 探测报文序号 + "hopAddress": "-", // hopAddress 地址 + "probeTime": 0, // probeTime 探测时长 + }, + }, + }, + }, + } + + rtts := []map[string]any{} + for i, tts := range stats.Rtts { + rtts = append(rtts, map[string]any{ + "probeIndex": i + 1, // probeIndex 探测报文序号 + "hopAddress": stats.IPAddr.String(), // hopAddress 地址 + "probeTime": tts.Milliseconds(), // probeTime 探测时长 + }) + } + data["hopList"][0]["probeList"] = rtts + + return data, nil +} diff --git a/src/framework/utils/repo/repo.go b/src/framework/utils/repo/repo.go index 02da857..f783c7f 100644 --- a/src/framework/utils/repo/repo.go +++ b/src/framework/utils/repo/repo.go @@ -5,8 +5,9 @@ import ( "reflect" "strconv" "strings" + "time" - "ems.agt/src/framework/utils/parse" + "be.ems/src/framework/utils/parse" ) // PageNumSize 分页页码记录数 @@ -64,6 +65,18 @@ func SetFieldValue(obj any, fieldName string, value any) { floatValue = 0 } fieldValue.SetFloat(floatValue) + case reflect.Struct: + fmt.Printf("%s 时间解析 %s %v \n", fieldName, fieldValue.Type(), value) + if fieldValue.Type() == reflect.TypeOf(time.Time{}) && value != nil { + // 解析 value 并转换为 time.Time 类型 + parsedTime, err := time.Parse("2006-01-02 15:04:05 +0800 CST", fmt.Sprintf("%v", value)) + if err != nil { + fmt.Println("时间解析出错:", err) + } else { + // 设置字段的值 + fieldValue.Set(reflect.ValueOf(parsedTime)) + } + } default: // 设置字段的值 fieldValue.Set(reflect.ValueOf(value).Convert(fieldValue.Type())) diff --git a/src/framework/utils/ssh/files.go b/src/framework/utils/ssh/files.go index 23604a8..59eefe5 100644 --- a/src/framework/utils/ssh/files.go +++ b/src/framework/utils/ssh/files.go @@ -4,10 +4,10 @@ import ( "fmt" "strings" - "ems.agt/src/framework/cmd" - "ems.agt/src/framework/config" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/cmd" + "be.ems/src/framework/utils/parse" ) // FileListRow 文件列表行数据 diff --git a/src/framework/utils/ssh/scp.go b/src/framework/utils/ssh/scp.go index 2a50d78..834ba8e 100644 --- a/src/framework/utils/ssh/scp.go +++ b/src/framework/utils/ssh/scp.go @@ -6,8 +6,8 @@ import ( "os/exec" "path/filepath" - "ems.agt/src/framework/config" - "ems.agt/src/framework/logger" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" ) // 网元NE 文件复制到远程文件 diff --git a/src/framework/utils/ssh/ssh.go b/src/framework/utils/ssh/ssh.go new file mode 100644 index 0000000..fbee80f --- /dev/null +++ b/src/framework/utils/ssh/ssh.go @@ -0,0 +1,245 @@ +package ssh + +import ( + "bytes" + "fmt" + "io" + "os" + "os/user" + "strings" + "sync" + "time" + + "be.ems/src/framework/logger" + gossh "golang.org/x/crypto/ssh" +) + +// ConnSSH 连接SSH对象 +type ConnSSH struct { + User string `json:"user"` // 主机用户名 + Addr string `json:"addr"` // 主机地址 + Port int64 `json:"port"` // SSH端口 + AuthMode string `json:"authMode"` // 认证模式(0密码 1主机私钥) + Password string `json:"password"` // 认证密码 + PrivateKey string `json:"privateKey"` // 认证私钥 + PassPhrase string `json:"passPhrase"` // 认证私钥密码 + + DialTimeOut time.Duration `json:"dialTimeOut"` // 连接超时断开 + + Client *gossh.Client `json:"client"` + LastResult string `json:"lastResult"` // 记最后一次执行命令的结果 +} + +// NewClient 创建SSH客户端 +func (c *ConnSSH) NewClient() (*ConnSSH, error) { + // IPV6地址协议 + proto := "tcp" + if strings.Contains(c.Addr, ":") { + proto = "tcp6" + c.Addr = fmt.Sprintf("[%s]", c.Addr) + } + addr := fmt.Sprintf("%s:%d", c.Addr, c.Port) + + // ssh客户端配置 + config := &gossh.ClientConfig{} + config.SetDefaults() + config.HostKeyCallback = gossh.InsecureIgnoreHostKey() + config.User = c.User + + // 默认等待5s + if c.DialTimeOut == 0 { + c.DialTimeOut = 5 * time.Second + } + config.Timeout = c.DialTimeOut + + // 认证模式-0密码 1私钥 + if c.AuthMode == "1" { + var signer gossh.Signer + var err error + if len(c.PassPhrase) != 0 { + signer, err = gossh.ParsePrivateKeyWithPassphrase([]byte(c.PrivateKey), []byte(c.PassPhrase)) + } else { + signer, err = gossh.ParsePrivateKey([]byte(c.PrivateKey)) + } + if err != nil { + logger.Errorf("NewClient parse private key => %s", err.Error()) + return nil, err + } + config.Auth = []gossh.AuthMethod{gossh.PublicKeys(signer)} + } else { + config.Auth = []gossh.AuthMethod{gossh.Password(c.Password)} + } + + client, err := gossh.Dial(proto, addr, config) + if nil != err { + logger.Errorf("NewClient dial => %s", err.Error()) + return c, err + } + c.Client = client + return c, nil +} + +// Close 关闭当前SSH客户端 +func (c *ConnSSH) Close() { + if c.Client != nil { + c.Client.Close() + } +} + +// NewClientByLocalPrivate 创建SSH客户端-本地私钥(~/.ssh/id_rsa)直连 +// +// ssh.ConnSSH{ +// User: "user", +// Addr: "192.168.x.x", +// Port: body.Port, +// } +func (c *ConnSSH) NewClientByLocalPrivate() (*ConnSSH, error) { + c.Port = 22 + c.AuthMode = "1" + usr, err := user.Current() + if err != nil { + logger.Errorf("NewClientByLocal get current user => %s", err.Error()) + return nil, err + } + + // 读取用户默认的私钥文件 + keyPath := fmt.Sprintf("%s/.ssh/id_rsa", usr.HomeDir) + key, err := os.ReadFile(keyPath) + if err != nil { + logger.Errorf("NewClientByLocal [%s] read private key => %s", usr.Username, err.Error()) + return nil, err + } + c.PrivateKey = string(key) + return c.NewClient() +} + +// RunCMD 执行单次命令 +func (c *ConnSSH) RunCMD(cmd string) (string, error) { + if c.Client == nil { + if _, err := c.NewClient(); err != nil { + return "", err + } + } + session, err := c.Client.NewSession() + if err != nil { + logger.Errorf("RunCMD failed to create session: => %s", err.Error()) + return "", err + } + defer session.Close() + buf, err := session.CombinedOutput(cmd) + if err != nil { + logger.Errorf("RunCMD failed run command: => %s", err.Error()) + } + c.LastResult = string(buf) + return c.LastResult, err +} + +// NewClient 创建SSH客户端会话对象 +func (c *ConnSSH) NewClientSession(cols, rows int) (*SSHClientSession, error) { + sshSession, err := c.Client.NewSession() + if err != nil { + return nil, err + } + + stdin, err := sshSession.StdinPipe() + if err != nil { + return nil, err + } + + comboWriter := new(singleWriter) + sshSession.Stdout = comboWriter + sshSession.Stderr = comboWriter + + modes := gossh.TerminalModes{ + gossh.ECHO: 1, + gossh.TTY_OP_ISPEED: 14400, + gossh.TTY_OP_OSPEED: 14400, + } + + if err := sshSession.RequestPty("xterm", rows, cols, modes); err != nil { + return nil, err + } + + if err := sshSession.Shell(); err != nil { + return nil, err + } + + return &SSHClientSession{ + Stdin: stdin, + Stdout: comboWriter, + Session: sshSession, + }, nil +} + +// SSHClientSession SSH客户端会话对象 +type SSHClientSession struct { + Stdin io.WriteCloser + Stdout *singleWriter + Session *gossh.Session +} + +// Close 关闭会话 +func (s *SSHClientSession) Close() { + if s.Stdin != nil { + s.Stdin.Close() + } + if s.Stdout != nil { + s.Stdout = nil + } + if s.Session != nil { + s.Session.Close() + } +} + +// Write 写入命令 回车(\n)才会执行 +func (s *SSHClientSession) Write(cmd string) (int, error) { + if s.Stdin == nil { + return 0, fmt.Errorf("ssh client session is nil to content write failed") + } + return s.Stdin.Write([]byte(cmd)) +} + +// Read 读取结果 等待一会才有结果 +func (s *SSHClientSession) Read() []byte { + if s.Stdout == nil { + return []byte{} + } + // time.Sleep(300 * time.Millisecond) + bs := s.Stdout.Bytes() + if len(bs) > 0 { + s.Stdout.Reset() + return bs + } + return []byte{} +} + +// CombinedOutput 发送命令带结果返回 +func (s *SSHClientSession) CombinedOutput(cmd string) (string, error) { + n, err := s.Write(cmd) + if n == 0 || err != nil { + return "", err + } + return string(s.Read()), nil +} + +// singleWriter SSH客户端会话消息 +type singleWriter struct { + b bytes.Buffer + mu sync.Mutex +} + +func (w *singleWriter) Write(p []byte) (int, error) { + w.mu.Lock() + defer w.mu.Unlock() + return w.b.Write(p) +} +func (w *singleWriter) Bytes() []byte { + w.mu.Lock() + defer w.mu.Unlock() + return w.b.Bytes() +} +func (w *singleWriter) Reset() { + w.mu.Lock() + defer w.mu.Unlock() + w.b.Reset() +} diff --git a/src/framework/utils/telnet/telnet.go b/src/framework/utils/telnet/telnet.go new file mode 100644 index 0000000..651ede9 --- /dev/null +++ b/src/framework/utils/telnet/telnet.go @@ -0,0 +1,218 @@ +package telnet + +import ( + "bytes" + "fmt" + "net" + "strings" + "time" +) + +// ConnTelnet 连接telnet对象 +type ConnTelnet struct { + User string `json:"user"` // 主机用户名 + Addr string `json:"addr"` // 主机地址 + Port int64 `json:"port"` // telnet端口 + Password string `json:"password"` // 认证密码 + + DialTimeOut time.Duration `json:"dialTimeOut"` // 连接超时断开 + + Client *net.Conn `json:"client"` + LastResult string `json:"lastResult"` // 记最后一次执行命令的结果 +} + +// NewClient 创建Telnet客户端 +func (c *ConnTelnet) NewClient() (*ConnTelnet, error) { + // IPV6地址协议 + proto := "tcp" + if strings.Contains(c.Addr, ":") { + proto = "tcp6" + 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 + } + + // 连接到 Telnet 服务器 + client, err := net.DialTimeout(proto, addr, c.DialTimeOut) + if err != nil { + return nil, err + } + + // 进行登录 + time.Sleep(100 * time.Millisecond) + client.Write([]byte(c.User + "\r\n")) + time.Sleep(100 * time.Millisecond) + client.Write([]byte(c.Password + "\r\n")) + // fmt.Fprintln(client, c.User) + // fmt.Fprintln(client, c.Password) + + c.Client = &client + return c, nil +} + +// Close 关闭当前Telnet客户端 +func (c *ConnTelnet) Close() { + if c.Client != nil { + (*c.Client).Close() + } +} + +// RunCMD 执行单次命令 +func (c *ConnTelnet) RunCMD(cmd string) (string, error) { + if c.Client == nil { + return "", fmt.Errorf("telnet client not connected") + } + conn := *c.Client + var buf bytes.Buffer + tmp := make([]byte, 1024) + + // 排空连接登录的信息 + for { + // 设置读取超时时间为100毫秒 + conn.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) + n, err := conn.Read(tmp) + if err != nil { + // 判断是否是超时错误 + if netErr, ok := err.(net.Error); ok && netErr.Timeout() { + break + } + break + } + if n == 0 { + break + } + buf.Write(tmp[:n]) + } + buf.Reset() + + // 写入命令 + _, err := conn.Write([]byte(cmd)) + if err != nil { + return "", err + } + + // 读取本次响应命令消息 + for { + // 设置读取超时时间为1000毫秒 + conn.SetReadDeadline(time.Now().Add(1000 * time.Millisecond)) + n, err := conn.Read(tmp) + if err != nil { + // 判断是否是超时错误 + if netErr, ok := err.(net.Error); ok && netErr.Timeout() { + break + } + break + } + if n == 0 { + break + } + buf.Write(tmp[:n]) + } + defer buf.Reset() + + c.LastResult = buf.String() + return c.LastResult, nil +} + +// NewClient 创建Telnet客户端会话对象 +func (c *ConnTelnet) NewClientSession() (*TelnetClientSession, error) { + if c.Client == nil { + return nil, fmt.Errorf("telnet client not connected") + } + conn := *c.Client + + var buf bytes.Buffer + tmp := make([]byte, 1024) + // 排空连接登录的信息 + for { + // 设置读取超时时间为5毫秒 + conn.SetReadDeadline(time.Now().Add(5 * time.Millisecond)) + n, err := conn.Read(tmp) + if err != nil { + // 判断是否是超时错误 + if netErr, ok := err.(net.Error); ok && netErr.Timeout() { + break + } + break + } + if n == 0 { + break + } + buf.Write(tmp[:n]) + } + buf.Reset() + + return &TelnetClientSession{ + Client: conn, + }, nil +} + +// TelnetClientSession Telnet客户端会话对象 +type TelnetClientSession struct { + Client net.Conn +} + +// Close 关闭会话 +func (s *TelnetClientSession) Close() { + if s.Client != nil { + s.Client.Close() + } +} + +// Write 写入命令 不带回车(\n)也会执行根据客户端情况 +func (s *TelnetClientSession) Write(cmd string) (int, error) { + if s.Client == nil { + return 0, fmt.Errorf("client is nil to content write failed") + } + return s.Client.Write([]byte(cmd)) +} + +// Read 读取结果 等待一会才有结果 +func (s *TelnetClientSession) Read() []byte { + if s.Client == nil { + return []byte{} + } + + buf := make([]byte, 1024) + // 设置读取超时时间为100毫秒 + s.Client.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) + _, err := s.Client.Read(buf) + if err != nil { + return []byte{} + } + return buf +} + +// CombinedOutput 发送命令带结果返回 +func (s *TelnetClientSession) CombinedOutput(cmd string) (string, error) { + n, err := s.Write(cmd) + if n == 0 || err != nil { + return "", err + } + + var buf bytes.Buffer + tmp := make([]byte, 1024) + for { + // 设置读取超时时间为1000毫秒 + s.Client.SetReadDeadline(time.Now().Add(1000 * time.Millisecond)) + n, err := s.Client.Read(tmp) + if err != nil { + // 判断是否是超时错误 + if netErr, ok := err.(net.Error); ok && netErr.Timeout() { + break + } + break + } + if n == 0 { + break + } + buf.Write(tmp[:n]) + } + defer buf.Reset() + + return buf.String(), nil +} diff --git a/src/framework/utils/token/token.go b/src/framework/utils/token/token.go index f02b285..2a4fb06 100644 --- a/src/framework/utils/token/token.go +++ b/src/framework/utils/token/token.go @@ -5,13 +5,13 @@ import ( "fmt" "time" - "ems.agt/src/framework/config" - cachekeyConstants "ems.agt/src/framework/constants/cachekey" - tokenConstants "ems.agt/src/framework/constants/token" - "ems.agt/src/framework/logger" - redisCahe "ems.agt/src/framework/redis" - "ems.agt/src/framework/utils/generate" - "ems.agt/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/vo" jwt "github.com/golang-jwt/jwt/v5" ) diff --git a/src/framework/vo/loginuser.go b/src/framework/vo/loginuser.go index 823d7a6..f5e538e 100644 --- a/src/framework/vo/loginuser.go +++ b/src/framework/vo/loginuser.go @@ -1,6 +1,6 @@ package vo -import systemModel "ems.agt/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 e10b53c..7ff154f 100644 --- a/src/framework/vo/result/result.go +++ b/src/framework/vo/result/result.go @@ -1,7 +1,7 @@ package result import ( - "ems.agt/src/framework/constants/result" + "be.ems/src/framework/constants/result" ) // CodeMsg 响应结果 diff --git a/src/framework/vo/treeselect.go b/src/framework/vo/treeselect.go index ea86ba9..01fcf89 100644 --- a/src/framework/vo/treeselect.go +++ b/src/framework/vo/treeselect.go @@ -1,6 +1,6 @@ package vo -import systemModel "ems.agt/src/modules/system/model" +import systemModel "be.ems/src/modules/system/model" // TreeSelect 树结构实体类 type TreeSelect struct { diff --git a/src/lib_features/account/account.go b/src/lib_features/account/account.go index 352829c..df339c2 100644 --- a/src/lib_features/account/account.go +++ b/src/lib_features/account/account.go @@ -3,11 +3,11 @@ package libfeatures import ( "time" - "ems.agt/lib/dborm" - "ems.agt/lib/oauth" - libConfig "ems.agt/restagent/config" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/redis" + "be.ems/lib/dborm" + "be.ems/lib/oauth" + libConfig "be.ems/restagent/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" ) // SessionToken 设置登录会话-兼容旧登录方式 diff --git a/src/lib_features/config/config.go b/src/lib_features/config/config.go index a56a757..e315460 100644 --- a/src/lib_features/config/config.go +++ b/src/lib_features/config/config.go @@ -3,9 +3,9 @@ package libfeatures import ( "fmt" - libConf "ems.agt/lib/core/conf" - libGlobal "ems.agt/lib/global" - libConfig "ems.agt/restagent/config" + libConf "be.ems/lib/core/conf" + libGlobal "be.ems/lib/global" + libConfig "be.ems/restagent/config" "github.com/spf13/viper" ) diff --git a/src/lib_features/session/session.go b/src/lib_features/session/session.go index f2ec700..41de9f2 100644 --- a/src/lib_features/session/session.go +++ b/src/lib_features/session/session.go @@ -3,8 +3,8 @@ package session import ( "time" - libConfig "ems.agt/restagent/config" - "ems.agt/src/framework/redis" + libConfig "be.ems/restagent/config" + "be.ems/src/framework/redis" "github.com/gin-gonic/gin" ) diff --git a/src/modules/chart/chart.go b/src/modules/chart/chart.go index f490b59..d8079ce 100644 --- a/src/modules/chart/chart.go +++ b/src/modules/chart/chart.go @@ -1,10 +1,10 @@ package chart import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/src/framework/middleware/collectlogs" - "ems.agt/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" ) diff --git a/src/modules/chart/controller/chart_graph.go b/src/modules/chart/controller/chart_graph.go index a95d672..89f6a4b 100644 --- a/src/modules/chart/controller/chart_graph.go +++ b/src/modules/chart/controller/chart_graph.go @@ -1,10 +1,10 @@ package controller import ( - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - chartService "ems.agt/src/modules/chart/service" + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + chartService "be.ems/src/modules/chart/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) diff --git a/src/modules/chart/repository/chart_graph.go b/src/modules/chart/repository/chart_graph.go index d930fb6..9d42eaa 100644 --- a/src/modules/chart/repository/chart_graph.go +++ b/src/modules/chart/repository/chart_graph.go @@ -1,6 +1,6 @@ package repository -import "ems.agt/src/modules/chart/model" +import "be.ems/src/modules/chart/model" // G6关系图数据 数据层接口 type IChartGraph interface { diff --git a/src/modules/chart/repository/chart_graph.impl.go b/src/modules/chart/repository/chart_graph.impl.go index e25802b..c3a26d5 100644 --- a/src/modules/chart/repository/chart_graph.impl.go +++ b/src/modules/chart/repository/chart_graph.impl.go @@ -3,11 +3,11 @@ package repository import ( "strings" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/chart/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/chart/model" ) // 实例化数据层 NewChartGraphImpl 结构体 diff --git a/src/modules/chart/service/chart_graph.impl.go b/src/modules/chart/service/chart_graph.impl.go index a054585..8244f75 100644 --- a/src/modules/chart/service/chart_graph.impl.go +++ b/src/modules/chart/service/chart_graph.impl.go @@ -3,9 +3,9 @@ package service import ( "strings" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/modules/chart/model" - chartRepository "ems.agt/src/modules/chart/repository" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/chart/model" + chartRepository "be.ems/src/modules/chart/repository" "github.com/goccy/go-json" ) diff --git a/src/modules/common/common.go b/src/modules/common/common.go index 419a7ec..b25d8e0 100644 --- a/src/modules/common/common.go +++ b/src/modules/common/common.go @@ -1,9 +1,9 @@ package common import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/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 b5730c7..763fa5d 100644 --- a/src/modules/common/controller/account.go +++ b/src/modules/common/controller/account.go @@ -1,18 +1,18 @@ package controller import ( - "ems.agt/src/framework/config" - commonConstants "ems.agt/src/framework/constants/common" - tokenConstants "ems.agt/src/framework/constants/token" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - tokenUtils "ems.agt/src/framework/utils/token" - "ems.agt/src/framework/vo" - "ems.agt/src/framework/vo/result" - libAccount "ems.agt/src/lib_features/account" - commonModel "ems.agt/src/modules/common/model" - commonService "ems.agt/src/modules/common/service" - systemService "ems.agt/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" + libAccount "be.ems/src/lib_features/account" + 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/controller/captcha.go b/src/modules/common/controller/captcha.go index 1a19883..50bf563 100644 --- a/src/modules/common/controller/captcha.go +++ b/src/modules/common/controller/captcha.go @@ -3,14 +3,14 @@ package controller import ( "time" - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/constants/captcha" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/redis" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - systemService "ems.agt/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 4ba3776..5e2ec70 100644 --- a/src/modules/common/controller/common.go +++ b/src/modules/common/controller/common.go @@ -1,10 +1,10 @@ package controller import ( - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - commonService "ems.agt/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 d925221..3506243 100644 --- a/src/modules/common/controller/file.go +++ b/src/modules/common/controller/file.go @@ -7,12 +7,12 @@ import ( "path/filepath" "strings" - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/uploadsubpath" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/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 db200e6..020b5be 100644 --- a/src/modules/common/controller/index.go +++ b/src/modules/common/controller/index.go @@ -3,8 +3,8 @@ package controller import ( "fmt" - "ems.agt/src/framework/config" - "ems.agt/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 85fa828..7b5f344 100644 --- a/src/modules/common/controller/register.go +++ b/src/modules/common/controller/register.go @@ -1,14 +1,14 @@ package controller import ( - commonConstants "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/regular" - "ems.agt/src/framework/vo/result" - commonModel "ems.agt/src/modules/common/model" - commonService "ems.agt/src/modules/common/service" - systemService "ems.agt/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 7a98a24..48443e3 100644 --- a/src/modules/common/service/account.go +++ b/src/modules/common/service/account.go @@ -1,6 +1,6 @@ package service -import "ems.agt/src/framework/vo" +import "be.ems/src/framework/vo" // 账号身份操作服务 服务层接口 type IAccount interface { diff --git a/src/modules/common/service/account.impl.go b/src/modules/common/service/account.impl.go index 31e9571..b91c8f1 100644 --- a/src/modules/common/service/account.impl.go +++ b/src/modules/common/service/account.impl.go @@ -4,16 +4,16 @@ import ( "fmt" "time" - "ems.agt/src/framework/config" - adminConstants "ems.agt/src/framework/constants/admin" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/redis" - "ems.agt/src/framework/utils/crypto" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo" - "ems.agt/src/modules/system/model" - systemService "ems.agt/src/modules/system/service" + "be.ems/src/framework/config" + adminConstants "be.ems/src/framework/constants/admin" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo" + "be.ems/src/modules/system/model" + systemService "be.ems/src/modules/system/service" ) // 实例化服务层 AccountImpl 结构体 diff --git a/src/modules/common/service/commont.impl.go b/src/modules/common/service/commont.impl.go index 2d976d4..6273ab3 100644 --- a/src/modules/common/service/commont.impl.go +++ b/src/modules/common/service/commont.impl.go @@ -3,9 +3,9 @@ package service import ( "fmt" - "ems.agt/lib/global" - "ems.agt/src/framework/config" - systemService "ems.agt/src/modules/system/service" + "be.ems/lib/global" + "be.ems/src/framework/config" + 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 d374072..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" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/redis" - "ems.agt/src/framework/utils/parse" - systemModel "ems.agt/src/modules/system/model" - systemService "ems.agt/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/backupEtcFromNE/backupEtcFromNE.go b/src/modules/crontask/backupEtcFromNE/backupEtcFromNE.go deleted file mode 100644 index 02bc273..0000000 --- a/src/modules/crontask/backupEtcFromNE/backupEtcFromNE.go +++ /dev/null @@ -1,145 +0,0 @@ -package backupEtcFromNE - -import ( - "encoding/json" - "fmt" - "os" - "strings" - "time" - - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/restagent/config" - "ems.agt/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"` - ColName string `json:"colName"` // column name of time string - Extras string `json:"extras"` // extras condition for where -} - -func (s *BarProcessor) Execute(data any) (any, error) { - log.Infof("execute %d,last progress: %d ", s.count, s.progress) - 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 - } - - log.Infof("Repeat %v Job ID %s", options.Repeat, sysJob.JobID) - - var nes []dborm.NeInfo - _, err = dborm.XormGetAllNeInfo(&nes) - if err != nil { - return nil, err - } - - var successfulNEs, failureNEs []string - for _, neInfo := range nes { - neTypeUpper := strings.ToUpper(neInfo.NeType) - neTypeLower := strings.ToLower(neInfo.NeType) - nePath := fmt.Sprintf("%s/etc/%s", config.GetYamlConfig().OMC.Backup, neTypeLower) - isExist, err := global.PathExists(nePath) - if err != nil { - log.Errorf("Failed to PathExists:", err) - failureNEs = append(failureNEs, neInfo.NeType+"/"+neInfo.NeId) - continue - } - if isExist { - err = os.RemoveAll(nePath) - if err != nil { - log.Errorf("Failed to RemoveAll:", err) - failureNEs = append(failureNEs, neInfo.NeType+"/"+neInfo.NeId) - continue - } - } - err = os.MkdirAll(nePath, os.ModePerm) - if err != nil { - log.Errorf("Failed to MkdirAll:", err) - failureNEs = append(failureNEs, neInfo.NeType+"/"+neInfo.NeId) - continue - } - - var scpCmd string - ipType := global.ParseIPAddr(neInfo.Ip) - if neTypeLower != "omc" { - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/%s/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/%s/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - } else { - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/etc/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.OmcDir, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/etc/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.OmcDir, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - } - - zipFile := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, strings.ToLower(neInfo.NeId), time.Now().Format(global.DateData)) - zipFilePath := config.GetYamlConfig().OMC.Backup + "/" + zipFile - zipCmd := fmt.Sprintf("cd %s/etc && zip -r %s %s/*", config.GetYamlConfig().OMC.Backup, zipFilePath, neTypeLower) - - command := fmt.Sprintf("%s&&%s", scpCmd, zipCmd) - - log.Trace("command:", command) - out, err := global.ExecCmd(command) - if err != nil { - log.Error("Faile to exec command:", err) - failureNEs = append(failureNEs, neInfo.NeType+"/"+neInfo.NeId) - continue - } - log.Tracef("command output:%s", out) - - md5Sum, err := global.GetFileMD5Sum(zipFilePath) - if err != nil { - log.Error("Faile to md5sum:", err) - failureNEs = append(failureNEs, neInfo.NeType+"/"+neInfo.NeId) - continue - } - //log.Debug("md5Str:", md5Sum) - path := config.GetYamlConfig().OMC.Backup - neBackup := dborm.NeBackup{NeType: neTypeUpper, NeId: neInfo.NeId, FileName: zipFile, Path: path, Md5Sum: md5Sum} - _, err = dborm.XormInsertTableOne("ne_backup", neBackup) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - failureNEs = append(failureNEs, neInfo.NeType+"/"+neInfo.NeId) - continue - } - successfulNEs = append(successfulNEs, neInfo.NeType+"/"+neInfo.NeId) - } - - log.Infof("successfulNEs: %s failureNEs: %s", successfulNEs, failureNEs) - // result - return map[string]any{ - "successfulNEs": successfulNEs, - "failureNEs": failureNEs, - }, nil -} diff --git a/src/modules/crontask/crontask.go b/src/modules/crontask/crontask.go index 53fd16e..0ee9d74 100644 --- a/src/modules/crontask/crontask.go +++ b/src/modules/crontask/crontask.go @@ -1,8 +1,8 @@ package crontask import ( - "ems.agt/src/framework/logger" - "ems.agt/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/delExpiredNeBackup/delExpiredNeBackup.go b/src/modules/crontask/delExpiredNeBackup/delExpiredNeBackup.go deleted file mode 100644 index 4d4857d..0000000 --- a/src/modules/crontask/delExpiredNeBackup/delExpiredNeBackup.go +++ /dev/null @@ -1,94 +0,0 @@ -package delExpiredNeBackup - -import ( - "encoding/json" - "fmt" - - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/restagent/config" - "ems.agt/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"` -} - -func (s *BarProcessor) Execute(data any) (any, error) { - log.Infof("count: %d ,progress: %d ", s.count, s.progress) - s.count++ - - options := data.(cron.JobData) - sysJob := options.SysJob - var params BarParams - duration := 60 - - err := json.Unmarshal([]byte(sysJob.TargetParams), ¶ms) - if err == nil { - duration = params.Duration - } - log.Infof("Repeat: %v JobID: %s", options.Repeat, sysJob.JobID) - - // // 实现任务处理逻辑 - // i := 0 - // s.progress = i - // for i < 5 { - // // 获取任务进度 - // progress := s.progress - // log.Infof("jonId: %s => 任务进度:%d", sysJob.JobID, progress) - // // 延迟响应 - // time.Sleep(time.Second * 2) - // // 程序中途执行错误 - // if i == 3 { - // // arr := [1]int{1} - // // arr[i] = 3 - // // fmt.Println(arr) - // // return "i = 3" - // panic("程序中途执行错误") - // } - // i++ - // // 改变任务进度 - // s.progress = i - // } - where := fmt.Sprintf("NOW()>ADDDATE(`create_time`,interval %d day)", duration) - affected, err := dborm.XormDeleteDataByWhere(where, "ne_backup") - if err != nil { - // panic(fmt.Sprintf("Failed to XormDeleteDataByWhere:%v", err)) - return nil, err - } - - // delete expired files in backup directory - // todo ... - // command := fmt.Sprintf("find . -name '*.zip' -mtime +%d -type f -print | xargs rm -rf", duration) - - command := fmt.Sprintf("%s/rmexpfiles.sh %s %d", config.GetYamlConfig().OMC.BinDir, config.GetYamlConfig().OMC.Backup, duration) - - log.Trace("command:", command) - out, err := global.ExecCmd(command) - if err != nil { - log.Error("Faile to exec command:", err) - return nil, err - } - log.Tracef("command output:%s", out) - - // 返回结果,用于记录执行结果 - return map[string]any{ - "msg": "success", - "cmdoutput": string(out), - "affected": affected, - }, nil -} diff --git a/src/modules/crontask/deleteExpiredRecord/deleteExpiredRecord.go b/src/modules/crontask/deleteExpiredRecord/deleteExpiredRecord.go deleted file mode 100644 index 8cae446..0000000 --- a/src/modules/crontask/deleteExpiredRecord/deleteExpiredRecord.go +++ /dev/null @@ -1,88 +0,0 @@ -package deleteExpiredRecord - -import ( - "encoding/json" - "fmt" - - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/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"` - ColName string `json:"colName"` // column name of time string - Extras string `json:"extras"` // extras condition for where -} - -func (s *BarProcessor) Execute(data any) (any, error) { - log.Infof("执行 %d 次,上次进度: %d ", s.count, s.progress) - 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 - } - - //duration = params.Duration - log.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) - - // // 实现任务处理逻辑 - // i := 0 - // s.progress = i - // for i < 5 { - // // 获取任务进度 - // progress := s.progress - // log.Infof("jonId: %s => 任务进度:%d", sysJob.JobID, progress) - // // 延迟响应 - // time.Sleep(time.Second * 2) - // // 程序中途执行错误 - // if i == 3 { - // // arr := [1]int{1} - // // arr[i] = 3 - // // fmt.Println(arr) - // // return "i = 3" - // panic("程序中途执行错误") - // } - // i++ - // // 改变任务进度 - // s.progress = i - // } - - var where string - if params.Extras == "" { - where = fmt.Sprintf("NOW()>ADDDATE(`%s`,interval %d day)", params.ColName, params.Duration) - } else { - where = fmt.Sprintf("NOW()>ADDDATE(`%s`,interval %d day) and %s", params.ColName, params.Duration, params.Extras) - } - - affected, err := dborm.XormDeleteDataByWhere(where, params.TableName) - if err != nil { - // panic(fmt.Sprintf("Failed to XormDeleteDataByWhere:%v", err)) - return nil, err - } - - // 返回结果,用于记录执行结果 - return map[string]any{ - "msg": "sucess", - "affected": affected, - }, nil -} diff --git a/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go b/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go index d4327c8..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" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/restagent/config" - "ems.agt/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 641641b..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" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/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 8cae446..2df3969 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" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/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/genNeStateAlarm/genNeStateAlarm.go b/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go index 02e4345..c3a260d 100644 --- a/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go +++ b/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go @@ -8,12 +8,12 @@ import ( "strings" "time" - "ems.agt/features/fm" - "ems.agt/lib/dborm" - "ems.agt/lib/global" - "ems.agt/lib/log" - "ems.agt/restagent/config" - "ems.agt/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 fd7f6fb..b4decc1 100644 --- a/src/modules/crontask/processor/getStateFromNE/getStateFromNE.go +++ b/src/modules/crontask/processor/getStateFromNE/getStateFromNE.go @@ -7,10 +7,10 @@ import ( "strings" "time" - "ems.agt/lib/dborm" - "ems.agt/lib/log" - "ems.agt/restagent/config" - "ems.agt/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 58ecfd0..6395d3b 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,9 +4,9 @@ import ( "encoding/json" "fmt" - "ems.agt/src/framework/cron" - "ems.agt/src/framework/logger" - monitorService "ems.agt/src/modules/monitor/service" + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" + monitorService "be.ems/src/modules/monitor/service" ) var NewProcessor = &MonitorSysResourceProcessor{ diff --git a/src/modules/crontask/processor/processor.go b/src/modules/crontask/processor/processor.go index cab305d..f190b89 100644 --- a/src/modules/crontask/processor/processor.go +++ b/src/modules/crontask/processor/processor.go @@ -1,13 +1,13 @@ package processor import ( - "ems.agt/src/framework/cron" - "ems.agt/src/modules/crontask/processor/backupEtcFromNE" - "ems.agt/src/modules/crontask/processor/delExpiredNeBackup" - "ems.agt/src/modules/crontask/processor/deleteExpiredRecord" - "ems.agt/src/modules/crontask/processor/genNeStateAlarm" - "ems.agt/src/modules/crontask/processor/getStateFromNE" - monitorsysresource "ems.agt/src/modules/crontask/processor/monitor_sys_resource" + "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/genNeStateAlarm" + "be.ems/src/modules/crontask/processor/getStateFromNE" + monitorsysresource "be.ems/src/modules/crontask/processor/monitor_sys_resource" ) // InitCronQueue 初始定时任务队列 diff --git a/src/modules/monitor/controller/monitor.go b/src/modules/monitor/controller/monitor.go index 6f714b0..52e9037 100644 --- a/src/modules/monitor/controller/monitor.go +++ b/src/modules/monitor/controller/monitor.go @@ -1,10 +1,10 @@ package controller import ( - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - "ems.agt/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" ) diff --git a/src/modules/monitor/controller/sys_cache.go b/src/modules/monitor/controller/sys_cache.go index abfeddb..4c544ef 100644 --- a/src/modules/monitor/controller/sys_cache.go +++ b/src/modules/monitor/controller/sys_cache.go @@ -1,12 +1,12 @@ package controller import ( - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/redis" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - "ems.agt/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 9db72f5..4847eeb 100644 --- a/src/modules/monitor/controller/sys_job.go +++ b/src/modules/monitor/controller/sys_job.go @@ -7,14 +7,14 @@ import ( "strings" "time" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/monitor/model" - "ems.agt/src/modules/monitor/service" - systemService "ems.agt/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" diff --git a/src/modules/monitor/controller/sys_job_log.go b/src/modules/monitor/controller/sys_job_log.go index f84bc86..b3693af 100644 --- a/src/modules/monitor/controller/sys_job_log.go +++ b/src/modules/monitor/controller/sys_job_log.go @@ -6,15 +6,15 @@ import ( "strings" "time" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/monitor/model" - "ems.agt/src/modules/monitor/service" - systemService "ems.agt/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" ) diff --git a/src/modules/monitor/controller/sys_user_online.go b/src/modules/monitor/controller/sys_user_online.go index cbd7690..40a8419 100644 --- a/src/modules/monitor/controller/sys_user_online.go +++ b/src/modules/monitor/controller/sys_user_online.go @@ -5,14 +5,14 @@ import ( "sort" "strings" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/redis" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/monitor/model" - "ems.agt/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" ) diff --git a/src/modules/monitor/controller/system_info.go b/src/modules/monitor/controller/system_info.go index a6cb03c..a6d4776 100644 --- a/src/modules/monitor/controller/system_info.go +++ b/src/modules/monitor/controller/system_info.go @@ -1,8 +1,8 @@ package controller import ( - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/monitor/service" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/monitor/service" "github.com/gin-gonic/gin" ) diff --git a/src/modules/monitor/monitor.go b/src/modules/monitor/monitor.go index 737809d..67fa63e 100644 --- a/src/modules/monitor/monitor.go +++ b/src/modules/monitor/monitor.go @@ -1,13 +1,13 @@ package monitor import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/src/framework/middleware/collectlogs" - "ems.agt/src/framework/middleware/repeat" - "ems.agt/src/modules/monitor/controller" - "ems.agt/src/modules/monitor/processor" - "ems.agt/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" ) diff --git a/src/modules/monitor/processor/bar/bar.go b/src/modules/monitor/processor/bar/bar.go index 1d96892..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" - "ems.agt/src/framework/cron" - "ems.agt/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 21dd527..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" - "ems.agt/src/framework/cron" - "ems.agt/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 74909d6..d50b0e8 100644 --- a/src/modules/monitor/processor/processor.go +++ b/src/modules/monitor/processor/processor.go @@ -1,10 +1,10 @@ package processor import ( - "ems.agt/src/framework/cron" - "ems.agt/src/modules/monitor/processor/bar" - "ems.agt/src/modules/monitor/processor/foo" - "ems.agt/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 1f997bf..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 ( - "ems.agt/src/framework/cron" - "ems.agt/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 a293efe..8a843df 100644 --- a/src/modules/monitor/repository/monitor.go +++ b/src/modules/monitor/repository/monitor.go @@ -1,6 +1,6 @@ package repository -import "ems.agt/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 a538674..9a47e58 100644 --- a/src/modules/monitor/repository/monitor.impl.go +++ b/src/modules/monitor/repository/monitor.impl.go @@ -1,9 +1,9 @@ package repository import ( - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/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 7fa93f8..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 ( - "ems.agt/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 196601f..0f88a57 100644 --- a/src/modules/monitor/repository/sys_job.impl.go +++ b/src/modules/monitor/repository/sys_job.impl.go @@ -1,14 +1,15 @@ package repository import ( + "fmt" "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 结构体 @@ -209,11 +210,7 @@ func (r *SysJobImpl) CheckUniqueJob(sysJob model.SysJob) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/monitor/repository/sys_job_log.go b/src/modules/monitor/repository/sys_job_log.go index 6579e47..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 ( - "ems.agt/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 2e97e85..fc01e61 100644 --- a/src/modules/monitor/repository/sys_job_log.impl.go +++ b/src/modules/monitor/repository/sys_job_log.impl.go @@ -4,12 +4,12 @@ import ( "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/monitor/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "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.impl.go b/src/modules/monitor/service/monitor.impl.go index a7e5632..e9de38c 100644 --- a/src/modules/monitor/service/monitor.impl.go +++ b/src/modules/monitor/service/monitor.impl.go @@ -5,10 +5,10 @@ import ( "strconv" "time" - "ems.agt/src/framework/logger" - "ems.agt/src/modules/monitor/model" - "ems.agt/src/modules/monitor/repository" - systemService "ems.agt/src/modules/system/service" + "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/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/load" diff --git a/src/modules/monitor/service/sys_job.go b/src/modules/monitor/service/sys_job.go index 6bb1d9e..f4beb36 100644 --- a/src/modules/monitor/service/sys_job.go +++ b/src/modules/monitor/service/sys_job.go @@ -1,7 +1,7 @@ package service import ( - "ems.agt/src/modules/monitor/model" + "be.ems/src/modules/monitor/model" ) // ISysJob 调度任务信息 服务层接口 diff --git a/src/modules/monitor/service/sys_job.impl.go b/src/modules/monitor/service/sys_job.impl.go index dc54726..81fd7e7 100644 --- a/src/modules/monitor/service/sys_job.impl.go +++ b/src/modules/monitor/service/sys_job.impl.go @@ -3,10 +3,10 @@ package service import ( "fmt" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/cron" - "ems.agt/src/modules/monitor/model" - "ems.agt/src/modules/monitor/repository" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/cron" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" ) // 实例化服务层 SysJobImpl 结构体 diff --git a/src/modules/monitor/service/sys_job_log.go b/src/modules/monitor/service/sys_job_log.go index ea4c1e8..b1e227e 100644 --- a/src/modules/monitor/service/sys_job_log.go +++ b/src/modules/monitor/service/sys_job_log.go @@ -1,7 +1,7 @@ package service import ( - "ems.agt/src/modules/monitor/model" + "be.ems/src/modules/monitor/model" ) // ISysJobLog 调度任务日志 服务层接口 diff --git a/src/modules/monitor/service/sys_job_log.impl.go b/src/modules/monitor/service/sys_job_log.impl.go index 369845b..692d40a 100644 --- a/src/modules/monitor/service/sys_job_log.impl.go +++ b/src/modules/monitor/service/sys_job_log.impl.go @@ -1,8 +1,8 @@ package service import ( - "ems.agt/src/modules/monitor/model" - "ems.agt/src/modules/monitor/repository" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" ) // 实例化服务层 SysJobLogImpl 结构体 diff --git a/src/modules/monitor/service/sys_user_online.go b/src/modules/monitor/service/sys_user_online.go index b74f348..c6aef2c 100644 --- a/src/modules/monitor/service/sys_user_online.go +++ b/src/modules/monitor/service/sys_user_online.go @@ -1,8 +1,8 @@ package service import ( - "ems.agt/src/framework/vo" - "ems.agt/src/modules/monitor/model" + "be.ems/src/framework/vo" + "be.ems/src/modules/monitor/model" ) // ISysUserOnline 在线用户 服务层接口 diff --git a/src/modules/monitor/service/sys_user_online.impl.go b/src/modules/monitor/service/sys_user_online.impl.go index dbfe427..99c0ec4 100644 --- a/src/modules/monitor/service/sys_user_online.impl.go +++ b/src/modules/monitor/service/sys_user_online.impl.go @@ -1,8 +1,8 @@ package service import ( - "ems.agt/src/framework/vo" - "ems.agt/src/modules/monitor/model" + "be.ems/src/framework/vo" + "be.ems/src/modules/monitor/model" ) // 实例化服务层 SysUserOnlineImpl 结构体 diff --git a/src/modules/monitor/service/system_info.impl.go b/src/modules/monitor/service/system_info.impl.go index 597a5ab..663499d 100644 --- a/src/modules/monitor/service/system_info.impl.go +++ b/src/modules/monitor/service/system_info.impl.go @@ -7,8 +7,8 @@ import ( "strings" "time" - "ems.agt/src/framework/config" - "ems.agt/src/framework/utils/parse" + "be.ems/src/framework/config" + "be.ems/src/framework/utils/parse" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" diff --git a/src/modules/net_element/controller/ne_info.go b/src/modules/net_element/controller/ne_info.go deleted file mode 100644 index a525e2a..0000000 --- a/src/modules/net_element/controller/ne_info.go +++ /dev/null @@ -1,39 +0,0 @@ -package controller - -import ( - "ems.agt/src/framework/vo/result" - netElementService "ems.agt/src/modules/net_element/service" - "github.com/gin-gonic/gin" -) - -// 实例化控制层 NeInfoController 结构体 -var NewNeInfo = &NeInfoController{ - NeInfoService: netElementService.NewNeInfoImpl, -} - -// 网元信息请求 -// -// PATH /ne-info -type NeInfoController struct { - // 网元信息服务 - NeInfoService netElementService.INeInfo -} - -// 网元neType和neID查询 -// -// GET /info -func (s *NeInfoController) NeTypeAndID(c *gin.Context) { - neType := c.Query("neType") - neId := c.Query("neId") - if neType == "" || neId == "" { - c.JSON(400, result.CodeMsg(400, "parameter error")) - return - } - - data := s.NeInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if data.NeType == neType { - c.JSON(200, result.OkData(data)) - return - } - c.JSON(200, result.Err(nil)) -} diff --git a/src/modules/net_element/model/ne_info.go b/src/modules/net_element/model/ne_info.go deleted file mode 100644 index 71844c1..0000000 --- a/src/modules/net_element/model/ne_info.go +++ /dev/null @@ -1,19 +0,0 @@ -package model - -// NeInfo 网元信息对象 -type NeInfo struct { - ID int64 `json:"id"` - NeType string `json:"neType"` - NeId string `json:"neId"` - RmUID string `json:"rmUid"` - NeName string `json:"neName"` - IP string `json:"ip"` - Port int64 `json:"port"` - PvFlag string `json:"pvFlag"` // enum('PNF','VNF') - Province string `json:"province"` - VendorName string `json:"vendorName"` - Dn string `json:"dn"` - NeAddress string `json:"neAddress"` - Status string `json:"status"` // 0: 在线 1: 下线 2: 备用 3: 工程 - UpdateTime string `json:"updateTime"` -} diff --git a/src/modules/net_element/net_element.go b/src/modules/net_element/net_element.go deleted file mode 100644 index b7c0049..0000000 --- a/src/modules/net_element/net_element.go +++ /dev/null @@ -1,23 +0,0 @@ -package netelement - -import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/src/modules/net_element/controller" - - "github.com/gin-gonic/gin" -) - -// 模块路由注册 -func Setup(router *gin.Engine) { - logger.Infof("开始加载 ====> net_element 模块路由") - - // 网元信息 - netInfoGroup := router.Group("/ne-info") - { - netInfoGroup.GET("/info", - middleware.PreAuthorize(nil), - controller.NewNeInfo.NeTypeAndID, - ) - } -} diff --git a/src/modules/net_element/repository/ne_info.go b/src/modules/net_element/repository/ne_info.go deleted file mode 100644 index fd02208..0000000 --- a/src/modules/net_element/repository/ne_info.go +++ /dev/null @@ -1,11 +0,0 @@ -package repository - -import ( - "ems.agt/src/modules/net_element/model" -) - -// 网元信息 数据层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo -} diff --git a/src/modules/net_element/repository/ne_info.impl.go b/src/modules/net_element/repository/ne_info.impl.go deleted file mode 100644 index af95725..0000000 --- a/src/modules/net_element/repository/ne_info.impl.go +++ /dev/null @@ -1,69 +0,0 @@ -package repository - -import ( - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/net_element/model" -) - -// 实例化数据层 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, status, 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", - "status": "Status", - "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) - } - 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{} -} diff --git a/src/modules/net_element/service/ne_info.go b/src/modules/net_element/service/ne_info.go deleted file mode 100644 index 5efc53f..0000000 --- a/src/modules/net_element/service/ne_info.go +++ /dev/null @@ -1,9 +0,0 @@ -package service - -import "ems.agt/src/modules/net_element/model" - -// 网元信息 服务层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo -} diff --git a/src/modules/net_element/service/ne_info.impl.go b/src/modules/net_element/service/ne_info.impl.go deleted file mode 100644 index d76e81a..0000000 --- a/src/modules/net_element/service/ne_info.impl.go +++ /dev/null @@ -1,22 +0,0 @@ -package service - -import ( - "ems.agt/src/modules/net_element/model" - "ems.agt/src/modules/net_element/repository" -) - -// 实例化服务层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - NeInfoRepository: repository.NewNeInfoImpl, -} - -// 网元信息 服务层处理 -type NeInfoImpl struct { - // 网元信息数据信息 - NeInfoRepository repository.INeInfo -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - return r.NeInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) -} diff --git a/src/modules/network_data/controller/alarm.go b/src/modules/network_data/controller/alarm.go new file mode 100644 index 0000000..da67ada --- /dev/null +++ b/src/modules/network_data/controller/alarm.go @@ -0,0 +1,81 @@ +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" + "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, +} + +// 告警数据 +// +// PATH /alarm +type AlarmController struct { + // 网元信息服务 + neInfoService neService.INeInfo + // 告警信息服务 + alarmService neDataService.IAlarm +} + +// 告警列表 +// +// GET /list +func (s *AlarmController) List(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys model.AlarmQuery + 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 + } + querys.RmUID = neInfo.RmUID + + // 查询数据 + data := s.alarmService.SelectPage(querys) + c.JSON(200, result.Ok(data)) +} + +// 告警删除 +// +// DELETE /:alarmIds +func (s *AlarmController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + alarmIds := c.Param("alarmIds") + if alarmIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(alarmIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.alarmService.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/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index 1c92fb4..4611797 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -1,12 +1,15 @@ package controller import ( - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/network_data/model" - neDataService "ems.agt/src/modules/network_data/service" - neService "ems.agt/src/modules/network_element/service" + "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/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" ) @@ -28,8 +31,8 @@ type AMFController struct { // UE会话列表 // -// GET /ues -func (s *AMFController) UEs(c *gin.Context) { +// GET /ue/list +func (s *AMFController) UEList(c *gin.Context) { language := ctx.AcceptLanguage(c) var querys model.UEEventQuery if err := c.ShouldBindQuery(&querys); err != nil { @@ -49,3 +52,29 @@ func (s *AMFController) UEs(c *gin.Context) { data := s.ueEventService.SelectPage(querys) c.JSON(200, result.Ok(data)) } + +// UE会话删除 +// +// DELETE /ue/:ueIds +func (s *AMFController) UERemove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + ueIds := c.Param("ueIds") + if ueIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(ueIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.ueEventService.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/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index dfd4988..4ddf7ba 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -1,12 +1,15 @@ package controller import ( - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/network_data/model" - neDataService "ems.agt/src/modules/network_data/service" - neService "ems.agt/src/modules/network_element/service" + "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/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" ) @@ -28,8 +31,8 @@ type IMSController struct { // CDR会话列表 // -// GET /cdrs -func (s *IMSController) CDRs(c *gin.Context) { +// GET /cdr/list +func (s *IMSController) CDRList(c *gin.Context) { language := ctx.AcceptLanguage(c) var querys model.CDREventQuery if err := c.ShouldBindQuery(&querys); err != nil { @@ -49,3 +52,29 @@ func (s *IMSController) CDRs(c *gin.Context) { data := s.cdrEventService.SelectPage(querys) c.JSON(200, result.Ok(data)) } + +// CDR会话删除 +// +// DELETE /cdr/:cdrIds +func (s *IMSController) CDRRemove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + cdrIds := c.Param("cdrIds") + if cdrIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(cdrIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.cdrEventService.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/network_data/controller/perf_kpi.go b/src/modules/network_data/controller/perf_kpi.go index 18274f1..fe231d5 100644 --- a/src/modules/network_data/controller/perf_kpi.go +++ b/src/modules/network_data/controller/perf_kpi.go @@ -1,13 +1,13 @@ package controller import ( - "ems.agt/lib/core/utils/date" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/network_data/model" - neDataService "ems.agt/src/modules/network_data/service" - neService "ems.agt/src/modules/network_element/service" + "be.ems/lib/core/utils/date" + "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" ) diff --git a/src/modules/network_data/controller/upf.go b/src/modules/network_data/controller/upf.go index 8a6b285..aa3ef33 100644 --- a/src/modules/network_data/controller/upf.go +++ b/src/modules/network_data/controller/upf.go @@ -1,11 +1,11 @@ package controller import ( - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - neDataService "ems.agt/src/modules/network_data/service" - neService "ems.agt/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" ) diff --git a/src/modules/network_data/model/alarm.go b/src/modules/network_data/model/alarm.go new file mode 100644 index 0000000..4e4bc9a --- /dev/null +++ b/src/modules/network_data/model/alarm.go @@ -0,0 +1,57 @@ +package model + +import "time" + +// Alarm 告警数据对象 alarm +type Alarm struct { + ID string `json:"id" gorm:"id"` + AlarmSeq string `json:"alarmSeq" gorm:"alarm_seq"` + AlarmId string `json:"alarmId" gorm:"alarm_id"` + AlarmTitle string `json:"alarmTitle" gorm:"alarm_title"` + NeType string `json:"neType" gorm:"ne_type"` + NeId string `json:"neId" gorm:"ne_id"` + AlarmCode string `json:"alarmCode" gorm:"alarm_code"` + EventTime time.Time `json:"eventTime" gorm:"event_time"` + AlarmType string `json:"alarmType" gorm:"alarm_type"` + OrigSeverity string `json:"origSeverity" gorm:"orig_severity"` // 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + PerceivedSeverity string `json:"perceivedSeverity" gorm:"perceived_severity"` // 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + PvFlag string `json:"pvFlag" gorm:"pv_flag"` + NeName string `json:"neName" gorm:"ne_name"` + ObjectUid string `json:"objectUid" gorm:"object_uid"` + ObjectName string `json:"objectName" gorm:"object_name"` + ObjectType string `json:"objectType" gorm:"object_type"` + LocationInfo string `json:"locationInfo" gorm:"location_info"` + Province string `json:"province" gorm:"province"` + AlarmStatus string `json:"alarmStatus" gorm:"alarm_status"` // 0:clear, 1:active + SpecificProblem string `json:"specificProblem" gorm:"specific_problem"` + SpecificProblemId string `json:"specificProblemId" gorm:"specific_problem_id"` + AddInfo string `json:"addInfo" gorm:"add_info"` + Counter string `json:"counter" gorm:"counter"` + LatestEventTime time.Time `json:"latestEventTime" gorm:"latest_event_time"` + AckState string `json:"ackState" gorm:"ack_state"` // 0: Unacked, 1: Acked + AckTime time.Time `json:"ackTime" gorm:"ack_time"` + AckUser string `json:"ackUser" gorm:"ack_user"` + ClearType string `json:"clearType" gorm:"clear_type"` // 0: Unclear, 1: AutoClear, 2: ManualClear + ClearTime time.Time `json:"clearTime" gorm:"clear_time"` + ClearUser string `json:"clearUser" gorm:"clear_user"` + Timestamp time.Time `json:"timestamp" gorm:"timestamp"` +} + +// TableName 表名称 +func (*Alarm) TableName() string { + return "alarm" +} + +// AlarmQuery 告警数据查询参数结构体 +type AlarmQuery struct { + NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型 + NeID string `json:"neId" form:"neId" binding:"required"` + RmUID string `json:"rmUID" form:"rmUID"` + OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + StartTime string `json:"startTime" form:"startTime"` + EndTime string `json:"endTime" form:"endTime"` + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` +} diff --git a/src/modules/network_data/model/cdr_event.go b/src/modules/network_data/model/cdr_event.go index 96896c2..a4721d3 100644 --- a/src/modules/network_data/model/cdr_event.go +++ b/src/modules/network_data/model/cdr_event.go @@ -15,14 +15,14 @@ type CDREvent struct { // CDREventQuery CDR会话对象查询参数结构体 type CDREventQuery struct { - NeType string `json:"neType" form:"neType" binding:"required"` + 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"` + RecordType string `json:"recordType" form:"recordType"` // 记录行为 MOC MTC MOSM MTSM StartTime string `json:"startTime" form:"startTime"` EndTime string `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/network_data/model/ue_event.go b/src/modules/network_data/model/ue_event.go index eed904f..d39dd63 100644 --- a/src/modules/network_data/model/ue_event.go +++ b/src/modules/network_data/model/ue_event.go @@ -16,13 +16,14 @@ type UEEvent struct { // UEEventQuery UE会话对象查询参数结构体 type UEEventQuery struct { - NeType string `json:"neType" form:"neType" binding:"required"` + NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型, 暂时支持AMF NeID string `json:"neId" form:"neId" binding:"required"` RmUID string `json:"rmUID" form:"rmUID"` + EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state StartTime string `json:"startTime" form:"startTime"` EndTime string `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index 41f83b0..9c7bae7 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -1,9 +1,10 @@ package networkdata import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/src/modules/network_data/controller" + "be.ems/src/framework/logger" + "be.ems/src/framework/middleware" + "be.ems/src/framework/middleware/collectlogs" + "be.ems/src/modules/network_data/controller" "github.com/gin-gonic/gin" ) @@ -27,22 +28,48 @@ func Setup(router *gin.Engine) { ) } + // 告警数据信息 + alarmGroup := neDataGroup.Group("/alarm") + { + alarmGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewAlarmController.List, + ) + alarmGroup.DELETE("/:alarmIds", + middleware.PreAuthorize(nil), + controller.NewAlarmController.Remove, + ) + } + // 网元IMS imsGroup := neDataGroup.Group("/ims") { - // CDR会话事件信息 - imsGroup.GET("/cdrs", + // CDR会话事件列表 + imsGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewIMSController.CDRs, + controller.NewIMSController.CDRList, + ) + // CDR会话删除 + imsGroup.DELETE("/cdr/:cdrIds", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewIMSController.CDRRemove, ) } // 网元AMF amfGroup := neDataGroup.Group("/amf") { - amfGroup.GET("/ues", + // UE会话事件 + amfGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewAMFController.UEs, + controller.NewAMFController.UEList, + ) + // UE会话删除 + amfGroup.DELETE("/ue/:ueIds", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewAMFController.UERemove, ) } diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go new file mode 100644 index 0000000..0ea43bb --- /dev/null +++ b/src/modules/network_data/repository/alarm.go @@ -0,0 +1,15 @@ +package repository + +import "be.ems/src/modules/network_data/model" + +// 告警 数据层接口 +type IAlarm interface { + // SelectPage 根据条件分页查询 + SelectPage(querys model.AlarmQuery) map[string]any + + // SelectByIds 通过ID查询 + SelectByIds(ids []string) []model.Alarm + + // DeleteByIds 批量删除信息 + DeleteByIds(ids []string) int64 +} diff --git a/src/modules/network_data/repository/alarm.impl.go b/src/modules/network_data/repository/alarm.impl.go new file mode 100644 index 0000000..6a97dbf --- /dev/null +++ b/src/modules/network_data/repository/alarm.impl.go @@ -0,0 +1,194 @@ +package repository + +import ( + "fmt" + "strings" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 AlarmImpl 结构体 +var NewAlarmImpl = &AlarmImpl{ + selectSql: `select + id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, + alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, + object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, + add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, + clear_time, clear_user, timestamp + from alarm`, + + resultMap: map[string]string{ + "id": "ID", + "alarm_seq": "AlarmSeq", + "alarm_id": "AlarmId", + "alarm_title": "AlarmTitle", + "ne_type": "NeType", + "ne_id": "NeId", + "alarm_code": "AlarmCode", + "event_time": "EventTime", + "alarm_type": "AlarmType", + "orig_severity": "OrigSeverity", + "perceived_severity": "PerceivedSeverity", + "pv_flag": "PvFlag", + "ne_name": "NeName", + "object_uid": "ObjectUid", + "object_name": "ObjectName", + "object_type": "ObjectType", + "location_info": "LocationInfo", + "province": "Province", + "alarm_status": "AlarmStatus", + "specific_problem": "SpecificProblem", + "specific_problem_id": "SpecificProblemId", + "add_info": "AddInfo", + "counter": "Counter", + "latest_event_time": "LatestEventTime", + "ack_state": "AckState", + "ack_time": "AckTime", + "ack_user": "AckUser", + "clear_type": "ClearType", + "clear_time": "ClearTime", + "clear_user": "ClearUser", + "timestamp": "Timestamp", + }, +} + +// AlarmImpl 告警 数据层处理 +type AlarmImpl struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *AlarmImpl) convertResultRows(rows []map[string]any) []model.Alarm { + arr := make([]model.Alarm, 0) + for _, row := range rows { + item := model.Alarm{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "object_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + params = append(params, querys.EndTime) + } + if querys.OrigSeverity != "" { + eventTypes := strings.Split(querys.OrigSeverity, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.Alarm{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from alarm" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *AlarmImpl) SelectByIds(ids []string) []model.Alarm { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.Alarm{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *AlarmImpl) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from alarm where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results +} diff --git a/src/modules/network_data/repository/cdr_event.go b/src/modules/network_data/repository/cdr_event.go index 0df96d9..cb3241c 100644 --- a/src/modules/network_data/repository/cdr_event.go +++ b/src/modules/network_data/repository/cdr_event.go @@ -1,9 +1,15 @@ package repository -import "ems.agt/src/modules/network_data/model" +import "be.ems/src/modules/network_data/model" // CDR会话事件 数据层接口 type ICDREvent interface { // SelectPage 根据条件分页查询 SelectPage(querys model.CDREventQuery) map[string]any + + // SelectByIds 通过ID查询 + SelectByIds(cdrIds []string) []model.CDREvent + + // DeleteByIds 批量删除信息 + DeleteByIds(cdrIds []string) int64 } diff --git a/src/modules/network_data/repository/cdr_event.impl.go b/src/modules/network_data/repository/cdr_event.impl.go index b8cf5df..ac75e43 100644 --- a/src/modules/network_data/repository/cdr_event.impl.go +++ b/src/modules/network_data/repository/cdr_event.impl.go @@ -4,12 +4,12 @@ import ( "fmt" "strings" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/network_data/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" ) // 实例化数据层 CDREventImpl 结构体 @@ -63,6 +63,10 @@ func (r *CDREventImpl) SelectPage(querys model.CDREventQuery) map[string]any { conditions = append(conditions, "rm_uid = ?") params = append(params, querys.RmUID) } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } if querys.StartTime != "" { conditions = append(conditions, "timestamp >= ?") beginDate := date.ParseStrToDate(querys.StartTime, date.YYYY_MM_DD_HH_MM_SS) @@ -74,8 +78,12 @@ func (r *CDREventImpl) SelectPage(querys model.CDREventQuery) map[string]any { params = append(params, endDate.Unix()) } if querys.RecordType != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, 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) + } } // 构建查询条件语句 @@ -120,7 +128,7 @@ func (r *CDREventImpl) SelectPage(querys model.CDREventQuery) map[string]any { sortSql += " asc " } } - orderSql = fmt.Sprintf(" order by %s ", sortSql) + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) } // 查询数据 @@ -134,3 +142,30 @@ func (r *CDREventImpl) SelectPage(querys model.CDREventQuery) map[string]any { result["rows"] = r.convertResultRows(results) return result } + +// SelectByIds 通过ID查询 +func (r *CDREventImpl) SelectByIds(cdrIds []string) []model.CDREvent { + 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.CDREvent{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventImpl) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event 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 6376d79..1a00957 100644 --- a/src/modules/network_data/repository/perf_kpi.go +++ b/src/modules/network_data/repository/perf_kpi.go @@ -1,6 +1,6 @@ package repository -import "ems.agt/src/modules/network_data/model" +import "be.ems/src/modules/network_data/model" // 性能统计 数据层接口 type IPerfKPI interface { diff --git a/src/modules/network_data/repository/perf_kpi.impl.go b/src/modules/network_data/repository/perf_kpi.impl.go index b665347..8975ae6 100644 --- a/src/modules/network_data/repository/perf_kpi.impl.go +++ b/src/modules/network_data/repository/perf_kpi.impl.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/modules/network_data/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" ) // 实例化数据层 PerfKPIImpl 结构体 diff --git a/src/modules/network_data/repository/ue_event.go b/src/modules/network_data/repository/ue_event.go index 42c520c..58b9046 100644 --- a/src/modules/network_data/repository/ue_event.go +++ b/src/modules/network_data/repository/ue_event.go @@ -1,9 +1,15 @@ package repository -import "ems.agt/src/modules/network_data/model" +import "be.ems/src/modules/network_data/model" // UE会话事件 数据层接口 type IUEEvent interface { // SelectPage 根据条件分页查询 SelectPage(querys model.UEEventQuery) map[string]any + + // SelectByIds 通过ID查询 + SelectByIds(ueIds []string) []model.UEEvent + + // DeleteByIds 批量删除信息 + DeleteByIds(ueIds []string) int64 } diff --git a/src/modules/network_data/repository/ue_event.impl.go b/src/modules/network_data/repository/ue_event.impl.go index 66e104c..01ab647 100644 --- a/src/modules/network_data/repository/ue_event.impl.go +++ b/src/modules/network_data/repository/ue_event.impl.go @@ -4,12 +4,12 @@ import ( "fmt" "strings" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/network_data/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" ) // 实例化数据层 UEEventImpl 结构体 @@ -74,6 +74,14 @@ func (r *UEEventImpl) SelectPage(querys model.UEEventQuery) map[string]any { endDate := date.ParseStrToDate(querys.EndTime, date.YYYY_MM_DD_HH_MM_SS) params = append(params, endDate.Unix()) } + 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) + } + } // 构建查询条件语句 whereSql := "" @@ -117,7 +125,7 @@ func (r *UEEventImpl) SelectPage(querys model.UEEventQuery) map[string]any { sortSql += " asc " } } - orderSql = fmt.Sprintf(" order by %s ", sortSql) + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) } // 查询数据 @@ -131,3 +139,30 @@ func (r *UEEventImpl) SelectPage(querys model.UEEventQuery) map[string]any { result["rows"] = r.convertResultRows(results) return result } + +// SelectByIds 通过ID查询 +func (r *UEEventImpl) SelectByIds(ueIds []string) []model.UEEvent { + 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.UEEvent{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventImpl) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event 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 new file mode 100644 index 0000000..3c466ee --- /dev/null +++ b/src/modules/network_data/service/alarm.go @@ -0,0 +1,12 @@ +package service + +import "be.ems/src/modules/network_data/model" + +// 告警 服务层接口 +type IAlarm interface { + // SelectPage 根据条件分页查询 + SelectPage(querys model.AlarmQuery) map[string]any + + // DeleteByIds 批量删除信息 + DeleteByIds(ids []string) (int64, error) +} diff --git a/src/modules/network_data/service/alarm.impl.go b/src/modules/network_data/service/alarm.impl.go new file mode 100644 index 0000000..e988ed1 --- /dev/null +++ b/src/modules/network_data/service/alarm.impl.go @@ -0,0 +1,40 @@ +package service + +import ( + "fmt" + + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化数据层 AlarmImpl 结构体 +var NewAlarmImpl = &AlarmImpl{ + alarmRepository: repository.NewAlarmImpl, +} + +// AlarmImpl 告警 服务层处理 +type AlarmImpl struct { + // 告警数据信息 + alarmRepository repository.IAlarm +} + +// SelectPage 根据条件分页查询 +func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { + return r.alarmRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *AlarmImpl) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.alarmRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(data) == len(ids) { + rows := r.alarmRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} diff --git a/src/modules/network_data/service/cdr_event.go b/src/modules/network_data/service/cdr_event.go index 8efc223..27e9917 100644 --- a/src/modules/network_data/service/cdr_event.go +++ b/src/modules/network_data/service/cdr_event.go @@ -1,9 +1,12 @@ package service -import "ems.agt/src/modules/network_data/model" +import "be.ems/src/modules/network_data/model" // CDR会话事件 服务层接口 type ICDREvent interface { // SelectPage 根据条件分页查询 SelectPage(querys model.CDREventQuery) map[string]any + + // DeleteByIds 批量删除信息 + DeleteByIds(cdrIds []string) (int64, error) } diff --git a/src/modules/network_data/service/cdr_event.impl.go b/src/modules/network_data/service/cdr_event.impl.go index e6a950c..89ac737 100644 --- a/src/modules/network_data/service/cdr_event.impl.go +++ b/src/modules/network_data/service/cdr_event.impl.go @@ -1,8 +1,10 @@ package service import ( - "ems.agt/src/modules/network_data/model" - "ems.agt/src/modules/network_data/repository" + "fmt" + + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" ) // 实例化数据层 CDREventImpl 结构体 @@ -20,3 +22,19 @@ type CDREventImpl struct { func (r *CDREventImpl) SelectPage(querys model.CDREventQuery) map[string]any { return r.cdrEventRepository.SelectPage(querys) } + +// DeleteByIds 批量删除信息 +func (r *CDREventImpl) 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 41a9364..fcd7d76 100644 --- a/src/modules/network_data/service/perf_kpi.go +++ b/src/modules/network_data/service/perf_kpi.go @@ -1,6 +1,6 @@ package service -import "ems.agt/src/modules/network_data/model" +import "be.ems/src/modules/network_data/model" // 性能统计 服务层接口 type IPerfKPI interface { diff --git a/src/modules/network_data/service/perf_kpi.impl.go b/src/modules/network_data/service/perf_kpi.impl.go index 4e193d7..297657d 100644 --- a/src/modules/network_data/service/perf_kpi.impl.go +++ b/src/modules/network_data/service/perf_kpi.impl.go @@ -5,10 +5,10 @@ import ( "fmt" "time" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/redis" - "ems.agt/src/modules/network_data/model" - "ems.agt/src/modules/network_data/repository" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" ) // 实例化数据层 PerfKPIImpl 结构体 @@ -54,14 +54,14 @@ func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID string, day int) map[stri var info map[string]any - // 读取缓存数据 - key := fmt.Sprintf("%sUPFTotalFlow_%s_%d", cachekey.NE_DATA_KEY, rmUID, day) + // 读取缓存数据 小于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) expireMinute := (time.Duration(int64(expireSecond)) * time.Second) - if expireMinute > 1*time.Minute { + if expireMinute > 2*time.Minute { return info } } diff --git a/src/modules/network_data/service/ue_event.go b/src/modules/network_data/service/ue_event.go index e85c689..367bb24 100644 --- a/src/modules/network_data/service/ue_event.go +++ b/src/modules/network_data/service/ue_event.go @@ -1,9 +1,12 @@ package service -import "ems.agt/src/modules/network_data/model" +import "be.ems/src/modules/network_data/model" // UE会话事件 服务层接口 type IUEEvent interface { // SelectPage 根据条件分页查询 SelectPage(querys model.UEEventQuery) map[string]any + + // DeleteByIds 批量删除信息 + DeleteByIds(ueIds []string) (int64, error) } diff --git a/src/modules/network_data/service/ue_event.impl.go b/src/modules/network_data/service/ue_event.impl.go index 46e7354..16f7e07 100644 --- a/src/modules/network_data/service/ue_event.impl.go +++ b/src/modules/network_data/service/ue_event.impl.go @@ -1,8 +1,10 @@ package service import ( - "ems.agt/src/modules/network_data/model" - "ems.agt/src/modules/network_data/repository" + "fmt" + + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" ) // 实例化数据层 UEEventImpl 结构体 @@ -20,3 +22,19 @@ type UEEventImpl struct { func (r *UEEventImpl) SelectPage(querys model.UEEventQuery) map[string]any { return r.ueEventRepository.SelectPage(querys) } + +// DeleteByIds 批量删除信息 +func (r *UEEventImpl) 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/ne_action.go b/src/modules/network_element/controller/ne_action.go index d56408a..783e3c0 100644 --- a/src/modules/network_element/controller/ne_action.go +++ b/src/modules/network_element/controller/ne_action.go @@ -5,13 +5,12 @@ import ( "path/filepath" "strings" - "ems.agt/src/framework/config" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/ssh" - "ems.agt/src/framework/vo/result" - neService "ems.agt/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/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" ) @@ -23,7 +22,7 @@ var NewNeAction = &NeActionController{ // 网元处理请求 // -// PATH / +// PATH /action type NeActionController struct { // 网元信息服务 neInfoService neService.INeInfo @@ -53,7 +52,7 @@ func (s *NeActionController) PushFile(c *gin.Context) { // 本地文件 localPath := file.ParseUploadFilePath(body.UploadPath) - nePath := config.Get("mml.upload").(string) + nePath := "/tmp" //config.Get("mml.upload").(string) // 复制到远程 err := ssh.FileSCPLocalToNe(neInfo.IP, localPath, nePath) if err != nil { @@ -67,7 +66,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) { diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go new file mode 100644 index 0000000..7bf3955 --- /dev/null +++ b/src/modules/network_element/controller/ne_host.go @@ -0,0 +1,356 @@ +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/utils/ssh" + "be.ems/src/framework/utils/telnet" + "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, +} + +// 网元主机连接请求 +// +// PATH /host +type NeHostController struct { + // 网元主机连接服务 + neHostService neService.INeHost +} + +// 网元主机列表 +// +// GET /list +func (s *NeHostController) List(c *gin.Context) { + querys := ctx.QueryMap(c) + data := s.neHostService.SelectPage(querys) + + rows := data["rows"].([]model.NeHost) + arr := &rows + for i := range *arr { + (*arr)[i].Password = "-" + (*arr)[i].PrivateKey = "-" + (*arr)[i].PassPhrase = "-" + } + + c.JSON(200, result.Ok(data)) +} + +// 网元主机信息 +// +// GET /:hostId +func (s *NeHostController) Info(c *gin.Context) { + language := ctx.AcceptLanguage(c) + hostId := c.Param("hostId") + if hostId == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + neHost := s.neHostService.SelectById(hostId) + if neHost.HostID != hostId { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + c.JSON(200, result.OkData(neHost)) +} + +// 网元主机新增 +// +// POST / +func (s *NeHostController) Add(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeHost + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.HostID != "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueHost := s.neHostService.CheckUniqueHostTitle(body.GroupID, body.Title, body.HostType, "") + if !uniqueHost { + // 主机信息操作【%s】失败,同组内名称已存在 + msg := i18n.TTemplate(language, "neHost.errKeyExists", map[string]any{"name": body.Title}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + body.CreateBy = ctx.LoginUserToUserName(c) + insertId := s.neHostService.Insert(body) + if insertId != "" { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元主机修改 +// +// PUT / +func (s *NeHostController) Edit(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeHost + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.HostID == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueHost := s.neHostService.CheckUniqueHostTitle(body.GroupID, body.Title, body.HostType, body.HostID) + if !uniqueHost { + // 主机信息操作【%s】失败,同组内名称已存在 + msg := i18n.TTemplate(language, "neHost.errKeyExists", map[string]any{"name": body.Title}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + // 检查是否存在 + neHost := s.neHostService.SelectById(body.HostID) + if neHost.HostID != body.HostID { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + body.UpdateBy = ctx.LoginUserToUserName(c) + rows := s.neHostService.Update(body) + if rows > 0 { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元主机删除 +// +// DELETE /:hostIds +func (s *NeHostController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + hostIds := c.Param("hostIds") + if hostIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(hostIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.neHostService.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 /test +func (s *NeHostController) Test(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeHost + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + if body.HostType == "ssh" { + var connSSH ssh.ConnSSH + body.CopyTo(&connSSH) + + client, err := connSSH.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 + } + + if body.HostType == "telnet" { + var connTelnet telnet.ConnTelnet + body.CopyTo(&connTelnet) + + client, err := connTelnet.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 + } +} + +// 网元主机发送命令 +// +// POST /cmd +func (s *NeHostController) Cmd(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + HostID string `json:"hostId" binding:"required"` // 主机ID + Cmd string `json:"cmd" binding:"required"` // 执行命令 + } + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查是否存在 + neHost := s.neHostService.SelectById(body.HostID) + if neHost.HostID != body.HostID { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + if neHost.HostType == "ssh" { + var connSSH ssh.ConnSSH + neHost.CopyTo(&connSSH) + + client, err := connSSH.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + + // 执行命令 + output, err := client.RunCMD(body.Cmd) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.OkData(output)) + return + } + + if neHost.HostType == "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() + + // 执行命令 + output, err := client.RunCMD(body.Cmd) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.OkData(output)) + return + } +} + +// 网元主机SSH方式检查服务器环境 +// +// POST /checkBySSH +func (s *NeHostController) CheckBySSH(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeHost + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + var connSSH ssh.ConnSSH + body.CopyTo(&connSSH) + + // 创建链接SSH客户端 + client, err := connSSH.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + + // 结果信息数据 + data := map[string]any{ + "addr": body.Addr, // 服务器地址 + "kernelName": "-", // 内核名称 -s + "nodename": "-", // 网络节点主机名 -n + "kernelRelease": "-", // 内核发布版本 -r + "machine": "-", // 机器硬件名称 -m + "prettyName": "-", // 系统发行版本 + "sudo": false, // 可提权 + "sshLink": false, // 可直连 + } + + // 执行命令 检查系统环境 + output, err := client.RunCMD("uname -snrm && cat /etc/os-release | grep PRETTY_NAME") + if err != nil { + c.JSON(200, result.OkData(data)) + return + } + output = strings.TrimSuffix(output, "\n") + sysInfoArr := strings.SplitN(output, "\n", 2) + if len(sysInfoArr) == 2 { + // uname -snrm + baseInfoArr := strings.SplitN(sysInfoArr[0], " ", 4) + data["kernelName"] = baseInfoArr[0] + data["nodename"] = baseInfoArr[1] + data["kernelRelease"] = baseInfoArr[2] + data["machine"] = baseInfoArr[3] + // cat /etc/os-release | grep PRETTY_NAME + prettyName := sysInfoArr[1] + index := strings.Index(prettyName, `"`) + if index != -1 { + data["prettyName"] = prettyName[index+1 : len(prettyName)-1] + } + } + // 执行命令 检查sudo权限 + _, err = client.RunCMD("sudo -n uname") + if err == nil { + data["sudo"] = true + } else { + data["sudo"] = false + } + + // 本地免密创建链接直连 + lcoalConnSSH := ssh.ConnSSH{ + User: body.User, + Addr: body.Addr, + Port: body.Port, + } + lcoalClient, err := lcoalConnSSH.NewClientByLocalPrivate() + if err == nil { + data["sshLink"] = true + } else { + data["sshLink"] = false + } + defer lcoalClient.Close() + + c.JSON(200, result.OkData(data)) +} diff --git a/src/modules/network_element/controller/ne_host_cmd.go b/src/modules/network_element/controller/ne_host_cmd.go new file mode 100644 index 0000000..f817a59 --- /dev/null +++ b/src/modules/network_element/controller/ne_host_cmd.go @@ -0,0 +1,152 @@ +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" + "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, +} + +// 网元主机命令请求 +// +// PATH /hostCmd +type NeHostCmdController struct { + // 网元主机命令服务 + neHostCmdService neService.INeHostCmd +} + +// 网元主机命令列表 +// +// GET /list +func (s *NeHostCmdController) List(c *gin.Context) { + querys := ctx.QueryMap(c) + data := s.neHostCmdService.SelectPage(querys) + + c.JSON(200, result.Ok(data)) +} + +// 网元主机命令信息 +// +// GET /:cmdId +func (s *NeHostCmdController) Info(c *gin.Context) { + language := ctx.AcceptLanguage(c) + cmdId := c.Param("cmdId") + if cmdId == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + neHost := s.neHostCmdService.SelectById(cmdId) + if neHost.CmdID != cmdId { + // 没有可访问主机命令数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHostCmd.noData"))) + return + } + + c.JSON(200, result.OkData(neHost)) +} + +// 网元主机命令新增 +// +// POST / +func (s *NeHostCmdController) Add(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeHostCmd + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.CmdID != "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueHostCmd := s.neHostCmdService.CheckUniqueGroupTitle(body.GroupID, body.Title, body.CmdType, "") + if !uniqueHostCmd { + // 主机命令操作【%s】失败,同组内名称已存在 + msg := i18n.TTemplate(language, "neHostCmd.errKeyExists", map[string]any{"name": body.Title}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + body.CreateBy = ctx.LoginUserToUserName(c) + insertId := s.neHostCmdService.Insert(body) + if insertId != "" { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元主机命令修改 +// +// PUT / +func (s *NeHostCmdController) Edit(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeHostCmd + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.CmdID == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueHostCmd := s.neHostCmdService.CheckUniqueGroupTitle(body.GroupID, body.Title, body.CmdType, body.CmdID) + if !uniqueHostCmd { + // 主机命令操作【%s】失败,同组内名称已存在 + msg := i18n.TTemplate(language, "neHostCmd.errKeyExists", map[string]any{"name": body.Title}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + // 检查是否存在 + neHost := s.neHostCmdService.SelectById(body.CmdID) + if neHost.CmdID != body.CmdID { + // 没有可访问主机命令数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHostCmd.noData"))) + return + } + + body.UpdateBy = ctx.LoginUserToUserName(c) + rows := s.neHostCmdService.Update(body) + if rows > 0 { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元主机命令删除 +// +// DELETE /:cmdIds +func (s *NeHostCmdController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + cmdIds := c.Param("cmdIds") + if cmdIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(cmdIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.neHostCmdService.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/network_element/controller/ne_info.go b/src/modules/network_element/controller/ne_info.go index 975f7d1..f575ab6 100644 --- a/src/modules/network_element/controller/ne_info.go +++ b/src/modules/network_element/controller/ne_info.go @@ -2,15 +2,17 @@ package controller import ( "fmt" + "strings" "sync" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/network_element/model" - neService "ems.agt/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" ) // 实例化控制层 NeInfoController 结构体 @@ -30,10 +32,10 @@ type NeInfoController struct { var neStateCacheMap sync.Map var mutex sync.Mutex -// 网元状态 +// 网元信息状态 // // GET /state -func (s *NeInfoController) NeState(c *gin.Context) { +func (s *NeInfoController) State(c *gin.Context) { language := ctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` @@ -82,32 +84,23 @@ func (s *NeInfoController) NeState(c *gin.Context) { c.JSON(200, result.OkData(resData)) } -// 网元neType和neID查询 -// -// GET /info -func (s *NeInfoController) NeTypeAndID(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var querys struct { - NeType string `form:"neType" binding:"required"` - NeID string `form:"neId" binding:"required"` - } - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - 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 - } - c.JSON(200, result.OkData(neInfo)) -} - -// 网元列表 +// 网元信息列表 // // GET /list -func (s *NeInfoController) NeList(c *gin.Context) { +func (s *NeInfoController) List(c *gin.Context) { + querys := ctx.QueryMap(c) + bandStatus := false + if v, ok := querys["bandStatus"]; ok && v != nil { + bandStatus = parse.Boolean(v) + } + data := s.neInfoService.SelectPage(querys, bandStatus) + c.JSON(200, result.Ok(data)) +} + +// 网元信息列表全部无分页 +// +// GET /listAll +func (s *NeInfoController) ListAll(c *gin.Context) { language := ctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType"` @@ -128,10 +121,173 @@ func (s *NeInfoController) NeList(c *gin.Context) { ne.NeId = querys.NeId } bandStatus := parse.Boolean(querys.BandStatus) - neList := s.neInfoService.SelectNeList(ne, bandStatus) + neList := s.neInfoService.SelectList(ne, bandStatus) if len(neList) == 0 { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } c.JSON(200, result.OkData(neList)) } + +// 网元信息 +// +// GET /:infoId +func (s *NeInfoController) Info(c *gin.Context) { + language := ctx.AcceptLanguage(c) + infoId := c.Param("infoId") + if infoId == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + neHost := s.neInfoService.SelectById(infoId, true) + if neHost.ID != infoId { + // 没有可访问网元信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neInfo.noData"))) + return + } + + c.JSON(200, result.OkData(neHost)) +} + +// 网元neType和neID查询 +// +// GET / +func (s *NeInfoController) NeTypeAndID(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys struct { + NeType string `form:"neType" binding:"required"` + NeID string `form:"neId" binding:"required"` + } + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + 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 + } + c.JSON(200, result.OkData(neInfo)) +} + +// 网元信息新增 +// +// POST / +func (s *NeInfoController) Add(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeInfo + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.ID != "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueInfo := s.neInfoService.CheckUniqueNeTypeAndNeId(body.NeType, body.NeId, "") + if !uniqueInfo { + // 网元信息操作【%s】失败,同类型下标识已存在 + msg := i18n.TTemplate(language, "neInfo.errKeyExists", map[string]any{"key": body.NeId}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + // 获取网元状态是否正常 + _, err = neService.NeState(body) + if err != nil { + body.Status = "1" + } else { + // 下发网管配置信息给网元 + _, err = neService.NeConfigOMC(body) + if err == nil { + body.Status = "0" + } else { + body.Status = "3" + } + } + + insertId := s.neInfoService.Insert(body) + if insertId != "" { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元信息修改 +// +// PUT / +func (s *NeInfoController) Edit(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeInfo + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.ID == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueHostCmd := s.neInfoService.CheckUniqueNeTypeAndNeId(body.NeType, body.NeId, body.ID) + if !uniqueHostCmd { + // 网元信息操作【%s】失败,同类型下标识已存在 + msg := i18n.TTemplate(language, "neInfo.errKeyExists", map[string]any{"key": body.NeId}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + // 检查是否存在 + neInfo := s.neInfoService.SelectById(body.ID, false) + if neInfo.ID != body.ID { + // 没有可访问网元信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neInfo.noData"))) + return + } + + // 获取网元状态是否正常 + _, err = neService.NeState(body) + if err != nil { + body.Status = "1" + } else { + // 下发网管配置信息给网元 + _, err = neService.NeConfigOMC(body) + if err == nil { + body.Status = "0" + } else { + body.Status = "3" + } + } + + rows := s.neInfoService.Update(body) + if rows > 0 { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元信息删除 +// +// DELETE /:infoIds +func (s *NeInfoController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + infoIds := c.Param("infoIds") + if infoIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(infoIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.neInfoService.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/network_element/controller/ne_software.go b/src/modules/network_element/controller/ne_software.go new file mode 100644 index 0000000..1001392 --- /dev/null +++ b/src/modules/network_element/controller/ne_software.go @@ -0,0 +1,180 @@ +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" + "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, +} + +// 网元软件包信息请求 +// +// PATH /software +type NeSoftwareController struct { + // 网元软件包信息服务 + neSoftwareService neService.INeSoftware +} + +// 网元软件包信息列表 +// +// GET /list +func (s *NeSoftwareController) List(c *gin.Context) { + querys := ctx.QueryMap(c) + data := s.neSoftwareService.SelectPage(querys) + + c.JSON(200, result.Ok(data)) +} + +// 网元软件包信息信息 +// +// GET /:softwareId +func (s *NeSoftwareController) Info(c *gin.Context) { + language := ctx.AcceptLanguage(c) + softwareId := c.Param("softwareId") + if softwareId == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + neSoftware := s.neSoftwareService.SelectById(softwareId) + if neSoftware.ID != softwareId { + // 没有可访问网元版本数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neSoftware.noData"))) + return + } + + c.JSON(200, result.OkData(neSoftware)) +} + +// 网元软件包信息新增 +// +// POST / +func (s *NeSoftwareController) Add(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeSoftware + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.ID != "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueSoftware := s.neSoftwareService.CheckUniqueTypeAndFileNameAndVersion(body.NeType, body.FileName, body.Version, "") + if !uniqueSoftware { + // 网元软件包操作【%s】失败,网元类型与文件名版本已存在 + msg := i18n.TTemplate(language, "neSoftware.errKeyExists", map[string]any{"name": body.FileName}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + insertId := s.neSoftwareService.Insert(body) + if insertId != "" { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元软件包信息修改 +// +// PUT / +func (s *NeSoftwareController) Edit(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeSoftware + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.ID == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueSoftware := s.neSoftwareService.CheckUniqueTypeAndFileNameAndVersion(body.NeType, body.FileName, body.Version, body.ID) + if !uniqueSoftware { + // 网元软件包操作【%s】失败,网元类型与文件名版本已存在 + msg := i18n.TTemplate(language, "neSoftware.errKeyExists", map[string]any{"name": body.FileName}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + // 检查是否存在 + neSoftware := s.neSoftwareService.SelectById(body.ID) + if neSoftware.ID != body.ID { + // 没有可访问网元版本数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neSoftware.noData"))) + return + } + + rows := s.neSoftwareService.Update(body) + if rows > 0 { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元软件包信息删除 +// +// DELETE /:softwareIds +func (s *NeSoftwareController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + softwareIds := c.Param("softwareIds") + if softwareIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(softwareIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.neSoftwareService.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 /install +func (s *NeSoftwareController) Install(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeSoftware + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查是否存在 + neSoftwares := s.neSoftwareService.SelectList(body) + if len(neSoftwares) == 0 { + // 没有可访问网元版本数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neSoftware.noData"))) + return + } + neSoftware := neSoftwares[0] + + // 进行安装 + output, err := s.neSoftwareService.Install(neSoftware) + if err != nil { + c.JSON(200, result.OkData(output)) + return + } + c.JSON(200, result.Err(nil)) +} diff --git a/src/modules/network_element/controller/ne_version.go b/src/modules/network_element/controller/ne_version.go new file mode 100644 index 0000000..8e4710f --- /dev/null +++ b/src/modules/network_element/controller/ne_version.go @@ -0,0 +1,150 @@ +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" + "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" +) + +// 实例化控制层 NeVersionController 结构体 +var NewNeVersion = &NeVersionController{ + neVersionService: neService.NewNeVersionImpl, +} + +// 网元版本信息请求 +// +// PATH /version +type NeVersionController struct { + // 网元版本信息服务 + neVersionService neService.INeVersion +} + +// 网元版本信息列表 +// +// GET /list +func (s *NeVersionController) List(c *gin.Context) { + querys := ctx.QueryMap(c) + data := s.neVersionService.SelectPage(querys) + + c.JSON(200, result.Ok(data)) +} + +// 网元版本信息信息 +// +// GET /:versionId +func (s *NeVersionController) Info(c *gin.Context) { + language := ctx.AcceptLanguage(c) + versionId := c.Param("versionId") + if versionId == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + neVersion := s.neVersionService.SelectById(versionId) + if neVersion.ID != versionId { + // 没有可访问网元版本数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neVersion.noData"))) + return + } + + c.JSON(200, result.OkData(neVersion)) +} + +// 网元版本信息新增 +// +// POST / +func (s *NeVersionController) Add(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeVersion + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.ID != "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueInfo := s.neVersionService.CheckUniqueTypeAndID(body.NeType, body.NeId, "") + if !uniqueInfo { + // 网元版本操作【%s】失败,网元类型信息已存在 + msg := i18n.TTemplate(language, "neVersion.errKeyExists", map[string]any{"name": body.NeType}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + insertId := s.neVersionService.Insert(body) + if insertId != "" { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元版本信息修改 +// +// PUT / +func (s *NeVersionController) Edit(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeVersion + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil || body.ID == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 检查属性值唯一 + uniqueInfo := s.neVersionService.CheckUniqueTypeAndID(body.NeType, body.NeId, body.ID) + if !uniqueInfo { + // 网元版本操作【%s】失败,网元类型信息已存在 + msg := i18n.TTemplate(language, "neVersion.errKeyExists", map[string]any{"name": body.NeType}) + c.JSON(200, result.ErrMsg(msg)) + return + } + + // 检查是否存在 + neVersion := s.neVersionService.SelectById(body.ID) + if neVersion.ID != body.ID { + // 没有可访问网元版本数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neVersion.noData"))) + return + } + + rows := s.neVersionService.Update(body) + if rows > 0 { + c.JSON(200, result.Ok(nil)) + return + } + c.JSON(200, result.Err(nil)) +} + +// 网元版本信息删除 +// +// DELETE /:versionIds +func (s *NeVersionController) Remove(c *gin.Context) { + language := ctx.AcceptLanguage(c) + versionIds := c.Param("versionIds") + if versionIds == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + // 处理字符转id数组后去重 + ids := strings.Split(versionIds, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + if len(uniqueIDs) <= 0 { + c.JSON(200, result.Err(nil)) + return + } + rows, err := s.neVersionService.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/network_element/controller/perf_kpi.go b/src/modules/network_element/controller/perf_kpi.go deleted file mode 100644 index aadc7aa..0000000 --- a/src/modules/network_element/controller/perf_kpi.go +++ /dev/null @@ -1,77 +0,0 @@ -package controller - -import ( - "ems.agt/lib/core/utils/date" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/network_element/model" - neService "ems.agt/src/modules/network_element/service" - "github.com/gin-gonic/gin" -) - -// 实例化控制层 PerfKPIController 结构体 -var NewPerfKPI = &PerfKPIController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neService.NewPerfKPIImpl, -} - -// 性能统计 -// -// PATH /kpi -type PerfKPIController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neService.IPerfKPI -} - -// 获取统计数据 -// -// GET /data -func (s *PerfKPIController) GoldKPI(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var querys model.GoldKPIQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - // 时间格式校验 - startTime := date.ParseStrToDate(querys.StartTime, date.YYYY_MM_DD_HH_MM_SS) - if startTime.IsZero() { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - } - endTime := date.ParseStrToDate(querys.EndTime, date.YYYY_MM_DD_HH_MM_SS) - if endTime.IsZero() { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - } - - // 查询网元获取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 - } - querys.RmUID = neInfo.RmUID - - // 查询数据 - kpiData := s.perfKPIService.SelectGoldKPI(querys) - c.JSON(200, result.OkData(kpiData)) -} - -// 获取统计标题 -// -// GET /title -func (s *PerfKPIController) Title(c *gin.Context) { - language := ctx.AcceptLanguage(c) - neType := c.Query("neType") - if neType == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - kpiTitles := s.perfKPIService.SelectGoldKPITitle(neType) - - c.JSON(200, result.OkData(kpiTitles)) -} diff --git a/src/modules/network_element/controller/udm_auth.go b/src/modules/network_element/controller/udm_auth.go index 38d1cdd..f7910fe 100644 --- a/src/modules/network_element/controller/udm_auth.go +++ b/src/modules/network_element/controller/udm_auth.go @@ -5,17 +5,16 @@ import ( "strings" "time" - mmlclient "ems.agt/lib/core/mml_client" - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/uploadsubpath" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/ssh" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/network_element/model" - neService "ems.agt/src/modules/network_element/service" + mmlclient "be.ems/lib/core/mml_client" + "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/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" ) @@ -377,7 +376,7 @@ func (s *UDMAuthController) Export(c *gin.Context) { data = append(data, []string{v.Imsi, v.Ki, v.AlgoIndex, v.Amf, v.Opc}) } // 输出到文件 - err := file.WriterCSVFile(data, filePath) + err := file.WriterFileCSV(data, filePath) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return @@ -391,7 +390,7 @@ func (s *UDMAuthController) Export(c *gin.Context) { data = append(data, []string{v.Imsi, v.Ki, v.AlgoIndex, v.Amf, v.Opc}) } // 输出到文件 - err = file.WriterTxtFile(data, filePath) + err = file.WriterFileTXT(data, ",", filePath) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return @@ -437,7 +436,7 @@ func (s *UDMAuthController) Import(c *gin.Context) { // 本地文件 localPath := file.ParseUploadFilePath(upFilePath) - nePath := config.Get("mml.upload").(string) + nePath := "/tmp" //config.Get("mml.upload").(string) // 复制到远程 err = ssh.FileSCPLocalToNe(neInfo.IP, localPath, nePath) if err != nil { @@ -458,12 +457,12 @@ func (s *UDMAuthController) Import(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { if strings.HasSuffix(fileName, ".csv") { - data := file.ReadCSVFile(localPath) + data := file.ReadFileCSV(localPath) neId = "" go s.udmAuthService.InsertCSV(neId, data) } if strings.HasSuffix(fileName, ".txt") { - data := file.ReadTxtFile(localPath) + data := file.ReadFileTXT(",", localPath) neId = "" go s.udmAuthService.InsertTxt(neId, data) } diff --git a/src/modules/network_element/controller/udm_sub.go b/src/modules/network_element/controller/udm_sub.go index 294864c..80bf805 100644 --- a/src/modules/network_element/controller/udm_sub.go +++ b/src/modules/network_element/controller/udm_sub.go @@ -6,17 +6,16 @@ import ( "strings" "time" - mmlclient "ems.agt/lib/core/mml_client" - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/uploadsubpath" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/ssh" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/network_element/model" - neService "ems.agt/src/modules/network_element/service" + mmlclient "be.ems/lib/core/mml_client" + "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/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" ) @@ -454,7 +453,7 @@ func (s *UDMSubController) Export(c *gin.Context) { 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}) } // 输出到文件 - err = file.WriterCSVFile(data, filePath) + err = file.WriterFileCSV(data, filePath) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return @@ -469,7 +468,7 @@ func (s *UDMSubController) Export(c *gin.Context) { 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}) } // 输出到文件 - err = file.WriterTxtFile(data, filePath) + err = file.WriterFileTXT(data, ",", filePath) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return @@ -515,7 +514,7 @@ func (s *UDMSubController) Import(c *gin.Context) { // 本地文件 localPath := file.ParseUploadFilePath(upFilePath) - nePath := config.Get("mml.upload").(string) + nePath := "/tmp" //config.Get("mml.upload").(string) // 复制到远程 err = ssh.FileSCPLocalToNe(neInfo.IP, localPath, nePath) if err != nil { @@ -536,12 +535,12 @@ func (s *UDMSubController) Import(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { if strings.HasSuffix(fileName, ".csv") { - data := file.ReadCSVFile(localPath) + data := file.ReadFileCSV(localPath) neId = "" go s.udmSubService.InsertCSV(neId, data) } if strings.HasSuffix(fileName, ".txt") { - data := file.ReadTxtFile(localPath) + data := file.ReadFileTXT(",", localPath) neId = "" go s.udmSubService.InsertTxt(neId, data) } diff --git a/src/modules/network_element/model/ne_host.go b/src/modules/network_element/model/ne_host.go new file mode 100644 index 0000000..a479635 --- /dev/null +++ b/src/modules/network_element/model/ne_host.go @@ -0,0 +1,40 @@ +package model + +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 + 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"` // 主机用户名 + AuthMode string `json:"authMode" gorm:"column:auth_mode" binding:"oneof=0 1"` // 认证模式(0密码 1主机私钥) + Password string `json:"password" gorm:"column:password"` // 认证密码 + PrivateKey string `json:"privateKey" gorm:"column:private_key"` // 认证私钥 + PassPhrase string `json:"passPhrase" gorm:"column:pass_phrase"` // 认证私钥密码 + Remark string `json:"remark" gorm:"column:remark"` // 备注 + CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 + UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 +} + +// TableName 表名称 +func (NeHost) TableName() string { + return "ne_host" +} + +// CopyTo 网元主机信息将josn同key名的结构体复制给另一个结构体 +func (m *NeHost) CopyTo(to interface{}) error { + b, err := json.Marshal(m) + if err != nil { + return err + } + if err = json.Unmarshal(b, to); err != nil { + return err + } + return nil +} diff --git a/src/modules/network_element/model/ne_host_cmd.go b/src/modules/network_element/model/ne_host_cmd.go new file mode 100644 index 0000000..82aad31 --- /dev/null +++ b/src/modules/network_element/model/ne_host_cmd.go @@ -0,0 +1,20 @@ +package model + +// NeHostCmd 网元主机命令表 ne_host_cmd +type NeHostCmd struct { + CmdID string `json:"cmdId" gorm:"column:cmd_id"` // 命令主键 + CmdType string `json:"cmdType" gorm:"column:cmd_type"` // 命令类型 + GroupID string `json:"groupId" gorm:"column:group_id"` // 分组(0默认 1快速命令) + Title string `json:"title" gorm:"column:title" binding:"required"` // 标题名称 + Command string `json:"command" gorm:"column:command" binding:"required"` // 命令字符串 + Remark string `json:"remark" gorm:"column:remark"` // 备注 + CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 + UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 +} + +// TableName 表名称 +func (*NeHostCmd) TableName() string { + return "ne_host_cmd" +} diff --git a/src/modules/network_element/model/ne_info.go b/src/modules/network_element/model/ne_info.go index ad13c4a..c08e71a 100644 --- a/src/modules/network_element/model/ne_info.go +++ b/src/modules/network_element/model/ne_info.go @@ -2,23 +2,27 @@ package model // NeInfo 网元信息对象 ne_info type NeInfo struct { - ID int64 `json:"id"` - NeType string `json:"neType"` - NeId string `json:"neId"` + ID string `json:"id"` + NeType string `json:"neType" binding:"required"` + NeId string `json:"neId" binding:"required"` RmUID string `json:"rmUid"` NeName string `json:"neName"` - IP string `json:"ip"` - Port int64 `json:"port"` - PvFlag string `json:"pvFlag"` // enum('PNF','VNF') + IP string `json:"ip" binding:"required"` + Port int64 `json:"port" binding:"required,number,max=65535,min=1"` + PvFlag string `json:"pvFlag" binding:"oneof=PNF VNF"` // enum('PNF','VNF') Province string `json:"province"` VendorName string `json:"vendorName"` Dn string `json:"dn"` NeAddress string `json:"neAddress"` - Status string `json:"status"` // 0: 在线 1: 下线 2: 备用 3: 工程 + Status string `json:"status"` // 0: 在线 1: 下线 2: 备用 3: 待下发配置 UpdateTime string `json:"updateTime"` + HostIDs string `json:"hostIds"` // 网元主机ID组 数据格式(ssh,telnet,telnet) // ====== 非数据库字段属性 ====== // 服务状态 ServerState map[string]any `json:"serverState,omitempty"` + + // 主机对象组 + Hosts []NeHost `json:"hosts,omitempty"` } diff --git a/src/modules/network_element/model/ne_software.go b/src/modules/network_element/model/ne_software.go new file mode 100644 index 0000000..afb6dff --- /dev/null +++ b/src/modules/network_element/model/ne_software.go @@ -0,0 +1,21 @@ +package model + +import "time" + +// NeSoftware 网元软件包 ne_software +type NeSoftware struct { + ID string `json:"id" gorm:"id"` + NeType string `json:"neType" gorm:"ne_type" binding:"required"` // 网元类型 + FileName string `json:"fileName" gorm:"file_name" binding:"required"` // 包名称 + Path string `json:"path" gorm:"path"` // 包路径 + Version string `json:"version" gorm:"version" binding:"required"` // 包版本 + Md5Sum string `json:"md5Sum" gorm:"md5_sum"` // --无使用 md5签名 + Status string `json:"status" gorm:"status"` // --无使用 + Comment string `json:"comment" gorm:"comment"` // 包说明 + UpdateTime time.Time `json:"updateTime" gorm:"update_time"` // 上传时间 +} + +// TableName 表名称 +func (*NeSoftware) TableName() string { + return "ne_software" +} diff --git a/src/modules/network_element/model/ne_version.go b/src/modules/network_element/model/ne_version.go new file mode 100644 index 0000000..11a00e6 --- /dev/null +++ b/src/modules/network_element/model/ne_version.go @@ -0,0 +1,23 @@ +package model + +import "time" + +// NeVersion 网元版本信息 ne_version +type NeVersion struct { + ID string `json:"id" gorm:"id"` + NeType string `json:"neType" gorm:"ne_type" binding:"required"` // 网元类型 + NeId string `json:"neId" gorm:"ne_id" binding:"required"` // 网元ID + Version string `json:"version" gorm:"version"` // 当前版本 + FilePath string `json:"filePath" gorm:"file_path"` // 当前软件包 + PreVersion string `json:"preVersion" gorm:"pre_version"` // 上一版本 + PreFile string `json:"preFile" gorm:"pre_file"` // 上一版本软件包 + NewVersion string `json:"newVersion" gorm:"new_version"` // 下一版本 + NewFile string `json:"newFile" gorm:"new_file"` // 下一版本软件包 + Status string `json:"status" gorm:"status" binding:"oneof=Uploaded Inactive Active"` // 当前状态 (Uploaded下一版本上传 Inactive下一版本待激活 Active当前已激活) + UpdateTime time.Time `json:"updateTime" gorm:"update_time"` // 更新时间 +} + +// TableName 表名称 +func (*NeVersion) TableName() string { + return "ne_version" +} diff --git a/src/modules/network_element/model/perf_kpi.go b/src/modules/network_element/model/perf_kpi.go deleted file mode 100644 index 108d81f..0000000 --- a/src/modules/network_element/model/perf_kpi.go +++ /dev/null @@ -1,23 +0,0 @@ -package model - -// GoldKPITitle 黄金指标标题信息对象 kpi_title -type GoldKPITitle struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - KPIID string `json:"kpiId" gorm:"column:kpi_id"` - TitleJson string `json:"titleJson" gorm:"column:title_json"` - CnTitle string `json:"cnTitle" gorm:"column:cn_title"` - EnTitle string `json:"enTitle" gorm:"column:en_title"` -} - -// GoldKPIQuery 黄金指标查询参数结构体 -type GoldKPIQuery struct { - NeType string `form:"neType" binding:"required"` - NeID string `form:"neId" binding:"required"` - StartTime string `form:"startTime" binding:"required"` - EndTime string `form:"endTime" binding:"required"` - Interval int64 `form:"interval" binding:"required"` - RmUID string `form:"rmUID"` - SortField string `form:"sortField" binding:"omitempty,oneof=timeGroup"` - SortOrder string `form:"sortOrder" binding:"omitempty,oneof=asc desc"` -} diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index 7f7f7e3..e767da0 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -1,12 +1,12 @@ package networkelement import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/src/framework/middleware/collectlogs" - "ems.agt/src/framework/middleware/repeat" - "ems.agt/src/modules/network_element/controller" - "ems.agt/src/modules/network_element/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/network_element/controller" + "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" ) @@ -20,23 +20,7 @@ func Setup(router *gin.Engine) { neGroup := router.Group("/ne") - // 网元信息 - { - neGroup.GET("/info", - middleware.PreAuthorize(nil), - controller.NewNeInfo.NeTypeAndID, - ) - neGroup.GET("/state", - middleware.PreAuthorize(nil), - controller.NewNeInfo.NeState, - ) - neGroup.GET("/list", - middleware.PreAuthorize(nil), - controller.NewNeInfo.NeList, - ) - } - - // 网元处理 + // 网元操作处理 neActionGroup := neGroup.Group("/action") { neActionGroup.GET("/files", @@ -54,6 +38,178 @@ func Setup(router *gin.Engine) { ) } + // 网元信息 + neInfoGroup := neGroup.Group("/info") + { + neInfoGroup.GET("/listAll", + middleware.PreAuthorize(nil), + controller.NewNeInfo.ListAll, + ) + neInfoGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewNeInfo.List, + ) + neInfoGroup.GET("/:infoId", + middleware.PreAuthorize(nil), + controller.NewNeInfo.Info, + ) + neInfoGroup.POST("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewNeInfo.Add, + ) + neInfoGroup.PUT("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_UPDATE)), + controller.NewNeInfo.Edit, + ) + neInfoGroup.DELETE("/:infoIds", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewNeInfo.Remove, + ) + neInfoGroup.GET("/state", + middleware.PreAuthorize(nil), + controller.NewNeInfo.State, + ) + neInfoGroup.GET("/byTypeAndID", + middleware.PreAuthorize(nil), + controller.NewNeInfo.NeTypeAndID, + ) + } + + // 网元主机 + neHostGroup := neGroup.Group("/host") + { + neHostGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewNeHost.List, + ) + neHostGroup.GET("/:hostId", + middleware.PreAuthorize(nil), + controller.NewNeHost.Info, + ) + neHostGroup.POST("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewNeHost.Add, + ) + neHostGroup.PUT("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_UPDATE)), + controller.NewNeHost.Edit, + ) + neHostGroup.DELETE("/:hostIds", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewNeHost.Remove, + ) + neHostGroup.POST("/test", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewNeHost.Test, + ) + neHostGroup.POST("/cmd", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewNeHost.Cmd, + ) + neHostGroup.POST("/checkBySSH", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewNeHost.CheckBySSH, + ) + } + + // 网元主机命令 + neHostCmdGroup := neGroup.Group("/hostCmd") + { + neHostCmdGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewNeHostCmd.List, + ) + neHostCmdGroup.GET("/:cmdId", + middleware.PreAuthorize(nil), + controller.NewNeHostCmd.Info, + ) + neHostCmdGroup.POST("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHostCmd", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewNeHostCmd.Add, + ) + neHostCmdGroup.PUT("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHostCmd", collectlogs.BUSINESS_TYPE_UPDATE)), + controller.NewNeHostCmd.Edit, + ) + neHostCmdGroup.DELETE("/:cmdIds", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHostCmd", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewNeHostCmd.Remove, + ) + } + + // 网元版本信息 + neVersionGroup := neGroup.Group("/version") + { + neVersionGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewNeVersion.List, + ) + neVersionGroup.GET("/:versionId", + middleware.PreAuthorize(nil), + controller.NewNeVersion.Info, + ) + neVersionGroup.POST("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neVersion", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewNeVersion.Add, + ) + neVersionGroup.PUT("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neVersion", collectlogs.BUSINESS_TYPE_UPDATE)), + controller.NewNeVersion.Edit, + ) + neVersionGroup.DELETE("/:versionIds", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neVersion", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewNeVersion.Remove, + ) + } + + // 网元软件包信息 + neSoftwareGroup := neGroup.Group("/software") + { + neSoftwareGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewNeSoftware.List, + ) + neSoftwareGroup.GET("/:softwareId", + middleware.PreAuthorize(nil), + controller.NewNeSoftware.Info, + ) + neSoftwareGroup.POST("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewNeSoftware.Add, + ) + neSoftwareGroup.PUT("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_UPDATE)), + controller.NewNeSoftware.Edit, + ) + neSoftwareGroup.DELETE("/:softwareIds", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewNeSoftware.Remove, + ) + neSoftwareGroup.POST("/install", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewNeSoftware.Install, + ) + } + // UDM鉴权用户信息 udmAuthGroup := neGroup.Group("/udm/auth") { @@ -167,4 +323,5 @@ func Setup(router *gin.Engine) { func InitLoad() { // 启动时,清除缓存-网元类型 service.NewNeInfoImpl.ClearNeCacheByNeType("*") + service.NewNeInfoImpl.SelectNeInfoByRmuid("") } diff --git a/src/modules/network_element/repository/ne_host.go b/src/modules/network_element/repository/ne_host.go new file mode 100644 index 0000000..a61fb96 --- /dev/null +++ b/src/modules/network_element/repository/ne_host.go @@ -0,0 +1,27 @@ +package repository + +import "be.ems/src/modules/network_element/model" + +// INeHost 网元主机连接 数据层接口 +type INeHost interface { + // SelectPage 根据条件分页查询字典类型 + SelectPage(query map[string]any) map[string]any + + // SelectList 根据实体查询 + SelectList(neHost model.NeHost) []model.NeHost + + // 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 +} diff --git a/src/modules/network_element/repository/ne_host.impl.go b/src/modules/network_element/repository/ne_host.impl.go new file mode 100644 index 0000000..156b570 --- /dev/null +++ b/src/modules/network_element/repository/ne_host.impl.go @@ -0,0 +1,404 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "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/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{} + } + // 转换实体 + rows := r.convertResultRows(results) + arr := &rows + for i := range *arr { + passwordDe, err := crypto.StringDecryptByAES((*arr)[i].Password) + if err != nil { + logger.Errorf("selectById %s StringDecryptByAES : %v", (*arr)[i].HostID, err.Error()) + (*arr)[i].Password = "" + } else { + (*arr)[i].Password = passwordDe + } + privateKeyDe, err := crypto.StringDecryptByAES((*arr)[i].PrivateKey) + if err != nil { + logger.Errorf("selectById %s StringDecryptByAES : %v", (*arr)[i].HostID, err.Error()) + (*arr)[i].PrivateKey = "" + } else { + (*arr)[i].PrivateKey = privateKeyDe + } + passPhraseDe, err := crypto.StringDecryptByAES((*arr)[i].PassPhrase) + if err != nil { + logger.Errorf("selectById %s StringDecryptByAES : %v", (*arr)[i].HostID, err.Error()) + (*arr)[i].PassPhrase = "" + } else { + (*arr)[i].PassPhrase = passPhraseDe + } + } + return rows +} + +// 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 != "" { + passwordEn, err := crypto.StringEncryptByAES(neHost.Password) + if err != nil { + logger.Errorf("insert StringEncryptByAES : %v", err.Error()) + return "" + } + params["password"] = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.StringEncryptByAES(neHost.PrivateKey) + if err != nil { + logger.Errorf("insert StringEncryptByAES : %v", err.Error()) + return "" + } + params["private_key"] = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.StringEncryptByAES(neHost.PassPhrase) + if err != nil { + logger.Errorf("insert StringEncryptByAES : %v", err.Error()) + return "" + } + params["pass_phrase"] = passPhraseEn + } + if neHost.Remark != "" { + params["remark"] = neHost.Remark + } + if neHost.CreateBy != "" { + params["create_by"] = neHost.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + 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 != "" { + passwordEn, err := crypto.StringEncryptByAES(neHost.Password) + if err != nil { + logger.Errorf("update StringEncryptByAES : %v", err.Error()) + return 0 + } + params["password"] = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.StringEncryptByAES(neHost.PrivateKey) + if err != nil { + logger.Errorf("update StringEncryptByAES : %v", err.Error()) + return 0 + } + params["private_key"] = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.StringEncryptByAES(neHost.PassPhrase) + if err != nil { + logger.Errorf("update StringEncryptByAES : %v", err.Error()) + return 0 + } + params["pass_phrase"] = passPhraseEn + } + params["remark"] = neHost.Remark + if neHost.UpdateBy != "" { + params["update_by"] = neHost.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + 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 new file mode 100644 index 0000000..170441b --- /dev/null +++ b/src/modules/network_element/repository/ne_host_cmd.go @@ -0,0 +1,27 @@ +package repository + +import "be.ems/src/modules/network_element/model" + +// INeHostCmd 网元主机命令 数据层接口 +type INeHostCmd interface { + // SelectPage 根据条件分页查询字典类型 + SelectPage(query map[string]any) map[string]any + + // SelectList 根据实体查询 + SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd + + // 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 +} diff --git a/src/modules/network_element/repository/ne_host_cmd.impl.go b/src/modules/network_element/repository/ne_host_cmd.impl.go new file mode 100644 index 0000000..b4bb279 --- /dev/null +++ b/src/modules/network_element/repository/ne_host_cmd.impl.go @@ -0,0 +1,306 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) + +// 实例化数据层 NewNeHostCmdImpl 结构体 +var NewNeHostCmdImpl = &NeHostCmdImpl{ + selectSql: `select + cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time + from ne_host_cmd`, + + resultMap: map[string]string{ + "cmd_id": "CmdID", + "cmd_type": "CmdType", + "group_id": "GroupID", + "title": "Title", + "command": "Command", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHostCmdImpl 网元主机连接 数据层处理 +type NeHostCmdImpl struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHostCmdImpl) convertResultRows(rows []map[string]any) []model.NeHostCmd { + arr := make([]model.NeHostCmd, 0) + for _, row := range rows { + item := model.NeHostCmd{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["cmdType"]; ok && v != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host_cmd" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmdImpl) SelectByIds(cmdIds []string) []model.NeHostCmd { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHostCmd{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmdImpl) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + if neHostCmd.Remark != "" { + params["remark"] = neHostCmd.Remark + } + if neHostCmd.CreateBy != "" { + params["create_by"] = neHostCmd.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + params["remark"] = neHostCmd.Remark + if neHostCmd.UpdateBy != "" { + params["update_by"] = neHostCmd.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" + + // 执行更新 + values = append(values, neHostCmd.CmdID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results +} diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index 5286839..c09d034 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -1,7 +1,7 @@ package repository import ( - "ems.agt/src/modules/network_element/model" + "be.ems/src/modules/network_element/model" ) // 网元信息 数据层接口 @@ -9,6 +9,24 @@ type INeInfo interface { // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - // SelectNeList 查询网元列表 - SelectNeList(ne model.NeInfo) []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 } diff --git a/src/modules/network_element/repository/ne_info.impl.go b/src/modules/network_element/repository/ne_info.impl.go index 26016fb..732de0d 100644 --- a/src/modules/network_element/repository/ne_info.impl.go +++ b/src/modules/network_element/repository/ne_info.impl.go @@ -1,13 +1,16 @@ package repository import ( + "fmt" "sort" "strings" + "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/network_element/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_element/model" ) // neListSort 网元列表预设排序 @@ -30,7 +33,7 @@ var neListSort = []string{ // 实例化数据层 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, status, update_time from ne_info`, + selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, status, update_time, host_ids from ne_info`, resultMap: map[string]string{ "id": "ID", @@ -47,6 +50,7 @@ var NewNeInfoImpl = &NeInfoImpl{ "ne_address": "NeAddress", "status": "Status", "update_time": "UpdateTime", + "host_ids": "HostIDs", }, } @@ -114,18 +118,80 @@ func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeIn return model.NeInfo{} } -// SelectNeList 查询网元列表 -func (r *NeInfoImpl) SelectNeList(ne model.NeInfo) []model.NeInfo { +// SelectPage 根据条件分页查询 +func (r *NeInfoImpl) SelectPage(query map[string]any) map[string]any { // 查询条件拼接 var conditions []string var params []any - if ne.NeType != "" { + if v, ok := query["neType"]; ok && v != "" { conditions = append(conditions, "ne_type = ?") - params = append(params, ne.NeType) + params = append(params, strings.Trim(v.(string), " ")) } - if ne.NeId != "" { + if v, ok := query["neId"]; ok && v != "" { conditions = append(conditions, "ne_id = ?") - params = append(params, ne.NeId) + 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) } // 构建查询条件语句 @@ -144,3 +210,184 @@ func (r *NeInfoImpl) SelectNeList(ne model.NeInfo) []model.NeInfo { // 转换实体 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 + } + params["status"] = neInfo.Status + params["update_time"] = time.Now() + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + + // 构建执行语句 + 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 + params["status"] = neInfo.Status + params["update_time"] = time.Now() + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + + // 构建执行语句 + 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_software.go b/src/modules/network_element/repository/ne_software.go new file mode 100644 index 0000000..98947d2 --- /dev/null +++ b/src/modules/network_element/repository/ne_software.go @@ -0,0 +1,27 @@ +package repository + +import "be.ems/src/modules/network_element/model" + +// INeSoftware 网元软件包信息 数据层接口 +type INeSoftware interface { + // SelectPage 根据条件分页查询字典类型 + SelectPage(query map[string]any) map[string]any + + // SelectList 根据实体查询 + SelectList(neSoftware model.NeSoftware) []model.NeSoftware + + // SelectByIds 通过ID查询 + SelectByIds(ids []string) []model.NeSoftware + + // Insert 新增信息 + Insert(neSoftware model.NeSoftware) string + + // Update 修改信息 + Update(neSoftware model.NeSoftware) int64 + + // DeleteByIds 批量删除信息 + DeleteByIds(ids []string) int64 + + // CheckUniqueTypeAndFileNameAndVersion 校验网元类型和文件名版本是否唯一 + CheckUniqueTypeAndFileNameAndVersion(neSoftware model.NeSoftware) string +} diff --git a/src/modules/network_element/repository/ne_software.impl.go b/src/modules/network_element/repository/ne_software.impl.go new file mode 100644 index 0000000..3116b52 --- /dev/null +++ b/src/modules/network_element/repository/ne_software.impl.go @@ -0,0 +1,323 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) + +// 实例化数据层 NewNeSoftware 结构体 +var NewNeSoftwareImpl = &NeSoftwareImpl{ + selectSql: `select + id, ne_type, file_name, path, version, md5_sum, status, comment, update_time + from ne_software`, + + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "file_name": "FileName", + "path": "Path", + "version": "Version", + "md5_sum": "Md5Sum", + "status": "Status", + "comment": "Comment", + "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 != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["fileName"]; ok && v != "" { + conditions = append(conditions, "file_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.FileName != "" { + conditions = append(conditions, "file_name like concat(?, '%')") + params = append(params, neSoftware.FileName) + } + + // 构建查询条件语句 + 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) +} + +// CheckUniqueTypeAndFileNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftwareImpl) CheckUniqueTypeAndFileNameAndVersion(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.FileName != "" { + conditions = append(conditions, "file_name = ?") + params = append(params, neSoftware.FileName) + } + + // 构建查询条件语句 + 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.FileName != "" { + params["file_name"] = neSoftware.FileName + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + if neSoftware.Md5Sum != "" { + params["md5_sum"] = neSoftware.Md5Sum + } + if neSoftware.Status != "" { + params["status"] = neSoftware.Status + } + if neSoftware.Comment != "" { + params["comment"] = neSoftware.Comment + } + if neSoftware.Status != "" { + params["status"] = neSoftware.Status + } + params["update_time"] = time.Now() + + // 构建执行语句 + 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.FileName != "" { + params["file_name"] = neSoftware.FileName + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + if neSoftware.Md5Sum != "" { + params["md5_sum"] = neSoftware.Md5Sum + } + if neSoftware.Status != "" { + params["status"] = neSoftware.Status + } + if neSoftware.Comment != "" { + params["comment"] = neSoftware.Comment + } + if neSoftware.Status != "" { + params["status"] = neSoftware.Status + } + params["update_time"] = time.Now() + + // 构建执行语句 + 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 new file mode 100644 index 0000000..c680553 --- /dev/null +++ b/src/modules/network_element/repository/ne_version.go @@ -0,0 +1,27 @@ +package repository + +import "be.ems/src/modules/network_element/model" + +// INeVersion 网元版本信息 数据层接口 +type INeVersion interface { + // SelectPage 根据条件分页查询字典类型 + SelectPage(query map[string]any) map[string]any + + // SelectList 根据实体查询 + SelectList(neVersion model.NeVersion) []model.NeVersion + + // SelectByIds 通过ID查询 + SelectByIds(ids []string) []model.NeVersion + + // Insert 新增信息 + Insert(neVersion model.NeVersion) string + + // Update 修改信息 + Update(neVersion model.NeVersion) int64 + + // DeleteByIds 批量删除信息 + DeleteByIds(ids []string) int64 + + // CheckUniqueTypeAndID 校验网元类型和网元ID是否唯一 + CheckUniqueTypeAndID(neVersion model.NeVersion) string +} diff --git a/src/modules/network_element/repository/ne_version.impl.go b/src/modules/network_element/repository/ne_version.impl.go new file mode 100644 index 0000000..7bfefcd --- /dev/null +++ b/src/modules/network_element/repository/ne_version.impl.go @@ -0,0 +1,331 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) + +// 实例化数据层 NewNeVersion 结构体 +var NewNeVersionImpl = &NeVersionImpl{ + selectSql: `select + id, ne_type, ne_id, version, file_path, pre_version, pre_file, new_version, new_file, status, update_time + from ne_version`, + + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "version": "Version", + "file_path": "FilePath", + "pre_version": "PreVersion", + "pre_file": "PreFile", + "new_version": "NewVersion", + "new_file": "NewFile", + "status": "Status", + "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["filePath"]; ok && v != "" { + conditions = append(conditions, "file_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 := " 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.FilePath != "" { + conditions = append(conditions, "file_path like concat(?, '%')") + params = append(params, neVersion.FilePath) + } + + // 构建查询条件语句 + 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 *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) +} + +// CheckUniqueTypeAndID 校验网元类型和网元ID是否唯一 +func (r *NeVersionImpl) CheckUniqueTypeAndID(neVersion model.NeVersion) string { + // 查询条件拼接 + 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) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_version " + 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 *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.Version != "" { + params["version"] = neVersion.Version + } + if neVersion.FilePath != "" { + params["file_path"] = neVersion.FilePath + } + if neVersion.PreVersion != "" { + params["pre_version"] = neVersion.PreVersion + } + if neVersion.PreFile != "" { + params["pre_file"] = neVersion.PreFile + } + if neVersion.NewVersion != "" { + params["new_version"] = neVersion.NewVersion + } + if neVersion.NewFile != "" { + params["new_file"] = neVersion.NewFile + } + if neVersion.Status != "" { + params["status"] = neVersion.Status + } + params["update_time"] = time.Now() + + // 构建执行语句 + 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.Version != "" { + params["version"] = neVersion.Version + } + if neVersion.FilePath != "" { + params["file_path"] = neVersion.FilePath + } + if neVersion.PreVersion != "" { + params["pre_version"] = neVersion.PreVersion + } + if neVersion.PreFile != "" { + params["pre_file"] = neVersion.PreFile + } + if neVersion.NewVersion != "" { + params["new_version"] = neVersion.NewVersion + } + if neVersion.NewFile != "" { + params["new_file"] = neVersion.NewFile + } + if neVersion.Status != "" { + params["status"] = neVersion.Status + } + params["update_time"] = time.Now() + + // 构建执行语句 + 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/repository/perf_kpi.go b/src/modules/network_element/repository/perf_kpi.go deleted file mode 100644 index 2c21acd..0000000 --- a/src/modules/network_element/repository/perf_kpi.go +++ /dev/null @@ -1,12 +0,0 @@ -package repository - -import "ems.agt/src/modules/network_element/model" - -// 性能统计 数据层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any - - // SelectGoldKPITitle - SelectGoldKPITitle(neType string) []model.GoldKPITitle -} diff --git a/src/modules/network_element/repository/perf_kpi.impl.go b/src/modules/network_element/repository/perf_kpi.impl.go deleted file mode 100644 index 0b13aba..0000000 --- a/src/modules/network_element/repository/perf_kpi.impl.go +++ /dev/null @@ -1,90 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/modules/network_element/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 - 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) - } - if query.StartTime != "" { - conditions = append(conditions, "gk.start_time >= ?") - params = append(params, query.StartTime) - } - if query.EndTime != "" { - conditions = append(conditions, "gk.start_time <= ?") - params = append(params, query.EndTime) - } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询字段列 - timeFormat := "DATE_FORMAT(gk.start_time, '%Y-%m-%d %H:')" - minuteGroup := fmt.Sprintf("LPAD(FLOOR(MINUTE(gk.start_time) / %d) * %d, 2, '0')", query.Interval, query.Interval) - groupByField := fmt.Sprintf("CONCAT( %s, %s ) AS timeGroup", timeFormat, minuteGroup) - var fields = []string{ - groupByField, - "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", - "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", - } - for _, kid := range kpiIds { - // 特殊字段,只取最后一次收到的非0值 - if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" { - str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN gk.kpi_id = '%s' and gk.VALUE != 0 THEN gk.VALUE END ), ',', 1), 0) AS '%s'", kid, kid) - fields = append(fields, str) - } else { - str := fmt.Sprintf("sum(CASE WHEN gk.kpi_id = '%s' THEN gk.value ELSE 0 END) AS '%s'", kid, 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 gold_kpi gk %s GROUP BY timeGroup %s", fieldsSql, 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("Delete err => %v", err) - } - return result -} diff --git a/src/modules/network_element/repository/udm_auth.go b/src/modules/network_element/repository/udm_auth.go index d131964..2d1d58d 100644 --- a/src/modules/network_element/repository/udm_auth.go +++ b/src/modules/network_element/repository/udm_auth.go @@ -1,7 +1,7 @@ package repository import ( - "ems.agt/src/modules/network_element/model" + "be.ems/src/modules/network_element/model" ) // UDM鉴权信息 数据层接口 diff --git a/src/modules/network_element/repository/udm_auth.impl.go b/src/modules/network_element/repository/udm_auth.impl.go index bd45095..682ab8c 100644 --- a/src/modules/network_element/repository/udm_auth.impl.go +++ b/src/modules/network_element/repository/udm_auth.impl.go @@ -3,11 +3,11 @@ package repository import ( "strings" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/network_element/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_element/model" ) // 实例化数据层 UDMAuthImpl 结构体 diff --git a/src/modules/network_element/repository/udm_sub.go b/src/modules/network_element/repository/udm_sub.go index f2d202c..970639e 100644 --- a/src/modules/network_element/repository/udm_sub.go +++ b/src/modules/network_element/repository/udm_sub.go @@ -1,7 +1,7 @@ package repository import ( - "ems.agt/src/modules/network_element/model" + "be.ems/src/modules/network_element/model" ) // UDM签约信息 数据层接口 diff --git a/src/modules/network_element/repository/udm_sub.impl.go b/src/modules/network_element/repository/udm_sub.impl.go index db0c993..9a1dc91 100644 --- a/src/modules/network_element/repository/udm_sub.impl.go +++ b/src/modules/network_element/repository/udm_sub.impl.go @@ -4,11 +4,11 @@ import ( "strconv" "strings" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/network_element/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_element/model" ) // 实例化数据层 UDMSubImpl 结构体 diff --git a/src/modules/network_element/service/ne_direct_link.go b/src/modules/network_element/service/ne_direct_link.go index 596fd9a..5b239f1 100644 --- a/src/modules/network_element/service/ne_direct_link.go +++ b/src/modules/network_element/service/ne_direct_link.go @@ -6,16 +6,16 @@ import ( "strings" "time" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/fetch" - "ems.agt/src/modules/network_element/model" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" ) // NeState 获取网元端服务状态 func NeState(neInfo model.NeInfo) (map[string]any, error) { - // 网元直连 + // 网元状态 neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType)) - resBytes, err := fetch.Get(neUrl, nil, 200) + resBytes, err := fetch.Get(neUrl, nil, 250) if err != nil { logger.Warnf("NeState %s", err.Error()) return nil, err @@ -44,3 +44,37 @@ func NeState(neInfo model.NeInfo) (map[string]any, error) { "disk": resData["diskSpace"], }, nil } + +// NeConfigOMC 网元配置对端网管信息 +func NeConfigOMC(neInfo model.NeInfo) (map[string]any, error) { + // 网元配置对端网管信息 + neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType)) + resBytes, err := fetch.PutJSON(neUrl, map[string]any{ + "neId": neInfo.NeId, + "neName": neInfo.NeName, + "port": neInfo.Port, + "province": neInfo.Province, + "pvFlag": neInfo.PvFlag, + "rmUID": neInfo.RmUID, + "vendorName": neInfo.VendorName, + "dn": neInfo.Dn, + }, nil) + var resData map[string]any + if err != nil { + status := err.Error() + logger.Warnf("NeConfigOMC %s", status) + if strings.HasPrefix(status, "204") { + return resData, nil + } + return nil, err + } + + // 序列化结果 + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Warnf("NeConfigOMC Unmarshal %s", err.Error()) + return nil, err + } + + return resData, nil +} diff --git a/src/modules/network_element/service/ne_host.go b/src/modules/network_element/service/ne_host.go new file mode 100644 index 0000000..7b6f0c1 --- /dev/null +++ b/src/modules/network_element/service/ne_host.go @@ -0,0 +1,30 @@ +package service + +import "be.ems/src/modules/network_element/model" + +// INeHost 网元主机连接 服务层接口 +type INeHost interface { + // SelectPage 根据条件分页查询字典类型 + SelectPage(query map[string]any) map[string]any + + // 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) +} diff --git a/src/modules/network_element/service/ne_host.impl.go b/src/modules/network_element/service/ne_host.impl.go new file mode 100644 index 0000000..101c3c1 --- /dev/null +++ b/src/modules/network_element/service/ne_host.impl.go @@ -0,0 +1,92 @@ +package service + +import ( + "fmt" + + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) + +// 实例化服务层 NeHostImpl 结构体 +var NewNeHostImpl = &NeHostImpl{ + neHostRepository: repository.NewNeHostImpl, +} + +// NeHostImpl 网元主机连接 服务层处理 +type NeHostImpl struct { + // 网元主机连接表 + neHostRepository repository.INeHost +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { + return r.neHostRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { + return r.neHostRepository.SelectList(neHost) +} + +// SelectByIds 通过ID查询 +func (r *NeHostImpl) SelectById(hostId string) model.NeHost { + if hostId == "" { + return model.NeHost{} + } + neHosts := r.neHostRepository.SelectByIds([]string{hostId}) + if len(neHosts) > 0 { + return neHosts[0] + } + 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 { + return r.neHostRepository.Insert(neHost) +} + +// Update 修改信息 +func (r *NeHostImpl) Update(neHost model.NeHost) int64 { + 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 new file mode 100644 index 0000000..eaea5a3 --- /dev/null +++ b/src/modules/network_element/service/ne_host_cmd.go @@ -0,0 +1,27 @@ +package service + +import "be.ems/src/modules/network_element/model" + +// INeHostCmd 网元主机命令 服务层接口 +type INeHostCmd interface { + // SelectPage 根据条件分页查询字典类型 + SelectPage(query map[string]any) map[string]any + + // 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 +} diff --git a/src/modules/network_element/service/ne_host_cmd.impl.go b/src/modules/network_element/service/ne_host_cmd.impl.go new file mode 100644 index 0000000..a38c9ba --- /dev/null +++ b/src/modules/network_element/service/ne_host_cmd.impl.go @@ -0,0 +1,80 @@ +package service + +import ( + "fmt" + + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) + +// 实例化服务层 NeHostCmdImpl 结构体 +var NewNeHostCmdImpl = &NeHostCmdImpl{ + neHostCmdRepository: repository.NewNeHostCmdImpl, +} + +// NeHostCmdImpl 网元主机命令 服务层处理 +type NeHostCmdImpl struct { + // 网元主机命令表 + neHostCmdRepository repository.INeHostCmd +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { + return r.neHostCmdRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + return r.neHostCmdRepository.SelectList(neHostCmd) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmdImpl) SelectById(cmdId string) model.NeHostCmd { + if cmdId == "" { + return model.NeHostCmd{} + } + neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeHostCmd{} +} + +// Insert 新增信息 +func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { + return r.neHostCmdRepository.Insert(neHostCmd) +} + +// Update 修改信息 +func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { + return r.neHostCmdRepository.Update(neHostCmd) +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostCmdRepository.SelectByIds(cmdIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(ids) == len(cmdIds) { + rows := r.neHostCmdRepository.DeleteByIds(cmdIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmdImpl) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { + uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ + CmdType: cmdType, + GroupID: groupId, + Title: title, + }) + if uniqueId == cmdId { + return true + } + return uniqueId == "" +} diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index 6122504..a231b16 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -1,6 +1,6 @@ package service -import "ems.agt/src/modules/network_element/model" +import "be.ems/src/modules/network_element/model" // 网元信息 服务层接口 type INeInfo interface { @@ -13,6 +13,33 @@ type INeInfo interface { // ClearNeCacheByNeType 清除网元类型缓存 ClearNeCacheByNeType(neType string) bool - // SelectNeList 查询网元列表 - SelectNeList(ne model.NeInfo, bandStatus bool) []model.NeInfo + // SelectNeInfoByRmuid 通过rmUID查询网元信息 + SelectNeInfoByRmuid(rmUid string) model.NeInfo + + // SelectPage 根据条件分页查询 + // + // bandStatus 带状态信息 + SelectPage(query map[string]any, bandStatus bool) map[string]any + + // SelectList 查询列表 + // + // bandStatus 带状态信息 + SelectList(ne model.NeInfo, bandStatus 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, infoId string) bool } diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go index d2ae5c1..142b1cc 100644 --- a/src/modules/network_element/service/ne_info.impl.go +++ b/src/modules/network_element/service/ne_info.impl.go @@ -3,28 +3,32 @@ package service import ( "encoding/json" "fmt" + "strings" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/redis" - "ems.agt/src/modules/network_element/model" - "ems.agt/src/modules/network_element/repository" + "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" ) // 实例化服务层 NeInfoImpl 结构体 var NewNeInfoImpl = &NeInfoImpl{ neInfoRepository: repository.NewNeInfoImpl, + neHostRepository: repository.NewNeHostImpl, } // 网元信息 服务层处理 type NeInfoImpl struct { // 网元信息数据信息 neInfoRepository repository.INeInfo + // 网元主机连接表 + neHostRepository repository.INeHost } // 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, neType, neID) + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, neType, neID) jsonStr, _ := redis.Get("", key) if len(jsonStr) > 7 { err := json.Unmarshal([]byte(jsonStr), &neInfo) @@ -45,7 +49,7 @@ func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeIn // 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, neType, neID) + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, neType, neID) redis.Del("", key) neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) if neInfo.NeId == neID { @@ -69,9 +73,85 @@ func (r *NeInfoImpl) ClearNeCacheByNeType(neType string) bool { return delOk } -// SelectNeList 查询网元列表 -func (r *NeInfoImpl) SelectNeList(ne model.NeInfo, bandStatus bool) []model.NeInfo { - list := r.neInfoRepository.SelectNeList(ne) +// 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) + for _, v := range neInfos { + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, 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) + arr := &rows + for i := range *arr { + v := (*arr)[i] + result, err := NeState(v) + if err != nil { + (*arr)[i].ServerState = map[string]any{ + "online": false, + } + // 网元状态设置为离线 + if v.Status != "1" { + v.Status = "1" + r.neInfoRepository.Update(v) + } + continue + } + result["online"] = true + (*arr)[i].ServerState = result + // 网元状态设置为在线 + if v.Status != "0" { + // 下发网管配置信息给网元 + _, err = NeConfigOMC(v) + if err != nil { + v.Status = "3" + } else { + v.Status = "0" + } + r.neInfoRepository.Update(v) + } + } + } + + return data +} + +// SelectList 查询列表 +// +// bandStatus 带状态信息 +func (r *NeInfoImpl) SelectList(ne model.NeInfo, bandStatus bool) []model.NeInfo { + list := r.neInfoRepository.SelectList(ne) // 网元直连读取网元服务状态 if bandStatus { @@ -83,12 +163,130 @@ func (r *NeInfoImpl) SelectNeList(ne model.NeInfo, bandStatus bool) []model.NeIn (*neList)[i].ServerState = map[string]any{ "online": false, } + // 网元状态设置为离线 + if v.Status != "1" { + v.Status = "1" + r.neInfoRepository.Update(v) + } continue } result["online"] = true (*neList)[i].ServerState = result + // 网元状态设置为在线 + if v.Status != "0" { + // 下发网管配置信息给网元 + _, err = NeConfigOMC(v) + if err != nil { + v.Status = "3" + } else { + v.Status = "0" + } + r.neInfoRepository.Update(v) + } } } return list } + +// SelectByIds 通过ID查询 +// +// bandStatus 带主机信息 +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 { + neInfo := neInfos[0] + // 带主机信息 + if neInfo.HostIDs != "" && bandHost { + neInfo.Hosts = r.neHostRepository.SelectByIds(strings.Split(neInfo.HostIDs, ",")) + } + return neInfo + } + 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 := r.neHostRepository.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" + r.neHostRepository.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 != "" { + hostIds := strings.Split(v.HostIDs, ",") + r.neHostRepository.DeleteByIds(hostIds) + } + // 缓存信息删除 + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId) + redis.Del("", key) + } + rows := r.neInfoRepository.DeleteByIds(infoIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neType, neId, infoId string) bool { + uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ + NeType: neType, + NeId: neId, + }) + if uniqueId == infoId { + return true + } + return uniqueId == "" +} diff --git a/src/modules/network_element/service/ne_software.go b/src/modules/network_element/service/ne_software.go new file mode 100644 index 0000000..c4936ac --- /dev/null +++ b/src/modules/network_element/service/ne_software.go @@ -0,0 +1,33 @@ +package service + +import "be.ems/src/modules/network_element/model" + +// INeSoftware 网元软件包信息 服务层接口 +type INeSoftware interface { + // SelectPage 根据条件分页查询字典类型 + SelectPage(query map[string]any) map[string]any + + // 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) + + // SelectByVersionAndPath 通过文件版本和路径查询 + SelectByVersionAndPath(version, path string) model.NeSoftware + + // CheckUniqueTypeAndFileNameAndVersion 校验网元类型和文件名版本是否唯一 + CheckUniqueTypeAndFileNameAndVersion(neType, fileName, version, id string) bool + + // Install 安装软件包 + Install(neSoftware model.NeSoftware) (string, error) +} diff --git a/src/modules/network_element/service/ne_software.impl.go b/src/modules/network_element/service/ne_software.impl.go new file mode 100644 index 0000000..9978f4b --- /dev/null +++ b/src/modules/network_element/service/ne_software.impl.go @@ -0,0 +1,97 @@ +package service + +import ( + "fmt" + + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) + +// 实例化服务层 NeSoftwareImpl 结构体 +var NewNeSoftwareImpl = &NeSoftwareImpl{ + neSoftwareRepository: repository.NewNeSoftwareImpl, +} + +// NeSoftwareImpl 网元软件包信息 服务层处理 +type NeSoftwareImpl struct { + // 网元软件包信息 + neSoftwareRepository repository.INeSoftware +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { + return r.neSoftwareRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + return r.neSoftwareRepository.SelectList(neSoftware) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftwareImpl) SelectById(id string) model.NeSoftware { + if id == "" { + return model.NeSoftware{} + } + neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeSoftware{} +} + +// Insert 新增信息 +func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { + return r.neSoftwareRepository.Insert(neSoftware) +} + +// Update 修改信息 +func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { + return r.neSoftwareRepository.Update(neSoftware) +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftwareImpl) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rowIds := r.neSoftwareRepository.SelectByIds(ids) + if len(rowIds) <= 0 { + return 0, fmt.Errorf("neSoftware.noData") + } + + if len(rowIds) == len(ids) { + rows := r.neSoftwareRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// SelectByVersionAndPath 通过文件版本和路径查询 +func (r *NeSoftwareImpl) SelectByVersionAndPath(version, path string) model.NeSoftware { + neSoftwares := r.neSoftwareRepository.SelectList(model.NeSoftware{ + Version: version, + Path: path, + }) + if len(neSoftwares) > 0 { + return neSoftwares[0] + } + return model.NeSoftware{} +} + +// CheckUniqueTypeAndFileNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftwareImpl) CheckUniqueTypeAndFileNameAndVersion(neType, fileName, version, id string) bool { + uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndFileNameAndVersion(model.NeSoftware{ + NeType: neType, + FileName: fileName, + Version: version, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// Install 安装软件包 +func (r *NeSoftwareImpl) Install(neSoftware model.NeSoftware) (string, error) { + return "", nil +} diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go new file mode 100644 index 0000000..d0ebc05 --- /dev/null +++ b/src/modules/network_element/service/ne_version.go @@ -0,0 +1,30 @@ +package service + +import "be.ems/src/modules/network_element/model" + +// INeVersion 网元版本信息 服务层接口 +type INeVersion interface { + // SelectPage 根据条件分页查询字典类型 + SelectPage(query map[string]any) map[string]any + + // 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) + + // SelectByTypeAndID 通过网元类型和网元ID查询 + SelectByTypeAndID(neType, neId string) model.NeVersion + + // CheckUniqueTypeAndID 校验网元类型和网元ID是否唯一 + CheckUniqueTypeAndID(neType, neId, id string) bool +} diff --git a/src/modules/network_element/service/ne_version.impl.go b/src/modules/network_element/service/ne_version.impl.go new file mode 100644 index 0000000..d3f4f08 --- /dev/null +++ b/src/modules/network_element/service/ne_version.impl.go @@ -0,0 +1,91 @@ +package service + +import ( + "fmt" + + "be.ems/src/modules/network_element/model" + "be.ems/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") +} + +// SelectByTypeAndID 通过网元类型和网元ID查询 +func (r *NeVersionImpl) SelectByTypeAndID(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{} +} + +// CheckUniqueTypeAndID 校验网元类型和网元ID是否唯一 +func (r *NeVersionImpl) CheckUniqueTypeAndID(neType, neId, id string) bool { + uniqueId := r.neVersionRepository.CheckUniqueTypeAndID(model.NeVersion{ + NeType: neType, + NeId: neId, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} diff --git a/src/modules/network_element/service/perf_kpi.go b/src/modules/network_element/service/perf_kpi.go deleted file mode 100644 index decd5dc..0000000 --- a/src/modules/network_element/service/perf_kpi.go +++ /dev/null @@ -1,12 +0,0 @@ -package service - -import "ems.agt/src/modules/network_element/model" - -// 性能统计 数据层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery) []map[string]any - - // SelectGoldKPITitle - SelectGoldKPITitle(neType string) []model.GoldKPITitle -} diff --git a/src/modules/network_element/service/perf_kpi.impl.go b/src/modules/network_element/service/perf_kpi.impl.go deleted file mode 100644 index da2f7d0..0000000 --- a/src/modules/network_element/service/perf_kpi.impl.go +++ /dev/null @@ -1,38 +0,0 @@ -package service - -import ( - "ems.agt/src/modules/network_element/model" - "ems.agt/src/modules/network_element/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) -} diff --git a/src/modules/network_element/service/udm_auth.go b/src/modules/network_element/service/udm_auth.go index d2d3270..4ed5108 100644 --- a/src/modules/network_element/service/udm_auth.go +++ b/src/modules/network_element/service/udm_auth.go @@ -1,6 +1,6 @@ package service -import "ems.agt/src/modules/network_element/model" +import "be.ems/src/modules/network_element/model" // UDM鉴权信息 服务层接口 type IUDMAuth interface { diff --git a/src/modules/network_element/service/udm_auth.impl.go b/src/modules/network_element/service/udm_auth.impl.go index cd1ac30..a3c9689 100644 --- a/src/modules/network_element/service/udm_auth.impl.go +++ b/src/modules/network_element/service/udm_auth.impl.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "ems.agt/src/framework/redis" - "ems.agt/src/modules/network_element/model" - "ems.agt/src/modules/network_element/repository" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" ) // 实例化服务层 UDMAuthImpl 结构体 diff --git a/src/modules/network_element/service/udm_sub.go b/src/modules/network_element/service/udm_sub.go index 7da470a..14e5af5 100644 --- a/src/modules/network_element/service/udm_sub.go +++ b/src/modules/network_element/service/udm_sub.go @@ -1,6 +1,6 @@ package service -import "ems.agt/src/modules/network_element/model" +import "be.ems/src/modules/network_element/model" // UDM签约用户信息 服务层接口 type IUDMSub interface { diff --git a/src/modules/network_element/service/udm_sub.impl.go b/src/modules/network_element/service/udm_sub.impl.go index 3bc27c5..e031071 100644 --- a/src/modules/network_element/service/udm_sub.impl.go +++ b/src/modules/network_element/service/udm_sub.impl.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "ems.agt/src/framework/redis" - "ems.agt/src/modules/network_element/model" - "ems.agt/src/modules/network_element/repository" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" ) // 实例化服务层 UDMSubImpl 结构体 diff --git a/src/modules/system/controller/sys_config.go b/src/modules/system/controller/sys_config.go index 1ae3508..1b7258e 100644 --- a/src/modules/system/controller/sys_config.go +++ b/src/modules/system/controller/sys_config.go @@ -6,13 +6,13 @@ import ( "strings" "time" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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" diff --git a/src/modules/system/controller/sys_dept.go b/src/modules/system/controller/sys_dept.go index aaaffdb..6cb582c 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" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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 779a48d..a409a0c 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" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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" diff --git a/src/modules/system/controller/sys_dict_type.go b/src/modules/system/controller/sys_dict_type.go index f115c88..6a2bdf9 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" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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" diff --git a/src/modules/system/controller/sys_log_login.go b/src/modules/system/controller/sys_log_login.go index 294bb9c..3de3f4d 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" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - commonService "ems.agt/src/modules/common/service" - "ems.agt/src/modules/system/model" - "ems.agt/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" ) diff --git a/src/modules/system/controller/sys_log_operate.go b/src/modules/system/controller/sys_log_operate.go index ffedb36..566ecf5 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" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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 3cb023b..d601b29 100644 --- a/src/modules/system/controller/sys_menu.go +++ b/src/modules/system/controller/sys_menu.go @@ -1,16 +1,16 @@ package controller import ( - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/constants/menu" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/regular" - "ems.agt/src/framework/vo" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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_notice.go b/src/modules/system/controller/sys_notice.go deleted file mode 100644 index 00d0266..0000000 --- a/src/modules/system/controller/sys_notice.go +++ /dev/null @@ -1,127 +0,0 @@ -package controller - -import ( - "fmt" - "strings" - - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/src/modules/system/service" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" -) - -// 实例化控制层 SysNoticeController 结构体 -var NewSysNotice = &SysNoticeController{ - sysNoticeService: service.NewSysNoticeImpl, -} - -// 通知公告信息 -// -// PATH /system/notice -type SysNoticeController struct { - // 公告服务 - sysNoticeService service.ISysNotice -} - -// 通知公告列表 -// -// GET /list -func (s *SysNoticeController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - data := s.sysNoticeService.SelectNoticePage(querys) - c.JSON(200, result.Ok(data)) -} - -// 通知公告信息 -// -// GET /:noticeId -func (s *SysNoticeController) Info(c *gin.Context) { - noticeId := c.Param("noticeId") - if noticeId == "" { - c.JSON(400, result.CodeMsg(400, "parameter error")) - return - } - data := s.sysNoticeService.SelectNoticeById(noticeId) - if data.NoticeID == noticeId { - c.JSON(200, result.OkData(data)) - return - } - c.JSON(200, result.Err(nil)) -} - -// 通知公告新增 -// -// POST / -func (s *SysNoticeController) Add(c *gin.Context) { - var body model.SysNotice - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.NoticeID != "" { - c.JSON(400, result.CodeMsg(400, "parameter error")) - return - } - - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysNoticeService.InsertNotice(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) - return - } - c.JSON(200, result.Err(nil)) -} - -// 通知公告修改 -// -// PUT / -func (s *SysNoticeController) Edit(c *gin.Context) { - var body model.SysNotice - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.NoticeID == "" { - c.JSON(400, result.CodeMsg(400, "parameter error")) - return - } - - // 检查是否存在 - notice := s.sysNoticeService.SelectNoticeById(body.NoticeID) - if notice.NoticeID != body.NoticeID { - // 没有可访问公告信息数据! - c.JSON(200, result.ErrMsg("There is no accessible bulletin information data!")) - return - } - - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysNoticeService.UpdateNotice(body) - if rows > 0 { - c.JSON(200, result.Ok(nil)) - return - } - c.JSON(200, result.Err(nil)) -} - -// 通知公告删除 -// -// DELETE /:noticeIds -func (s *SysNoticeController) Remove(c *gin.Context) { - noticeIds := c.Param("noticeIds") - if noticeIds == "" { - c.JSON(400, result.CodeMsg(400, "parameter error")) - return - } - // 处理字符转id数组后去重 - ids := strings.Split(noticeIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return - } - rows, err := s.sysNoticeService.DeleteNoticeByIds(uniqueIDs) - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) - return - } - msg := fmt.Sprintf("Deleted successfully: %d", rows) - c.JSON(200, result.OkMsg(msg)) -} diff --git a/src/modules/system/controller/sys_post.go b/src/modules/system/controller/sys_post.go index 489bbde..53495e9 100644 --- a/src/modules/system/controller/sys_post.go +++ b/src/modules/system/controller/sys_post.go @@ -6,13 +6,13 @@ import ( "strings" "time" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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" diff --git a/src/modules/system/controller/sys_profile.go b/src/modules/system/controller/sys_profile.go index e094102..8b5669d 100644 --- a/src/modules/system/controller/sys_profile.go +++ b/src/modules/system/controller/sys_profile.go @@ -1,19 +1,19 @@ package controller import ( - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/admin" - "ems.agt/src/framework/constants/uploadsubpath" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/crypto" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/regular" - "ems.agt/src/framework/utils/token" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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" diff --git a/src/modules/system/controller/sys_role.go b/src/modules/system/controller/sys_role.go index a4170cc..eaa9f0f 100644 --- a/src/modules/system/controller/sys_role.go +++ b/src/modules/system/controller/sys_role.go @@ -6,14 +6,14 @@ import ( "strings" "time" - "ems.agt/src/framework/constants/admin" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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/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_user.go b/src/modules/system/controller/sys_user.go index 63202a8..7730bc9 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -6,18 +6,18 @@ import ( "strings" "time" - "ems.agt/src/framework/config" - "ems.agt/src/framework/constants/admin" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/file" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/regular" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/system/model" - "ems.agt/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" diff --git a/src/modules/system/repository/sys_config.go b/src/modules/system/repository/sys_config.go index ea7cb2b..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 "ems.agt/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 90d0d3d..9e499ca 100644 --- a/src/modules/system/repository/sys_config.impl.go +++ b/src/modules/system/repository/sys_config.impl.go @@ -1,15 +1,16 @@ package repository import ( + "fmt" "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysConfigImpl 结构体 @@ -185,11 +186,7 @@ func (r *SysConfigImpl) SelectConfigValueByKey(configKey string) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } @@ -234,11 +231,7 @@ func (r *SysConfigImpl) CheckUniqueConfig(sysConfig model.SysConfig) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/system/repository/sys_dept.go b/src/modules/system/repository/sys_dept.go index bc64d8f..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 "ems.agt/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 550d0eb..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" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 结构体 @@ -226,11 +226,7 @@ func (r *SysDeptImpl) CheckUniqueDept(sysDept model.SysDept) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/system/repository/sys_dict_data.go b/src/modules/system/repository/sys_dict_data.go index 050d697..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 "ems.agt/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 055762a..2a4331a 100644 --- a/src/modules/system/repository/sys_dict_data.impl.go +++ b/src/modules/system/repository/sys_dict_data.impl.go @@ -1,14 +1,15 @@ package repository import ( + "fmt" "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 结构体 @@ -219,11 +220,7 @@ func (r *SysDictDataImpl) CheckUniqueDictData(sysDictData model.SysDictData) str return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/system/repository/sys_dict_type.go b/src/modules/system/repository/sys_dict_type.go index 8a4f4ec..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 "ems.agt/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 0dd63b2..db59146 100644 --- a/src/modules/system/repository/sys_dict_type.impl.go +++ b/src/modules/system/repository/sys_dict_type.impl.go @@ -1,15 +1,16 @@ package repository import ( + "fmt" "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysDictTypeImpl 结构体 @@ -231,11 +232,7 @@ func (r *SysDictTypeImpl) CheckUniqueDictType(sysDictType model.SysDictType) str return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/system/repository/sys_log_login.go b/src/modules/system/repository/sys_log_login.go index 662e9fd..6fc0d69 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 "ems.agt/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 601bc5b..9a71977 100644 --- a/src/modules/system/repository/sys_log_login.impl.go +++ b/src/modules/system/repository/sys_log_login.impl.go @@ -4,12 +4,12 @@ import ( "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysLogLoginImpl 结构体 @@ -76,7 +76,7 @@ func (r *SysLogLoginImpl) SelectSysLogLoginPage(query map[string]any) map[string } if ok && beginTime != "" { conditions = append(conditions, "login_time >= ?") - beginDate := date.ParseStrToDate(beginTime.(string), date.YYYY_MM_DD) + beginDate := date.ParseStrToDate(beginTime.(string), date.YYYY_MM_DD_HH_MM_SS) params = append(params, beginDate.UnixMilli()) } endTime, ok := query["endTime"] @@ -85,7 +85,7 @@ func (r *SysLogLoginImpl) SelectSysLogLoginPage(query map[string]any) map[string } if ok && endTime != "" { conditions = append(conditions, "login_time <= ?") - endDate := date.ParseStrToDate(endTime.(string), date.YYYY_MM_DD) + endDate := date.ParseStrToDate(endTime.(string), date.YYYY_MM_DD_HH_MM_SS) params = append(params, endDate.UnixMilli()) } diff --git a/src/modules/system/repository/sys_log_operate.go b/src/modules/system/repository/sys_log_operate.go index e3f7be2..9f8a98c 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 "ems.agt/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 10d1f3b..18f5cb4 100644 --- a/src/modules/system/repository/sys_log_operate.impl.go +++ b/src/modules/system/repository/sys_log_operate.impl.go @@ -4,12 +4,12 @@ import ( "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysLogOperateImpl 结构体 @@ -89,7 +89,7 @@ func (r *SysLogOperateImpl) SelectSysLogOperatePage(query map[string]any) map[st } if ok && beginTime != "" { conditions = append(conditions, "oper_time >= ?") - beginDate := date.ParseStrToDate(beginTime.(string), date.YYYY_MM_DD) + beginDate := date.ParseStrToDate(beginTime.(string), date.YYYY_MM_DD_HH_MM_SS) params = append(params, beginDate.UnixMilli()) } endTime, ok := query["endTime"] @@ -98,7 +98,7 @@ func (r *SysLogOperateImpl) SelectSysLogOperatePage(query map[string]any) map[st } if ok && endTime != "" { conditions = append(conditions, "oper_time <= ?") - endDate := date.ParseStrToDate(endTime.(string), date.YYYY_MM_DD) + endDate := date.ParseStrToDate(endTime.(string), date.YYYY_MM_DD_HH_MM_SS) params = append(params, endDate.UnixMilli()) } diff --git a/src/modules/system/repository/sys_menu.go b/src/modules/system/repository/sys_menu.go index 6b5f4ea..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 "ems.agt/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 72975c0..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" - "ems.agt/src/framework/constants/menu" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 结构体 @@ -468,11 +468,7 @@ func (r *SysMenuImpl) CheckUniqueMenu(sysMenu model.SysMenu) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/system/repository/sys_notice.go b/src/modules/system/repository/sys_notice.go deleted file mode 100644 index cacb311..0000000 --- a/src/modules/system/repository/sys_notice.go +++ /dev/null @@ -1,24 +0,0 @@ -package repository - -import "ems.agt/src/modules/system/model" - -// ISysNotice 通知公告表 数据层接口 -type ISysNotice interface { - // SelectNoticePage 分页查询公告列表 - SelectNoticePage(query map[string]any) map[string]any - - // SelectNoticeList 查询公告列表 - SelectNoticeList(sysNotice model.SysNotice) []model.SysNotice - - // SelectNoticeById 查询公告信息 - SelectNoticeByIds(noticeIds []string) []model.SysNotice - - // InsertNotice 新增公告 - InsertNotice(sysNotice model.SysNotice) string - - // UpdateNotice 修改公告 - UpdateNotice(sysNotice model.SysNotice) int64 - - // DeleteNoticeByIds 批量删除公告信息 - DeleteNoticeByIds(noticeIds []string) int64 -} diff --git a/src/modules/system/repository/sys_notice.impl.go b/src/modules/system/repository/sys_notice.impl.go deleted file mode 100644 index f565ddb..0000000 --- a/src/modules/system/repository/sys_notice.impl.go +++ /dev/null @@ -1,297 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/system/model" -) - -// 实例化数据层 SysNoticeImpl 结构体 -var NewSysNoticeImpl = &SysNoticeImpl{ - selectSql: `select - notice_id, notice_title, notice_type, notice_content, status, del_flag, - create_by, create_time, update_by, update_time, remark from sys_notice`, - - resultMap: map[string]string{ - "notice_id": "NoticeID", - "notice_title": "NoticeTitle", - "notice_type": "NoticeType", - "notice_content": "NoticeContent", - "status": "Status", - "del_flag": "DelFlag", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "remark": "Remark", - }, -} - -// SysNoticeImpl 通知公告表 数据层处理 -type SysNoticeImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysNoticeImpl) convertResultRows(rows []map[string]any) []model.SysNotice { - arr := make([]model.SysNotice, 0) - for _, row := range rows { - sysNotice := model.SysNotice{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysNotice, keyMapper, value) - } - } - arr = append(arr, sysNotice) - } - return arr -} - -// SelectNoticePage 分页查询公告列表 -func (r *SysNoticeImpl) SelectNoticePage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["noticeTitle"]; ok && v != "" { - conditions = append(conditions, "notice_title like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["noticeType"]; ok && v != "" { - conditions = append(conditions, "notice_type = ?") - params = append(params, v) - } - if v, ok := query["createBy"]; ok && v != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - beginTime, ok := query["beginTime"] - if !ok { - beginTime, ok = query["params[beginTime]"] - } - if ok && beginTime != "" { - conditions = append(conditions, "create_time >= ?") - beginDate := date.ParseStrToDate(beginTime.(string), date.YYYY_MM_DD) - params = append(params, beginDate.UnixMilli()) - } - endTime, ok := query["endTime"] - if !ok { - endTime, ok = query["params[endTime]"] - } - if ok && endTime != "" { - conditions = append(conditions, "create_time <= ?") - endDate := date.ParseStrToDate(endTime.(string), date.YYYY_MM_DD) - params = append(params, endDate.UnixMilli()) - } - - // 构建查询条件语句 - whereSql := " where del_flag = '0' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysNotice{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from sys_notice" - 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 -} - -// SelectNoticeList 查询公告列表 -func (r *SysNoticeImpl) SelectNoticeList(sysNotice model.SysNotice) []model.SysNotice { - // 查询条件拼接 - var conditions []string - var params []any - if sysNotice.NoticeTitle != "" { - conditions = append(conditions, "notice_title like concat(?, '%')") - params = append(params, sysNotice.NoticeTitle) - } - if sysNotice.NoticeType != "" { - conditions = append(conditions, "notice_type = ?") - params = append(params, sysNotice.NoticeType) - } - if sysNotice.CreateBy != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, sysNotice.CreateBy) - } - if sysNotice.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, sysNotice.Status) - } - - // 构建查询条件语句 - whereSql := " where del_flag = '0' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysNotice{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectNoticeByIds 查询公告信息 -func (r *SysNoticeImpl) SelectNoticeByIds(noticeIds []string) []model.SysNotice { - placeholder := repo.KeyPlaceholderByQuery(len(noticeIds)) - querySql := r.selectSql + " where notice_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(noticeIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysNotice{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// InsertNotice 新增公告 -func (r *SysNoticeImpl) InsertNotice(sysNotice model.SysNotice) string { - // 参数拼接 - params := make(map[string]any) - if sysNotice.NoticeTitle != "" { - params["notice_title"] = sysNotice.NoticeTitle - } - if sysNotice.NoticeType != "" { - params["notice_type"] = sysNotice.NoticeType - } - if sysNotice.NoticeContent != "" { - params["notice_content"] = sysNotice.NoticeContent - } - if sysNotice.Status != "" { - params["status"] = sysNotice.Status - } - if sysNotice.Remark != "" { - params["remark"] = sysNotice.Remark - } - if sysNotice.CreateBy != "" { - params["create_by"] = sysNotice.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_notice (" + 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 -} - -// UpdateNotice 修改公告 -func (r *SysNoticeImpl) UpdateNotice(sysNotice model.SysNotice) int64 { - // 参数拼接 - params := make(map[string]any) - if sysNotice.NoticeTitle != "" { - params["notice_title"] = sysNotice.NoticeTitle - } - if sysNotice.NoticeType != "" { - params["notice_type"] = sysNotice.NoticeType - } - if sysNotice.NoticeContent != "" { - params["notice_content"] = sysNotice.NoticeContent - } - if sysNotice.Status != "" { - params["status"] = sysNotice.Status - } - if sysNotice.Remark != "" { - params["remark"] = sysNotice.Remark - } - if sysNotice.UpdateBy != "" { - params["update_by"] = sysNotice.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_notice set " + strings.Join(keys, ",") + " where notice_id = ?" - - // 执行更新 - values = append(values, sysNotice.NoticeID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteNoticeByIds 批量删除公告信息 -func (r *SysNoticeImpl) DeleteNoticeByIds(noticeIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(noticeIds)) - sql := "update sys_notice set del_flag = '1' where notice_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(noticeIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("update err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/system/repository/sys_post.go b/src/modules/system/repository/sys_post.go index 98bf3e4..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 "ems.agt/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 184c98b..c200811 100644 --- a/src/modules/system/repository/sys_post.impl.go +++ b/src/modules/system/repository/sys_post.impl.go @@ -1,14 +1,15 @@ package repository import ( + "fmt" "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 结构体 @@ -314,11 +315,7 @@ func (r *SysPostImpl) CheckUniquePost(sysPost model.SysPost) string { logger.Errorf("query err %v", err) } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/system/repository/sys_role.go b/src/modules/system/repository/sys_role.go index cf259b5..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 "ems.agt/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 719ee4e..10e5532 100644 --- a/src/modules/system/repository/sys_role.impl.go +++ b/src/modules/system/repository/sys_role.impl.go @@ -1,15 +1,16 @@ package repository import ( + "fmt" "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/src/modules/system/model" + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysRoleImpl 结构体 @@ -371,11 +372,7 @@ func (r *SysRoleImpl) CheckUniqueRole(sysRole model.SysRole) string { return "" } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/system/repository/sys_role_dept.go b/src/modules/system/repository/sys_role_dept.go index 28c034f..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 "ems.agt/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 c6e3ce9..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" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 5a2def7..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 "ems.agt/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 7c7ecf1..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" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 b79ab0e..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 "ems.agt/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 05d47c9..89209e3 100644 --- a/src/modules/system/repository/sys_user.impl.go +++ b/src/modules/system/repository/sys_user.impl.go @@ -1,16 +1,17 @@ package repository import ( + "fmt" "strings" "time" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/crypto" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/system/model" ) // 实例化数据层 SysUserImpl 结构体 @@ -557,11 +558,7 @@ func (r *SysUserImpl) CheckUniqueUser(sysUser model.SysUser) string { logger.Errorf("query err %v", err) } if len(results) > 0 { - v, ok := results[0]["str"].(string) - if ok { - return v - } - return "" + return fmt.Sprint(results[0]["str"]) } return "" } diff --git a/src/modules/system/repository/sys_user_post.go b/src/modules/system/repository/sys_user_post.go index 2d2060b..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 "ems.agt/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 cd6b937..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" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 b6af57c..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 "ems.agt/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 f44a219..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" - "ems.agt/src/framework/datasource" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/repo" - "ems.agt/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 6e9be4e..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 "ems.agt/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 6fbfd19..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" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/redis" - "ems.agt/src/modules/system/model" - "ems.agt/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 db995fc..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 ( - "ems.agt/src/framework/vo" - "ems.agt/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 c718df6..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" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/vo" - "ems.agt/src/modules/system/model" - "ems.agt/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 802a7f7..716eb2a 100644 --- a/src/modules/system/service/sys_dict_data.go +++ b/src/modules/system/service/sys_dict_data.go @@ -1,6 +1,6 @@ package service -import "ems.agt/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysDictData 字典类型数据 服务层接口 type ISysDictData interface { diff --git a/src/modules/system/service/sys_dict_data.impl.go b/src/modules/system/service/sys_dict_data.impl.go index 735c21d..13dcf89 100644 --- a/src/modules/system/service/sys_dict_data.impl.go +++ b/src/modules/system/service/sys_dict_data.impl.go @@ -3,8 +3,8 @@ package service import ( "fmt" - "ems.agt/src/modules/system/model" - "ems.agt/src/modules/system/repository" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysDictDataImpl 结构体 diff --git a/src/modules/system/service/sys_dict_type.go b/src/modules/system/service/sys_dict_type.go index a2a1446..5171d22 100644 --- a/src/modules/system/service/sys_dict_type.go +++ b/src/modules/system/service/sys_dict_type.go @@ -1,6 +1,6 @@ package service -import "ems.agt/src/modules/system/model" +import "be.ems/src/modules/system/model" // ISysDictType 字典类型 服务层接口 type ISysDictType interface { diff --git a/src/modules/system/service/sys_dict_type.impl.go b/src/modules/system/service/sys_dict_type.impl.go index dae0a61..4f8c6d5 100644 --- a/src/modules/system/service/sys_dict_type.impl.go +++ b/src/modules/system/service/sys_dict_type.impl.go @@ -4,11 +4,11 @@ import ( "encoding/json" "fmt" - "ems.agt/src/framework/constants/cachekey" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/redis" - "ems.agt/src/modules/system/model" - "ems.agt/src/modules/system/repository" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/redis" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" ) // 实例化服务层 SysDictTypeImpl 结构体 diff --git a/src/modules/system/service/sys_log_login.go b/src/modules/system/service/sys_log_login.go index 90d5d11..2bda2f4 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 "ems.agt/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 e3db000..83fe9a2 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 ( - "ems.agt/src/modules/system/model" - "ems.agt/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 5441119..8a7eeb2 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 "ems.agt/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 6c40be5..540e5fd 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 ( - "ems.agt/src/modules/system/model" - "ems.agt/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 f7648b5..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 ( - "ems.agt/src/framework/vo" - "ems.agt/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 f516595..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" - "ems.agt/src/framework/constants/common" - "ems.agt/src/framework/constants/menu" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/utils/regular" - "ems.agt/src/framework/vo" - "ems.agt/src/modules/system/model" - "ems.agt/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_notice.go b/src/modules/system/service/sys_notice.go deleted file mode 100644 index 78244f0..0000000 --- a/src/modules/system/service/sys_notice.go +++ /dev/null @@ -1,24 +0,0 @@ -package service - -import "ems.agt/src/modules/system/model" - -// ISysNotice 公告 服务层接口 -type ISysNotice interface { - // SelectNoticePage 分页查询公告列表 - SelectNoticePage(query map[string]any) map[string]any - - // SelectNoticeList 查询公告列表 - SelectNoticeList(sysNotice model.SysNotice) []model.SysNotice - - // SelectNoticeById 查询公告信息 - SelectNoticeById(noticeId string) model.SysNotice - - // InsertNotice 新增公告 - InsertNotice(sysNotice model.SysNotice) string - - // UpdateNotice 修改公告 - UpdateNotice(sysNotice model.SysNotice) int64 - - // DeleteNoticeByIds 批量删除公告信息 - DeleteNoticeByIds(noticeIds []string) (int64, error) -} diff --git a/src/modules/system/service/sys_notice.impl.go b/src/modules/system/service/sys_notice.impl.go deleted file mode 100644 index 5f8446e..0000000 --- a/src/modules/system/service/sys_notice.impl.go +++ /dev/null @@ -1,73 +0,0 @@ -package service - -import ( - "fmt" - - "ems.agt/src/modules/system/model" - "ems.agt/src/modules/system/repository" -) - -// 实例化服务层 SysNoticeImpl 结构体 -var NewSysNoticeImpl = &SysNoticeImpl{ - sysNoticeRepository: repository.NewSysNoticeImpl, -} - -// SysNoticeImpl 公告 服务层处理 -type SysNoticeImpl struct { - // 公告服务 - sysNoticeRepository repository.ISysNotice -} - -// SelectNoticePage 分页查询公告列表 -func (r *SysNoticeImpl) SelectNoticePage(query map[string]any) map[string]any { - return r.sysNoticeRepository.SelectNoticePage(query) -} - -// SelectNoticeList 查询公告列表 -func (r *SysNoticeImpl) SelectNoticeList(sysNotice model.SysNotice) []model.SysNotice { - return r.sysNoticeRepository.SelectNoticeList(sysNotice) -} - -// SelectNoticeById 查询公告信息 -func (r *SysNoticeImpl) SelectNoticeById(noticeId string) model.SysNotice { - if noticeId == "" { - return model.SysNotice{} - } - configs := r.sysNoticeRepository.SelectNoticeByIds([]string{noticeId}) - if len(configs) > 0 { - return configs[0] - } - return model.SysNotice{} -} - -// InsertNotice 新增公告 -func (r *SysNoticeImpl) InsertNotice(sysNotice model.SysNotice) string { - return r.sysNoticeRepository.InsertNotice(sysNotice) -} - -// UpdateNotice 修改公告 -func (r *SysNoticeImpl) UpdateNotice(sysNotice model.SysNotice) int64 { - return r.sysNoticeRepository.UpdateNotice(sysNotice) -} - -// DeleteNoticeByIds 批量删除公告信息 -func (r *SysNoticeImpl) DeleteNoticeByIds(noticeIds []string) (int64, error) { - // 检查是否存在 - notices := r.sysNoticeRepository.SelectNoticeByIds(noticeIds) - if len(notices) <= 0 { - return 0, fmt.Errorf("there is no accessible bulletin information data") - } - for _, notice := range notices { - // 检查是否为已删除 - if notice.DelFlag == "1" { - // 【%s】公告信息已经删除! - return 0, fmt.Errorf("the [%s] announcement message has been deleted", notice.NoticeID) - } - } - if len(notices) == len(noticeIds) { - rows := r.sysNoticeRepository.DeleteNoticeByIds(noticeIds) - return rows, nil - } - // 删除公告信息失败! - return 0, fmt.Errorf("failed to delete the announcement message") -} diff --git a/src/modules/system/service/sys_post.go b/src/modules/system/service/sys_post.go index 5903384..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 "ems.agt/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 c402893..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" - "ems.agt/src/modules/system/model" - "ems.agt/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 cc4d301..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 "ems.agt/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 ebc5b09..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" - "ems.agt/src/modules/system/model" - "ems.agt/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 cc38da5..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 "ems.agt/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 aceeeda..d188627 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" - "ems.agt/src/framework/constants/admin" - "ems.agt/src/modules/system/model" - "ems.agt/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 5838cdb..407a94e 100644 --- a/src/modules/system/system.go +++ b/src/modules/system/system.go @@ -1,12 +1,12 @@ package system import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/src/framework/middleware/collectlogs" - "ems.agt/src/framework/middleware/repeat" - "ems.agt/src/modules/system/controller" - "ems.agt/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" ) diff --git a/src/modules/trace/controller/tcpdump.go b/src/modules/trace/controller/tcpdump.go index abc2877..c932dd0 100644 --- a/src/modules/trace/controller/tcpdump.go +++ b/src/modules/trace/controller/tcpdump.go @@ -1,10 +1,10 @@ package controller import ( - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/vo/result" - traceService "ems.agt/src/modules/trace/service" + "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" ) diff --git a/src/modules/trace/service/tcpdump.impl.go b/src/modules/trace/service/tcpdump.impl.go index 930e317..938fd74 100644 --- a/src/modules/trace/service/tcpdump.impl.go +++ b/src/modules/trace/service/tcpdump.impl.go @@ -5,11 +5,11 @@ import ( "strings" "time" - "ems.agt/src/framework/cmd" - "ems.agt/src/framework/config" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - neService "ems.agt/src/modules/network_element/service" + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/cmd" + "be.ems/src/framework/utils/date" + neService "be.ems/src/modules/network_element/service" ) // 实例化服务层 TcpdumpImpl 结构体 diff --git a/src/modules/trace/trace.go b/src/modules/trace/trace.go index 2fb9f27..f045f70 100644 --- a/src/modules/trace/trace.go +++ b/src/modules/trace/trace.go @@ -1,10 +1,10 @@ package trace import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/src/framework/middleware/collectlogs" - "ems.agt/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" "github.com/gin-gonic/gin" ) diff --git a/src/modules/ws/controller/ws.go b/src/modules/ws/controller/ws.go index 1257f59..b9051c4 100644 --- a/src/modules/ws/controller/ws.go +++ b/src/modules/ws/controller/ws.go @@ -1,14 +1,22 @@ package controller import ( + "encoding/json" + "fmt" + "strconv" "strings" + "time" - "ems.agt/src/framework/i18n" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/ctx" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/ws/service" + neService "be.ems/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/parse" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/utils/telnet" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/service" "github.com/gin-gonic/gin" ) @@ -16,6 +24,7 @@ import ( var NewWSController = &WSController{ wsService: service.NewWSImpl, wsSendService: service.NewWSSendImpl, + neHostService: neService.NewNeHostImpl, } // WebSocket通信 @@ -26,6 +35,8 @@ type WSController struct { wsService service.IWS // WebSocket消息发送 服务 wsSendService service.IWSSend + // 网元主机连接服务 + neHostService neService.INeHost } // 通用 @@ -60,10 +71,11 @@ func (s *WSController) WS(c *gin.Context) { } defer conn.Close() - wsClient := s.wsService.NewClient(loginUser.UserID, subGroupIDs, conn) + wsClient := s.wsService.NewClient(loginUser.UserID, subGroupIDs, conn, nil) // 等待停止信号 for value := range wsClient.StopChan { + s.wsService.CloseClient(wsClient.ID) logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) return } @@ -102,3 +114,188 @@ 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) + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 连接主机ID + hostId := c.Query("hostId") + if hostId == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + neHost := s.neHostService.SelectById(hostId) + if neHost.HostID != hostId || neHost.HostType != "ssh" { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + // 创建链接SSH客户端 + var connSSH ssh.ConnSSH + neHost.CopyTo(&connSSH) + client, err := connSSH.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + + // 终端单行字符数 + cols, err := strconv.Atoi(c.Query("cols")) + if err != nil { + cols = 80 + } + // 终端显示行数 + rows, err := strconv.Atoi(c.Query("rows")) + if err != nil { + rows = 40 + } + + // 创建SSH客户端会话 + clientSession, err := client.NewClientSession(cols, 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.NewClient(loginUser.UserID, nil, wsConn, clientSession) + + // 实时读取SSH消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + go func() { + for ms := range 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", 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 + } + } + } + }() + + // 等待停止信号 + for value := range wsClient.StopChan { + s.wsService.CloseClient(wsClient.ID) + logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) + return + } +} + +// Telnet终端 +// +// GET /telnet?hostId=1 +func (s *WSController) Telnet(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 + } + + // 连接主机ID + hostId := c.Query("hostId") + if hostId == "" { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + neHost := s.neHostService.SelectById(hostId) + if neHost.HostID != 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() + 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.NewClient(loginUser.UserID, nil, wsConn, clientSession) + + // 实时读取Telnet消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + go func() { + for ms := range 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", 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 + } + } + } + }() + + // 等待停止信号 + for value := range wsClient.StopChan { + s.wsService.CloseClient(wsClient.ID) + logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) + return + } +} diff --git a/src/modules/ws/model/ws.go b/src/modules/ws/model/ws.go index 130419c..759195f 100644 --- a/src/modules/ws/model/ws.go +++ b/src/modules/ws/model/ws.go @@ -4,13 +4,14 @@ import "github.com/gorilla/websocket" // WSClient ws客户端 type WSClient struct { - ID string // 连接ID-随机字符串16位 + ID string // 客户端连接ID-随机字符串16位 Conn *websocket.Conn // 连接实例 LastHeartbeat int64 // 最近一次心跳消息(毫秒) BindUid string // 绑定登录用户ID SubGroup []string // 订阅组ID MsgChan chan []byte // 消息通道 StopChan chan struct{} // 停止信号-退出协程 + ChildConn any // 子连接实例-携带某种连接会话 } // WSRequest ws消息接收 diff --git a/src/modules/ws/processor/cdr_connect.go b/src/modules/ws/processor/cdr_connect.go index 607e26e..cc97f79 100644 --- a/src/modules/ws/processor/cdr_connect.go +++ b/src/modules/ws/processor/cdr_connect.go @@ -4,10 +4,10 @@ import ( "encoding/json" "fmt" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/vo/result" - neDataModel "ems.agt/src/modules/network_data/model" - neDataService "ems.agt/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" ) // GetCDRConnect 获取CDR会话事件-IMS diff --git a/src/modules/ws/processor/ne_state.go b/src/modules/ws/processor/ne_state.go index 38d9baf..dcf5df1 100644 --- a/src/modules/ws/processor/ne_state.go +++ b/src/modules/ws/processor/ne_state.go @@ -4,9 +4,9 @@ import ( "encoding/json" "fmt" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/vo/result" - neService "ems.agt/src/modules/network_element/service" + "be.ems/src/framework/logger" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" ) // GetNeState 获取网元服务状态 diff --git a/src/modules/ws/processor/net_connect.go b/src/modules/ws/processor/net_connect.go index d38c3ca..6530d0c 100644 --- a/src/modules/ws/processor/net_connect.go +++ b/src/modules/ws/processor/net_connect.go @@ -5,9 +5,9 @@ import ( "fmt" "strings" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/vo/result" - "ems.agt/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/v3/net" "github.com/shirou/gopsutil/v3/process" ) diff --git a/src/modules/ws/processor/ps_process.go b/src/modules/ws/processor/ps_process.go index 03238c0..45fe6ff 100644 --- a/src/modules/ws/processor/ps_process.go +++ b/src/modules/ws/processor/ps_process.go @@ -7,11 +7,11 @@ import ( "strings" "sync" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/date" - "ems.agt/src/framework/utils/parse" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/ws/model" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/model" "github.com/shirou/gopsutil/v3/process" ) diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index e43ecc9..29caace 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" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/vo/result" - neDataModel "ems.agt/src/modules/network_data/model" - neDataService "ems.agt/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" ) // GetUEConnect 获取UE会话事件-AMF diff --git a/src/modules/ws/processor/upf_total_flow.go b/src/modules/ws/processor/upf_total_flow.go index 5c1feb7..9a86786 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" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/vo/result" - neDataService "ems.agt/src/modules/network_data/service" - neService "ems.agt/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) diff --git a/src/modules/ws/service/ws.go b/src/modules/ws/service/ws.go index f404c14..32c15f3 100644 --- a/src/modules/ws/service/ws.go +++ b/src/modules/ws/service/ws.go @@ -3,7 +3,7 @@ package service import ( "net/http" - "ems.agt/src/modules/ws/model" + "be.ems/src/modules/ws/model" "github.com/gorilla/websocket" ) @@ -12,9 +12,14 @@ type IWS interface { // UpgraderWs http升级ws请求 UpgraderWs(w http.ResponseWriter, r *http.Request) *websocket.Conn - // NewClient 新建客户端 uid 登录用户ID - NewClient(uid string, gids []string, conn *websocket.Conn) *model.WSClient + // NewClient 新建客户端 + // + // uid 登录用户ID + // groupIDs 用户订阅组 + // conn ws连接实例 + // childConn 子连接实例 + NewClient(uid string, groupIDs []string, conn *websocket.Conn, childConn any) *model.WSClient - // CloseClient 客户端关闭 + // CloseClient 关闭客户端 CloseClient(clientID string) } diff --git a/src/modules/ws/service/ws.impl.go b/src/modules/ws/service/ws.impl.go index 350979d..71c2615 100644 --- a/src/modules/ws/service/ws.impl.go +++ b/src/modules/ws/service/ws.impl.go @@ -6,10 +6,10 @@ import ( "sync" "time" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/utils/generate" - "ems.agt/src/framework/vo/result" - "ems.agt/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" ) @@ -50,8 +50,13 @@ func (s *WSImpl) UpgraderWs(w http.ResponseWriter, r *http.Request) *websocket.C return conn } -// NewClient 新建客户端 uid 登录用户ID -func (s *WSImpl) NewClient(uid string, groupIDs []string, conn *websocket.Conn) *model.WSClient { +// NewClient 新建客户端 +// +// uid 登录用户ID +// groupIDs 用户订阅组 +// conn ws连接实例 +// childConn 子连接实例 +func (s *WSImpl) NewClient(uid string, groupIDs []string, conn *websocket.Conn, childConn any) *model.WSClient { // clientID也可以用其他方式生成,只要能保证在所有服务端中都能保证唯一即可 clientID := generate.Code(16) @@ -63,6 +68,7 @@ func (s *WSImpl) NewClient(uid string, groupIDs []string, conn *websocket.Conn) SubGroup: groupIDs, MsgChan: make(chan []byte, 100), StopChan: make(chan struct{}, 1), // 卡死循环标记 + ChildConn: childConn, } // 存入客户端 @@ -127,17 +133,18 @@ func (s *WSImpl) clientRead(wsClient *model.WSClient) { s.CloseClient(wsClient.ID) return } + // fmt.Println(messageType, string(msg)) // 文本和二进制类型,只处理文本json if messageType == websocket.TextMessage { var reqMsg model.WSRequest err := json.Unmarshal(msg, &reqMsg) - // fmt.Println(messageType, string(msg)) if err != nil { msgByte, _ := json.Marshal(result.ErrMsg("message format not supported")) wsClient.MsgChan <- msgByte } else { - go NewWSReceiveImpl.Receive(wsClient, reqMsg) + // 协程异步处理 + go NewWSReceiveImpl.AsyncReceive(wsClient, reqMsg) } } } @@ -173,8 +180,8 @@ func (s *WSImpl) CloseClient(clientID string) { defer func() { client.Conn.WriteMessage(websocket.CloseMessage, []byte{}) client.Conn.Close() - client.StopChan <- struct{}{} WsClients.Delete(clientID) + client.StopChan <- struct{}{} }() // 客户端断线时自动踢出Uid绑定列表 diff --git a/src/modules/ws/service/ws_receive.go b/src/modules/ws/service/ws_receive.go index 0a1d8e0..06b2362 100644 --- a/src/modules/ws/service/ws_receive.go +++ b/src/modules/ws/service/ws_receive.go @@ -1,9 +1,9 @@ package service -import "ems.agt/src/modules/ws/model" +import "be.ems/src/modules/ws/model" // IWSReceive WebSocket消息接收处理 服务层接口 type IWSReceive interface { - // Receive 接收处理 - Receive(client *model.WSClient, reqMsg model.WSRequest) error + // AsyncReceive 接收业务异步处理 + AsyncReceive(client *model.WSClient, reqMsg model.WSRequest) } diff --git a/src/modules/ws/service/ws_receive.impl.go b/src/modules/ws/service/ws_receive.impl.go index 454878d..00648e2 100644 --- a/src/modules/ws/service/ws_receive.impl.go +++ b/src/modules/ws/service/ws_receive.impl.go @@ -3,11 +3,14 @@ package service import ( "encoding/json" "fmt" + "time" - "ems.agt/src/framework/logger" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/ws/model" - "ems.agt/src/modules/ws/processor" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/utils/telnet" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/model" + "be.ems/src/modules/ws/processor" ) // 实例化服务层 WSReceiveImpl 结构体 @@ -16,11 +19,12 @@ var NewWSReceiveImpl = &WSReceiveImpl{} // WSReceiveImpl WebSocket消息接收处理 服务层处理 type WSReceiveImpl struct{} -// Receive 接收处理 -func (s *WSReceiveImpl) Receive(client *model.WSClient, reqMsg model.WSRequest) { +// AsyncReceive 接收业务异步处理 +func (s *WSReceiveImpl) AsyncReceive(client *model.WSClient, reqMsg model.WSRequest) { + // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Warnf("ws ReceiveMessage UID %s err: %s", client.BindUid, msg) + logger.Infof("ws AsyncReceive UID %s err: %s", client.BindUid, msg) msgByte, _ := json.Marshal(result.ErrMsg(msg)) client.MsgChan <- msgByte return @@ -30,6 +34,35 @@ func (s *WSReceiveImpl) Receive(client *model.WSClient, reqMsg model.WSRequest) 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{}{} + 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) + } + case "telnet": + // Telnet会话消息接收直接写入会话 + command := reqMsg.Data.(string) + telnetClientSession := client.ChildConn.(*telnet.TelnetClientSession) + _, err = telnetClientSession.Write(command) case "ps": resByte, err = processor.GetProcessData(reqMsg.RequestID, reqMsg.Data) case "net": @@ -47,10 +80,12 @@ func (s *WSReceiveImpl) Receive(client *model.WSClient, reqMsg model.WSRequest) } if err != nil { - logger.Warnf("ws ReceiveMessage UID %s err: %s", client.BindUid, err.Error()) + logger.Warnf("ws AsyncReceive UID %s err: %s", client.BindUid, err.Error()) msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) client.MsgChan <- msgByte return } - client.MsgChan <- resByte + if len(resByte) > 0 { + client.MsgChan <- resByte + } } diff --git a/src/modules/ws/service/ws_send.impl.go b/src/modules/ws/service/ws_send.impl.go index 8db8fcd..0720cc2 100644 --- a/src/modules/ws/service/ws_send.impl.go +++ b/src/modules/ws/service/ws_send.impl.go @@ -4,8 +4,8 @@ import ( "encoding/json" "fmt" - "ems.agt/src/framework/vo/result" - "ems.agt/src/modules/ws/model" + "be.ems/src/framework/vo/result" + "be.ems/src/modules/ws/model" ) // 订阅组指定编号为支持服务器向客户端主动推送数据 diff --git a/src/modules/ws/ws.go b/src/modules/ws/ws.go index ee83ea3..cfca832 100644 --- a/src/modules/ws/ws.go +++ b/src/modules/ws/ws.go @@ -1,10 +1,10 @@ package ws import ( - "ems.agt/src/framework/logger" - "ems.agt/src/framework/middleware" - "ems.agt/src/framework/middleware/collectlogs" - "ems.agt/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" ) @@ -18,10 +18,19 @@ func Setup(router *gin.Engine) { { wsGroup.GET("", middleware.PreAuthorize(nil), - collectlogs.OperateLog(collectlogs.OptionNew("WS Subscription", collectlogs.BUSINESS_TYPE_OTHER)), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), controller.NewWSController.WS, ) - + wsGroup.GET("/ssh", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewWSController.SSH, + ) + wsGroup.GET("/telnet", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ws", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewWSController.Telnet, + ) wsGroup.GET("/test", middleware.PreAuthorize(nil), controller.NewWSController.Test,