From 1a6cd7a1a95fe639d98d252e589902a9d3570ec7 Mon Sep 17 00:00:00 2001 From: Hector Date: Fri, 10 Sep 2021 07:09:22 +0100 Subject: [PATCH] update socket protocol to get version string Add a new method to get the version data from the fail2ban socket and return it to the metric collector. The version is now correctly exposed. --- src/exporter.go | 9 +++++++-- src/socket/fail2banSocket.go | 14 ++++++++++++++ src/socket/protocol.go | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/exporter.go b/src/exporter.go index 294e75a..1cf422f 100644 --- a/src/exporter.go +++ b/src/exporter.go @@ -282,9 +282,14 @@ func (e *Exporter) collectJailStatsMetric(ch chan<- prometheus.Metric, s *socket } func (e *Exporter) collectVersionMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) { - fail2banVersion := "9.9.9" + var err error + var fail2banVersion = "" if s != nil { - // TODO: Get fail2ban server version + fail2banVersion, err = s.GetServerVersion() + if err != nil { + e.socketRequestErrorCount++ + log.Printf("failed to get fail2ban server version: %v", err) + } } ch <- prometheus.MustNewConstMetric( diff --git a/src/socket/fail2banSocket.go b/src/socket/fail2banSocket.go index 4f720ad..78133e3 100644 --- a/src/socket/fail2banSocket.go +++ b/src/socket/fail2banSocket.go @@ -118,6 +118,20 @@ func (s *Fail2BanSocket) GetJailStats(jail string) (JailStats, error) { return stats, newBadFormatError(statusCommand, response) } +func (s *Fail2BanSocket) GetServerVersion() (string, error) { + response, err := s.sendCommand([]string{versionCommand}) + if err != nil { + return "", err + } + + if lvl1, ok := response.(*types.Tuple); ok { + if versionStr, ok := lvl1.Get(1).(string); ok { + return versionStr, nil + } + } + return "", newBadFormatError(versionCommand, response) +} + func newBadFormatError(command string, data interface{}) error { return fmt.Errorf("(%s) unexpected response format - cannot parse: %v", command, data) } diff --git a/src/socket/protocol.go b/src/socket/protocol.go index 5320f5b..d510af7 100644 --- a/src/socket/protocol.go +++ b/src/socket/protocol.go @@ -11,6 +11,7 @@ const ( commandTerminator = "" pingCommand = "ping" statusCommand = "status" + versionCommand = "version" socketReadBufferSize = 1024 )