diff options
Diffstat (limited to 'systemd.py')
-rwxr-xr-x | systemd.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/systemd.py b/systemd.py new file mode 100755 index 0000000..18cdb77 --- /dev/null +++ b/systemd.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# +# This should be both valid Python 2 and 3, as the collectd Python +# plugin can be either Python 2 or 3 (decided at compile time). +# +# Oddly, the Arch 'collectd' package chose Python 2, despite using +# Python 3 as the default system Python. I assume they have a good +# reason for it, though I can't find it discussed anywhere. + +import sys +import dbus + +# For compatibility with Python 2 & 3 +if sys.version_info.major is 2: + def iteritems(d): + return d.iteritems() +else: + def iteritems(d): + return d.items() + +# DBus utility function +def get_property(dbus_iface, propname): + return dbus_iface.proxy_object.Get(dbus_iface.dbus_interface, propname, dbus_interface='org.freedesktop.DBus.Properties') + +# The main program + +def init(): + global system_manager + system_manager = dbus.Interface(dbus.SystemBus().get_object("org.freedesktop.systemd1", "/org/freedesktop/systemd1"), "org.freedesktop.systemd1.Manager") + +def read(): + global system_manager + + dat = { + # These are the values of the + # basic/unit-name.h:UnitActiveStates enum. + ('sd_units', 'active'): 0, + ('sd_units', 'reloading'): 0, + ('sd_units', 'inactive'): 0, + ('sd_units', 'failed'): 0, + ('sd_units', 'activating'): 0, + ('sd_units', 'deactivating'): 0, + } + for unit in system_manager.ListUnits(): + key = ('sd_units', str(unit[3])) + dat[key] = dat[key] + 1 + + dat[('sd_jobs', 'queued')] = int(get_property(system_manager, 'NJobs')) + dat[('sd_jobs', 'installed')] = int(get_property(system_manager, 'NInstalledJobs')) + dat[('sd_jobs', 'failed')] = int(get_property(system_manager, 'NFailedJobs')) + + return dat + +if __name__ == '__main__': + init() + for (key, val) in iteritems(read()): + print("%s => %s" % (key, val)) +else: + import collectd + def _config(conf): + pass + def _read(): + for (key, val) in iteritems(read()): + collectd.Values( + plugin='systemd', + type=key[0], + type_instance=key[1] + ).dispatch( + values=[val] + ) + collectd.register_config(_config) + collectd.register_init(init) + collectd.register_read(_read, 1) |