Added notification manager

This commit is contained in:
Magnus Åhall 2024-05-05 10:10:04 +02:00
parent 317c233255
commit 49af9dc33c
6 changed files with 318 additions and 51 deletions

112
main.go
View file

@ -4,7 +4,10 @@ import (
// External
ws "git.gibonuddevalla.se/go/webservice"
"git.gibonuddevalla.se/go/webservice/session"
we "git.gibonuddevalla.se/go/wrappederror"
werr "git.gibonuddevalla.se/go/wrappederror"
// Internal
"smon/notification"
// Standard
"embed"
@ -26,13 +29,14 @@ import (
const VERSION = "v6"
var (
logger *slog.Logger
flagConfigFile string
flagDev bool
service *ws.Service
logFile *os.File
parsedTemplates map[string]*template.Template
componentFilenames []string
logger *slog.Logger
flagConfigFile string
flagDev bool
service *ws.Service
logFile *os.File
parsedTemplates map[string]*template.Template
componentFilenames []string
notificationManager notification.Manager
//go:embed sql
sqlFS embed.FS
@ -50,7 +54,7 @@ func init() { // {{{
confDir, err := os.UserConfigDir()
if err != nil {
logger.Error("application", "error", we.Wrap(err))
logger.Error("application", "error", werr.Wrap(err))
}
cfgPath := path.Join(confDir, "smon.yaml")
flag.StringVar(&flagConfigFile, "config", cfgPath, "Path and filename of the YAML configuration file")
@ -68,8 +72,8 @@ func init() { // {{{
func main() { // {{{
var err error
we.Init()
we.SetLogCallback(logHandler)
werr.Init()
werr.SetLogCallback(logHandler)
service, err = ws.New(flagConfigFile, VERSION, logger)
if err != nil {
@ -96,6 +100,12 @@ func main() { // {{{
return
}
err = InitNotificationManager()
if err != nil {
err = werr.Wrap(err).Log()
logger.Error("notification", "error", err)
}
service.Register("/", false, false, staticHandler)
service.Register("/area/new/{name}", false, false, areaNew)
@ -124,7 +134,7 @@ func main() { // {{{
err = service.Start()
if err != nil {
logger.Error("webserver", "error", we.Wrap(err))
logger.Error("webserver", "error", werr.Wrap(err))
os.Exit(1)
}
@ -139,7 +149,7 @@ func sqlProvider(dbname string, version int) (sql []byte, found bool) { // {{{
found = true
return
} // }}}
func logHandler(err we.Error) { // {{{
func logHandler(err werr.Error) { // {{{
j, _ := json.Marshal(err)
logFile.Write(j)
logFile.Write([]byte("\n"))
@ -175,7 +185,7 @@ func entryDatapoint(w http.ResponseWriter, r *http.Request, sess *session.T) { /
err := DatapointAdd(dpoint, value)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -188,7 +198,7 @@ func entryDatapoint(w http.ResponseWriter, r *http.Request, sess *session.T) { /
var out any
out, err = trigger.Run()
if err != nil {
err = we.Wrap(err).Log()
err = werr.Wrap(err).Log()
logger.Error("entry", "error", err)
}
@ -200,13 +210,13 @@ func entryDatapoint(w http.ResponseWriter, r *http.Request, sess *session.T) { /
if v {
err = ProblemStart(trigger)
if err != nil {
err = we.Wrap(err).Log()
err = werr.Wrap(err).Log()
logger.Error("entry", "error", err)
}
} else {
err = ProblemClose(trigger)
if err != nil {
err = we.Wrap(err).Log()
err = werr.Wrap(err).Log()
logger.Error("entry", "error", err)
}
}
@ -214,7 +224,7 @@ func entryDatapoint(w http.ResponseWriter, r *http.Request, sess *session.T) { /
default:
err := fmt.Errorf(`Expression for trigger %s not returning bool (%T)`, trigger.Name, v)
logger.Info("entry", "error", err)
we.Wrap(err).WithData(v).Log()
werr.Wrap(err).WithData(v).Log()
}
}
@ -268,7 +278,7 @@ func getPage(layout, page string) (tmpl *template.Template, err error) { // {{{
tmpl, err = template.New("main.gotmpl").Funcs(funcMap).ParseFS(viewFS, filenames...)
}
if err != nil {
err = we.Wrap(err).Log()
err = werr.Wrap(err).Log()
return
}
@ -288,7 +298,7 @@ func areaNew(w http.ResponseWriter, r *http.Request, _ *session.T) { // {{{
name := r.PathValue("name")
err := AreaCreate(name)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -300,14 +310,14 @@ func areaRename(w http.ResponseWriter, r *http.Request, _ *session.T) { // {{{
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
name := r.PathValue("name")
err = AreaRename(id, name)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -320,14 +330,14 @@ func sectionNew(w http.ResponseWriter, r *http.Request, _ *session.T) { // {{{
idStr := r.PathValue("areaID")
areaID, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
name := r.PathValue("name")
err = SectionCreate(areaID, name)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -339,14 +349,14 @@ func sectionRename(w http.ResponseWriter, r *http.Request, _ *session.T) { // {{
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
name := r.PathValue("name")
err = SectionRename(id, name)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -363,7 +373,7 @@ func pageProblems(w http.ResponseWriter, _ *http.Request, _ *session.T) { // {{{
problems, err := ProblemsRetrieve()
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -377,13 +387,13 @@ func pageProblemAcknowledge(w http.ResponseWriter, r *http.Request, _ *session.T
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
err = ProblemAcknowledge(id, true)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -396,13 +406,13 @@ func pageProblemUnacknowledge(w http.ResponseWriter, r *http.Request, _ *session
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
err = ProblemAcknowledge(id, false)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -420,7 +430,7 @@ func pageDatapoints(w http.ResponseWriter, r *http.Request, _ *session.T) { // {
datapoints, err := DatapointsRetrieve()
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -441,7 +451,7 @@ func pageDatapointEdit(w http.ResponseWriter, r *http.Request, _ *session.T) { /
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -452,7 +462,7 @@ func pageDatapointEdit(w http.ResponseWriter, r *http.Request, _ *session.T) { /
} else {
datapoint, err = DatapointRetrieve(id, "")
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
}
@ -475,7 +485,7 @@ func pageDatapointUpdate(w http.ResponseWriter, r *http.Request, _ *session.T) {
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -485,7 +495,7 @@ func pageDatapointUpdate(w http.ResponseWriter, r *http.Request, _ *session.T) {
dp.Datatype = DatapointType(r.FormValue("datatype"))
err = dp.Update()
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -496,13 +506,13 @@ func pageDatapointDelete(w http.ResponseWriter, r *http.Request, _ *session.T) {
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
err = DatapointDelete(id)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -513,7 +523,7 @@ func pageDatapointDelete(w http.ResponseWriter, r *http.Request, _ *session.T) {
func pageTriggers(w http.ResponseWriter, _ *http.Request, _ *session.T) { // {{{
areas, err := TriggersRetrieve()
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -535,7 +545,7 @@ func pageTriggerEdit(w http.ResponseWriter, r *http.Request, _ *session.T) { //
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -546,7 +556,7 @@ func pageTriggerEdit(w http.ResponseWriter, r *http.Request, _ *session.T) { //
if id > 0 {
trigger, err = TriggerRetrieve(id)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
} else {
@ -555,7 +565,7 @@ func pageTriggerEdit(w http.ResponseWriter, r *http.Request, _ *session.T) { //
if sectionIDStr != "" {
trigger.SectionID, err = strconv.Atoi(sectionIDStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
}
@ -565,7 +575,7 @@ func pageTriggerEdit(w http.ResponseWriter, r *http.Request, _ *session.T) { //
for _, dpname := range trigger.Datapoints {
dp, err := DatapointRetrieve(0, dpname)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
dp.LastDatapointValue.TemplateValue = dp.LastDatapointValue.Value()
@ -590,7 +600,7 @@ func pageTriggerUpdate(w http.ResponseWriter, r *http.Request, _ *session.T) { /
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -598,13 +608,13 @@ func pageTriggerUpdate(w http.ResponseWriter, r *http.Request, _ *session.T) { /
if id > 0 {
trigger, err = TriggerRetrieve(id)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
} else {
trigger.SectionID, err = strconv.Atoi(r.FormValue("sectionID"))
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
}
@ -614,7 +624,7 @@ func pageTriggerUpdate(w http.ResponseWriter, r *http.Request, _ *session.T) { /
trigger.Datapoints = r.Form["datapoints[]"]
err = trigger.Update()
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -625,14 +635,14 @@ func pageTriggerRun(w http.ResponseWriter, r *http.Request, _ *session.T) { // {
idStr := r.PathValue("id")
id, err := strconv.Atoi(idStr)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
var trigger Trigger
trigger, err = TriggerRetrieve(id)
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}
@ -647,7 +657,7 @@ func pageTriggerRun(w http.ResponseWriter, r *http.Request, _ *session.T) { // {
}
resp.Output, err = trigger.Run()
if err != nil {
we.Wrap(err).Log()
werr.Wrap(err).Log()
httpError(w, err)
return
}
@ -660,7 +670,7 @@ func pageTriggerRun(w http.ResponseWriter, r *http.Request, _ *session.T) { // {
func pageConfiguration(w http.ResponseWriter, _ *http.Request, _ *session.T) { // {{{
areas, err := AreaRetrieve()
if err != nil {
httpError(w, we.Wrap(err).Log())
httpError(w, werr.Wrap(err).Log())
return
}