93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
package notifications
|
|
|
|
import (
|
|
"context"
|
|
"crypto/tls"
|
|
"fmt"
|
|
|
|
"github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2"
|
|
|
|
"github.com/pkg/errors"
|
|
"gopkg.in/gomail.v2"
|
|
corev1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
|
|
)
|
|
|
|
const (
|
|
mailSubject = "Jenkins Operator Notification"
|
|
)
|
|
|
|
type SMTP struct {
|
|
k8sClient k8sclient.Client
|
|
}
|
|
|
|
func (s SMTP) Send(event Event, config v1alpha2.Notification) error {
|
|
usernameSecret := &corev1.Secret{}
|
|
passwordSecret := &corev1.Secret{}
|
|
|
|
usernameSelector := config.SMTP.UsernameSecretKeySelector
|
|
passwordSelector := config.SMTP.PasswordSecretKeySelector
|
|
|
|
err := s.k8sClient.Get(context.TODO(), types.NamespacedName{Name: usernameSelector.Name, Namespace: event.Jenkins.Namespace}, usernameSecret)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = s.k8sClient.Get(context.TODO(), types.NamespacedName{Name: passwordSelector.Name, Namespace: event.Jenkins.Namespace}, passwordSecret)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
usernameSecretValue := string(usernameSecret.Data[usernameSelector.Key])
|
|
if usernameSecretValue == "" {
|
|
return errors.Errorf("SMTP username is empty in secret '%s/%s[%s]", event.Jenkins.Namespace, usernameSelector.Name, usernameSelector.Key)
|
|
}
|
|
|
|
passwordSecretValue := string(passwordSecret.Data[passwordSelector.Key])
|
|
if passwordSecretValue == "" {
|
|
return errors.Errorf("SMTP password is empty in secret '%s/%s[%s]", event.Jenkins.Namespace, passwordSelector.Name, passwordSelector.Key)
|
|
}
|
|
|
|
mailer := gomail.NewDialer(config.SMTP.Server, config.SMTP.Port, usernameSecretValue, passwordSecretValue)
|
|
mailer.TLSConfig = &tls.Config{InsecureSkipVerify: config.SMTP.TLSInsecureSkipVerify}
|
|
|
|
var statusMessage string
|
|
|
|
if config.Verbose {
|
|
message := event.Message + "<ul>"
|
|
for _, msg := range event.MessagesVerbose {
|
|
message = message + "<li>" + msg + "</li>"
|
|
}
|
|
message = message + "</ul>"
|
|
statusMessage = message
|
|
} else {
|
|
statusMessage = event.Message
|
|
}
|
|
|
|
htmlMessage := fmt.Sprintf(content, s.getStatusColor(event.LogLevel), notificationTitle(event), statusMessage, event.Jenkins.Name, event.Phase)
|
|
message := gomail.NewMessage()
|
|
|
|
message.SetHeader("From", config.SMTP.From)
|
|
message.SetHeader("To", config.SMTP.To)
|
|
message.SetHeader("Subject", mailSubject)
|
|
message.SetBody("text/html", htmlMessage)
|
|
|
|
if err := mailer.DialAndSend(message); err != nil {
|
|
fmt.Print(err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s SMTP) getStatusColor(logLevel v1alpha2.NotificationLogLevel) StatusColor {
|
|
switch logLevel {
|
|
case v1alpha2.NotificationLogLevelInfo:
|
|
return "blue"
|
|
case v1alpha2.NotificationLogLevelWarning:
|
|
return "red"
|
|
default:
|
|
return "gray"
|
|
}
|
|
} |