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 }