119 lines
2.6 KiB
Go
119 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
// External
|
|
"git.gibonuddevalla.se/go/vlog"
|
|
|
|
// Standard
|
|
"flag"
|
|
"log/slog"
|
|
"os"
|
|
"path"
|
|
"slices"
|
|
"fmt"
|
|
)
|
|
|
|
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(name string) (dev RouterosDevice, err error) {
|
|
var found bool
|
|
if dev, found = devices[name]; found {
|
|
logger.Debug("routeros", "op", "connection", "name", name, "cached", true)
|
|
return
|
|
}
|
|
|
|
i := slices.IndexFunc(config.Devices, func(d Device) bool {
|
|
return d.Name == name
|
|
})
|
|
if i == -1 {
|
|
err = fmt.Errorf("Unknown device '%s'", name)
|
|
logger.Error("routeros", "op", "connection", "error", err)
|
|
return
|
|
}
|
|
|
|
logger.Debug("routeros", "name", name, "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[name] = dev
|
|
|
|
return
|
|
}
|