mirror of
https://github.com/henrygd/beszel.git
synced 2025-12-17 02:36:17 +01:00
68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
package alerts
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/pocketbase/pocketbase/core"
|
|
)
|
|
|
|
// handleSmartDeviceAlert sends alerts when a SMART device state changes from PASSED to FAILED.
|
|
// This is automatic and does not require user opt-in.
|
|
func (am *AlertManager) handleSmartDeviceAlert(e *core.RecordEvent) error {
|
|
oldState := e.Record.Original().GetString("state")
|
|
newState := e.Record.GetString("state")
|
|
|
|
// Only alert when transitioning from PASSED to FAILED
|
|
if oldState != "PASSED" || newState != "FAILED" {
|
|
return e.Next()
|
|
}
|
|
|
|
systemID := e.Record.GetString("system")
|
|
if systemID == "" {
|
|
return e.Next()
|
|
}
|
|
|
|
// Fetch the system record to get the name and users
|
|
systemRecord, err := e.App.FindRecordById("systems", systemID)
|
|
if err != nil {
|
|
e.App.Logger().Error("Failed to find system for SMART alert", "err", err, "systemID", systemID)
|
|
return e.Next()
|
|
}
|
|
|
|
systemName := systemRecord.GetString("name")
|
|
deviceName := e.Record.GetString("name")
|
|
model := e.Record.GetString("model")
|
|
|
|
// Build alert message
|
|
title := fmt.Sprintf("SMART failure on %s: %s \U0001F534", systemName, deviceName)
|
|
var message string
|
|
if model != "" {
|
|
message = fmt.Sprintf("Disk %s (%s) SMART status changed to FAILED", deviceName, model)
|
|
} else {
|
|
message = fmt.Sprintf("Disk %s SMART status changed to FAILED", deviceName)
|
|
}
|
|
|
|
// Get users associated with the system
|
|
userIDs := systemRecord.GetStringSlice("users")
|
|
if len(userIDs) == 0 {
|
|
return e.Next()
|
|
}
|
|
|
|
// Send alert to each user
|
|
for _, userID := range userIDs {
|
|
if err := am.SendAlert(AlertMessageData{
|
|
UserID: userID,
|
|
SystemID: systemID,
|
|
Title: title,
|
|
Message: message,
|
|
Link: am.hub.MakeLink("system", systemID),
|
|
LinkText: "View " + systemName,
|
|
}); err != nil {
|
|
e.App.Logger().Error("Failed to send SMART alert", "err", err, "userID", userID)
|
|
}
|
|
}
|
|
|
|
return e.Next()
|
|
}
|
|
|