Skip to content

Commit db0e714

Browse files
committed
feat: added cli flags
1 parent 90ee059 commit db0e714

File tree

2 files changed

+105
-20
lines changed

2 files changed

+105
-20
lines changed

pkg/command/command.go

Lines changed: 80 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package command
22

33
import (
44
"github.com/patrickjahns/openvpn_exporter/pkg/collector"
5+
"github.com/patrickjahns/openvpn_exporter/pkg/config"
56
"github.com/patrickjahns/openvpn_exporter/pkg/version"
67
"net/http"
78
"os"
9+
"strings"
810

911
"github.com/go-kit/kit/log"
1012
"github.com/go-kit/kit/log/level"
@@ -27,7 +29,7 @@ func Run() error {
2729
},
2830
},
2931
}
30-
32+
cfg := config.Load()
3133
cli.HelpFlag = &cli.BoolFlag{
3234
Name: "help",
3335
Aliases: []string{"h"},
@@ -40,20 +42,49 @@ func Run() error {
4042
Usage: "Prints the current version",
4143
}
4244

45+
app.Flags = []cli.Flag{
46+
&cli.StringFlag{
47+
Name: "web.address",
48+
Aliases: []string{"web.listen-address"},
49+
Value: "0.0.0.0:9176",
50+
Usage: "Address to bind the metrics server",
51+
Destination: &cfg.Server.Addr,
52+
},
53+
&cli.StringFlag{
54+
Name: "web.path",
55+
Aliases: []string{"web.telemetry-path"},
56+
Value: "/metrics",
57+
Usage: "Path to bind the metrics server",
58+
Destination: &cfg.Server.Path,
59+
},
60+
&cli.StringFlag{
61+
Name: "web.root",
62+
Value: "/",
63+
Usage: "Root path to exporter endpoints",
64+
Destination: &cfg.Server.Root,
65+
},
66+
&cli.StringSliceFlag{
67+
Name: "status-file",
68+
Usage: "The OpenVPN status file(s) to export (example test:./example/version1.status )",
69+
Required: true,
70+
},
71+
}
72+
73+
app.Before = func(c *cli.Context) error {
74+
cfg.StatusFile = c.StringSlice("status-file")
75+
return nil
76+
}
77+
4378
app.Action = func(c *cli.Context) error {
44-
return run(c)
79+
return run(c, cfg)
4580
}
4681

4782
return app.Run(os.Args)
4883
}
4984

50-
func run(c *cli.Context) error {
51-
// hardcoded vars for development, will be replaced with cli/config
52-
addr := ":9000"
53-
statusFile := "./example/version1.status"
54-
85+
func run(c *cli.Context, cfg *config.Config) error {
5586
// setup logging
56-
logger := setupLogging()
87+
logger := setupLogging(cfg)
5788
level.Info(logger).Log(
5889
"msg", "Starting openvpn_exporter",
5990
"version", version.Version,
@@ -74,15 +105,25 @@ func run(c *cli.Context) error {
74105
version.GoVersion,
75106
version.Started,
76107
))
77-
r.MustRegister(collector.NewOpenVPNCollector(
78-
logger,
79-
"udp",
80-
statusFile,
81-
))
82-
http.Handle("/metrics",
108+
for _, statusFile := range cfg.StatusFile {
109+
serverName, statusFile := parseStatusFileSlice(statusFile)
110+
111+
level.Info(logger).Log(
112+
"msg", "registering collector for",
113+
"serverName", serverName,
114+
"statusFile", statusFile,
115+
)
116+
r.MustRegister(collector.NewOpenVPNCollector(
117+
logger,
118+
serverName,
119+
statusFile,
120+
))
121+
}
122+
123+
http.Handle(cfg.Server.Path,
83124
promhttp.HandlerFor(r, promhttp.HandlerOpts{}),
84125
)
85-
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
126+
http.HandleFunc(cfg.Server.Root, func(w http.ResponseWriter, r *http.Request) {
86127
_, _ = w.Write([]byte(`<html>
87128
<head><title>OpenVPN Exporter</title></head>
88129
<body>
@@ -92,18 +133,37 @@ func run(c *cli.Context) error {
92133
</html>`))
93134
})
94135

95-
level.Info(logger).Log("msg", "Listening on", "addr", addr)
96-
if err := http.ListenAndServe(addr, nil); err != nil {
136+
level.Info(logger).Log("msg", "Listening on", "addr", cfg.Server.Addr)
137+
if err := http.ListenAndServe(cfg.Server.Addr, nil); err != nil {
97138
level.Error(logger).Log("msg", "http listenandserve error", "err", err)
98139
return err
99140
}
100141
return nil
101142
}
102143

103-
func setupLogging() log.Logger {
104-
filterOption := level.AllowDebug()
144+
func parseStatusFileSlice(statusFile string) (string, string) {
145+
parts := strings.Split(statusFile, ":")
146+
if len(parts) > 1 {
147+
return parts[0], parts[1]
148+
}
149+
return "server", parts[0]
150+
}
151+
152+
func setupLogging(cfg *config.Config) log.Logger {
105153
logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
106-
logger = level.NewFilter(logger, filterOption)
154+
155+
switch strings.ToLower(cfg.Logs.Level) {
156+
case "error":
157+
logger = level.NewFilter(logger, level.AllowError())
158+
case "warn":
159+
logger = level.NewFilter(logger, level.AllowWarn())
160+
case "info":
161+
logger = level.NewFilter(logger, level.AllowInfo())
162+
case "debug":
163+
logger = level.NewFilter(logger, level.AllowDebug())
164+
default:
165+
logger = level.NewFilter(logger, level.AllowInfo())
166+
}
107167
logger = log.With(logger,
108168
"ts", log.DefaultTimestampUTC,
109169
"caller", log.DefaultCaller,

pkg/config/config.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package config
2+
3+
// Server defines the general server configuration.
4+
type Server struct {
5+
Addr string
6+
Path string
7+
Root string
8+
}
9+
10+
// Logs defines the level for configuration
11+
type Logs struct {
12+
Level string
13+
}
14+
15+
// Config defines the general configuration object
16+
type Config struct {
17+
Server Server
18+
Logs Logs
19+
StatusFile []string
20+
}
21+
22+
// Load initializes a default configuration struct.
23+
func Load() *Config {
24+
return &Config{}
25+
}

0 commit comments

Comments
 (0)