From b32426733d6d536ad5e14811cbd5a318096540dd Mon Sep 17 00:00:00 2001 From: Milan Nikolic Date: Wed, 20 Apr 2022 14:11:12 +0200 Subject: [PATCH] Add support for config file, issue #10 --- README.md | 9 ++++++--- config.example | 6 ++++++ go.mod | 1 + go.sum | 3 +++ main.go | 37 ++++++++++++++++++++++--------------- 5 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 config.example diff --git a/README.md b/README.md index 0dfb6d0..2e22452 100644 --- a/README.md +++ b/README.md @@ -12,18 +12,21 @@ Supports FreeRADIUS 3.0.x. Name | Description -------------------|------------ -radius.addr | Address of [FreeRADIUS status server](https://wiki.freeradius.org/config/Status), defaults to `127.0.0.1:18121`. -radius.secret | FreeRADIUS client secret. +radius.address | Address of [FreeRADIUS status server](https://wiki.freeradius.org/config/Status), defaults to `127.0.0.1:18121`. +radius.secret | FreeRADIUS client secret, defaults to `adminsecret`. radius.timeout | Timeout, in milliseconds, defaults to `5000`. +radius.homeservers | Addresses of home servers separated by comma, e.g. "172.28.1.2:1812,172.28.1.3:1812" web.listen-address | Address to listen on for web interface and telemetry, defaults to `:9812`. web.telemetry-path | Path under which to expose metrics, defaults to `/metrics`. version | Display version information +config | Config file (optional) ### Environment Variables Name | Description -------------------|------------ -RADIUS_ADDR | Address of [FreeRADIUS status server](https://wiki.freeradius.org/config/Status). +RADIUS_ADDRESS | Address of [FreeRADIUS status server](https://wiki.freeradius.org/config/Status). RADIUS_SECRET | FreeRADIUS client secret. +RADIUS_TIMEOUT | Timeout, in milliseconds. RADIUS_HOMESERVERS | Addresses of home servers separated by comma, e.g. "172.28.1.2:1812,172.28.1.3:1812" diff --git a/config.example b/config.example new file mode 100644 index 0000000..efca1ef --- /dev/null +++ b/config.example @@ -0,0 +1,6 @@ +{ + "radius.address": "127.0.0.1:18121", + "radius.secret": "secret", + "radius.timeout": 10000, + "radius.homeservers": "" +} diff --git a/go.mod b/go.mod index 0faf2c9..e6d9b9c 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/bvantagelimited/freeradius_exporter go 1.14 require ( + github.com/peterbourgon/ff/v3 v3.1.2 github.com/prometheus/client_golang v1.12.1 github.com/prometheus/common v0.33.0 // indirect golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect diff --git a/go.sum b/go.sum index 1ca6050..7fb9465 100644 --- a/go.sum +++ b/go.sum @@ -151,6 +151,9 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/peterbourgon/ff/v3 v3.1.2 h1:0GNhbRhO9yHA4CC27ymskOsuRpmX0YQxwxM9UPiP6JM= +github.com/peterbourgon/ff/v3 v3.1.2/go.mod h1:XNJLY8EIl6MjMVjBS4F0+G0LYoAqs0DTa4rmHHukKDE= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/main.go b/main.go index fe234ac..fe6d282 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "path/filepath" "strings" + "github.com/peterbourgon/ff/v3" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -19,15 +20,28 @@ import ( var version, commit, date string func main() { - listenAddr := flag.String("web.listen-address", ":9812", "Address to listen on for web interface and telemetry.") - metricsPath := flag.String("web.telemetry-path", "/metrics", "A path under which to expose metrics.") - radiusTimeout := flag.Int("radius.timeout", 5000, "Timeout, in milliseconds.") - radiusAddr := flag.String("radius.address", getEnv("RADIUS_ADDR", "127.0.0.1:18121"), "Address of FreeRADIUS status server.") - homeServers := flag.String("radius.homeservers", getEnv("RADIUS_HOMESERVERS", ""), "List of FreeRADIUS home servers to check, e.g. '172.28.1.2:1812,172.28.1.3:1812'.") - radiusSecret := flag.String("radius.secret", getEnv("RADIUS_SECRET", "adminsecret"), "FreeRADIUS client secret.") - appVersion := flag.Bool("version", false, "Display version information") + fs := flag.NewFlagSet("freeradius_exporter", flag.ContinueOnError) + appHelp := fs.Bool("help", false, "Display help") + appVersion := fs.Bool("version", false, "Display version information") + _ = fs.String("config", "", "Config file (optional)") - flag.Parse() + listenAddr := fs.String("web.listen-address", ":9812", "Address to listen on for web interface and telemetry.") + metricsPath := fs.String("web.telemetry-path", "/metrics", "A path under which to expose metrics.") + radiusTimeout := fs.Int("radius.timeout", 5000, "Timeout, in milliseconds [RADIUS_TIMEOUT].") + radiusAddr := fs.String("radius.address", "127.0.0.1:18121", "Address of FreeRADIUS status server [RADIUS_ADDRESS].") + homeServers := fs.String("radius.homeservers", "", "List of FreeRADIUS home servers to check, e.g. '172.28.1.2:1812,172.28.1.3:1812' [RADIUS_HOMESERVERS].") + radiusSecret := fs.String("radius.secret", "adminsecret", "FreeRADIUS client secret [RADIUS_SECRET].") + + err := ff.Parse(fs, os.Args[1:], ff.WithEnvVarNoPrefix(), ff.WithConfigFileFlag("config"), ff.WithConfigFileParser(ff.JSONParser)) + if err != nil { + println(err.Error()) + os.Exit(1) + } + + if *appHelp { + fs.PrintDefaults() + os.Exit(0) + } if *appVersion { println(filepath.Base(os.Args[0]), version, commit, date) @@ -65,10 +79,3 @@ func main() { log.Printf("Providing metrics at %s%s", *listenAddr, *metricsPath) log.Fatal(srv.Serve(listener)) } - -func getEnv(key string, defaultVal string) string { - if envVal, ok := os.LookupEnv(key); ok { - return envVal - } - return defaultVal -}