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"
 | |
| 	}
 | |
| } |