summaryrefslogtreecommitdiffstats
path: root/src/go/plugin/go.d/modules/systemdunits/collect.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/plugin/go.d/modules/systemdunits/collect.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/go/plugin/go.d/modules/systemdunits/collect.go b/src/go/plugin/go.d/modules/systemdunits/collect.go
new file mode 100644
index 000000000..0d61c9998
--- /dev/null
+++ b/src/go/plugin/go.d/modules/systemdunits/collect.go
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+//go:build linux
+// +build linux
+
+package systemdunits
+
+import (
+ "fmt"
+ "regexp"
+ "strconv"
+)
+
+func (s *SystemdUnits) collect() (map[string]int64, error) {
+ conn, err := s.getConnection()
+ if err != nil {
+ return nil, err
+ }
+
+ if s.systemdVersion == 0 {
+ ver, err := s.getSystemdVersion(conn)
+ if err != nil {
+ s.closeConnection()
+ return nil, err
+ }
+ s.systemdVersion = ver
+ }
+
+ mx := make(map[string]int64)
+
+ if err := s.collectUnits(mx, conn); err != nil {
+ s.closeConnection()
+ return nil, err
+ }
+
+ if s.CollectUnitFiles && len(s.IncludeUnitFiles) > 0 {
+ if err := s.collectUnitFiles(mx, conn); err != nil {
+ s.closeConnection()
+ return mx, err
+ }
+ }
+
+ return mx, nil
+}
+
+func (s *SystemdUnits) getConnection() (systemdConnection, error) {
+ if s.conn == nil {
+ conn, err := s.client.connect()
+ if err != nil {
+ return nil, fmt.Errorf("error on creating a connection: %v", err)
+ }
+ s.conn = conn
+ }
+ return s.conn, nil
+}
+
+func (s *SystemdUnits) closeConnection() {
+ if s.conn != nil {
+ s.conn.Close()
+ s.conn = nil
+ }
+}
+
+var reVersion = regexp.MustCompile(`[0-9][0-9][0-9]`)
+
+const versionProperty = "Version"
+
+func (s *SystemdUnits) getSystemdVersion(conn systemdConnection) (int, error) {
+ s.Debugf("calling function 'GetManagerProperty'")
+ version, err := conn.GetManagerProperty(versionProperty)
+ if err != nil {
+ return 0, fmt.Errorf("error on getting '%s' manager property: %v", versionProperty, err)
+ }
+
+ s.Debugf("systemd version: %s", version)
+
+ major := reVersion.FindString(version)
+ if major == "" {
+ return 0, fmt.Errorf("couldn't parse systemd version string '%s'", version)
+ }
+
+ ver, err := strconv.Atoi(major)
+ if err != nil {
+ return 0, fmt.Errorf("couldn't parse systemd version string '%s': %v", version, err)
+ }
+
+ return ver, nil
+}