Skip to content

Commit

Permalink
E-posta ile bildirim özelliği, hata ve hata harici mesajların farklı …
Browse files Browse the repository at this point in the history
…Mattermost kanallarına ve e-posta adreslerine bildirilmesi özelliği
  • Loading branch information
erdolc committed Dec 29, 2022
1 parent dd2798a commit cafb075
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 58 deletions.
71 changes: 26 additions & 45 deletions backup/snapshotter.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ type formattedStats struct {
Size string `yaml:"size"`
} `yaml:"incremental"`
Total struct {
FileCount int `yaml:"file_count"`
FileCount int `yaml:"file_count"`
Size string `yaml:"size"`
} `yaml:"total"`
StartTime string `yaml:"start_time"`
Expand Down Expand Up @@ -96,7 +96,16 @@ func NewSnapshotter(params *config.Params) (s *Snapshotter) {
"Snapshot alma işleminde hata oluştu.",
"Elasticsearch client oluşturulamadı:",
err.Error(),
true,
)

notify.Email(
s.p,
"Snapshot alma işleminde hata oluştu",
"Elasticsearch client oluşturulamadı: "+err.Error(),
true,
)

return
}
s.c = c
Expand All @@ -108,9 +117,9 @@ func (s *Snapshotter) Snapshot() {
TASKS:
for _, task := range s.p.Elasticsearch.Tasks {
if len(task.Indexes) == 0 {
s.m.Notify("Elasticsearch için `"+task.Repository+"` repository'sine tüm index'ler için snapshot alma işlemi başladı.", "", "")
s.m.Notify("Elasticsearch için `"+task.Repository+"` repository'sine tüm index'ler için snapshot alma işlemi başladı.", "", "", false)
} else {
s.m.Notify("Elasticsearch için `"+task.Repository+"` repository'sine `"+strings.Join(task.Indexes, ",")+"` index'leri için snapshot alma işlemi başladı.", "", "")
s.m.Notify("Elasticsearch için `"+task.Repository+"` repository'sine `"+strings.Join(task.Indexes, ",")+"` index'leri için snapshot alma işlemi başladı.", "", "", false)
}

vrReq := esapi.SnapshotVerifyRepositoryRequest{
Expand All @@ -122,15 +131,19 @@ TASKS:
"Snapshot alma işleminde hata oluştu.",
"`"+task.Repository+"` repository'si için doğrulama isteği Elasticsearch API'ına gönderilemedi:",
err.Error(),
true,
)
notify.Email(s.p, "Snapshot alma işleminde hata oluştu.", task.Repository+" repository'si için doğrulama isteği Elasticsearch API'ına gönderilemedi: "+err.Error(), true)
continue TASKS
}
if res.IsError() {
s.m.Notify(
"Snapshot alma işleminde hata oluştu.",
"`"+task.Repository+"` repository'si için doğrulama isteğine Elasticsearch API'ından 2XX harici yanıt geldi:",
res.String(),
true,
)
notify.Email(s.p, "Snapshot alma işleminde hata oluştu.", task.Repository+" repository'si için doğrulama isteğine Elasticsearch API'ından 2XX harici yanıt geldi: "+res.String(), true)
continue TASKS
}

Expand All @@ -153,15 +166,19 @@ TASKS:
"Snapshot alma işleminde hata oluştu.",
"Snapshot oluşturma isteği Elasticsearch API'ına gönderilemedi:",
err.Error(),
true,
)
notify.Email(s.p, "Snapshot alma işleminde hata oluştu.", "Snapshot oluşturma isteği Elasticsearch API'ına gönderilemedi:"+err.Error(), true)
continue TASKS
}
if res.IsError() {
s.m.Notify(
"Snapshot alma işleminde hata oluştu.",
"Snapshot oluşturma isteğine Elasticsearch API'ından 2XX harici yanıt geldi:",
res.String(),
true,
)
notify.Email(s.p, "Snapshot alma işleminde hata oluştu.", "Snapshot oluşturma isteğine Elasticsearch API'ından 2XX harici yanıt geldi:" + res.String(), true)
continue TASKS
}

Expand All @@ -175,7 +192,9 @@ TASKS:
"Snapshot alma işleminde hata oluştu.",
"Snapshot oluşturma isteği sonrası kontrol, zaman aşımına uğradı.",
"Zaman aşımı süresi: "+strconv.Itoa(task.TimeoutByMinutes)+" dakika",
true,
)
notify.Email(s.p, "Snapshot alma işleminde hata oluştu.", "Snapshot oluşturma isteği sonrası kontrol, zaman aşımına uğradı.", true)
cancel()
continue TASKS
default:
Expand Down Expand Up @@ -212,55 +231,17 @@ TASKS:
"Elasticsearch için snapshot alma işlemi sona erdi.",
"Snapshot ayrıntıları:",
fs,
false,
)
notify.Email(s.p, "Elasticsearch için snapshot alma işlemi sona erdi.", "Snapshot ayrıntıları: "+fs, false)

continue TASKS
}
}
}
}
}

func (s *Snapshotter) Prune() {
/*
s.m.Notify("Elasticsearch için `"+s.p.Elasticsearch.Repository+"` repository'sindeki eski snapshot'ları kaldırma işlemi başladı.", "", "")
sReq := esapi.CatSnapshotsRequest{
Repository: []string{s.p.Elasticsearch.Repository},
}
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(s.p.Elasticsearch.TimeoutByMinutes)*time.Minute)
defer cancel()
res, err := sReq.Do(ctx, s.c)
if err != nil {
s.m.Notify(
"Eski snapshot'ları kaldırma işleminde hata oluştu.",
"Snapshot'lar listenemedi.",
err.Error())
return
}
srb := new(snapshotsResponseBody)
err = yaml.NewDecoder(res.Body).Decode(&srb)
if err != nil {
s.m.Notify(
"Eski snapshot'ları kaldırma işleminde hata oluştu.",
"Snapshot listesi struct'a çevrilemedi.",
err.Error())
return
}
total := len(srb.Snapshots)
overMax := total - s.p.Elasticsearch.Retention.MaxCount
for i, snapshot := range srb.Snapshots {
if i < overMax && total > s.p.Elasticsearch.Retention.MinCount {
_ = snapshot
}
}
*/
}

func formatStats(yml string) (string, error) {
s := stats{}
err := yaml.Unmarshal([]byte(yml), &s)
Expand All @@ -279,7 +260,7 @@ func formatStats(yml string) (string, error) {
if err != nil {
return "", err
}
st := time.Unix(0, int64(s.StartTimeInMillis) * int64(time.Millisecond)).In(loc)
st := time.Unix(0, int64(s.StartTimeInMillis)*int64(time.Millisecond)).In(loc)
fs.StartTime = st.Format("2006-01-02 15:04:05.000")

fs.Time = durafmt.Parse(time.Duration(s.TimeInMillis) * time.Millisecond).String()
Expand Down
27 changes: 23 additions & 4 deletions config/config.sample.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,26 @@ elasticsearch:
expireAfter: 30
minCount: 5
maxCount: 50
mattermost:
channelId: k7z8p13hmpfgpgfya6118g153e
apiToken: fj11m54hqf86jfaey5yu7eye1a
url: https://chat.vkk.io
notify:
email:
enabled: true
info:
smtpHost: smtp.gmail.com
smtpPort: 587
from: [email protected]
password: 123456
to: [email protected]
error:
smtpHost: smtp.gmail.com
smtpPort: 587
from: [email protected]
password: 123456
to: [email protected]
mattermost:
enabled: true
info:
channelId: channel id
apiToken: api token
error:
channelId: channel id
apiToken: api token
29 changes: 25 additions & 4 deletions config/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,35 @@ type Params struct {
}
}
}
Mattermost struct{
Url string
ChannelId string
ApiToken string
Notify struct{
Email struct{
Enabled bool
Info EmailConfig
Error EmailConfig
}
Mattermost struct{
Enabled bool
Info MattermostConfig
Error MattermostConfig
}
}
Hostname string
}

type MattermostConfig struct {
Url string
ChannelId string
ApiToken string
}

type EmailConfig struct {
SmtpHost string
SmtpPort int
From string
Password string
To string
}

func NewParams() (p *Params) {
filePath := flag.String("config", "/etc/es-backup.yml", "Path of the configuration file in YAML format")
flag.Parse()
Expand Down
1 change: 0 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ github.com/elastic/go-elasticsearch/v7 v7.10.0/go.mod h1:OJ4wdbtDNk5g503kvlHLyEr
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
Expand Down
39 changes: 39 additions & 0 deletions notify/email.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package notify

import (
"es-backup/config"
"net/smtp"
"strconv"
)

func Email(params *config.Params, subject string, message string, isError bool) {
if !params.Notify.Email.Enabled {
return
}

var smtpHost, from, password, to string
var smtpPort int

if isError {
smtpHost = params.Notify.Email.Error.SmtpHost
smtpPort = params.Notify.Email.Error.SmtpPort
from = params.Notify.Email.Error.From
password = params.Notify.Email.Error.Password
to = params.Notify.Email.Error.To
} else {
smtpHost = params.Notify.Email.Info.SmtpHost
smtpPort = params.Notify.Email.Info.SmtpPort
from = params.Notify.Email.Info.From
password = params.Notify.Email.Info.Password
to = params.Notify.Email.Info.To
}

auth := smtp.PlainAuth("", from, password, smtpHost)

msg := []byte("From: " + from + "\r\n" +
"To: " + to + "\r\n" +
"Subject: [" + params.Hostname + "] " + subject + "\r\n\r\n" +
message + "\r\n")

_ = smtp.SendMail(smtpHost+":"+strconv.Itoa(smtpPort), auth, from, []string{to}, msg)
}
24 changes: 20 additions & 4 deletions notify/mattermost.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,29 @@ func NewMattermost(params *config.Params) (m *Mattermost) {
return
}

func (m *Mattermost) Notify(message string, pretext string, text string) {
func (m *Mattermost) Notify(message string, pretext string, text string, isError bool) {
if !m.p.Notify.Mattermost.Enabled {
return
}

if m.p.Hostname != "" {
message = "**[" + m.p.Hostname + "]** " + message
}

var channelID, apiToken, url string

if isError {
channelID = m.p.Notify.Mattermost.Error.ChannelId
apiToken = m.p.Notify.Mattermost.Error.ApiToken
url = m.p.Notify.Mattermost.Error.Url+"/api/v4/posts"
} else {
channelID = m.p.Notify.Mattermost.Info.ChannelId
apiToken = m.p.Notify.Mattermost.Info.ApiToken
url = m.p.Notify.Mattermost.Info.Url+"/api/v4/posts"
}

data := Payload{
ChannelID: m.p.Mattermost.ChannelId,
ChannelID: channelID,
Message: message,
}

Expand All @@ -61,13 +77,13 @@ func (m *Mattermost) Notify(message string, pretext string, text string) {
}
body := bytes.NewReader(payloadBytes)

req, err := http.NewRequest("POST", m.p.Mattermost.Url+"/api/v4/posts", body)
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Printf("Error creating POST request for Mattermost: %q", err.Error())
return
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+m.p.Mattermost.ApiToken)
req.Header.Set("Authorization", "Bearer "+apiToken)

res, err := http.DefaultClient.Do(req)
if err != nil {
Expand Down

0 comments on commit cafb075

Please sign in to comment.