Keep It Simple Stupid Stats (KISSS)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

95 lines
2.2 KiB

package main
import (
"fmt"
"github.com/jordan-wright/email"
"github.com/whiteshtef/clockwork"
"io/ioutil"
"net"
"net/http"
"net/smtp"
)
type report struct {
Name string `json:"name"`
Time string `json:"time"`
Query string `json:"query"`
Type string `json:"type"`
To string `json:"to"`
TGUserId int `json:"tgUserId"`
}
func startReports() {
scheduler := clockwork.NewScheduler()
for _, r := range appConfig.Reports {
scheduledReport := r
scheduler.Schedule().Every().Day().At(scheduledReport.Time).Do(func() {
executeReport(&scheduledReport)
})
}
scheduler.Run()
}
func executeReport(r *report) {
fmt.Println("Execute report:", r.Name)
req, e := http.NewRequest("GET", "http://localhost:"+appConfig.Port+"/stats?"+r.Query, nil)
if e != nil {
fmt.Println("Executing report failed:", e)
return
}
req.SetBasicAuth(appConfig.StatsUsername, appConfig.StatsPassword)
res, e := http.DefaultClient.Do(req)
if e != nil {
fmt.Println("Executing report failed:", e)
return
}
body, e := ioutil.ReadAll(res.Body)
if e != nil {
fmt.Println("Executing report failed:", e)
return
}
sendReport(r, body)
}
func sendReport(r *report, content []byte) {
switch r.Type {
case "telegram":
sendTelegram(r, content)
default:
sendMail(r, content)
}
}
func sendMail(r *report, content []byte) {
if r.To == "" || appConfig.SmtpFrom == "" || appConfig.SmtpUser == "" || appConfig.SmtpHost == "" {
fmt.Println("No valid report configuration")
return
}
smtpHostNoPort, _, _ := net.SplitHostPort(appConfig.SmtpHost)
mail := email.NewEmail()
mail.From = appConfig.SmtpFrom
mail.To = []string{r.To}
mail.Subject = "KISSS report: " + r.Name
mail.Text = content
e := mail.Send(appConfig.SmtpHost, smtp.PlainAuth("", appConfig.SmtpUser, appConfig.SmtpPassword, smtpHostNoPort))
if e != nil {
fmt.Println("Sending report failed:", e)
return
} else {
fmt.Println("Report sent")
}
}
func sendTelegram(r *report, content []byte) {
if r.TGUserId == 0 || app.telegram == nil {
fmt.Println("No valid report configuration")
return
}
e := app.telegram.sendMessage(r.TGUserId, r.Name+"\n\n"+string(content))
if e != nil {
fmt.Println("Sending report failed:", e)
return
} else {
fmt.Println("Report sent")
}
}