Healthcheck/notifier.go
2024-09-01 22:05:49 -03:00

82 lines
1.5 KiB
Go

package main
import (
"encoding/json"
"log"
"os"
"time"
)
func saveStatus(status HostStatus) error {
inMemoryStatus = status
data, err := json.Marshal(status)
if err != nil {
return err
}
return os.WriteFile("status.json", data, 0644)
}
var inMemoryStatus = make(HostStatus)
func loadStatus() (HostStatus, error) {
if len(inMemoryStatus) != 0 {
return inMemoryStatus, nil
}
data, err := os.ReadFile("status.json")
if err != nil {
return nil, err
}
var status HostStatus
err = json.Unmarshal(data, &status)
if err != nil {
return nil, err
}
inMemoryStatus = status
return status, nil
}
func watchStatusChanges() {
status, err := getHostStatus()
previous, err := loadStatus()
if err != nil {
err = saveStatus(status)
if err != nil {
log.Printf("Error saving status: %v", err)
}
}
for key, value := range status {
if previous[key] != value {
err := sendStatusReport(key, value, previous[key])
if err != nil {
log.Printf("Error sending status report: %v", err)
}
}
}
err = saveStatus(status)
if err != nil {
log.Printf("Error saving status: %v", err)
}
}
func taskStatusChangeNotifier() {
var interval int
err := db.QueryRow("SELECT value FROM configuration WHERE name = 'notify_interval_seconds'").Scan(&interval)
if err != nil {
log.Fatal("Erro ao buscar configuração de intervalo de notificação:", err)
}
ticker := time.NewTicker(time.Duration(interval) * time.Second)
defer ticker.Stop()
initSMTP()
sendReportingStarted()
for range ticker.C {
watchStatusChanges()
}
}