e2902b8cc2
Update the exporter logging on startup to include the exporter version, the path to the fail2ban socket, and whether basic-auth is enabled or not. Fix code printing error messages on invalid CLI parameters to correct line breaks and correctly print the "usage" information.
88 lines
2.2 KiB
Go
88 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fail2ban-prometheus-exporter/auth"
|
|
"fail2ban-prometheus-exporter/cfg"
|
|
"fail2ban-prometheus-exporter/collector/f2b"
|
|
"fail2ban-prometheus-exporter/collector/textfile"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
)
|
|
|
|
const (
|
|
metricsPath = "/metrics"
|
|
)
|
|
|
|
var (
|
|
version = "dev"
|
|
commit = "none"
|
|
date = "unknown"
|
|
builtBy = "unknown"
|
|
)
|
|
|
|
func printAppVersion() {
|
|
fmt.Println(version)
|
|
fmt.Printf(" build date: %s\r\n commit hash: %s\r\n built by: %s\r\n", date, commit, builtBy)
|
|
}
|
|
|
|
func rootHtmlHandler(w http.ResponseWriter, r *http.Request) {
|
|
_, err := w.Write([]byte(
|
|
`<html>
|
|
<head><title>Fail2Ban Exporter</title></head>
|
|
<body>
|
|
<h1>Fail2Ban Exporter</h1>
|
|
<p><a href="` + metricsPath + `">Metrics</a></p>
|
|
</body>
|
|
</html>`))
|
|
if err != nil {
|
|
log.Printf("error handling root url: %v", err)
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
}
|
|
}
|
|
|
|
func metricHandler(w http.ResponseWriter, r *http.Request, collector *textfile.Collector) {
|
|
promhttp.Handler().ServeHTTP(w, r)
|
|
collector.WriteTextFileMetrics(w, r)
|
|
}
|
|
|
|
func main() {
|
|
appSettings := cfg.Parse()
|
|
if appSettings.VersionMode {
|
|
printAppVersion()
|
|
} else {
|
|
addr := fmt.Sprintf("%s:%d", appSettings.MetricsAddress, appSettings.MetricsPort)
|
|
log.Printf("fail2ban exporter version %s", version)
|
|
log.Printf("starting server at %s", addr)
|
|
|
|
f2bCollector := f2b.NewExporter(appSettings, version)
|
|
prometheus.MustRegister(f2bCollector)
|
|
|
|
textFileCollector := textfile.NewCollector(appSettings)
|
|
prometheus.MustRegister(textFileCollector)
|
|
|
|
http.HandleFunc("/", auth.BasicAuthMiddleware(rootHtmlHandler, appSettings.BasicAuthProvider))
|
|
http.HandleFunc(metricsPath, auth.BasicAuthMiddleware(
|
|
func(w http.ResponseWriter, r *http.Request) {
|
|
metricHandler(w, r, textFileCollector)
|
|
},
|
|
appSettings.BasicAuthProvider,
|
|
))
|
|
log.Printf("metrics available at '%s'", metricsPath)
|
|
if appSettings.BasicAuthProvider.Enabled() {
|
|
log.Printf("basic auth enabled")
|
|
}
|
|
|
|
svrErr := make(chan error)
|
|
go func() {
|
|
svrErr <- http.ListenAndServe(addr, nil)
|
|
}()
|
|
log.Print("ready")
|
|
|
|
err := <-svrErr
|
|
log.Print(err)
|
|
}
|
|
}
|