From 551b06b4e83f6969ed7a05bae41fa888a3aebf99 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Sat, 9 Nov 2024 20:06:22 +0800 Subject: [PATCH] feat: notifier --- internal/pkg/core/notifier/notifier.go | 23 +++++++ .../pkg/core/notifier/providers/bark/bark.go | 48 +++++++++++++ .../notifier/providers/dingtalk/dingtalk.go | 45 ++++++++++++ .../core/notifier/providers/email/email.go | 69 +++++++++++++++++++ .../pkg/core/notifier/providers/lark/lark.go | 41 +++++++++++ .../notifier/providers/telegram/telegram.go | 47 +++++++++++++ .../notifier/providers/webhook/webhook.go | 43 ++++++++++++ .../providers/aliyun-cas/aliyun_cas.go | 5 ++ .../providers/aliyun-slb/aliyun_slb.go | 5 ++ .../uploader/providers/dogecloud/dogecloud.go | 5 ++ .../huaweicloud-elb/huaweicloud_elb.go | 4 ++ .../huaweicloud-scm/huaweicloud_scm.go | 5 ++ .../providers/qiniu-sslcert/qiniu_sslcert.go | 5 ++ .../tencentcloud-ssl/tencentcloud_ssl.go | 5 ++ 14 files changed, 350 insertions(+) create mode 100644 internal/pkg/core/notifier/notifier.go create mode 100644 internal/pkg/core/notifier/providers/bark/bark.go create mode 100644 internal/pkg/core/notifier/providers/dingtalk/dingtalk.go create mode 100644 internal/pkg/core/notifier/providers/email/email.go create mode 100644 internal/pkg/core/notifier/providers/lark/lark.go create mode 100644 internal/pkg/core/notifier/providers/telegram/telegram.go create mode 100644 internal/pkg/core/notifier/providers/webhook/webhook.go diff --git a/internal/pkg/core/notifier/notifier.go b/internal/pkg/core/notifier/notifier.go new file mode 100644 index 00000000..d8819395 --- /dev/null +++ b/internal/pkg/core/notifier/notifier.go @@ -0,0 +1,23 @@ +package notifier + +import "context" + +// 表示定义消息通知器的抽象类型接口。 +type Notifier interface { + // 发送通知。 + // + // 入参: + // - ctx:上下文。 + // - subject:通知主题。 + // - message:通知内容。 + // + // 出参: + // - res:发送结果。 + // - err: 错误。 + Notify(ctx context.Context, subject string, message string) (res *NotifyResult, err error) +} + +// 表示通知发送结果的数据结构。 +type NotifyResult struct { + NotificationData map[string]any `json:"notificationData,omitempty"` +} diff --git a/internal/pkg/core/notifier/providers/bark/bark.go b/internal/pkg/core/notifier/providers/bark/bark.go new file mode 100644 index 00000000..aefd6ab6 --- /dev/null +++ b/internal/pkg/core/notifier/providers/bark/bark.go @@ -0,0 +1,48 @@ +package email + +import ( + "context" + "errors" + + "github.com/nikoksr/notify" + "github.com/nikoksr/notify/service/bark" + + "github.com/usual2970/certimate/internal/pkg/core/notifier" +) + +type BarkNotifierConfig struct { + ServerUrl string `json:"serverUrl"` + DeviceKey string `json:"deviceKey"` +} + +type BarkNotifier struct { + config *BarkNotifierConfig +} + +var _ notifier.Notifier = (*BarkNotifier)(nil) + +func New(config *BarkNotifierConfig) (*BarkNotifier, error) { + if config == nil { + return nil, errors.New("config is nil") + } + + return &BarkNotifier{ + config: config, + }, nil +} + +func (n *BarkNotifier) Notify(ctx context.Context, subject string, message string) (res *notifier.NotifyResult, err error) { + var srv notify.Notifier + if n.config.ServerUrl == "" { + srv = bark.New(n.config.DeviceKey) + } else { + srv = bark.NewWithServers(n.config.DeviceKey, n.config.ServerUrl) + } + + err = srv.Send(ctx, subject, message) + if err != nil { + return nil, err + } + + return ¬ifier.NotifyResult{}, nil +} diff --git a/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go b/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go new file mode 100644 index 00000000..2d1e1220 --- /dev/null +++ b/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go @@ -0,0 +1,45 @@ +package email + +import ( + "context" + "errors" + + "github.com/nikoksr/notify/service/dingding" + + "github.com/usual2970/certimate/internal/pkg/core/notifier" +) + +type DingTalkNotifierConfig struct { + AccessToken string `json:"accessToken"` + Secret string `json:"secret"` +} + +type DingTalkNotifier struct { + config *DingTalkNotifierConfig +} + +var _ notifier.Notifier = (*DingTalkNotifier)(nil) + +func New(config *DingTalkNotifierConfig) (*DingTalkNotifier, error) { + if config == nil { + return nil, errors.New("config is nil") + } + + return &DingTalkNotifier{ + config: config, + }, nil +} + +func (n *DingTalkNotifier) Notify(ctx context.Context, subject string, message string) (res *notifier.NotifyResult, err error) { + srv := dingding.New(&dingding.Config{ + Token: n.config.AccessToken, + Secret: n.config.Secret, + }) + + err = srv.Send(ctx, subject, message) + if err != nil { + return nil, err + } + + return ¬ifier.NotifyResult{}, nil +} diff --git a/internal/pkg/core/notifier/providers/email/email.go b/internal/pkg/core/notifier/providers/email/email.go new file mode 100644 index 00000000..5f767659 --- /dev/null +++ b/internal/pkg/core/notifier/providers/email/email.go @@ -0,0 +1,69 @@ +package email + +import ( + "context" + "errors" + "fmt" + "net/smtp" + "os" + + "github.com/domodwyer/mailyak/v3" + + "github.com/usual2970/certimate/internal/pkg/core/notifier" +) + +type EmailNotifierConfig struct { + SmtpHost string `json:"smtpHost"` + SmtpPort int32 `json:"smtpPort"` + SmtpTLS bool `json:"smtpTLS"` + Username string `json:"username"` + Password string `json:"password"` + SenderAddress string `json:"senderAddress"` + ReceiverAddress string `json:"receiverAddress"` +} + +type EmailNotifier struct { + config *EmailNotifierConfig +} + +var _ notifier.Notifier = (*EmailNotifier)(nil) + +func New(config *EmailNotifierConfig) (*EmailNotifier, error) { + if config == nil { + return nil, errors.New("config is nil") + } + + return &EmailNotifier{ + config: config, + }, nil +} + +func (n *EmailNotifier) Notify(ctx context.Context, subject string, message string) (res *notifier.NotifyResult, err error) { + var smtpAuth smtp.Auth + if n.config.Username != "" || n.config.Password != "" { + smtpAuth = smtp.PlainAuth("", n.config.Username, n.config.Password, n.config.SmtpHost) + } + + var yak *mailyak.MailYak + if n.config.SmtpTLS { + os.Setenv("GODEBUG", "tlsrsakex=1") // Fix for TLS handshake error + yak, err = mailyak.NewWithTLS(fmt.Sprintf("%s:%d", n.config.SmtpHost, n.config.SmtpPort), smtpAuth, nil) + if err != nil { + return nil, err + } + } else { + yak = mailyak.New(fmt.Sprintf("%s:%d", n.config.SmtpHost, n.config.SmtpPort), smtpAuth) + } + + yak.From(n.config.SenderAddress) + yak.To(n.config.ReceiverAddress) + yak.Subject(subject) + yak.Plain().Set(message) + + err = yak.Send() + if err != nil { + return nil, err + } + + return ¬ifier.NotifyResult{}, nil +} diff --git a/internal/pkg/core/notifier/providers/lark/lark.go b/internal/pkg/core/notifier/providers/lark/lark.go new file mode 100644 index 00000000..1afd9660 --- /dev/null +++ b/internal/pkg/core/notifier/providers/lark/lark.go @@ -0,0 +1,41 @@ +package email + +import ( + "context" + "errors" + + "github.com/nikoksr/notify/service/lark" + + "github.com/usual2970/certimate/internal/pkg/core/notifier" +) + +type LarkNotifierConfig struct { + WebhookUrl string `json:"webhookUrl"` +} + +type LarkNotifier struct { + config *LarkNotifierConfig +} + +var _ notifier.Notifier = (*LarkNotifier)(nil) + +func New(config *LarkNotifierConfig) (*LarkNotifier, error) { + if config == nil { + return nil, errors.New("config is nil") + } + + return &LarkNotifier{ + config: config, + }, nil +} + +func (n *LarkNotifier) Notify(ctx context.Context, subject string, message string) (res *notifier.NotifyResult, err error) { + srv := lark.NewWebhookService(n.config.WebhookUrl) + + err = srv.Send(ctx, subject, message) + if err != nil { + return nil, err + } + + return ¬ifier.NotifyResult{}, nil +} diff --git a/internal/pkg/core/notifier/providers/telegram/telegram.go b/internal/pkg/core/notifier/providers/telegram/telegram.go new file mode 100644 index 00000000..e214a4c3 --- /dev/null +++ b/internal/pkg/core/notifier/providers/telegram/telegram.go @@ -0,0 +1,47 @@ +package email + +import ( + "context" + "errors" + + "github.com/nikoksr/notify/service/telegram" + + "github.com/usual2970/certimate/internal/pkg/core/notifier" +) + +type TelegramNotifierConfig struct { + ApiToken string `json:"apiToken"` + ChatId int64 `json:"chatId"` +} + +type TelegramNotifier struct { + config *TelegramNotifierConfig +} + +var _ notifier.Notifier = (*TelegramNotifier)(nil) + +func New(config *TelegramNotifierConfig) (*TelegramNotifier, error) { + if config == nil { + return nil, errors.New("config is nil") + } + + return &TelegramNotifier{ + config: config, + }, nil +} + +func (n *TelegramNotifier) Notify(ctx context.Context, subject string, message string) (res *notifier.NotifyResult, err error) { + srv, err := telegram.New(n.config.ApiToken) + if err != nil { + return nil, err + } + + srv.AddReceivers(n.config.ChatId) + + err = srv.Send(ctx, subject, message) + if err != nil { + return nil, err + } + + return ¬ifier.NotifyResult{}, nil +} diff --git a/internal/pkg/core/notifier/providers/webhook/webhook.go b/internal/pkg/core/notifier/providers/webhook/webhook.go new file mode 100644 index 00000000..1a3cdac8 --- /dev/null +++ b/internal/pkg/core/notifier/providers/webhook/webhook.go @@ -0,0 +1,43 @@ +package email + +import ( + "context" + "errors" + + "github.com/nikoksr/notify/service/http" + + "github.com/usual2970/certimate/internal/pkg/core/notifier" +) + +type WebhookNotifierConfig struct { + Url string `json:"url"` +} + +type WebhookNotifier struct { + config *WebhookNotifierConfig +} + +var _ notifier.Notifier = (*WebhookNotifier)(nil) + +func New(config *WebhookNotifierConfig) (*WebhookNotifier, error) { + if config == nil { + return nil, errors.New("config is nil") + } + + return &WebhookNotifier{ + config: config, + }, nil +} + +func (n *WebhookNotifier) Notify(ctx context.Context, subject string, message string) (res *notifier.NotifyResult, err error) { + srv := http.New() + + srv.AddReceiversURLs(n.config.Url) + + err = srv.Send(ctx, subject, message) + if err != nil { + return nil, err + } + + return ¬ifier.NotifyResult{}, nil +} diff --git a/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go b/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go index dc0a9f8e..463d10bd 100644 --- a/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go +++ b/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go @@ -2,6 +2,7 @@ import ( "context" + "errors" "fmt" "strings" "time" @@ -29,6 +30,10 @@ type AliyunCASUploader struct { var _ uploader.Uploader = (*AliyunCASUploader)(nil) func New(config *AliyunCASUploaderConfig) (*AliyunCASUploader, error) { + if config == nil { + return nil, errors.New("config is nil") + } + client, err := createSdkClient( config.AccessKeyId, config.AccessKeySecret, diff --git a/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go b/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go index aad8e219..aebf674c 100644 --- a/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go +++ b/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go @@ -4,6 +4,7 @@ import ( "context" "crypto/sha256" "encoding/hex" + "errors" "fmt" "strings" "time" @@ -31,6 +32,10 @@ type AliyunSLBUploader struct { var _ uploader.Uploader = (*AliyunSLBUploader)(nil) func New(config *AliyunSLBUploaderConfig) (*AliyunSLBUploader, error) { + if config == nil { + return nil, errors.New("config is nil") + } + client, err := createSdkClient( config.AccessKeyId, config.AccessKeySecret, diff --git a/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go b/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go index 7b11d462..1daec4bb 100644 --- a/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go +++ b/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go @@ -2,6 +2,7 @@ import ( "context" + "errors" "fmt" "time" @@ -24,6 +25,10 @@ type DogeCloudUploader struct { var _ uploader.Uploader = (*DogeCloudUploader)(nil) func New(config *DogeCloudUploaderConfig) (*DogeCloudUploader, error) { + if config == nil { + return nil, errors.New("config is nil") + } + client, err := createSdkClient( config.AccessKey, config.SecretKey, diff --git a/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go b/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go index e313164f..5b6ab376 100644 --- a/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go +++ b/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go @@ -35,6 +35,10 @@ type HuaweiCloudELBUploader struct { var _ uploader.Uploader = (*HuaweiCloudELBUploader)(nil) func New(config *HuaweiCloudELBUploaderConfig) (*HuaweiCloudELBUploader, error) { + if config == nil { + return nil, errors.New("config is nil") + } + client, err := createSdkClient( config.AccessKeyId, config.SecretAccessKey, diff --git a/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go b/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go index 4809faeb..45450d9e 100644 --- a/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go +++ b/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go @@ -2,6 +2,7 @@ import ( "context" + "errors" "fmt" "time" @@ -30,6 +31,10 @@ type HuaweiCloudSCMUploader struct { var _ uploader.Uploader = (*HuaweiCloudSCMUploader)(nil) func New(config *HuaweiCloudSCMUploaderConfig) (*HuaweiCloudSCMUploader, error) { + if config == nil { + return nil, errors.New("config is nil") + } + client, err := createSdkClient( config.AccessKeyId, config.SecretAccessKey, diff --git a/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go b/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go index 148c2998..afd36316 100644 --- a/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go +++ b/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go @@ -2,6 +2,7 @@ import ( "context" + "errors" "fmt" "time" @@ -26,6 +27,10 @@ type QiniuSSLCertUploader struct { var _ uploader.Uploader = (*QiniuSSLCertUploader)(nil) func New(config *QiniuSSLCertUploaderConfig) (*QiniuSSLCertUploader, error) { + if config == nil { + return nil, errors.New("config is nil") + } + client, err := createSdkClient( config.AccessKey, config.SecretKey, diff --git a/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go b/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go index 97a029c5..f0755f3e 100644 --- a/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go +++ b/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go @@ -2,6 +2,7 @@ import ( "context" + "errors" xerrors "github.com/pkg/errors" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" @@ -24,6 +25,10 @@ type TencentCloudSSLUploader struct { var _ uploader.Uploader = (*TencentCloudSSLUploader)(nil) func New(config *TencentCloudSSLUploaderConfig) (*TencentCloudSSLUploader, error) { + if config == nil { + return nil, errors.New("config is nil") + } + client, err := createSdkClient( config.SecretId, config.SecretKey,