From 56310cc3c986fe8d736dc8129797b2ac96f911d0 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 8 Dec 2023 10:32:06 +0800 Subject: [PATCH] =?UTF-8?q?marge:=20=E5=90=88=E5=B9=B6=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/fm/email.go | 16 +- features/mml/mml.go | 217 ++++++++++++++++-- restagent/etc/restconf.yaml | 10 +- restagent/makefile | 2 +- restagent/static/helpDoc/zh_doc.pdf | Bin 0 -> 7816687 bytes restagent/static/logo/en_brand.png | Bin 0 -> 42655 bytes restagent/static/logo/en_icon.png | Bin 0 -> 16488 bytes restagent/static/logo/zh_brand.png | Bin 0 -> 24521 bytes restagent/static/logo/zh_icon.png | Bin 0 -> 49131 bytes .../config/config/config.default.yaml | 2 +- src/modules/common/common.go | 6 +- src/modules/common/controller/common.go | 12 +- src/modules/common/service/commont.impl.go | 6 + .../network_element/controller/perf_kpi.go | 90 ++++++++ src/modules/network_element/model/perf_kpi.go | 11 + .../network_element/network_element.go | 13 ++ .../network_element/repository/perf_kpi.go | 12 + .../repository/perf_kpi.impl.go | 77 +++++++ .../repository/udm_auth.impl.go | 2 +- .../repository/udm_sub.impl.go | 4 +- .../network_element/service/perf_kpi.go | 12 + .../network_element/service/perf_kpi.impl.go | 31 +++ 22 files changed, 473 insertions(+), 50 deletions(-) create mode 100644 restagent/static/helpDoc/zh_doc.pdf create mode 100644 restagent/static/logo/en_brand.png create mode 100644 restagent/static/logo/en_icon.png create mode 100644 restagent/static/logo/zh_brand.png create mode 100644 restagent/static/logo/zh_icon.png create mode 100644 src/modules/network_element/controller/perf_kpi.go create mode 100644 src/modules/network_element/model/perf_kpi.go create mode 100644 src/modules/network_element/repository/perf_kpi.go create mode 100644 src/modules/network_element/repository/perf_kpi.impl.go create mode 100644 src/modules/network_element/service/perf_kpi.go create mode 100644 src/modules/network_element/service/perf_kpi.impl.go diff --git a/features/fm/email.go b/features/fm/email.go index 24af203..2b87f41 100644 --- a/features/fm/email.go +++ b/features/fm/email.go @@ -20,11 +20,12 @@ func AlarmEmailForward(alarmData *Alarm) error {
Alarm information
Sequence: %d
NE name: %s
-Title: %s
-Severity: %s
-Event Time: %s
-Automatic send by OMC, don't reply!
- `, alarmData.AlarmSeq, alarmData.NeName, alarmData.AlarmTitle, alarmData.OrigSeverity, alarmData.EventTime) +Title: %s
+Severity: %s
+Event Time: %s
+Alarm Status: %d
+Automatic sent by OMC, please do not reply!
+ `, alarmData.AlarmSeq, alarmData.NeName, alarmData.AlarmTitle, alarmData.OrigSeverity, alarmData.EventTime, alarmData.AlarmStatus) // message := fmt.Sprintf(` // Alarm information @@ -75,10 +76,9 @@ func AlarmEmailForward(alarmData *Alarm) error { EventTime: alarmData.EventTime, ToUser: strings.Join(*emails, ","), } - for _, email := range *emails { - m.SetHeader("To", email) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 - } + m.SetHeader("To", *emails...) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 + //m.SetHeader("To", strings.Join(*emails, " ")) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 //m.SetHeader("To", "zhangshuzhong@agrandtech.com", "simonzhangsz@outlook.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 //m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个 //m.SetHeader("Bcc", "******@qq.com") // 暗送,可以多个 diff --git a/features/mml/mml.go b/features/mml/mml.go index 99dbdc7..eeb1004 100644 --- a/features/mml/mml.go +++ b/features/mml/mml.go @@ -112,21 +112,8 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { } if neInfo != nil { - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(10 * time.Second)) switch strings.ToLower(neType) { - case "upf": + case "xxx": body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) if err != nil { log.Error("io.ReadAll is failed:", err) @@ -148,16 +135,29 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { // } // log.Debug(string(buf[0:n])) - 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) + // hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) + // conn, err := net.Dial("tcp", hostMML) + // if err != nil { + // errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // defer conn.Close() + + // conn.SetDeadline(time.Now().Add(10 * time.Second)) + // loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + // _, err = conn.Write([]byte(loginStr)) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) // n, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\n")) // if err != nil { @@ -203,6 +203,30 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { // log.Debug(string(buf[0:n])) for _, mml := range mmlRequest.MML { + hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + conn.SetDeadline(time.Now().Add(10 * time.Second)) + + loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + _, err = conn.Write([]byte(loginStr)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) mmlCommand := fmt.Sprintf("%s\n", mml) log.Debug("mml command:", mmlCommand) _, err = conn.Write([]byte(mmlCommand)) @@ -233,12 +257,157 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { result := re1.ReplaceAllString(string(buf[config.GetYamlConfig().MML.UpfHeaderLength:n-len(neType)-2]), "") result = re2.ReplaceAllString(result, "") mmlResult = append(mmlResult, result) + conn.Close() //mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) // can't read buffer from upf telnet server, so return ok always // mmlResult = append(mmlResult, "COMMAND OK\n") } + case "ims": + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("io.ReadAll is failed:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + for _, mml := range mmlRequest.MML { + hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + // localAddr := conn.LocalAddr() + // remoteAddr := conn.RemoteAddr() + // if localAddr == nil || remoteAddr == nil { + // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + conn.SetDeadline(time.Now().Add(10 * time.Second)) + + _, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\n")) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Debug(string(buf[0:n])) + + _, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\n")) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // 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 + // } + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0 : n-len(neType)-2])) + + mmlCommand := fmt.Sprintf("%s\n", mml) + log.Debug("mml command:", mmlCommand) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0 : n-len(neType)-2])) + + 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 := re1.ReplaceAllString(string(buf[0:]), "") + result = re2.ReplaceAllString(result, "") + mmlResult = append(mmlResult, result) + conn.Close() + } default: + hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + // localAddr := conn.LocalAddr() + // remoteAddr := conn.RemoteAddr() + // if localAddr == nil || remoteAddr == nil { + // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + + conn.SetDeadline(time.Now().Add(10 * time.Second)) loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) _, err = conn.Write([]byte(loginStr)) if err != nil { diff --git a/restagent/etc/restconf.yaml b/restagent/etc/restconf.yaml index 8bfb473..167382c 100644 --- a/restagent/etc/restconf.yaml +++ b/restagent/etc/restconf.yaml @@ -38,12 +38,12 @@ database: type: mysql user: root # password: "1000omc@kp!" - # host: "192.168.2.219" + # host: "192.168.5.57" # port: 33066 # name: omc_db backup: d:/local.git/ems.agt/restagent/database password: "root@1234" - host: "192.168.2.152" + host: "192.168.5.57" port: 3306 name: "omc_db" # Redis 缓存数据,数据源声明全小写 @@ -52,8 +52,8 @@ redis: # OMC系统使用库 default: port: 6379 # Redis port - host: "192.168.2.152" # Redis host - password: "redis@1234" + host: "192.168.5.57" # Redis host + password: "" db: 10 # Redis db_num # UDM网元用户库 udmuser: @@ -117,7 +117,7 @@ omc: # Forward interface: # email/sms alarm: - forwardAlarm: true + forwardAlarm: false email: smtp: mail.agrandtech.com port: 25 diff --git a/restagent/makefile b/restagent/makefile index 542a0bb..68fcf75 100644 --- a/restagent/makefile +++ b/restagent/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2311.8 +VERSION = 2.2312.8 PLATFORM = amd64 ARMPLATFORM = aarch64 BUILDDIR = ../../build diff --git a/restagent/static/helpDoc/zh_doc.pdf b/restagent/static/helpDoc/zh_doc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e25d5cae05a8a437fb8bb1d0ab7f903e6626694e GIT binary patch literal 7816687 zcmdqK2RK!a|2VFqqCqwdm&hvIWi$v`+2hJ8n<#sPj6${$B72WZ8b~Uukc6^Bl1f5K z86osL_ndpHo4o7ueP93Q{rr0#PuzRP>%8_pTxv&T_rV23woq}E0{^y9!C^u$I}__I zR0j_VYPs8+3rZV18=tnb6jU>|GIj8M29
zkS^ZF!b@rTPU2Rr=O)x*r=dY76WjSORfj{q@dwrN&o+Dc``bzHHLZ~2RO;Cr)NFMG
z_CO~=p1jcX$T?@(km`*d2PR`f&KngmDJEG|ADJhAwNaJoaPzSkvf8h=$zE=~L+;CX
zE@gufSv92qSqxpCbr77LEN=~Le6#(Uw9^`E8cGewo|0?73}rkg#lF^_ot6ycXRviI
z)#0^D9AxQ2>11h{wzQTdWMOHB9i9u7OT*j4)_IXt+B(hcAMl}&J`gUyuq9Kj^z_13
zVeY39u4X(ttzRW>+1aCi!u|EB ?nW6*sx!yle#}E#PJ1s9uJ&7d
zS!My0PJGQn^`~7Z+c186C><);oa(o=|40JnWaVMB8@?;HOp9m;e#2wK77&+Ytrb8x
zT@k7G6XR*%QO{OjE|PZ-d-Udpz^gZ-{4m(EE3HB;0aVl>sC_nU_H)|VV$b+&vbTUP3O-Qy7+P(IIYNUocb
z9*cK`%m&WPB-B$cas^xOapFWw^2)IAGR1&dBFS^_k%vrUJXb_o7$0nT5MZ#dV>ht4
z`h##P^HuG3%MLUf86YTSF|yS`6MfEFyPp(fVtRi)l=2$qEcY5S+n#Nr-nyiy_??li
z&~+aQHloa{FL5ZYiI;TT(Im2F2YEA&wMcT;s!Y+3O5mTg1+Q3{qdyQK81)Y>MYB<#
z(P~df)j;lE(Y);
i8kmlY-yKD3L*lD8^ZJ3R9Tu-}PHzzW5A}S?qwDP7zPhzwN$wMT
zKA5fkWOC2I)4Knq2K%~3X>3)q>iY+W$q|tu`SttAXxo`PJ1-VdcPUPzjH_RL-Wo7|
z-D3k&e^MwRo ={5LbK5J)(e>2gw
zsO`
!=GKKrl=f4@X=3={ZTzMN_=j%3CVGvafYeH7(r_Zb+D}mepNOM0N
zUd{C42JC7BPpxZzBl^O70H!y;1&-T2B>#ve{~w=hYjRm#-h*7sTf%o1{A-8fKO+
y4PRDg*GzFl&cj*u5Q{p_H*;HO6nknfTASAUBARp8?PKKuJ81p(v#
zg(N_LP;ATvF9&{)9Z?Bx89l`Wj??~x9{Q|cH+q1J0r(n>Z)E;EEHY>Phra)oDDhhC
z-#Fh;u+QIs5a0vE%MpO@Frl^YB<-#khXR6!YZ{YZsY%lBOc56S+)1zDS}|d;D+Kn<
z)W5K)`^k*HhW`d%cm&_TSCgPO%5ToV!Op76R(-58w^A-+8iE1(TMEPMtlZwH#Vx_Hj|YJb=4Sl59wt|%vaY;jxE8XcU+@(Dp++J@hV%=Yovx*6BW
zDx&%aks&><*d9-g@*{RaZwkblMhH%Fj9-~6ENs?^T-=RD=iwKSHQU2>;Q1d{uIEXG
zVNMp?oz8_Y8udRG{2P-Dye^^c6BjOPI%DvocteI#P|OmfAu+^RhADnTU7efl_}y6NJiy
zwbSs-r~i3~=crzY%-+=PO6v)lWV097K;B