diff options
Diffstat (limited to 'src/go/plugin/go.d/modules/systemdunits/collect_unit_files.go')
-rw-r--r-- | src/go/plugin/go.d/modules/systemdunits/collect_unit_files.go | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/go/plugin/go.d/modules/systemdunits/collect_unit_files.go b/src/go/plugin/go.d/modules/systemdunits/collect_unit_files.go new file mode 100644 index 000000000..eff2d6ecb --- /dev/null +++ b/src/go/plugin/go.d/modules/systemdunits/collect_unit_files.go @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +//go:build linux +// +build linux + +package systemdunits + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/coreos/go-systemd/v22/dbus" +) + +// https://github.com/systemd/systemd/blob/3d320785c4bbba74459096b07e85a79c4f0cdffb/src/shared/install.c#L3785 +// see "is-enabled" in https://www.man7.org/linux/man-pages/man1/systemctl.1.html +var unitFileStates = []string{ + "enabled", + "enabled-runtime", + "linked", + "linked-runtime", + "alias", + "masked", + "masked-runtime", + "static", + "disabled", + "indirect", + "generated", + "transient", + "bad", +} + +func (s *SystemdUnits) collectUnitFiles(mx map[string]int64, conn systemdConnection) error { + if s.systemdVersion < 230 { + return nil + } + + if now := time.Now(); now.After(s.lastListUnitFilesTime.Add(s.CollectUnitFilesEvery.Duration())) { + unitFiles, err := s.getUnitFilesByPatterns(conn) + if err != nil { + return err + } + s.lastListUnitFilesTime = now + s.cachedUnitFiles = unitFiles + } + + seen := make(map[string]bool) + + for _, unitFile := range s.cachedUnitFiles { + seen[unitFile.Path] = true + + if !s.seenUnitFiles[unitFile.Path] { + s.seenUnitFiles[unitFile.Path] = true + s.addUnitFileCharts(unitFile.Path) + } + + px := fmt.Sprintf("unit_file_%s_state_", unitFile.Path) + for _, st := range unitFileStates { + mx[px+st] = 0 + } + mx[px+strings.ToLower(unitFile.Type)] = 1 + } + + for k := range s.seenUnitFiles { + if !seen[k] { + delete(s.seenUnitFiles, k) + s.removeUnitFileCharts(k) + } + } + + return nil +} + +func (s *SystemdUnits) getUnitFilesByPatterns(conn systemdConnection) ([]dbus.UnitFile, error) { + ctx, cancel := context.WithTimeout(context.Background(), s.Timeout.Duration()) + defer cancel() + + s.Debugf("calling function 'ListUnitFilesByPatterns'") + + unitFiles, err := conn.ListUnitFilesByPatternsContext(ctx, nil, s.IncludeUnitFiles) + if err != nil { + return nil, fmt.Errorf("error on ListUnitFilesByPatterns: %v", err) + } + + for i := range unitFiles { + unitFiles[i].Path = cleanUnitName(unitFiles[i].Path) + } + + s.Debugf("got %d unit files", len(unitFiles)) + + return unitFiles, nil +} |