From 3ed3047e35bcc4df9423d6fbae22f79bafbbb40b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Wed, 5 Jul 2023 09:57:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/app/main.go | 2 ++ internal/watch/record.go | 16 +++++++++ pkg/pushcat/pushcat.go | 70 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 pkg/pushcat/pushcat.go diff --git a/cmd/app/main.go b/cmd/app/main.go index af0054a..5fa6c27 100644 --- a/cmd/app/main.go +++ b/cmd/app/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "github.com/codfrm/dnspod-watch/pkg/pushcat" "log" "github.com/codfrm/cago" @@ -19,6 +20,7 @@ func main() { err = cago.New(ctx, cfg). Registry(cago.FuncComponent(logger.Logger)). + Registry(pushcat.Pushcat()). Registry(watch.Watch()). Start() if err != nil { diff --git a/internal/watch/record.go b/internal/watch/record.go index d6c6b1f..0bd696f 100644 --- a/internal/watch/record.go +++ b/internal/watch/record.go @@ -2,6 +2,8 @@ package watch import ( "context" + "fmt" + "github.com/codfrm/dnspod-watch/pkg/pushcat" "net" "time" @@ -52,13 +54,20 @@ func (r *record) watch(ctx context.Context) { request.RecordId = common.Uint64Ptr(*r.record.RecordId) request.Status = common.StringPtr("DISABLE") _, err := r.w.client.ModifyRecordStatus(request) + msg := fmt.Sprintf("域名: %s, 记录: %s, ip无法访问,暂停记录", r.domain, r.value) if err != nil { r.logger.Ctx(ctx).Error("modify record status err", zap.Error(err)) + msg += "\n记录修改失败: " + err.Error() } else { r.logger.Ctx(ctx).Info("modify record status success", zap.String("status", "DISABLE")) r.isDisable = true } + if err := pushcat.Send(ctx, "ip无法访问,暂停记录", msg); err != nil { + r.logger.Ctx(ctx).Error("发送通知错误", + zap.Error(err), + zap.String("msg", msg)) + } } } else if r.isDisable && count > 3 { // 检查连续成功3次,开启记录 @@ -69,13 +78,20 @@ func (r *record) watch(ctx context.Context) { request.RecordId = common.Uint64Ptr(*r.record.RecordId) request.Status = common.StringPtr("ENABLE") _, err := r.w.client.ModifyRecordStatus(request) + msg := fmt.Sprintf("域名: %s, 记录: %s, ip可以访问,开启记录", r.domain, r.value) if err != nil { r.logger.Ctx(ctx).Error("modify record status err", zap.Error(err)) + msg += "\n记录修改失败: " + err.Error() } else { r.logger.Ctx(ctx).Info("modify record status success", zap.String("status", "ENABLE")) r.isDisable = false } + if err := pushcat.Send(ctx, "ip可以访问,开启记录", msg); err != nil { + r.logger.Ctx(ctx).Error("发送通知错误", + zap.Error(err), + zap.String("msg", msg)) + } } else { r.logger.Ctx(ctx).Info("ip is ok") } diff --git a/pkg/pushcat/pushcat.go b/pkg/pushcat/pushcat.go new file mode 100644 index 0000000..50ab8d2 --- /dev/null +++ b/pkg/pushcat/pushcat.go @@ -0,0 +1,70 @@ +package pushcat + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "github.com/codfrm/cago" + "github.com/codfrm/cago/configs" + "io" + "net/http" +) + +type Config struct { + AccessToken []string `yaml:"accessToken"` +} + +type Data struct { + Title string `json:"title"` + Content string `json:"content"` +} + +var defaultConfig *Config + +func Pushcat() cago.FuncComponent { + return func(ctx context.Context, cfg *configs.Config) error { + defaultConfig = &Config{} + if err := cfg.Scan("pushcat", defaultConfig); err != nil { + return err + } + return nil + } +} + +func Send(ctx context.Context, title, msg string) error { + url := "https://sct.icodef.com/openapi/v1/message/send" + + data := &Data{ + Title: title, + Content: msg, + } + + jsonData, err := json.Marshal(data) + if err != nil { + return err + } + + for _, token := range defaultConfig.AccessToken { + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "Bearer "+token) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + respData, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK { + return errors.New(string(respData)) + } + } + return nil +}