diff --git a/controllers/alarms.go b/controllers/alarms.go index 3da5442aba729eda70926e009f2f9af626180916..dde63286a754786c04cf048db6abb5f7bed009d7 100644 --- a/controllers/alarms.go +++ b/controllers/alarms.go @@ -8,12 +8,15 @@ package controllers import ( + "fmt" + "github.com/beego/beego/v2/server/web" "github.com/chai2010/gettext-go" "encoding/json" "gitee.com/openeuler/ha-api/models" + "gitee.com/openeuler/ha-api/utils" ) type AlarmConfig struct { @@ -27,9 +30,10 @@ func (ac *AlarmConfig) Get() { func (ac *AlarmConfig) Post() { var result map[string]interface{} - - reqData := make(map[string]interface{}) + var reqData models.AlarmData + // reqData := make(map[string]interface{}) if err := json.Unmarshal(ac.Ctx.Input.RequestBody, &reqData); err != nil { + fmt.Println(err) result = make(map[string]interface{}) result["action"] = false result["error"] = gettext.Gettext("invalid input data") @@ -39,3 +43,11 @@ func (ac *AlarmConfig) Post() { ac.Data["json"] = &result ac.ServeJSON() } + +func (ac *AlarmConfig) Put() { + var result utils.GeneralResponse + result = models.AlarmsTest() + + ac.Data["json"] = &result + ac.ServeJSON() +} diff --git a/models/alarms.go b/models/alarms.go index c2cb81c5a1290e832d8c99803b25028f24bc38e8..5f9755e11293fd6440a2cff5397a8e49db7a309d 100644 --- a/models/alarms.go +++ b/models/alarms.go @@ -9,6 +9,8 @@ package models import ( "fmt" + "reflect" + "strconv" "gitee.com/openeuler/ha-api/utils" "github.com/beego/beego/v2/core/logs" @@ -20,16 +22,29 @@ import ( /* {"action": true, "data": {"sender": "hatest@cs2c.com.cn", "smtp": "mailgw.cs2c.com.cn", "flag": "on", "receiver": ["hatest@cs2c.com.cn", ".com"], "password": "hhaest", "port": "25"}} */ -func AlarmsGet() map[string]interface{} { - var value map[string]interface{} +type AlarmResponse struct { + Action bool `json:"action"` + Data AlarmData `json:"data"` +} + +type AlarmData struct { + Flag bool `json:"flag"` + Password string `json:"password"` + Port float64 `json:"port"` + Receiver []string `json:"receiver"` // 允许 null 值 + Sender string `json:"sender"` + Smtp string `json:"smtp"` + Recipient []string `json:"recipient"` // 允许 null 值 +} + +func AlarmsGet() AlarmResponse { + var result AlarmResponse var doc *etree.Document var alertsJson []*etree.Element sender := "" smtp := "" password := "" - port := "" switCh := "" - data := map[string]interface{}{} out, err := utils.RunCommand(utils.CmdCibQueryConfig) if err != nil { @@ -43,113 +58,104 @@ func AlarmsGet() map[string]interface{} { } if len(alertsJson) == 0 { - alertsJson := doc.FindElements("/configuration/crm_config/cluster_property_set/nvpair") + alertsJson = doc.FindElements("/configuration/alerts/alert/instance_attributes/nvpair") + for _, v := range alertsJson { - if value[v.SelectAttr("name").Value] == "emailSender" { + fmt.Println(v) + if v.SelectAttr("name").Value == "email_sender" { sender = v.SelectAttr("value").Value + fmt.Println(sender) } - if value[v.SelectAttr("name").Value] == "emailServer" { + if v.SelectAttr("name").Value == "email_server" { smtp = v.SelectAttr("value").Value } - if value[v.SelectAttr("name").Value] == "password" { + if v.SelectAttr("name").Value == "password" { password = v.SelectAttr("value").Value } - if value[v.SelectAttr("name").Value] == "port" { - port = v.SelectAttr("value").Value + if v.SelectAttr("name").Value == "port" { + portV := v.SelectAttr("value").Value + // if portFloat, ok := portV.(float64); ok { + + port, _ := strconv.ParseFloat(portV, 64) + result.Data.Port = port + // } } - if value[v.SelectAttr("name").Value] == "switCh" { + if v.SelectAttr("name").Value == "switCh" { switCh = v.SelectAttr("value").Value } } + if switCh == "on" { + result.Data.Flag = true + } else { + result.Data.Flag = false + } var recipients []string var vaLue string - receivers := doc.SelectElements("recipient") + receivers := doc.FindElements("/configuration/alerts/alert/recipient") + fmt.Println("get receivers: ", receivers) for _, v := range receivers { + fmt.Println(v) vaLue = v.SelectAttr("value").Value recipients = append(recipients, vaLue) } - cmdStr := "/usr/bin/pwd_decode" + string(password) + cmdStr := "/usr/bin/pwd_decode " + string(password) out, _ := utils.RunCommand(cmdStr) + fmt.Println(password) mailPassword := "" if string(out) != "the parameter is less\n" { - mailPassword = string(out) + mailPassword = string(out) } - - data["sender"] = sender - data["smtp"] = smtp - data["flag"] = switCh - data["receiver"] = recipients - data["password"] = mailPassword - data["port"] = port + result.Data.Sender = sender + result.Data.Smtp = smtp + result.Data.Receiver = recipients + result.Data.Password = mailPassword } ret: - result := make(map[string]interface{}) - if len(data) == 0 { - data["flag"] = false - data["smtp"] = "" - data["port"] = "" - data["sender"] = "" - data["password"] = "" - data["receiver"] = []string{} - } - - result["action"] = true - result["data"] = data + result.Action = true return result } -func AlarmsSet(data map[string]interface{}) map[string]interface{} { +func isDataEmpty(data AlarmData) bool { + zeroValue := AlarmData{} + return reflect.DeepEqual(data, zeroValue) +} +func AlarmsSet(data AlarmData) map[string]interface{} { result := make(map[string]interface{}) - var receiver []string utils.RunCommand(utils.CmdDeleteAlert) - sender := "" - smtp := "" - password := "" - port := "" switCh := "" - if len(data) != 0 { - if _, ok := data["flag"]; ok { - if data["flag"] != "" { - switCh = "on" - } else { - switCh = "off" - } - } - if _, ok := data["smtp"]; ok { - smtp = data["smtp"].(string) - } - if _, ok := data["sender"]; ok { - sender = data["sender"].(string) - } - if _, ok := data["password"]; ok { - password = data["password"].(string) - } - if _, ok := data["port"]; ok { - port = fmt.Sprintf("%d", data["port"]) - } - if _, ok := data["receiver"]; ok { - receiver = data["receiver"].([]string) - } + if data.Flag != true { + switCh = "on" + } else { + switCh = "off" } - opsStr := " options email_sender=" + sender + " email_server=" + smtp + " password=" + password + " port=" + port + " switCh=" + switCh + fmt.Println("get receiver: ", data.Receiver) + port := strconv.Itoa(int(data.Port)) + opsStr := " options email_sender=" + data.Sender + " email_server=" + data.Smtp + " password=" + data.Password + " port=" + port + " switCh=" + switCh cmdStr := utils.CmdCreateAlert + opsStr + fmt.Println(cmdStr) _, err := utils.RunCommand(cmdStr) if err != nil { result["action"] = false + fmt.Println("err1") + fmt.Println(err) result["error"] = gettext.Gettext("Set alarm failed") return result } - for _, recipient := range receiver { + for _, recipient := range data.Receiver { + fmt.Println("set recipient") reveiverStr := utils.CmdAddAlert + " value=" + string(recipient) + " --force" + fmt.Println(reveiverStr) _, err := utils.RunCommand(reveiverStr) if err != nil { result["action"] = false + fmt.Println("err2") + fmt.Println(err) result["error"] = gettext.Gettext("Set alarm failed") return result } @@ -159,3 +165,34 @@ func AlarmsSet(data map[string]interface{}) map[string]interface{} { result["info"] = gettext.Gettext("Set alarm success") return result } + +func AlarmsTest() utils.GeneralResponse { + var result utils.GeneralResponse + alarmConfig := AlarmsGet().Data + for _, recipient := range alarmConfig.Receiver { + port := strconv.Itoa(int(alarmConfig.Port)) + reveiverStr := utils.CmdSendEmail + alarmConfig.Smtp + "' '" + alarmConfig.Sender + "' '" + alarmConfig.Password + "' '" + recipient + "' '此邮件为测试邮件' " + port + fmt.Println(reveiverStr) + out, err := utils.RunCommand(reveiverStr) + if err != nil { + fmt.Println(out) + fmt.Println(err) + testcmd := "echo send mail to " + string(recipient) + " failed:" + string(out) + " >>/var/log/mailtest.log" + out1, err1 := utils.RunCommand(testcmd) + if err1 != nil { + fmt.Println(out1) + } + result.Action = false + result.Error = gettext.Gettext("Send alarm test failed") + return result + + } else { + testcmd := "echo send mail to " + string(recipient) + " success >>/var/log/mailtest.log" + utils.RunCommand(testcmd) + } + } + result.Action = true + result.Info = gettext.Gettext("Send alarm test success") + return result + +}