master
go 87 lines 1.76 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 //go:build linux
4
5 package systemdunits
6
7 import (
8 "fmt"
9 "regexp"
10 "strconv"
11 )
12
13 func (c *Collector) collect() (map[string]int64, error) {
14 conn, err := c.getConnection()
15 if err != nil {
16 return nil, err
17 }
18
19 if c.systemdVersion == 0 {
20 ver, err := c.getSystemdVersion(conn)
21 if err != nil {
22 c.closeConnection()
23 return nil, err
24 }
25 c.systemdVersion = ver
26 }
27
28 mx := make(map[string]int64)
29
30 if err := c.collectUnits(mx, conn); err != nil {
31 c.closeConnection()
32 return nil, err
33 }
34
35 if c.CollectUnitFiles && len(c.IncludeUnitFiles) > 0 {
36 if err := c.collectUnitFiles(mx, conn); err != nil {
37 c.closeConnection()
38 return mx, err
39 }
40 }
41
42 return mx, nil
43 }
44
45 func (c *Collector) getConnection() (systemdConnection, error) {
46 if c.conn == nil {
47 conn, err := c.client.connect()
48 if err != nil {
49 return nil, fmt.Errorf("error on creating a connection: %v", err)
50 }
51 c.conn = conn
52 }
53 return c.conn, nil
54 }
55
56 func (c *Collector) closeConnection() {
57 if c.conn != nil {
58 c.conn.Close()
59 c.conn = nil
60 }
61 }
62
63 var reVersion = regexp.MustCompile(`[0-9][0-9][0-9]`)
64
65 const versionProperty = "Version"
66
67 func (c *Collector) getSystemdVersion(conn systemdConnection) (int, error) {
68 c.Debugf("calling function 'GetManagerProperty'")
69 version, err := conn.GetManagerProperty(versionProperty)
70 if err != nil {
71 return 0, fmt.Errorf("error on getting '%s' manager property: %v", versionProperty, err)
72 }
73
74 c.Debugf("systemd version: %s", version)
75
76 major := reVersion.FindString(version)
77 if major == "" {
78 return 0, fmt.Errorf("couldn't parse systemd version string '%s'", version)
79 }
80
81 ver, err := strconv.Atoi(major)
82 if err != nil {
83 return 0, fmt.Errorf("couldn't parse systemd version string '%s': %v", version, err)
84 }
85
86 return ver, nil
87 }