package notification import ( // External werr "git.gibonuddevalla.se/go/wrappederror" // Standard "encoding/json" "log/slog" "os/exec" "strconv" "strings" ) type Script struct { Filename string Prio int AcknowledgeURL string logger *slog.Logger } func NewScript(config []byte, prio int, ackURL string) (instance *Script, err error) { instance = new(Script) err = json.Unmarshal(config, &instance) if err != nil { err = werr.Wrap(err).WithCode("002-0001").WithData(config) return } instance.Prio = prio instance.AcknowledgeURL = ackURL return instance, nil } func (script *Script) SetLogger(l *slog.Logger) { script.logger = l } func (script *Script) GetType() string { return "SCRIPT" } func (script *Script) GetPrio() int { return script.Prio } func (script Script) Send(problemID int, msg []byte) (err error) { var errbuf strings.Builder cmd := exec.Command(script.Filename, strconv.Itoa(problemID), script.AcknowledgeURL, string(msg)) cmd.Stderr = &errbuf err = cmd.Run() if err != nil { script.logger.Error("notification", "type", "script", "error", err) err = werr.Wrap(err).WithData( struct { Filename string ProblemID int Msg string StdErr string }{ script.Filename, problemID, string(msg), errbuf.String(), }, ).Log() } return }