Semaphore/services/tasks/alert.go

137 lines
3.6 KiB
Go
Raw Normal View History

2017-02-22 09:46:42 +01:00
package tasks
import (
"bytes"
"html/template"
2017-03-22 08:22:09 +01:00
"net/http"
2017-02-22 09:46:42 +01:00
"strconv"
2021-10-26 18:54:19 +02:00
"strings"
2017-02-22 09:46:42 +01:00
"github.com/ansible-semaphore/semaphore/util"
)
2022-02-03 08:05:13 +01:00
const emailTemplate = `Subject: Task '{{ .Name }}' failed
2022-02-03 08:05:13 +01:00
Task {{ .TaskID }} with template '{{ .Name }}' has failed!
2017-04-22 05:22:16 +02:00
Task log: <a href='{{ .TaskURL }}'>{{ .TaskURL }}</a>`
2022-02-03 08:05:13 +01:00
const telegramTemplate = `{"chat_id": "{{ .ChatID }}","parse_mode":"HTML","text":"<code>{{ .Name }}</code>\n#{{ .TaskID }} <b>{{ .TaskResult }}</b> <code>{{ .TaskVersion }}</code> {{ .TaskDescription }}\nby {{ .Author }}\n{{ .TaskURL }}"}`
2017-03-22 08:22:09 +01:00
// Alert represents an alert that will be templated and sent to the appropriate service
type Alert struct {
2021-10-26 18:54:19 +02:00
TaskID string
2022-02-03 08:05:13 +01:00
Name string
2021-10-26 18:54:19 +02:00
TaskURL string
ChatID string
TaskResult string
TaskDescription string
TaskVersion string
Author string
}
func (t *TaskRunner) sendMailAlert() {
if !util.Config.EmailAlert || !t.alert {
2017-03-13 03:30:48 +01:00
return
}
mailHost := util.Config.EmailHost + ":" + util.Config.EmailPort
var mailBuffer bytes.Buffer
2017-04-18 16:36:09 +02:00
alert := Alert{
TaskID: strconv.Itoa(t.task.ID),
2022-02-03 08:05:13 +01:00
Name: t.template.Name,
2017-04-18 16:36:09 +02:00
TaskURL: util.Config.WebHost + "/project/" + strconv.Itoa(t.template.ProjectID),
}
2017-03-13 03:30:48 +01:00
tpl := template.New("mail body template")
tpl, err := tpl.Parse(emailTemplate)
util.LogError(err)
2017-03-13 03:30:48 +01:00
t.panicOnError(tpl.Execute(&mailBuffer, alert), "Can't generate alert template!")
2017-02-22 09:46:42 +01:00
2017-03-13 03:30:48 +01:00
for _, user := range t.users {
userObj, err := t.pool.store.GetUser(user)
2017-03-13 03:30:48 +01:00
if !userObj.Alert {
2017-03-13 03:30:48 +01:00
return
}
2021-10-26 18:54:19 +02:00
t.panicOnError(err, "Can't find user Email!")
2017-03-13 03:30:48 +01:00
t.Log("Sending email to " + userObj.Email + " from " + util.Config.EmailSender)
2021-09-22 05:43:19 +02:00
if util.Config.EmailSecure {
2021-09-22 06:01:53 +02:00
err = util.SendSecureMail(util.Config.EmailHost, util.Config.EmailPort, util.Config.EmailSender, util.Config.EmailUsername, util.Config.EmailPassword, userObj.Email, mailBuffer)
2021-09-22 05:43:19 +02:00
} else {
err = util.SendMail(mailHost, util.Config.EmailSender, userObj.Email, mailBuffer)
}
t.panicOnError(err, "Can't send email!")
2017-03-13 03:30:48 +01:00
}
2017-02-22 09:46:42 +01:00
}
2017-03-22 08:22:09 +01:00
func (t *TaskRunner) sendTelegramAlert() {
if !util.Config.TelegramAlert || !t.alert {
2017-03-22 08:22:09 +01:00
return
}
chatID := util.Config.TelegramChat
if t.alertChat != nil && *t.alertChat != "" {
chatID = *t.alertChat
}
2017-03-22 08:22:09 +01:00
var telegramBuffer bytes.Buffer
2021-10-26 18:54:19 +02:00
var version string
if t.task.Version != nil {
version = *t.task.Version
} else if t.task.BuildTaskID != nil {
version = "build " + strconv.Itoa(*t.task.BuildTaskID)
} else {
version = ""
}
var message string
if t.task.Message != "" {
message = "- " + t.task.Message
}
var author string
if t.task.UserID != nil {
user, err := t.pool.store.GetUser(*t.task.UserID)
2021-10-26 18:54:19 +02:00
if err != nil {
panic(err)
}
author = user.Name
}
2017-04-18 16:36:09 +02:00
alert := Alert{
2021-10-26 18:54:19 +02:00
TaskID: strconv.Itoa(t.task.ID),
2022-02-03 08:05:13 +01:00
Name: t.template.Name,
2021-10-26 18:54:19 +02:00
TaskURL: util.Config.WebHost + "/project/" + strconv.Itoa(t.template.ProjectID) + "/templates/" + strconv.Itoa(t.template.ID) + "?t=" + strconv.Itoa(t.task.ID),
ChatID: chatID,
TaskResult: strings.ToUpper(t.task.Status),
TaskVersion: version,
TaskDescription: message,
Author: author,
2017-04-18 16:36:09 +02:00
}
2021-08-31 14:03:52 +02:00
2017-03-22 08:22:09 +01:00
tpl := template.New("telegram body template")
2021-10-26 18:54:19 +02:00
2017-03-22 08:22:09 +01:00
tpl, err := tpl.Parse(telegramTemplate)
2021-10-26 18:54:19 +02:00
if err != nil {
t.Log("Can't parse telegram template!")
2021-10-26 18:54:19 +02:00
panic(err)
}
2017-03-22 08:22:09 +01:00
2021-10-26 18:54:19 +02:00
err = tpl.Execute(&telegramBuffer, alert)
if err != nil {
t.Log("Can't generate alert template!")
2021-10-26 18:54:19 +02:00
panic(err)
}
2017-03-22 08:22:09 +01:00
2017-03-24 08:50:26 +01:00
resp, err := http.Post("https://api.telegram.org/bot"+util.Config.TelegramToken+"/sendMessage", "application/json", &telegramBuffer)
2017-03-22 08:22:09 +01:00
2021-10-26 18:54:19 +02:00
if err != nil {
t.Log("Can't send telegram alert! Response code not 200!")
2021-10-26 18:54:19 +02:00
} else if resp.StatusCode != 200 {
t.Log("Can't send telegram alert! Response code not 200!")
2017-03-24 08:50:26 +01:00
}
2017-03-22 08:22:09 +01:00
}