routeros_dns/main.go
2026-02-27 11:31:19 +01:00

119 lines
2.6 KiB
Go

package main
import (
// External
"git.gibonuddevalla.se/go/vlog"
// Standard
"flag"
"fmt"
"log/slog"
"os"
"path"
"slices"
)
const VERSION = "v1"
var (
flagVersion bool
flagDev bool
flagDebug bool
flagConfig string
config Config
initLogger *slog.Logger
logger *slog.Logger
devices map[string]RouterosDevice
)
func init() { // {{{
initLogger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{}))
confDir, err := os.UserConfigDir()
if err != nil {
initLogger.Error("application", "error", err)
os.Exit(1)
}
defConfFilename := path.Join(confDir, "routeros_dns.json")
flag.BoolVar(&flagVersion, "version", false, "Print version and exit")
flag.BoolVar(&flagDev, "dev", false, "Load each static file from disk")
flag.BoolVar(&flagDebug, "debug", false, "Debugging log level")
flag.StringVar(&flagConfig, "config", defConfFilename, "Path to filename for configuration")
flag.Parse()
config, err = readConfig()
if err != nil {
initLogger.Error("application", "error", err)
os.Exit(1)
}
logger = initLogging(config)
} // }}}
func initLogging(config Config) *slog.Logger { // {{{
opts := slog.HandlerOptions{}
if flagDebug {
opts.Level = slog.LevelDebug
handler := slog.NewJSONHandler(os.Stdout, &opts)
return slog.New(handler)
} else {
handler := vlog.New(
os.Stdout,
opts,
config.Logging.LogDir,
config.Logging.URL,
"routeros-dns",
config.Logging.System,
config.Logging.Instance,
)
return slog.New(handler)
}
} // }}}
func main() {
initLogger.Info("application", "version", VERSION)
devices = make(map[string]RouterosDevice)
/*
device.Host = config.Device.Address
device.Port = config.Device.Port
device.Username = config.Device.Username
device.Password = config.Device.Password
device.Timeout = config.Device.Timeout
device.Init()
*/
registerWebserverHandlers()
startWebserver()
}
func routerosDevice(id string) (dev RouterosDevice, err error) {
var found bool
if dev, found = devices[id]; found {
logger.Debug("routeros", "op", "connection", "ID", id, "cached", true)
return
}
i := slices.IndexFunc(config.Devices, func(d Device) bool {
return d.ID == id
})
if i == -1 {
err = fmt.Errorf("Unknown device '%s'", id)
logger.Error("routeros", "op", "connection", "error", err)
return
}
logger.Debug("routeros", "name", id, "cached", false)
confDev := config.Devices[i]
dev.Host = confDev.Address
dev.Port = confDev.Port
dev.Username = confDev.Username
dev.Password = confDev.Password
dev.Timeout = confDev.Timeout
dev.Init()
devices[id] = dev
return
}