diff --git a/config/etc/default/restconf.yaml b/config/etc/default/restconf.yaml index 81bd699d..6e1b76bd 100644 --- a/config/etc/default/restconf.yaml +++ b/config/etc/default/restconf.yaml @@ -137,6 +137,7 @@ alarm: password: xxxxxx # TLS skip verify: true/false tlsSkipVerify: true + smProxy: smsc sms: apiURL: http://smsc.xxx.com accessKeyID: xxx diff --git a/database/install/alarm_forward_log.sql b/database/install/alarm_forward_log.sql index 0be17200..78852524 100644 --- a/database/install/alarm_forward_log.sql +++ b/database/install/alarm_forward_log.sql @@ -1,49 +1,39 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB +/* + Navicat Premium Data Transfer -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + Source Server : local_mariadb + Source Server Type : MariaDB + Source Server Version : 100338 (10.3.38-MariaDB) + Source Host : localhost:33066 + Source Schema : omc_db --- --- Table structure for table `alarm_forward_log` --- + Target Server Type : MariaDB + Target Server Version : 100338 (10.3.38-MariaDB) + File Encoding : 65001 + Date: 23/04/2024 14:05:00 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for alarm_forward_log +-- ---------------------------- DROP TABLE IF EXISTS `alarm_forward_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `alarm_forward_log` ( +CREATE TABLE `alarm_forward_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) DEFAULT NULL, - `ne_id` varchar(32) DEFAULT NULL, - `alarm_id` varchar(32) DEFAULT NULL, - `alarm_title` varchar(255) DEFAULT NULL, - `alarm_seq` varchar(20) DEFAULT NULL, - `event_time` datetime DEFAULT NULL, - `to_user` varchar(255) DEFAULT NULL, - `oper_result` varchar(255) DEFAULT NULL, - `log_time` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `alarm_seq` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `event_time` datetime NULL DEFAULT NULL, + `interface` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `to_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `oper_result` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `log_time` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=209122 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; +) ENGINE = InnoDB AUTO_INCREMENT = 209149 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2024-03-06 17:26:55 +SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/zupgrade.sql b/database/upgrade/zupgrade.sql index 7789ee9c..c7bb2138 100644 --- a/database/upgrade/zupgrade.sql +++ b/database/upgrade/zupgrade.sql @@ -186,4 +186,7 @@ ALTER TABLE `omc_db`.`mml_system` ADD COLUMN IF NOT EXISTS `object_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'mml' AFTER `mml_display`; ALTER TABLE `omc_db`.`ne_state` -MODIFY COLUMN `expiry_date` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' AFTER `serial_num`; \ No newline at end of file +MODIFY COLUMN `expiry_date` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' AFTER `serial_num`; + +ALTER TABLE `omc_db`.`alarm_forward_log` +ADD COLUMN IF NOT EXISTS `interface` varchar(16) NULL AFTER `event_time`; \ No newline at end of file diff --git a/database/upgvue3/zupgrade.sql b/database/upgvue3/zupgrade.sql index 93daa133..bc81a2c1 100644 --- a/database/upgvue3/zupgrade.sql +++ b/database/upgvue3/zupgrade.sql @@ -186,4 +186,7 @@ ALTER TABLE `omc_db`.`mml_system` ADD COLUMN IF NOT EXISTS `object_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'mml' AFTER `mml_display`; ALTER TABLE `omc_db`.`ne_state` -MODIFY COLUMN `expiry_date` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' AFTER `serial_num`; \ No newline at end of file +MODIFY COLUMN `expiry_date` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' AFTER `serial_num`; + +ALTER TABLE `omc_db`.`alarm_forward_log` +ADD COLUMN IF NOT EXISTS `interface` varchar(16) NULL AFTER `event_time`; \ No newline at end of file diff --git a/features/cm/ne.go b/features/cm/ne.go index 2f225180..da6d993b 100644 --- a/features/cm/ne.go +++ b/features/cm/ne.go @@ -142,7 +142,8 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { services.ResponseInternalServerError500ProcessError(w, err) return } - neInfo.UpdateTime = time.Now().Format(time.DateTime) + //neInfo.UpdateTime = time.Now().Format(time.DateTime) + neInfo.UpdateTime = time.Now() log.Debug("NE info:", neInfo) //if !config.GetYamlConfig().OMC.Chk2Ne { @@ -252,7 +253,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { neInfo := new(dborm.NeInfo) _ = json.Unmarshal(body, neInfo) neInfo.NeType = strings.ToUpper(neType) - neInfo.UpdateTime = time.Now().Format(time.DateTime) + neInfo.UpdateTime = time.Now() log.Debug("NE info:", neInfo) //if !config.GetYamlConfig().OMC.Chk2Ne { diff --git a/features/fm/alarm.go b/features/fm/alarm.go index 98e0bb43..716721b5 100644 --- a/features/fm/alarm.go +++ b/features/fm/alarm.go @@ -461,8 +461,8 @@ func PostAlarmFromNF(w http.ResponseWriter, r *http.Request) { if err = AlarmEmailForward(&alarmData); err != nil { log.Error("Failed to AlarmEmailForward:", err) } - if err = AlarmForwardBySMPP(&alarmData); err != nil { - log.Error("Failed to AlarmForwardBySMPP:", err) + if err = AlarmSMSForward(&alarmData); err != nil { + log.Error("Failed to AlarmSMSForward:", err) } } } @@ -735,8 +735,8 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { if err = AlarmEmailForward(&alarmData); err != nil { log.Error("Failed to AlarmEmailForward:", err) } - if err = AlarmForwardBySMPP(&alarmData); err != nil { - log.Error("Failed to AlarmForwardBySMPP:", err) + if err = AlarmSMSForward(&alarmData); err != nil { + log.Error("Failed to AlarmSMSForward:", err) } } } diff --git a/features/fm/smsforward.go b/features/fm/smsforward.go index 6933704b..06e11347 100644 --- a/features/fm/smsforward.go +++ b/features/fm/smsforward.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "net/url" + "strings" "time" "be.ems/lib/dborm" @@ -15,7 +16,24 @@ import ( "github.com/linxGnu/gosmpp/pdu" ) -func AlarmForwardBySMS(alarmData *Alarm) error { +func AlarmSMSForward(alarmData *Alarm) error { + switch config.GetYamlConfig().Alarm.SMProxy { + case "sms": + users, err := AlarmForwardBySMS(alarmData) + writeLog(alarmData, users, "SMS", err) + return err + case "smsc": + users, err := AlarmForwardBySMPP(alarmData) + writeLog(alarmData, users, "SMS", err) + return err + default: + users, err := AlarmForwardBySMPP(alarmData) + writeLog(alarmData, users, "SMS", err) + return err + } +} + +func AlarmForwardBySMS(alarmData *Alarm) (string, error) { log.Info("AlarmForwardBySMS processing... ") SMSFforwardconfig := config.GetYamlConfig().Alarm.SMS @@ -29,86 +47,69 @@ func AlarmForwardBySMS(alarmData *Alarm) error { toUsers, err := dborm.XormGetAlarmForward("SMS") if err != nil { log.Error("Failed to XormGetAlarmForward:", err) - return err + return "", err } else if toUsers == nil { err := errors.New("not found forward phone number") log.Error(err) - return err + return "", err + } + userList := strings.Join(*toUsers, ",") + + // 短信相关参数 + params := url.Values{} + params.Set("PhoneNumbers", userList) + params.Set("SignName", SMSFforwardconfig.SignName) + params.Set("TemplateCode", SMSFforwardconfig.TemplateCode) + params.Set("TemplateParam", `{"message":"alarm"}`) + + // 构建请求URL + reqURL := apiURL + "?Action=SendSms&" + params.Encode() + + // 创建HTTP请求 + req, err := http.NewRequest("GET", reqURL, nil) + if err != nil { + log.Error("Failed to create request:", err) + return userList, err } - for _, toUser := range *toUsers { - // 短信相关参数 - params := url.Values{} - params.Set("PhoneNumbers", toUser) - params.Set("SignName", SMSFforwardconfig.SignName) - params.Set("TemplateCode", SMSFforwardconfig.TemplateCode) - params.Set("TemplateParam", `{"message":"alarm"}`) + // 添加请求头部 + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Authorization", "APPCODE "+accessKeySecret) - // 构建请求URL - reqURL := apiURL + "?Action=SendSms&" + params.Encode() + // 发送请求 + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + log.Error("Failed to send request:%v", err) + return userList, err + } + defer resp.Body.Close() - // 创建HTTP请求 - req, err := http.NewRequest("GET", reqURL, nil) - if err != nil { - log.Error("Failed to create request:", err) - return err - } - - // 添加请求头部 - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - req.Header.Set("Authorization", "APPCODE "+accessKeySecret) - - forwardLog := &dborm.AlarmForwardLog{ - NeType: alarmData.NeType, - NeID: alarmData.NeId, - AlarmID: alarmData.AlarmId, - AlarmTitle: alarmData.AlarmTitle, - AlarmSeq: alarmData.AlarmSeq, - EventTime: alarmData.EventTime, - ToUser: toUser, - } - // 发送请求 - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - operResult := fmt.Sprintf("Failed to send request:%v", err) - log.Error(operResult) - forwardLog.OperResult = operResult - affected, err := dborm.XormInsertAlarmForwardLog(forwardLog) - if err != nil && affected <= 0 { - log.Error("Failed to insert data:", err) - } - continue - } - defer resp.Body.Close() - - // 解析响应 - if resp.StatusCode == http.StatusOK { - operResult := "SMS sent successfully!" - log.Info(operResult) - forwardLog.OperResult = operResult - affected, err := dborm.XormInsertAlarmForwardLog(forwardLog) - if err != nil && affected <= 0 { - log.Error("Failed to insert data:", err) - continue - } - } else { - operResult := fmt.Sprintf("Failed to send SMS, StatusCode=%d", resp.StatusCode) - log.Error(operResult) - forwardLog.OperResult = operResult - affected, err := dborm.XormInsertAlarmForwardLog(forwardLog) - if err != nil && affected <= 0 { - log.Error("Failed to insert data:", err) - continue - } - } + // 解析响应 + switch resp.StatusCode { + case http.StatusOK, http.StatusAccepted, http.StatusNoContent, http.StatusCreated: + return userList, nil + default: + err := fmt.Errorf("Failed to send SMS: %s(Code=%d)", resp.Status, resp.StatusCode) + log.Error(err) + return userList, err } - return nil } -func AlarmForwardBySMPP(alarmData *Alarm) error { +func AlarmForwardBySMPP(alarmData *Alarm) (string, error) { log.Info("AlarmForwardBySMPP processing... ") + toUsers, err := dborm.XormGetAlarmForward("SMS") + if err != nil { + log.Error("Failed to XormGetAlarmForward:", err) + return "", err + } else if toUsers == nil { + err := errors.New("not found forward phone number") + log.Error(err) + return "", err + } + userList := strings.Join(*toUsers, ",") + auth := gosmpp.Auth{ SMSC: config.GetYamlConfig().Alarm.SMSC.Addr, SystemID: config.GetYamlConfig().Alarm.SMSC.SystemID, @@ -142,48 +143,49 @@ func AlarmForwardBySMPP(alarmData *Alarm) error { }, -1) if err != nil { log.Error("Failed to create SMPP new session:", err) - return err + return userList, 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 := "Alarm Notification: " + 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 - } + // var results []string + // for _, toUser := range *toUsers { + message := "Alarm Notification: " + alarmData.AlarmTitle + " from " + alarmData.NeType + " " + alarmData.NeId + " at " + alarmData.EventTime + if err = trans.Transceiver().Submit(newSubmitSM(userList, message)); err != nil { + // result := fmt.Sprintf("Failed to submit %s hort message:%s", toUser, err.Error()) + // results = append(results, result) + log.Error("Failed to submit hort message:", err) + return userList, err + } + // } + return userList, nil +} - affected, err := dborm.XormInsertAlarmForwardLog(forwardLog) - if err != nil && affected <= 0 { - log.Error("Failed to insert data:", err) - continue - } +func writeLog(alarmData *Alarm, toUser, forwardBy string, err error) error { + var result string + if err == nil { + result = "SMS sent successfully" + } else { + result = err.Error() + } + forwardLog := &dborm.AlarmForwardLog{ + NeType: alarmData.NeType, + NeID: alarmData.NeId, + AlarmID: alarmData.AlarmId, + AlarmTitle: alarmData.AlarmTitle, + AlarmSeq: alarmData.AlarmSeq, + EventTime: alarmData.EventTime, + Interface: forwardBy, + ToUser: toUser, + OperResult: result, + } + + affected, err := dborm.XormInsertAlarmForwardLog(forwardLog) + if err != nil && affected <= 0 { + log.Error("Failed to insert data:", err) + return err } return nil } diff --git a/lib/dborm/dborm.go b/lib/dborm/dborm.go index f35c7ee7..389b8525 100644 --- a/lib/dborm/dborm.go +++ b/lib/dborm/dborm.go @@ -182,20 +182,20 @@ func InsertDataWithJson(insertData interface{}) (int64, error) { } type NeInfo struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` // neUID/rmUID 网元唯一标识 - RmUID string `json:"rmUid" xorm:"rm_uid"` // neUID/rmUID网元UID - NeName string `json:"neName" xorm:"ne_name"` // NeName/UserLabel 网元名称/网元设备友好名称 - Ip string `json:"ip" xorm:"ip"` - Port string `json:"port" xorm:"port"` - PvFlag string `json:"pvFlag" xorm:"pv_flag"` // 网元虚实性标识 VNF/PNF: 虚拟/物理 - NeAddress string `json:"neAddress" xorm:"ne_address"` // 只对PNF - Province string `json:"province" xorm:"province"` // 网元所在省份 - VendorName string `json:"vendorName" xorm:"vendor_name"` // 厂商名称 - Dn string `json:"dn" xorm:"dn"` // 网络标识 - Status int `json:"status" xorm:"status"` - UpdateTime string `json:"-" xorm:"-"` + Id int `json:"id" xorm:"pk 'id' autoincr"` + NeType string `json:"neType" xorm:"ne_type"` + NeId string `json:"neId" xorm:"ne_id"` // neUID/rmUID 网元唯一标识 + RmUID string `json:"rmUid" xorm:"rm_uid"` // neUID/rmUID网元UID + NeName string `json:"neName" xorm:"ne_name"` // NeName/UserLabel 网元名称/网元设备友好名称 + Ip string `json:"ip" xorm:"ip"` + Port string `json:"port" xorm:"port"` + PvFlag string `json:"pvFlag" xorm:"pv_flag"` // 网元虚实性标识 VNF/PNF: 虚拟/物理 + NeAddress string `json:"neAddress" xorm:"ne_address"` // 只对PNF + Province string `json:"province" xorm:"province"` // 网元所在省份 + VendorName string `json:"vendorName" xorm:"vendor_name"` // 厂商名称 + Dn string `json:"dn" xorm:"dn"` // 网络标识 + Status int `json:"status" xorm:"status"` + UpdateTime time.Time `json:"updateTime" xorm:"<-"` } func XormGetMySQLVersion() (string, error) { @@ -1634,9 +1634,10 @@ type AlarmForwardLog struct { AlarmTitle string `json:"alarmTitle" xorm:"alarm_title"` AlarmSeq int `json:"alarmSeq" xorm:"alarm_seq"` EventTime string `json:"eventTime" xorm:"event_time"` + Interface string `json:"interface" xorm:"interface"` ToUser string `json:"toUser" xorm:"to_user"` OperResult string `json:"operResult" xorm:"oper_result"` - LogTime string `json:"-" xorm:"-"` + LogTime string `json:"logTime" xorm:"<-"` } func XormInsertAlarmForwardLog(logData *AlarmForwardLog) (int64, error) { @@ -1671,7 +1672,7 @@ func XormInsertSystemLog(logData *SystemLog) (int64, error) { return affected, err } -type permission struct { +type Permission struct { ID int `json:"-" xorm:"pk 'id' autoincr"` PermissionName string `json:"permissionName"` Method string `json:"method"` diff --git a/restagent/config/config.go b/restagent/config/config.go index dc8ee014..1dd3ce9a 100644 --- a/restagent/config/config.go +++ b/restagent/config/config.go @@ -77,7 +77,8 @@ type YamlConfig struct { } `yaml:"omc"` Alarm struct { - ForwardAlarm bool `yaml:"forwardAlarm"` + ForwardAlarm bool `yaml:"forwardAlarm"` + SMProxy string `yaml:"smProxy"` Email struct { Smtp string `yaml:"smtp"` Port uint16 `yaml:"port"` diff --git a/restagent/etc/restconf.yaml b/restagent/etc/restconf.yaml index 45c12473..8bf09af2 100644 --- a/restagent/etc/restconf.yaml +++ b/restagent/etc/restconf.yaml @@ -127,7 +127,8 @@ omc: # Alarm module setting # Forward interface: -# email/sms +# email/sms +# smProxy: sms(Short Message Service)/smsc(SMS Centre) alarm: forwardAlarm: true email: @@ -137,8 +138,9 @@ alarm: password: "1000smtp@omc!" # TLS skip verify: true/false tlsSkipVerify: true + smProxy: smsc sms: - apiURL: http://smsc.xxx.com.cn/ + apiURL: http://smsc.xxx.com/ accessKeyID: xxxx accessKeySecret: xxxx signName: xxx SMSC