config.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package syslog
  2. import (
  3. "errors"
  4. "fmt"
  5. "log/slog"
  6. "strings"
  7. "github.com/imgproxy/imgproxy/v3/ensure"
  8. "github.com/imgproxy/imgproxy/v3/env"
  9. )
  10. var (
  11. IMGPROXY_SYSLOG_ENABLE = env.Describe("IMGPROXY_SYSLOG_ENABLE", "boolean")
  12. IMGPROXY_SYSLOG_LEVEL = env.Describe("IMGPROXY_SYSLOG_LEVEL", "debug|info|warn|error|crit")
  13. IMGPROXY_SYSLOG_NETWORK = env.Describe("IMGPROXY_SYSLOG_NETWORK", "string")
  14. IMGPROXY_SYSLOG_ADDRESS = env.Describe("IMGPROXY_SYSLOG_ADDRESS", "string")
  15. IMGPROXY_SYSLOG_TAG = env.Describe("IMGPROXY_SYSLOG_TAG", "string")
  16. )
  17. type Config struct {
  18. Enabled bool
  19. Level slog.Leveler
  20. Network string
  21. Addr string
  22. Tag string
  23. }
  24. func NewDefaultConfig() Config {
  25. return Config{
  26. Enabled: false,
  27. Level: slog.LevelInfo,
  28. Tag: "imgproxy",
  29. }
  30. }
  31. func LoadConfigFromEnv(c *Config) (*Config, error) {
  32. c = ensure.Ensure(c, NewDefaultConfig)
  33. var levelStr string
  34. err := errors.Join(
  35. env.Bool(&c.Enabled, IMGPROXY_SYSLOG_ENABLE),
  36. env.String(&c.Network, IMGPROXY_SYSLOG_NETWORK),
  37. env.String(&c.Addr, IMGPROXY_SYSLOG_ADDRESS),
  38. env.String(&c.Tag, IMGPROXY_SYSLOG_TAG),
  39. env.String(&levelStr, IMGPROXY_SYSLOG_LEVEL),
  40. )
  41. if levelStr != "" {
  42. c.Level = parseLevel(levelStr)
  43. }
  44. return c, err
  45. }
  46. func (c *Config) Validate() error {
  47. if !c.Enabled {
  48. return nil
  49. }
  50. if c.Network != "" && c.Addr == "" {
  51. return errors.New("syslog address is required if syslog network is set")
  52. }
  53. return nil
  54. }
  55. func parseLevel(str string) slog.Level {
  56. switch strings.ToLower(str) {
  57. case "debug":
  58. return slog.LevelDebug
  59. case "info":
  60. return slog.LevelInfo
  61. case "warn":
  62. return slog.LevelWarn
  63. case "error":
  64. return slog.LevelError
  65. case "crit":
  66. return slog.LevelError + 8
  67. default:
  68. slog.Warn(fmt.Sprintf("Syslog level '%s' is invalid, 'info' is used", str))
  69. return slog.LevelInfo
  70. }
  71. }