package main import ( "bytes" "flag" "io/ioutil" "os" "time" "fmt" "net/http" "github.com/nshttpd/mikrotik-exporter/collector" "github.com/nshttpd/mikrotik-exporter/config" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/version" log "github.com/sirupsen/logrus" ) // single device can be defined via CLI flags, mutliple via config file. var ( device = flag.String("device", "", "single device to monitor") address = flag.String("address", "", "address of the device to monitor") user = flag.String("user", "", "user for authentication with single device") password = flag.String("password", "", "password for authentication for single device") logLevel = flag.String("log-level", "info", "log level") logFormat = flag.String("log-format", "json", "logformat text or json (default json)") port = flag.String("port", ":9090", "port number to listen on") metricsPath = flag.String("path", "/metrics", "path to answer requests on") configFile = flag.String("config-file", "", "config file to load") withBgp = flag.Bool("with-bgp", false, "retrieves BGP routing infrormation") withRoutes = flag.Bool("with-routes", false, "retrieves routing table information") withDHCP = flag.Bool("with-dhcp", false, "retrieves DHCP server metrics") withDHCPv6 = flag.Bool("with-dhcpv6", false, "retrieves DHCPv6 server metrics") withPools = flag.Bool("with-pools", false, "retrieves IP(v6) pool metrics") timeout = flag.Duration("timeout", collector.DefaultTimeout*time.Second, "timeout when connecting to routers") tls = flag.Bool("tls", false, "use tls to connect to routers") insecure = flag.Bool("insecure", false, "skips verification of server certificate when using TLS (not recommended)") cfg *config.Config ) func init() { prometheus.MustRegister(version.NewCollector("mikrotik_exporter")) } func main() { flag.Parse() configureLog() c, err := loadConfig() if err != nil { log.Errorf("Could not load config: %v", err) os.Exit(3) } cfg = c startServer() } func configureLog() { ll, err := log.ParseLevel(*logLevel) if err != nil { panic(err) } log.SetLevel(ll) } func loadConfig() (*config.Config, error) { if *configFile != "" { return loadConfigFromFile() } return loadConfigFromFlags() } func loadConfigFromFile() (*config.Config, error) { b, err := ioutil.ReadFile(*configFile) if err != nil { return nil, err } return config.Load(bytes.NewReader(b)) } func loadConfigFromFlags() (*config.Config, error) { if *device == "" || *address == "" || *user == "" || *password == "" { return nil, fmt.Errorf("missing required param for single device configuration") } return &config.Config{ Devices: []config.Device{ config.Device{ Name: *device, Address: *address, User: *user, Password: *password, }, }, }, nil } func startServer() { h, err := createMetricsHandler() if err != nil { log.Fatal(err) } http.Handle(*metricsPath, h) http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok")) }) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`