This commit is contained in:
TsMask
2023-08-22 19:25:39 +08:00
parent 38d3b7450e
commit 96de169777
45 changed files with 881 additions and 676 deletions

View File

@@ -0,0 +1,22 @@
package api
import (
"omc/core"
"github.com/aceld/zinx/ziface"
"github.com/aceld/zinx/znet"
)
var CloseConnAlarmMsgID uint32 = 10
var CloseConnAlarmMsgType uint32 = 10
var CloseConnAlarmMsgName string = "closeConnAlarm"
// closeConnAlarm 关闭连接
type CloseConnAlarm struct {
znet.BaseRouter
}
func (s *CloseConnAlarm) Handle(request ziface.IRequest) {
request.GetConnection().Stop()
request.GetConnection().SendMsg(CloseConnAlarmMsgType, core.ResultSuccess(CloseConnAlarmMsgName, "", ""))
}

View File

@@ -0,0 +1,46 @@
package api
import (
"omc/core"
"omc/core/manage"
"omc/core/utils"
"github.com/aceld/zinx/ziface"
"github.com/aceld/zinx/zlog"
"github.com/aceld/zinx/znet"
)
var ReqCMCALoginAlarmMsgID uint32 = 11
var ReqCMCALoginAlarmMsgType uint32 = 11
var ReqCMCALoginAlarmMsgName string = "reqCMCALoginAlarm"
// reqCMCALoginAlarm CMCA认证方式登录
type ReqCMCALoginAlarm struct {
znet.BaseRouter
}
func (*ReqCMCALoginAlarm) Handle(request ziface.IRequest) {
// 获取当前请求的通道
m := manage.GetManager(request.GetConnection().GetName())
if m == nil {
zlog.Ins().ErrorF("server internal error")
request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.ResultError(ReqLoginAlarmMsgName, "server internal error", ""))
return
}
uid, err := request.GetConnection().GetProperty("UID")
if err != nil {
zlog.Ins().ErrorF("GetProperty UID error %s", err)
request.GetConnection().Stop()
return
}
// seqNo 32位长度 0-9A-Z
seqNo := utils.SeqNo(32)
m.SetSeqNo(uid.(string), seqNo)
// 发送信息
msgData := map[string]string{
"seqNo": seqNo,
}
request.GetConnection().SendMsg(ReqCMCALoginAlarmMsgType, core.Result(ReqCMCALoginAlarmMsgName, msgData))
}

View File

@@ -0,0 +1,83 @@
package api
// import (
// "omc/core"
// "omc/core/manage"
// "omc/core/parse"
// "omc/handle/service"
// "github.com/aceld/zinx/ziface"
// "github.com/aceld/zinx/zlog"
// "github.com/aceld/zinx/znet"
// )
// var ReqCMCALoginSeqMsgID uint32 = 12
// var ReqCMCALoginSeqMsgType uint32 = 13
// var ReqCMCALoginSeqMsgName string = "ackCMCALoginSeq"
// // reqCMCALoginSeq CMCA认证方式登录随机码
// type ReqCMCALoginSeq struct {
// znet.BaseRouter
// }
// // reqCMCALoginAlarm;user=omc;key=base64Key;cert=cer;type=msg"
// func (s *ReqCMCALoginSeq) Handle(request ziface.IRequest) {
// // 登录消息处理
// body, err := parse.RequestBodyDecode(request, []string{"user", "key", "cert", "type"})
// if err != nil {
// zlog.Ins().ErrorF("inlaid message body %s", err.Error())
// request.GetConnection().SendMsg(ReqCMCALoginSeqMsgType, core.ResultError(ReqCMCALoginSeqMsgName, err.Error(), ""))
// return
// }
// // 获取当前请求的通道
// m := manage.GetManager(request.GetConnection().GetName())
// if m == nil {
// zlog.Ins().ErrorF("server internal error")
// request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.ResultError(ReqLoginAlarmMsgName, "server internal error", ""))
// return
// }
// uid, err := request.GetConnection().GetProperty("UID")
// if err != nil {
// zlog.Ins().ErrorF("GetProperty UID error %s", err)
// request.GetConnection().Stop()
// return
// }
// // 账户和消息类型
// username := body.Data["key"]
// tp := body.Data["type"]
// //登录信息check
// seqNo := m.GetUserByPID(uid.(string)).SeqNo
// if ok, err := service.CMCALogin(seqNo, username, body.Data["cert"]); !ok || err != nil {
// zlog.Ins().ErrorF("LoginFail %s", err)
// request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.Result(ReqLoginAlarmMsgName, map[string]string{
// "result": "autherror",
// "resDesc": err.Error(),
// }))
// // 已登录的登录错误超过3次,断开连接
// if uid != nil || uid != "" {
// isClose, _ := m.LoginFail(uid.(string))
// if isClose {
// request.GetConnection().Stop()
// return
// }
// }
// return
// }
// // manager 用户登录更新
// err = m.LoginSuccess(uid.(string), username, tp)
// if err != nil {
// zlog.Ins().ErrorF("manager:%s", err)
// request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.Result(ReqLoginAlarmMsgName, map[string]string{
// "result": "autherror",
// "resDesc": err.Error(),
// }))
// return
// }
// zlog.Ins().InfoF("user login loginSuccess,username:%s, type:%s, channel:%s", username, tp, request.GetConnection().GetName())
// request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.ResultSuccess(ReqLoginAlarmMsgName, "", ""))
// }

View File

@@ -0,0 +1,47 @@
package api
import (
"omc/core"
"omc/core/manage"
"omc/core/utils"
"github.com/aceld/zinx/ziface"
"github.com/aceld/zinx/zlog"
"github.com/aceld/zinx/znet"
)
var ReqCMCALoginSeqMsgID uint32 = 12
var ReqCMCALoginSeqMsgType uint32 = 13
var ReqCMCALoginSeqMsgName string = "ackCMCALoginSeq"
// reqCMCALoginSeq CMCA认证方式登录随机码
type ReqCMCALoginSeq struct {
znet.BaseRouter
}
// reqCMCALoginAlarm;user=omc;key=base64Key;cert=cer;type=msg"
func (s *ReqCMCALoginSeq) Handle(request ziface.IRequest) {
// 获取当前请求的通道
m := manage.GetManager(request.GetConnection().GetName())
if m == nil {
zlog.Ins().ErrorF("server internal error")
request.GetConnection().SendMsg(ReqCMCALoginSeqMsgType, core.ResultError(ReqCMCALoginSeqMsgName, "server internal error", ""))
return
}
uid, err := request.GetConnection().GetProperty("UID")
if err != nil {
zlog.Ins().ErrorF("GetProperty UID error %s", err)
request.GetConnection().Stop()
return
}
// seqNo 32位长度 0-9A-Z
seqNo := utils.SeqNo(32)
m.SetSeqNo(uid.(string), seqNo)
// 发送信息
msgData := map[string]string{
"seqNo": seqNo,
}
request.GetConnection().SendMsg(ReqCMCALoginSeqMsgType, core.Result(ReqCMCALoginSeqMsgName, msgData))
}

View File

@@ -0,0 +1,40 @@
package api
import (
"omc/core"
"omc/core/parse"
"github.com/aceld/zinx/ziface"
"github.com/aceld/zinx/zlog"
"github.com/aceld/zinx/znet"
)
var ReqHeartBeatMsgID uint32 = 8
var ReqHeartBeatMsgType uint32 = 9
var ReqHeartBeatName string = "ackHeartBeat"
// ReqHeartBeat 心跳
type ReqHeartBeat struct {
znet.BaseRouter
}
// reqHeartBeat;reqId=12
func (s *ReqHeartBeat) Handle(request ziface.IRequest) {
// 解包
body, err := parse.RequestBodyDecode(request, nil)
if err != nil {
zlog.Ins().ErrorF("inlaid message body %s", err.Error())
request.GetConnection().SendMsg(ReqHeartBeatMsgType, core.ResultError(ReqHeartBeatName, "inlaid message body", ""))
return
}
reqId, ok := body.Data["reqId"]
if !ok {
zlog.Ins().ErrorF("missing parameter of message body")
request.GetConnection().SendMsg(ReqHeartBeatMsgType, core.ResultError(ReqHeartBeatName, "missing parameter of message body", ""))
return
}
//ack
request.GetConnection().SendMsg(ReqHeartBeatMsgType, core.ResultSuccess(ReqHeartBeatName, "ok", reqId))
}

View File

@@ -0,0 +1,81 @@
package api
import (
"omc/core"
"omc/core/manage"
"omc/core/parse"
"omc/handle/service"
"github.com/aceld/zinx/ziface"
"github.com/aceld/zinx/zlog"
"github.com/aceld/zinx/znet"
)
var ReqLoginAlarmMsgID uint32 = 1
var ReqLoginAlarmMsgType uint32 = 2
var ReqLoginAlarmMsgName string = "ackLoginAlarm"
// reqLoginAlarm 登录
type ReqLoginAlarm struct {
znet.BaseRouter
}
// reqLoginAlarm;user=omc;key=omc;type=msg
func (s *ReqLoginAlarm) Handle(request ziface.IRequest) {
// 登录消息处理
body, err := parse.RequestBodyDecode(request, []string{"user", "key", "type"})
// 账户密码
username := body.Data["user"]
key := body.Data["key"]
if err != nil || username == "" || key == "" {
zlog.Ins().ErrorF("inlaid message body %s", err.Error())
request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.ResultError(ReqLoginAlarmMsgName, "inlaid message body", ""))
return
}
// 获取当前请求的通道
m := manage.GetManager(request.GetConnection().GetName())
if m == nil {
zlog.Ins().ErrorF("server internal error")
request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.ResultError(ReqLoginAlarmMsgName, "server internal error", ""))
return
}
uid, err := request.GetConnection().GetProperty("UID")
if err != nil {
zlog.Ins().ErrorF("GetProperty UID error %s", err)
request.GetConnection().Stop()
return
}
// 登录信息
err = service.UserLogin(username, key)
if err != nil {
zlog.Ins().ErrorF("LoginFail %s", err)
request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.Result(ReqLoginAlarmMsgName, map[string]string{
"result": "autherror",
"resDesc": err.Error(),
}))
// 已登录的登录错误超过3次,断开连接
if uid != nil || uid != "" {
isClose, _ := m.LoginFail(uid.(string))
if isClose {
request.GetConnection().Stop()
return
}
}
return
}
// manager 用户登录更新
err = m.LoginSuccess(uid.(string), username, key)
if err != nil {
zlog.Ins().ErrorF("manager:%s", err)
request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.Result(ReqLoginAlarmMsgName, map[string]string{
"result": "autherror",
"resDesc": err.Error(),
}))
return
}
zlog.Ins().InfoF("user login loginSuccess,username:%s, type:%s, channel:%s", username, key, request.GetConnection().GetName())
request.GetConnection().SendMsg(ReqLoginAlarmMsgType, core.ResultSuccess(ReqLoginAlarmMsgName, "", ""))
}

View File

@@ -0,0 +1,100 @@
package api
import (
"fmt"
"omc/conf"
"omc/core"
"omc/core/consts"
"omc/core/file"
"omc/core/manage"
"omc/core/parse"
"omc/handle/service"
"strconv"
"time"
"github.com/aceld/zinx/ziface"
"github.com/aceld/zinx/zlog"
"github.com/aceld/zinx/znet"
)
var ackSyncAlarmFileMsgID uint32 = 6
var ackSyncAlarmFileMsgName string = "ackSyncAlarmFile"
// SyncAlarmFileApi 文件方式同步告警请求
type SyncAlarmFileApi struct {
znet.BaseRouter
}
// Handle
// reqSyncAlarmFile;reqId=33;startTime=2014-11-27 10:00:00;endTime=2014-11-27 10:30:00; syncSource =0
func (*SyncAlarmFileApi) Handle(request ziface.IRequest) {
// 消息处理
checker := []string{"reqId", "syncSource"}
body, err := parse.RequestBodyDecode(request, checker)
if err != nil {
zlog.Ins().ErrorF("inlaid message body %s", err.Error())
request.GetConnection().SendMsg(ackSyncAlarmFileMsgID, core.ResultError(ackSyncAlarmFileMsgName, err.Error(), ""))
return
}
reqId := body.Data["reqId"]
//管理模块
m := manage.GetManager(request.GetConnection().GetName())
if m == nil {
zlog.Ins().ErrorF("server internal error")
request.GetConnection().SendMsg(ackSyncAlarmFileMsgID, core.ResultError(ackSyncAlarmFileMsgName, "server internal error", reqId))
return
}
// 检查用户是否登录
u := m.GetUserByPID(body.UID)
if !u.LoginState || u.AlarmType != consts.FILE {
zlog.Ins().ErrorF("no permissions ")
request.GetConnection().SendMsg(ackSyncAlarmFileMsgID, core.ResultError(ackSyncAlarmFileMsgName, "no permissions", reqId))
return
}
//查询需要上报的告警信息
start := ""
end := ""
syncSource := ""
alarmSeq := 0
fmt.Println("body.Data:", body.Data)
//map[alarmSeq:1 reqId:35 syncSource:1]
// map[endTime:2023-07-15 23:59:59 reqId:34 startTime:2023-01-08 16:07:00 syncSource:0]
if v, ok := body.Data["startTime"]; ok {
start = v
}
if v, ok := body.Data["endTime"]; ok {
end = v
}
if v, ok := body.Data["syncSource"]; ok {
syncSource = v
}
if v, ok := body.Data["alarmSeq"]; ok {
if seq, err := strconv.Atoi(v); err == nil {
alarmSeq = seq
}
}
neBind, _ := parse.ConvertBindFlag(m.BindFlag)
alarms, err := service.GetAlarm(neBind.NeType, neBind.NeId, start, end, syncSource, alarmSeq)
if err != nil || len(alarms) == 0 {
request.GetConnection().SendMsg(ackSyncAlarmFileMsgID, core.ResultError(ackSyncAlarmFileMsgName, "not find record", reqId))
return
}
//ack
request.GetConnection().SendMsg(ackSyncAlarmFileMsgID, core.ResultSuccess(ackSyncAlarmFileMsgName, "", reqId))
//打包结果文件
//打包生成文件
var meta file.FileMeta
meta.DirRoot = conf.OmcConf.FTPRoot
meta.Province = m.Province
meta.DeviceCode = m.DeviceCode
meta.Index = "001"
meta.Time = time.Now().Format("20060102150405")
meta.Compress = false
go service.GenFile(request, &meta, alarms)
}

View File

@@ -0,0 +1,69 @@
package api
import (
"omc/core"
"omc/core/manage"
"omc/core/parse"
"omc/handle/service"
"strconv"
"github.com/aceld/zinx/ziface"
"github.com/aceld/zinx/zlog"
"github.com/aceld/zinx/znet"
)
var ReqSyncAlarmMsgID uint32 = 3
var ReqSyncAlarmMsgType uint32 = 4
var ReqSyncAlarmMsgName string = "ackSyncAlarmMsg"
// reqSyncAlarmMsg 消息同步
type ReqSyncAlarmMsg struct {
znet.BaseRouter
}
// reqSyncAlarmMsg
func (s *ReqSyncAlarmMsg) Handle(request ziface.IRequest) {
// 消息处理
checker := []string{"reqId", "alarmSeq"}
body, err := parse.RequestBodyDecode(request, checker)
reqId := body.Data["reqId"]
if err != nil || reqId == "" {
zlog.Ins().ErrorF("inlaid message body %s", err.Error())
request.GetConnection().SendMsg(ReqSyncAlarmMsgType, core.ResultError(ReqSyncAlarmMsgName, err.Error(), ""))
return
}
//管理模块
m := manage.GetManager(request.GetConnection().GetName())
if m == nil {
zlog.Ins().ErrorF("server internal error")
request.GetConnection().SendMsg(ReqSyncAlarmMsgType, core.ResultError(ReqSyncAlarmMsgName, "server internal error", reqId))
return
}
// 检查用户是否登录
u := m.GetUserByPID(body.UID)
if !u.LoginState {
zlog.Ins().ErrorF("no permissions ")
request.GetConnection().SendMsg(ReqSyncAlarmMsgType, core.ResultError(ReqSyncAlarmMsgName, "no permissions", reqId))
return
}
alarmSeq, err := strconv.Atoi(body.Data["alarmSeq"])
if err != nil || alarmSeq < 1 {
zlog.Ins().ErrorF("invalid parameter of message body")
request.GetConnection().SendMsg(ReqSyncAlarmMsgType, core.ResultError(ReqSyncAlarmMsgName, "invalid parameter of message body", reqId))
return
}
//check alarmSeq 是否存在
neBind, _ := parse.ConvertBindFlag(m.BindFlag)
alarms, _ := service.GetRealTimeAlarm(neBind.NeType, neBind.NeId, int32(alarmSeq))
if len(alarms) == 0 {
request.GetConnection().SendMsg(ReqSyncAlarmMsgType, core.ResultError(ReqSyncAlarmMsgName, "alarm seq does not exist", reqId))
return
}
//更新实时上报的alarm seq
m.UpdateAlarmSeq(int32(alarmSeq))
request.GetConnection().SendMsg(ReqSyncAlarmMsgType, core.ResultSuccess(ReqSyncAlarmMsgName, "ok", reqId))
}

33
handle/model/alarm.go Normal file
View File

@@ -0,0 +1,33 @@
package model
import "time"
type Alarm struct {
Id int
AlarmSeq int
AlarmId string
NeId string
AlarmCode int
AlarmTitle string
EventTime time.Time
AlarmType string
OrigSeverity string
PVFlag string
NeName string
NeType string
ObjectName string
ObjectUID string
ObjectType string
LocationInfo string
Province string
AlarmStatus int
SpecificProblem string
SpecificProblemID string
AddInfo string
ClearType int
ClearTime time.Time
}
func (Alarm) TableName() string {
return "alarm"
}

View File

@@ -0,0 +1,21 @@
package model
import "time"
type NbiAlarmLog struct {
ID int64
AId int64
OpUser string
SrcIp string
NeType string
NeId string
AlarmSeq int64
AlarmId string
AlarmCode int
EventTime time.Time
LogTime time.Time
}
func (NbiAlarmLog) TableName() string {
return "nbi_alarm_log"
}

39
handle/model/user.go Normal file
View File

@@ -0,0 +1,39 @@
package model
import "time"
// 用户表实体信息
type User struct {
Id int `json:"id"`
AccountId string `json:"account_id"`
Name string `json:"name"`
RealName string `json:"real_name"`
Sn string `json:"sn"`
Gender string `json:"gender"`
Email string `json:"email"`
IdCardNumber string `json:"id_card_number"`
Description string `json:"description"`
TelephoneNumber string `json:"telephone_number"`
Phone string `json:"phone"`
Mobile string `json:"mobile"`
EmployeeNumber string `json:"employee_number"`
EmployeeType string `json:"employee_type"`
Organize string `json:"organize"`
SupporterCorpName string `json:"supporter_corp_name"`
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Password string `json:"password"`
PasswordSha512 string `json:"password_sha512"`
ChangePasswordFlag int `json:"change_password_flag"`
PasswordExpiration string `json:"password_expiration"`
Status string `json:"status"`
UserExpiration string `json:"user_expiration"`
GroupName string `json:"group_name"`
Profile string `json:"profile"`
CreateTime time.Time `json:"create_time"`
UpdateTime time.Time `json:"update_time"`
}
func (User) TableName() string {
return "user"
}

66
handle/service/login.go Normal file
View File

@@ -0,0 +1,66 @@
package service
import (
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"omc/ca"
"omc/conf"
"omc/core/db"
"omc/core/utils"
"omc/handle/model"
"github.com/aceld/zinx/zlog"
)
// UserLogin 用户登录
func UserLogin(name, passwd string) error {
// 用户名密码校验
var user model.User
err := db.Client.Model(&model.User{}).Where("account_id=?", name).First(&user).Error
if err != nil {
return err
}
if err := utils.Compare(user.Password, passwd); err != nil {
zlog.Ins().ErrorF("Password Login[%s]:%s", name, err)
return errors.New("incorrect username and password")
}
return nil
}
func CMCALogin(source, sign, cert string) (login bool, err error) {
defer func() {
if r := recover(); r != nil {
zlog.Ins().ErrorF("CMCALogin panic:%v", r)
}
}()
//base64 解码签名数据
signBytes, err := base64.StdEncoding.DecodeString(sign)
if err != nil {
return false, err
}
//证书加载
block, _ := pem.Decode([]byte(cert))
//证书解析
certBody, err := x509.ParseCertificate(block.Bytes)
if err != nil {
return false, err
}
//证书校验
if conf.OmcConf.CA.Check {
if err := ca.VerifyCert(certBody); err != nil {
return false, err
}
}
//签名验证
err = ca.VerifyRSA([]byte(source), signBytes, certBody)
if err != nil {
return false, err
}
return true, nil
}

View File

@@ -0,0 +1,92 @@
package service
import (
"encoding/json"
"omc/core/db"
"omc/core/emun"
"omc/handle/model"
"github.com/aceld/zinx/zlog"
)
type OmcAlarm struct {
AId int64 `json:"-"`
AlarmSeq int32 `json:"alarmSeq"` //告警序列号
AlarmTitle string `json:"alarmTitle"` //告警事件标题
AlarmStatus int32 `json:"alarmStatus"` //告警状态
AlarmType string `json:"alarmType"` //告警类型
OrigSeverity int32 `json:"origSeverity"` //原始级别
EventTime string `json:"eventTime"` //事件发生时间
AlarmId string `json:"alarmId"` //告警事件唯一标识
SpecificProblemID string `json:"specificProblemID"` //告警问题原因ID
SpecificProblem string `json:"specificProblem"` //告警问题原因
NeUID string `json:"neUID"` //告警网元UID
NeName string `json:"neName"` //告警网元名称
NeType string `json:"neType"` //告警网元设备类型
ObjectUID string `json:"objectUID"` //告警定位对象UID
ObjectName string `json:"objectName"` //告警定位对象名称
ObjectType string `json:"objectType"` //告警定位对象资源类型
LocationInfo string `json:"locationInfo"` //告警定位信息
AddInfo string `json:"addInfo"` //告警辅助信息[条件必选]
PVFlag string `json:"PVFlag"` //网元虚实性[条件必选]
Province string `json:"province"` //网元服务省份
}
// GetRealTimeAlarm 获取最新的告警信息
func GetRealTimeAlarm(neType, neId string, alarmSeq int32) ([]OmcAlarm, error) {
var alarms []model.Alarm
var result []OmcAlarm
if err := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ? and alarm_seq >= ?", neType, neId, alarmSeq).Order("alarm_seq asc").Find(&alarms).Error; err != nil {
return nil, err
}
for _, v := range alarms {
var item OmcAlarm
item.AlarmSeq = int32(v.AlarmSeq)
item.AlarmTitle = v.AlarmTitle
item.AlarmStatus = int32(v.AlarmStatus)
item.AlarmType = v.AlarmType
item.OrigSeverity = emun.OrigSeverity(v.OrigSeverity)
item.EventTime = v.EventTime.Format("2006-01-02 15:04:05")
item.AlarmId = v.AlarmId
item.SpecificProblemID = v.SpecificProblemID
item.SpecificProblem = v.SpecificProblem
item.NeUID = v.NeId
item.NeName = v.NeName
item.NeType = v.NeType
item.ObjectUID = v.ObjectUID
item.ObjectName = v.NeName
item.ObjectType = v.ObjectType
item.LocationInfo = v.LocationInfo
item.AddInfo = v.AddInfo
item.PVFlag = v.PVFlag
item.Province = v.Province
item.AId = int64(v.Id)
result = append(result, item)
}
return result, nil
}
// GetLastAlarmSeq 获取最新的alarm seq
func GetLastAlarmSeq(neType, neId string) int32 {
var alarm model.Alarm
if err := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ?", neType, neId).Order("alarm_seq desc").First(&alarm).Error; err != nil {
zlog.Ins().ErrorF("db error %s", err)
return 0
}
return int32(alarm.AlarmSeq) + 1
}
func GenAlarm(alarm OmcAlarm) []byte {
data, _ := json.Marshal(&alarm)
return data
}
func MaxAlarm(current int32, alarms []OmcAlarm) int32 {
var req = current
for _, v := range alarms {
if v.AlarmSeq > req {
req = v.AlarmSeq
}
}
return req
}

View File

@@ -0,0 +1,209 @@
package service
import (
"bytes"
"encoding/binary"
"encoding/json"
"errors"
"omc/core"
"omc/core/db"
"omc/core/emun"
"omc/core/file"
"omc/handle/model"
"time"
"github.com/aceld/zinx/ziface"
)
var AckSyncAlarmFileResultMsgID uint32 = 9
func GenFile(request ziface.IRequest, meta *file.FileMeta, data []OmcAlarm) {
//生成文件内容
dataBuff := bytes.NewBuffer([]byte{})
for _, v := range data {
b, _ := json.Marshal(v)
binary.Write(dataBuff, binary.BigEndian, b)
binary.Write(dataBuff, binary.BigEndian, '\r')
binary.Write(dataBuff, binary.BigEndian, '\n')
}
file, err := file.GenFile(meta, dataBuff.Bytes())
if err != nil {
return
}
//发送文件同步信息
msgData := core.Result("ackSyncOmcAlarmFileResult", map[string]string{
"reqId": meta.ReqId,
"result": "succ",
"fileName": file,
"resDesc": "",
})
request.GetConnection().SendMsg(AckSyncAlarmFileResultMsgID, msgData)
}
// GetAlarmOfAlarmSeq 获取告警信息
func GetAlarmOfAlarmSeq(neType, neId string, alarmSeq int) ([]OmcAlarm, error) {
var alarms []model.Alarm
var result []OmcAlarm
query := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ? and alarm_seq > ?", neType, neId, alarmSeq)
if err := query.Order("alarm_seq asc").Find(&alarms).Error; err != nil {
return nil, err
}
for _, v := range alarms {
var item OmcAlarm
item.AlarmSeq = int32(v.AlarmSeq)
item.AlarmTitle = v.AlarmTitle
item.AlarmStatus = int32(v.AlarmStatus)
item.AlarmType = v.AlarmType
item.OrigSeverity = emun.OrigSeverity(v.OrigSeverity)
item.EventTime = v.EventTime.Format("2006-01-02 15:04:05")
item.AlarmId = v.AlarmId
item.SpecificProblemID = v.SpecificProblemID
item.SpecificProblem = v.SpecificProblem
item.NeUID = v.NeId
item.NeName = v.NeName
item.NeType = v.NeType
item.ObjectUID = v.ObjectUID
item.ObjectName = v.NeName
item.ObjectType = v.ObjectType
item.LocationInfo = v.LocationInfo
item.AddInfo = v.AddInfo
item.PVFlag = v.PVFlag
item.Province = v.Province
result = append(result, item)
}
return result, nil
}
//GetAlarm
/*
1 如果syncSource=1 && alarmSeq 为空: 从北向告警上报日志中(nbi_alarm_log)取数据ID然后反查告警信息表(alarm)取出告警日志
2 其他情况: 从告警信息表中取数据, 数据来源为设备告警事件
*/
func GetAlarm(neType, neId, startTime, endTime, syncSource string, alarmSeq int) ([]OmcAlarm, error) {
if syncSource == "0" {
return GetAlarmOfEventTime(neType, neId, startTime, endTime)
} else {
if alarmSeq > 0 {
return GetAlarmOfAlarmSeq(neType, neId, alarmSeq)
} else {
return GetAlarmOfLog(neType, neId, startTime, endTime)
}
}
}
// GetAlarmOfEventTime 获取告警信息
func GetAlarmOfEventTime(neType, neId, startTime, endTime string) ([]OmcAlarm, error) {
var alarms []model.Alarm
var result []OmcAlarm
if startTime == "" && endTime == "" {
return result, nil
}
query := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ?", neType, neId)
if startTime != "" {
t1, err := time.Parse("2006-01-02 15:04:05", startTime)
if err != nil {
return nil, errors.New("startTime invalid")
}
query = query.Where("event_time > ?", t1)
}
if endTime != "" {
t2, err := time.Parse("2006-01-02 15:04:05", endTime)
if err != nil {
return nil, errors.New("endTime invalid")
}
query = query.Where("event_time < ?", t2)
}
if err := query.Order("alarm_seq asc").Find(&alarms).Error; err != nil {
return nil, err
}
for _, v := range alarms {
var item OmcAlarm
item.AlarmSeq = int32(v.AlarmSeq)
item.AlarmTitle = v.AlarmTitle
item.AlarmStatus = int32(v.AlarmStatus)
item.AlarmType = v.AlarmType
item.OrigSeverity = emun.OrigSeverity(v.OrigSeverity)
item.EventTime = v.EventTime.Format("2006-01-02 15:04:05")
item.AlarmId = v.AlarmId
item.SpecificProblemID = v.SpecificProblemID
item.SpecificProblem = v.SpecificProblem
item.NeUID = v.NeId
item.NeName = v.NeName
item.NeType = v.NeType
item.ObjectUID = v.ObjectUID
item.ObjectName = v.NeName
item.ObjectType = v.ObjectType
item.LocationInfo = v.LocationInfo
item.AddInfo = v.AddInfo
item.PVFlag = v.PVFlag
item.Province = v.Province
result = append(result, item)
}
return result, nil
}
// GetAlarmOfLog 获取告警信息
func GetAlarmOfLog(neType, neId, startTime, endTime string) ([]OmcAlarm, error) {
var alarms []model.Alarm
var result []OmcAlarm
if startTime == "" && endTime == "" {
return result, nil
}
var aIDs []int64
query := db.Client.Model(&model.NbiAlarmLog{}).Select("distinct a_id").Where("ne_type = ? and ne_id = ?", neType, neId)
if startTime != "" {
t1, err := time.Parse("2006-01-02 15:04:05", startTime)
if err != nil {
return nil, errors.New("startTime invalid")
}
query = query.Where("log_time >= ?", t1)
}
if endTime != "" {
t2, err := time.Parse("2006-01-02 15:04:05", endTime)
if err != nil {
return nil, errors.New("endTime invalid")
}
query = query.Where("log_time <= ?", t2)
}
if err := query.Order("alarm_seq asc").Find(&aIDs).Error; err != nil {
return nil, err
}
if err := db.Client.Model(&model.Alarm{}).Where("id in (?)", aIDs).Find(&alarms).Error; err != nil {
return nil, err
}
for _, v := range alarms {
var item OmcAlarm
item.AlarmSeq = int32(v.AlarmSeq)
item.AlarmTitle = v.AlarmTitle
item.AlarmStatus = int32(v.AlarmStatus)
item.AlarmType = v.AlarmType
item.OrigSeverity = emun.OrigSeverity(v.OrigSeverity)
item.EventTime = v.EventTime.Format("2006-01-02 15:04:05")
item.AlarmId = v.AlarmId
item.SpecificProblemID = v.SpecificProblemID
item.SpecificProblem = v.SpecificProblem
item.NeUID = v.NeId
item.NeName = v.NeName
item.NeType = v.NeType
item.ObjectUID = v.ObjectUID
item.ObjectName = v.NeName
item.ObjectType = v.ObjectType
item.LocationInfo = v.LocationInfo
item.AddInfo = v.AddInfo
item.PVFlag = v.PVFlag
item.Province = v.Province
result = append(result, item)
}
return result, nil
}