lgregmapper/lgregmapper.go
2019-09-13 22:29:04 +01:00

110 lines
2.8 KiB
Go

//////////////////////////////////////////////////////////////////////////
// lgregmapper, a small utility to provide DN42 registry data to bird-lg
//////////////////////////////////////////////////////////////////////////
package main
//////////////////////////////////////////////////////////////////////////
import (
// "fmt"
log "github.com/sirupsen/logrus"
flag "github.com/spf13/pflag"
"net"
"os"
"os/signal"
"time"
)
//////////////////////////////////////////////////////////////////////////
// utility function to set the log level
func setLogLevel(levelStr string) {
if level, err := log.ParseLevel(levelStr); err != nil {
// failed to set the level
// set a sensible default and, of course, log the error
log.SetLevel(log.InfoLevel)
log.WithFields(log.Fields{
"loglevel": levelStr,
"error": err,
}).Error("Failed to set requested log level")
} else {
// set the requested level
log.SetLevel(level)
}
}
//////////////////////////////////////////////////////////////////////////
// everything starts here
func main() {
// set a default log level, so that logging can be used immediately
// the level will be overidden later on once the command line
// options are loaded
log.SetLevel(log.InfoLevel)
log.Info("LG Reg Mapper Server Starting")
// declare cmd line options
var (
logLevel = flag.StringP("LogLevel", "l", "Info", "Log level")
refreshInterval = flag.StringP("Refresh", "i", "10m", "Refresh interval")
bindAddress = flag.StringP("BindAddress", "b", "localhost:11211",
"Server bind address")
apiAddress = flag.StringP("APIAddress", "a", "https://explorer.burble.dn42/",
"DN42 API server address")
)
flag.Parse()
// now initialise logging properly based on the cmd line options
setLogLevel(*logLevel)
// parse the refreshInterval and start data collection
interval, err := time.ParseDuration(*refreshInterval)
if err != nil {
log.WithFields(log.Fields{
"error": err,
"interval": *refreshInterval,
}).Fatal("Unable to parse registry refresh interval")
}
// fetch initial registry data and start regular updates
regc := NewRegClient(*apiAddress)
regc.Update()
go regc.Start(interval)
listener, err := net.Listen("tcp", *bindAddress)
if err != nil {
log.WithFields(log.Fields{
"BindAddress": *bindAddress,
"Error": err,
}).Fatal("Failed to bind listener")
}
log.WithFields(log.Fields{
"BindAddress": *bindAddress,
}).Info("Listening")
// create a new server and start it working on the listen port
fmc := NewFakeMemcache(regc)
go fmc.Start(listener)
// sigint will perform a graceful exit
csig := make(chan os.Signal)
signal.Notify(csig, os.Interrupt)
// and block
<-csig
log.Info("Server shutting down")
regc.Shutdown()
fmc.Shutdown()
}
//////////////////////////////////////////////////////////////////////////
// end of code