Adding upstream version 0.8.9.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
3b2c48b5e4
commit
c0c4addb85
285 changed files with 25880 additions and 0 deletions
61
pkg/services/logger/logger.go
Normal file
61
pkg/services/logger/logger.go
Normal file
|
@ -0,0 +1,61 @@
|
|||
package logger
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/nicholas-fedor/shoutrrr/pkg/services/standard"
|
||||
"github.com/nicholas-fedor/shoutrrr/pkg/types"
|
||||
)
|
||||
|
||||
// Service is the Logger service struct.
|
||||
type Service struct {
|
||||
standard.Standard
|
||||
Config *Config
|
||||
}
|
||||
|
||||
// Send a notification message to log.
|
||||
func (service *Service) Send(message string, params *types.Params) error {
|
||||
data := types.Params{}
|
||||
|
||||
if params != nil {
|
||||
for key, value := range *params {
|
||||
data[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
data["message"] = message
|
||||
|
||||
return service.doSend(data)
|
||||
}
|
||||
|
||||
func (service *Service) doSend(data types.Params) error {
|
||||
msg := data["message"]
|
||||
|
||||
if tpl, found := service.GetTemplate("message"); found {
|
||||
wc := &strings.Builder{}
|
||||
if err := tpl.Execute(wc, data); err != nil {
|
||||
return fmt.Errorf("failed to write template to log: %w", err)
|
||||
}
|
||||
|
||||
msg = wc.String()
|
||||
}
|
||||
|
||||
service.Log(msg)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Initialize loads ServiceConfig from configURL and sets logger for this Service.
|
||||
func (service *Service) Initialize(_ *url.URL, logger types.StdLogger) error {
|
||||
service.SetLogger(logger)
|
||||
service.Config = &Config{}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetID returns the service identifier.
|
||||
func (service *Service) GetID() string {
|
||||
return Scheme
|
||||
}
|
30
pkg/services/logger/logger_config.go
Normal file
30
pkg/services/logger/logger_config.go
Normal file
|
@ -0,0 +1,30 @@
|
|||
package logger
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
|
||||
"github.com/nicholas-fedor/shoutrrr/pkg/services/standard"
|
||||
)
|
||||
|
||||
const (
|
||||
// Scheme is the identifying part of this service's configuration URL.
|
||||
Scheme = "logger"
|
||||
)
|
||||
|
||||
// Config is the configuration object for the Logger Service.
|
||||
type Config struct {
|
||||
standard.EnumlessConfig
|
||||
}
|
||||
|
||||
// GetURL returns a URL representation of it's current field values.
|
||||
func (config *Config) GetURL() *url.URL {
|
||||
return &url.URL{
|
||||
Scheme: Scheme,
|
||||
Opaque: "//", // Ensures "logger://" output
|
||||
}
|
||||
}
|
||||
|
||||
// SetURL updates a ServiceConfig from a URL representation of it's field values.
|
||||
func (config *Config) SetURL(_ *url.URL) error {
|
||||
return nil
|
||||
}
|
107
pkg/services/logger/logger_suite_test.go
Normal file
107
pkg/services/logger/logger_suite_test.go
Normal file
|
@ -0,0 +1,107 @@
|
|||
package logger_test
|
||||
|
||||
import (
|
||||
"log"
|
||||
"testing"
|
||||
|
||||
"github.com/onsi/ginkgo/v2"
|
||||
"github.com/onsi/gomega"
|
||||
"github.com/onsi/gomega/gbytes"
|
||||
|
||||
"github.com/nicholas-fedor/shoutrrr/internal/testutils"
|
||||
"github.com/nicholas-fedor/shoutrrr/pkg/services/logger"
|
||||
"github.com/nicholas-fedor/shoutrrr/pkg/types"
|
||||
)
|
||||
|
||||
func TestLogger(t *testing.T) {
|
||||
gomega.RegisterFailHandler(ginkgo.Fail)
|
||||
ginkgo.RunSpecs(t, "Logger Suite")
|
||||
}
|
||||
|
||||
var _ = ginkgo.Describe("the logger service", func() {
|
||||
ginkgo.When("sending a notification", func() {
|
||||
ginkgo.It("should output the message to the log", func() {
|
||||
logbuf := gbytes.NewBuffer()
|
||||
service := &logger.Service{}
|
||||
_ = service.Initialize(testutils.URLMust(`logger://`), log.New(logbuf, "", 0))
|
||||
|
||||
err := service.Send(`Failed - Requires Toaster Repair Level 10`, nil)
|
||||
gomega.Expect(err).NotTo(gomega.HaveOccurred())
|
||||
|
||||
gomega.Eventually(logbuf).
|
||||
Should(gbytes.Say("Failed - Requires Toaster Repair Level 10"))
|
||||
})
|
||||
|
||||
ginkgo.It("should not mutate the passed params", func() {
|
||||
service := &logger.Service{}
|
||||
_ = service.Initialize(testutils.URLMust(`logger://`), nil)
|
||||
params := types.Params{}
|
||||
err := service.Send(`Failed - Requires Toaster Repair Level 10`, ¶ms)
|
||||
gomega.Expect(err).NotTo(gomega.HaveOccurred())
|
||||
|
||||
gomega.Expect(params).To(gomega.BeEmpty())
|
||||
})
|
||||
|
||||
ginkgo.When("a template has been added", func() {
|
||||
ginkgo.It("should render template with params", func() {
|
||||
logbuf := gbytes.NewBuffer()
|
||||
service := &logger.Service{}
|
||||
_ = service.Initialize(testutils.URLMust(`logger://`), log.New(logbuf, "", 0))
|
||||
err := service.SetTemplateString(`message`, `{{.level}}: {{.message}}`)
|
||||
gomega.Expect(err).NotTo(gomega.HaveOccurred())
|
||||
|
||||
params := types.Params{
|
||||
"level": "warning",
|
||||
}
|
||||
err = service.Send(`Requires Toaster Repair Level 10`, ¶ms)
|
||||
gomega.Expect(err).NotTo(gomega.HaveOccurred())
|
||||
|
||||
gomega.Eventually(logbuf).
|
||||
Should(gbytes.Say("warning: Requires Toaster Repair Level 10"))
|
||||
})
|
||||
|
||||
ginkgo.It("should return an error if template execution fails", func() {
|
||||
logbuf := gbytes.NewBuffer()
|
||||
service := &logger.Service{}
|
||||
_ = service.Initialize(testutils.URLMust(`logger://`), log.New(logbuf, "", 0))
|
||||
err := service.SetTemplateString(
|
||||
`message`,
|
||||
`{{range .message}}x{{end}} {{.message}}`,
|
||||
)
|
||||
gomega.Expect(err).NotTo(gomega.HaveOccurred())
|
||||
|
||||
params := types.Params{
|
||||
"level": "error",
|
||||
}
|
||||
err = service.Send(`Critical Failure`, ¶ms)
|
||||
gomega.Expect(err).To(gomega.HaveOccurred())
|
||||
gomega.Expect(err.Error()).
|
||||
To(gomega.ContainSubstring("failed to write template to log"))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
ginkgo.Describe("the config object", func() {
|
||||
ginkgo.It("should return a URL with the correct scheme from GetURL", func() {
|
||||
config := &logger.Config{}
|
||||
url := config.GetURL()
|
||||
gomega.Expect(url.Scheme).To(gomega.Equal("logger"))
|
||||
gomega.Expect(url.String()).To(gomega.Equal("logger://"))
|
||||
})
|
||||
|
||||
ginkgo.It("should not error when SetURL is called with a valid URL", func() {
|
||||
config := &logger.Config{}
|
||||
url := testutils.URLMust(`logger://`)
|
||||
err := config.SetURL(url)
|
||||
gomega.Expect(err).NotTo(gomega.HaveOccurred())
|
||||
})
|
||||
})
|
||||
|
||||
ginkgo.Describe("the service identifier", func() {
|
||||
ginkgo.It("should return the correct ID", func() {
|
||||
service := &logger.Service{}
|
||||
id := service.GetID()
|
||||
gomega.Expect(id).To(gomega.Equal("logger"))
|
||||
})
|
||||
})
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue