-
KERDREUX Jerome authoredKERDREUX Jerome authored
config.go 1.99 KiB
package main
import (
"fmt"
"log/slog"
"gitlab.imt-atlantique.fr/xaal/code/go/core/uuid"
"gitlab.imt-atlantique.fr/xaal/code/go/core/xaal"
"gopkg.in/ini.v1"
)
var (
mqttClientID = "z2m-" + uuid.New().String()
ignoredTopics = []string{
"bridge/groups",
"bridge/definitions",
"bridge/extensions",
"bridge/info",
"bridge/state",
"bridge/logging",
"bridge/config",
"bridge/event",
"bridge/log",
}
)
type Config struct {
brokerHost string
topic string
ignoredTopics []string
logLevel slog.Level
brokerPort int
baseAddr uuid.UUID
}
func parseConfig() (*Config, error) {
// Default configuration
config := Config{brokerHost: "mqtt", topic: "zigbee2mqtt", logLevel: slog.LevelError, brokerPort: 1883}
// Parse the configuration file
cfg, err := ini.Load(xaal.GetConfigDir() + "/z2m.ini")
if err != nil {
return nil, err
}
sec := cfg.Section(ini.DefaultSection)
// NOTE: This parsing is painful to write, I should look for a better way to do it
// broker
broker, err := sec.GetKey("broker")
if err == nil {
config.brokerHost = broker.String()
}
// topic
topic, err := sec.GetKey("topic")
if err == nil {
config.topic = topic.String()
}
// log level
level, err := sec.GetKey("log_level")
if err == nil {
switch level.String() {
case "DEBUG":
config.logLevel = slog.LevelDebug
case "INFO":
config.logLevel = slog.LevelInfo
case "WARN":
config.logLevel = slog.LevelWarn
default:
config.logLevel = slog.LevelError
}
}
// port
port, err := sec.GetKey("port")
if err == nil {
value, err := port.Int()
if err != nil {
return nil, err
}
config.brokerPort = value
}
// base address
addr, err := sec.GetKey("base_addr")
if err == nil {
baseAddr, err := uuid.FromString(addr.String())
if err != nil {
return nil, err
}
config.baseAddr = baseAddr
}
for _, topic := range ignoredTopics {
config.ignoredTopics = append(config.ignoredTopics, fmt.Sprintf("%s/%s", config.topic, topic))
}
return &config, nil
}