logranger/config.go
Winni Neessen 830de14890
Update go-parsesyslog dependency and refine server connection handling
This update upgrades the go-parsesyslog dependency version to v0.2.2. It also enhances the server's connection handling. This is done by expanding the `HandleConnection` method to handle network errors and EOF scenarios more thoroughly, adjusting processing time measurements, and handling deadlines for connection processing. Furthermore, the initialization of the syslog parser has now been moved to the `NewServer` function for efficiency.
2023-12-22 15:24:58 +01:00

79 lines
2.3 KiB
Go

// SPDX-FileCopyrightText: 2023 Winni Neessen <wn@neessen.dev>
//
// SPDX-License-Identifier: MIT
package logranger
import (
"fmt"
"os"
"strings"
"time"
"github.com/kkyr/fig"
"github.com/wneessen/go-parsesyslog"
"github.com/wneessen/go-parsesyslog/rfc3164"
"github.com/wneessen/go-parsesyslog/rfc5424"
)
// Config holds all the global configuration settings that are parsed by fig
type Config struct {
// Server holds server specific configuration values
Server struct {
PIDFile string `fig:"pid_file" default:"/var/run/logranger.pid"`
}
Listener struct {
ListenerUnix struct {
Path string `fig:"path" default:"/var/tmp/logranger.sock"`
} `fig:"unix"`
ListenerTCP struct {
Addr string `fig:"addr" default:"0.0.0.0"`
Port uint `fig:"port" default:"9099"`
} `fig:"tcp"`
ListenerTLS struct {
Addr string `fig:"addr" default:"0.0.0.0"`
Port uint `fig:"port" default:"9099"`
CertPath string `fig:"cert_path"`
KeyPath string `fig:"key_path"`
} `fig:"tls"`
Type ListenerType `fig:"type" default:"unix"`
} `fig:"listener"`
Log struct {
Level string `fig:"level" default:"info"`
Extended bool `fig:"extended"`
} `fig:"log"`
Parser struct {
Type string `fig:"type" validate:"required"`
Timeout time.Duration `fig:"timeout" default:"500ms"`
}
internal struct {
ParserType parsesyslog.ParserType
}
}
// NewConfig creates a new instance of the Config object by reading and loading
// configuration values. It takes in the file path and file name of the configuration
// file as parameters. It returns a pointer to the Config object and an error if
// there was a problem reading or loading the configuration.
func NewConfig(p, f string) (*Config, error) {
co := Config{}
_, err := os.Stat(fmt.Sprintf("%s/%s", p, f))
if err != nil {
return &co, fmt.Errorf("failed to read config: %w", err)
}
if err := fig.Load(&co, fig.Dirs(p), fig.File(f), fig.UseEnv("logranger")); err != nil {
return &co, fmt.Errorf("failed to load config: %w", err)
}
switch {
case strings.EqualFold(co.Parser.Type, "rfc3164"):
co.internal.ParserType = rfc3164.Type
case strings.EqualFold(co.Parser.Type, "rfc5424"):
co.internal.ParserType = rfc5424.Type
default:
return nil, fmt.Errorf("unknown parser type: %s", co.Parser.Type)
}
return &co, nil
}