summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--[l---------]Makefile32
l---------README.md1
-rw-r--r--config.mk12
-rw-r--r--config.mk.in198
-rw-r--r--systemd.conf.in12
-rwxr-xr-xsystemd.py73
-rw-r--r--systemd.types.db2
8 files changed, 134 insertions, 200 deletions
diff --git a/.gitignore b/.gitignore
index 30be33f..eccf758 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
+*.pyc
+/systemd.conf
+/collectd-*
+
.tmp.*
.var.*
diff --git a/Makefile b/Makefile
index 4ecdba5..0aa88a4 120000..100644
--- a/Makefile
+++ b/Makefile
@@ -1 +1,31 @@
-build-aux/Makefile.README.mk \ No newline at end of file
+PACKAGE = collectd-systemd
+VERSION = 20170820
+
+include $(dir $(lastword $(MAKEFILE_LIST)))/config.mk
+include $(topsrcdir)/build-aux/Makefile.head.mk
+
+files.out.all += systemd.conf
+#files.out.all += systemd.types.db
+#files.out.all += systemd.py
+
+files.sys.all += $(collectdconfdir)/systemd.conf
+files.sys.all += $(collectdtypesdir)/systemd.types.db
+files.sys.all += $(collectdpythondir)/systemd.py
+
+$(outdir)/%: $(srcdir)/%.in
+ sed $(foreach v,$(patsubst $(var.)%,%,$(filter $(var.)%,$^)), -e 's|@$(v)@|$($(v))|g' ) < $< > $@
+
+$(outdir)/systemd.conf: $(var.)collectd_typesdir
+$(outdir)/systemd.conf: $(var.)collectd_pythondir
+
+$(DESTDIR)$(collectdconfdir)/systemd.conf: $(outdir)/systemd.conf
+ $(INSTALL_DATA) -DT $< $@
+$(DESTDIR)$(collectdtypesdir)/systemd.types.db: $(srcdir)/systemd.types.db
+ $(INSTALL_DATA) -DT $< $@
+$(DESTDIR)$(collectdpythondir)/systemd.py: $(srcdir)/systemd.py
+ $(INSTALL_PROGRAM) -DT $< $@
+
+.SECONDARY:
+.DELETE_ON_ERROR:
+
+include $(topsrcdir)/build-aux/Makefile.tail.mk
diff --git a/README.md b/README.md
deleted file mode 120000
index 5e5ea4a..0000000
--- a/README.md
+++ /dev/null
@@ -1 +0,0 @@
-build-aux/Makefile.README.txt \ No newline at end of file
diff --git a/config.mk b/config.mk
new file mode 100644
index 0000000..46cbc00
--- /dev/null
+++ b/config.mk
@@ -0,0 +1,12 @@
+# In addition to the variables in the default version of this file,
+# you may set any of the standard GNU configuration variables.
+ifeq ($(origin topsrcdir),undefined)
+topoutdir := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
+topsrcdir := $(topoutdir)
+
+collectd_pkgdatadir = $(datadir)/collectd
+collectd_confdir = $(collectd_pkgdatadir)
+collectd_typesdir = $(collectd_pkgdatadir)
+collectd_pythondir = $(collectd_pkgdatadir)
+
+endif
diff --git a/config.mk.in b/config.mk.in
deleted file mode 100644
index be95ab4..0000000
--- a/config.mk.in
+++ /dev/null
@@ -1,198 +0,0 @@
-# Copyright (C) 2016-2017 Luke Shumaker
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# This is based on §7.2 "Makefile Conventions" of the July 25, 2016
-# release of the GNU Coding Standards.
-#
-# Grep for '^##' in this file to see which Autoconf macros it depends
-# on.
-
-dist.pkgname = @PACKAGE_TARNAME@
-gnuconf.pkgname = @PACKAGE_NAME@
-
-# 7.2.2: Utilities in Makefiles
-# -----------------------------
-
-# It's ok to hard-code these commands in rules, but who wants to
-# memorize the list of what's ok?
-
-## AC_PROG_AWK
-## AC_PROG_GREP
-## AC_PROG_EGREP
-## AC_PROG_SED
-
-AWK = @AWK@
-CAT = cat
-CMP = cmp
-CP = cp
-DIFF = diff
-ECHO = echo
-EGREP = @EGREP@
-EXPR = expr
-FALSE = false
-GREP = @GREP@
-INSTALL_INFO = install-info
-LN = ln
-LS = ls
-MKDIR = mkdir
-MV = mv
-PRINTF = printf
-PWD = pwd
-RM = rm
-RMDIR = rmdir
-SED = @SED@
-SLEEP = sleep
-SORT = sort
-TAR = tar
-TEST = test
-TOUCH = touch
-TR = tr
-TRUE = true
-
-# 7.2.2: Utilities in Makefiles/7.2.3: Variables for Specifying Commands
-# ----------------------------------------------------------------------
-
-# Standard user-configurable programs.
-#
-# The list of programs here is specified in §7.2.2, but the associated FLAGS
-# variables are specified in §7.2.3. I found it cleaner to list them together.
-
-## AC_PROG_INSTALL # @INSTALL@ @INSTALL_PROGRAM@ @INSTALL_SCRIPT@ @INSTALL_DATA@
-## AC_PROG_LEX # @LEX@ @LEXLIB@
-## AC_PROG_RANLIB
-## AC_PROG_YACC
-## AC_PROG_CC
-#
-# TODO: What causes Autoconf to define @AR@?
-
-AR = @AR@
-ARFLAGS =
-BISON = bison
-BISONFLAGS =
-CC = @CC@
-CFLAGS = @CFLAGS@ # CFLAGS instead of CCFLAGS
-FLEX = flex
-FLEXFLAGS =
-INSTALL = @INSTALL@
-# There is no INSTALLFLAGS[0]
-LD = ld
-LDFLAGS = @LDFLAGS@
-LDCONFIG = ldconfig # TODO[1]
-LDCONFIGFLAGS =
-LEX = @LEX@
-LFLAGS = #LFLAGS instead of LEXFLAGS
-#MAKE
-MAKEINFO = makeinfo
-MAKEINFOFLAGS =
-RANLIB = @RANLIB@
-RANLIBFLAGS =
-TEXI2DVI = texi2dvi
-TEXI2DVIFLAGS =
-YACC = @YACC@
-YFLAGS = # YFLAGS instead of YACCFLAGS
-
-CPPFLAGS = @CPPFLAGS@
-
-LN_S = @LN_S@
-
-CHGRP = chgrp
-CHGRPFLAGS =
-CHMOD = chmod
-CHMODFLAGS =
-CHOWN = chown
-CHOWNFLAGS =
-MKNOD = mknod
-MKNODFLAGS =
-
-# [0]: There is no INSTALLFLAGS because it would be inconsistent with how the
-# standards otherwise recommend using $(INSTALL); with INSTALL_PROGRAM and
-# INSTALL_DATA; which are specified in a way precluding the use of
-# INSTALLFLAGS. To have the variable, but to ignore it in the common case
-# would be confusing.
-#
-# [1]: The RANLIB and LDCONFIG variables need some extra smarts; §7.2.2 says:
-#
-# > When you use ranlib or ldconfig, you should make sure nothing bad
-# > happens if the system does not have the program in question. Arrange
-# > to ignore an error from that command, and print a message before the
-# > command to tell the user that failure of this command does not mean a
-# > problem. (The Autoconf ‘AC_PROG_RANLIB’ macro can help with this.)
-
-# 7.2.3: Variables for Specifying Commands
-# ----------------------------------------
-
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-
-# 7.2.5: Variables for Installation Directories
-# ---------------------------------------------
-
-# Root for the installation
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-# Executable programs
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-# Data files (Autoconf won't support runstatedir until version 2.70)
-datarootdir = @datarootdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-runstatedir = $(localstatedir)/run
-# Specific types of files
-includedir = @includedir@
-oldincludedir = @oldincludedir@
-docdir = @docdir@
-infodir = @infodir@
-htmldir = @htmldir@
-dvidir = @dvidir@
-pdfdir = @pdfdir@
-psdir = @psdir@
-libdir = @libdir@
-lispdir = $(datarootdir)/emacs/site-lisp
-localedir = @localedir@
-
-mandir = @mandir@
-man1dir = $(mandir)/man1
-man2dir = $(mandir)/man2
-man3dir = $(mandir)/man3
-man4dir = $(mandir)/man4
-man5dir = $(mandir)/man5
-man6dir = $(mandir)/man6
-man7dir = $(mandir)/man7
-man8dir = $(mandir)/man8
-
-manext = .1
-man1ext = .1
-man2ext = .2
-man3ext = .3
-man4ext = .4
-man5ext = .5
-man6ext = .6
-man7ext = .7
-man8ext = .8
-
-# 7.2.7: Install Command Categories
-# ---------------------------------
-
-PRE_INSTALL =
-POST_INSTALL =
-NORMAL_INSTALL =
-
-PRE_UNINSTALL =
-POST_UNINSTALL =
-NORMAL_UNINSTALL =
diff --git a/systemd.conf.in b/systemd.conf.in
new file mode 100644
index 0000000..b07019f
--- /dev/null
+++ b/systemd.conf.in
@@ -0,0 +1,12 @@
+TypesDB "@collectd_typesdir@/systemd.types.db"
+
+LoadPlugin python
+<Plugin python>
+ ModulePath "@collectd_pythondir@"
+ LogTraces true
+ Interactive false
+ Import "systemd"
+
+ <Module systemd>
+ </Module>
+</Plugin>
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)
diff --git a/systemd.types.db b/systemd.types.db
new file mode 100644
index 0000000..bf45e3a
--- /dev/null
+++ b/systemd.types.db
@@ -0,0 +1,2 @@
+sd_units value:GAUGE:0:U
+sd_jobs value:GAUGE:0:U