From 1aa2949fb423bdb326ad6338227da4243f8c1681 Mon Sep 17 00:00:00 2001 From: kylinhao Date: Fri, 3 Dec 2021 13:51:39 +0800 Subject: [PATCH] add mailconfig --- go.mod | 4 +- go.sum | 10 ++ pkg/net/http/alertmanagerMailConfig.go | 205 +++++++++++++++++++++++++ 3 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 pkg/net/http/alertmanagerMailConfig.go diff --git a/go.mod b/go.mod index 0a553630..4cd6fb1b 100644 --- a/go.mod +++ b/go.mod @@ -11,10 +11,12 @@ require ( github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible github.com/lestrrat-go/strftime v1.0.4 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/sftp v1.13.4 github.com/satori/go.uuid v1.2.0 github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v1.2.1 github.com/spf13/viper v1.9.0 github.com/valyala/fastjson v1.6.3 - golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 + golang.org/x/crypto v0.0.0-20211202192323-5770296d904e + golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 // indirect ) diff --git a/go.sum b/go.sum index 34d7acde..af971ef2 100644 --- a/go.sum +++ b/go.sum @@ -234,6 +234,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= @@ -291,6 +292,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.4 h1:Lb0RYJCmgUcBgZosfoi9Y9sbl6+LJgOIgk/2Y4YjMFg= +github.com/pkg/sftp v1.13.4/go.mod h1:LzqnAvaD5TWeNBsZpfKxSYn1MbjWwOsCIAFFJbpIsK8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -369,8 +372,11 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -445,6 +451,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -520,6 +527,7 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -529,6 +537,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/pkg/net/http/alertmanagerMailConfig.go b/pkg/net/http/alertmanagerMailConfig.go new file mode 100644 index 00000000..72e67cea --- /dev/null +++ b/pkg/net/http/alertmanagerMailConfig.go @@ -0,0 +1,205 @@ +package http + +import ( + "bufio" + "fmt" + "log" + "net" + "net/http" + "net/url" + "os" + "strconv" + "strings" + "time" + + "github.com/pkg/sftp" + "golang.org/x/crypto/ssh" +) + +// 实现alertmanager邮箱的动态配置 +// Alertmanager配置文件结构 +type AlertmanagerYaml struct { + Global Global `yaml:"global"` + Route Route `yaml:"route"` + Receivers []Receivers `yaml:"receivers"` +} + +// Global +type Global struct { + SmtpSmarthost string `yaml:"smtp_smarthost"` + SmtpFrom string `yaml:"smtp_from"` + SmtpAuthUsername string `yaml:"smtp_auth_username"` + SmtpAuthPassword string `yaml:"smtp_auth_password"` + ResolveTimeout string `yaml:"resolve_timeout"` + SmtpRequireTls bool `yaml:"smtp_require_tls"` +} + +// Route +type Route struct { + GroupBy []string `yaml:"group_by"` + GroupWait string `yaml:"group_wait"` + GroupInterval string `yaml:"group_interval"` + RepeatInterval string `yaml:"repeat_interval"` + Receiver string `yaml:"receiver"` +} + +// Receivers +type Receivers struct { + Name string `yaml:"name"` + EmailConfigs []EmailConfigs `yaml:"email_configs"` +} + +// EmailConfigs +type EmailConfigs struct { + To string `yaml:"to"` +} + +//写邮箱配置文件 +func WriteToYaml(email []string) { + FilePath := "C:/Users/王昊/go/alertmanager.yml" + os.Remove(FilePath) + os.Create(FilePath) + emailstr := strings.Join(email, ", ") + var alertYml AlertmanagerYaml + alertYml.Global.SmtpSmarthost = "'smtp.qq.com:465'" + fmt.Println(alertYml.Global.SmtpSmarthost) + alertYml.Global.SmtpFrom = "'157309081@qq.com'" + alertYml.Global.SmtpAuthUsername = "'157309081@qq.com'" + alertYml.Global.SmtpAuthPassword = "'pklazwfbpvkucbda'" + alertYml.Global.ResolveTimeout = "5m" + alertYml.Global.SmtpRequireTls = false + alertYml.Route.GroupBy = []string{"alertname"} + alertYml.Route.GroupWait = "5s" + alertYml.Route.GroupInterval = "5s" + alertYml.Route.RepeatInterval = "5s" + alertYml.Route.Receiver = "'mail'" + emailConfig := []EmailConfigs{{emailstr}} + alertYml.Receivers = []Receivers{{"'mail'", emailConfig}} + // data, err := yaml.Marshal(&alertYml) + // fmt.Println(string(data)) + // if err != nil { + // fmt.Println(err) + // } + + // err = ioutil.WriteFile("C:/Users/王昊/go/alertmanager.yml", data, 0777) + // if err != nil { + // fmt.Println(err) + // } + file, err := os.OpenFile(FilePath, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + fmt.Println("文件打开失败", err) + } + defer file.Close() + write := bufio.NewWriter(file) + write.WriteString( + "global:" + + "\n smtp_smarthost: " + alertYml.Global.SmtpSmarthost + + "\n smtp_from: " + alertYml.Global.SmtpFrom + + "\n smtp_auth_username: " + alertYml.Global.SmtpAuthUsername + + "\n smtp_auth_password: " + alertYml.Global.SmtpAuthPassword + + "\n resolve_timeout: " + alertYml.Global.ResolveTimeout + + "\n smtp_require_tls: " + strconv.FormatBool(alertYml.Global.SmtpRequireTls) + "\n") + write.WriteString("route:\n group_by: [") + for key, value := range alertYml.Route.GroupBy { + if key == len(alertYml.Route.GroupBy)-1 && key != 0 { + write.WriteString(" '" + value + "'") + } else if key == 0 && len(alertYml.Route.GroupBy) > 1 { + write.WriteString("'" + value + "',") + } else if key == 0 && len(alertYml.Route.GroupBy) == 1 { + write.WriteString("'" + value + "'") + } else { + write.WriteString(" '" + value + "',") + } + } + write.WriteString("]") + write.WriteString("\n group_interval: " + alertYml.Route.GroupInterval) + write.WriteString("\n repeat_interval: " + alertYml.Route.RepeatInterval) + write.WriteString("\n receiver: " + alertYml.Route.Receiver) + write.WriteString("\nreceivers:") + for key, _ := range alertYml.Receivers { + write.WriteString( + "\n- name: " + alertYml.Receivers[key].Name + + "\n email_configs:" + + "\n - to: '" + alertYml.Receivers[key].EmailConfigs[key].To + "'") + + } + write.Flush() +} + +//sftp连接函数 +func connect(user, password, host string, port int) (*sftp.Client, error) { + var ( + auth []ssh.AuthMethod + addr string + clientConfig *ssh.ClientConfig + sshClient *ssh.Client + sftpClient *sftp.Client + err error + ) + // get auth method + auth = make([]ssh.AuthMethod, 0) + auth = append(auth, ssh.Password(password)) + + clientConfig = &ssh.ClientConfig{ + User: user, + Auth: auth, + Timeout: 30 * time.Second, + HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { + return nil + }, + } + + // connet to ssh + addr = fmt.Sprintf("%s:%d", host, port) + + if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil { + return nil, err + } + + // create sftp client + if sftpClient, err = sftp.NewClient(sshClient); err != nil { + return nil, err + } + + return sftpClient, nil +} + +//将邮箱的配置文件传输给alertmanager +func SendFile() { + sftpClient, err := connect( + "root", + "wang13820205036@", + "192.168.217.22", + 22) + if err != nil { + log.Fatal(err) + } + defer sftpClient.Close() + sftpClient.Remove("/root/3/alertmanager.yml") + var localFilePath = "C:/Users/王昊/go/alertmanager.yml" + var remoteDIr = "/root/3/" + srcFile, err := os.Open(localFilePath) + if err != nil { + log.Fatal(err) + } + defer srcFile.Close() + dstFile, err := sftpClient.Create(remoteDIr + "alertmanager.yml") + if err != nil { + log.Fatal(err) + } + defer dstFile.Close() + buf := []byte{0} + for { + n, _ := srcFile.Read(buf) + if n == 0 { + break + } + dstFile.Write(buf) + } +} + +//alertmanager邮箱配置热启动 +func configReload() { + response, _ := http.PostForm("http://192.168.217.22:9093/-/reload", url.Values{}) + fmt.Println(response) +} -- Gitee