[arch-general] Systemd email notifications

Rodrigo Rivas rodrigorivascosta at gmail.com
Thu Feb 13 10:05:05 EST 2014


On Thu, Feb 13, 2014 at 1:35 PM, Thomas Bächler <thomas at archlinux.org> wrote:
>
> Am 13.02.2014 13:04, schrieb Paul Gideon Dann:
> > Does anyone know of any standard system for receiving
> > notifications from systemd for unit state changes?  I currently
> > use Monit for the monitoring of many processes, and it'll e-mail
> > me when things happen (e.g. a process was restarted).  Since
> > switching to systemd, it's felt a bit silly that for several
> > processes, I'm having Monit monitor them simply because
> > systemd is unable to tell me it restarted a unit.  Monit isn't
> > actually required to keep those processes alive as it once was,
> > because systemd can do that.
>
> I'd place a bet on the systemd dbus API: IIRC, it exports the state of
> each unit as a property and then emits the standard
> org.freedesktop.DBus.Properties.PropertiesChanged signal when the state
> changes.
>
> So, your task would be to subscribe to that signal and act on it. This
> could be nicely done in python (and maybe someone has done it already).
>

Ok... I'll take the chance to practice my DBus abilities...
It is a bit long, but it kind of works. Just replace the print() call
with your favourite sendmail function and you'll get a notification
every time any of the units specified in the command line changes
status.

HTH.

#!/usr/bin/python
from gi.repository import GObject
import sys
import dbus
from dbus.mainloop.glib import DBusGMainLoop

DBusGMainLoop(set_as_default=True)

bus = dbus.SystemBus()
systemd = bus.get_object('org.freedesktop.systemd1',
'/org/freedesktop/systemd1')
manager = dbus.Interface(systemd, 'org.freedesktop.systemd1.Manager')

def GetPropChanged(obj, iface, propName, changes, invalids):
    if propName in invalids:
        return obj.Get(iface, propName, dbus_interface=dbus.PROPERTIES_IFACE)
    elif propName in changes:
        return changes[propName]
    else:
        return None

def OnPropChanged(unit, name, iface, changes, invalids):
    if iface != 'org.freedesktop.systemd1.Unit':
        return
    state = GetPropChanged(unit, iface, 'ActiveState', changes, invalids)
    substate = GetPropChanged(unit, iface, 'SubState', changes, invalids)
    if state or substate:
        print('Status changed', name, state, substate)

for unitName in sys.argv[1:]:
    unit = bus.get_object('org.freedesktop.systemd1', manager.GetUnit(unitName))
    unit.connect_to_signal('PropertiesChanged', lambda a,b,c :
OnPropChanged(unit, unitName, a, b, c),
dbus_interface=dbus.PROPERTIES_IFACE)

loop = GObject.MainLoop()
loop.run()


More information about the arch-general mailing list