Use dbus-python to query system state and failed units

This commit is contained in:
Mike Gerber 2016-12-17 17:12:36 +01:00
parent ece5647c25
commit e95167262b
2 changed files with 35 additions and 23 deletions

View file

@ -12,5 +12,7 @@ these commands:
$ systemctl list-units $ systemctl list-units
$ systemctl status $ systemctl status
Requires python-dbus.
License: Public Domain. Keep my name in it if you like. License: Public Domain. Keep my name in it if you like.
Author: Mike Gerber 2015 Author: Mike Gerber 2015, 2016

View file

@ -7,29 +7,39 @@ import subprocess
import sys import sys
def find_systemctl():
systemctls = [ '/bin/systemctl', '/usr/bin/systemctl' ]
for systemctl in systemctls:
if posixpath.exists(systemctl):
return systemctl
systemctl = find_systemctl()
if not systemctl:
print('System WARN: systemctl not found')
sys.exit(1)
try: try:
state = subprocess.check_output([systemctl, 'is-system-running']) import dbus
state = state.strip() except ImportError:
except subprocess.CalledProcessError as e: print("UNKNOWN: Please install python-dbus")
state = e.output.strip() sys.exit(3)
print('System NOT OK: {}'.format(state))
sys.exit(2)
if state in ['running', 'starting']:
print('System OK: {}'.format(state)) bus = dbus.SystemBus()
proxy = bus.get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1')
def get_system_state():
"""Get system state."""
properties_manager = dbus.Interface(proxy, 'org.freedesktop.DBus.Properties')
system_state = properties_manager.Get('org.freedesktop.systemd1.Manager', 'SystemState')
return system_state
def get_failed_units():
"""Get a list of failed system units."""
units = proxy.ListUnits(dbus_interface='org.freedesktop.systemd1.Manager')
failed_units = []
for u in units:
service, _, loaded, active, state = u[:5]
if active == 'failed':
failed_units.append(service)
return failed_units
system_state = get_system_state()
if system_state in ['running', 'starting']:
print('System OK: {}'.format(system_state))
sys.exit(0) sys.exit(0)
else: else:
print('System NOT OK: {}'.format(state)) print('System NOT OK: {}, failed: {}'.format(system_state, " ".join(get_failed_units())))
sys.exit(0) sys.exit(2)