82 lines
1.5 KiB
Go
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()
|
|
}
|
|
}
|