コード例 #1
0
def check_service_status(service):
    """ queries systemd through dbus to see if the service is running """
    service_running = False
    bus = SystemBus()
    systemd = bus.get_object("org.freedesktop.systemd1", "/org/freedesktop/systemd1")
    manager = Interface(systemd, dbus_interface="org.freedesktop.systemd1.Manager")
    try:
        service_unit = (
            service
            if service.endswith(".service")
            else manager.GetUnit(f"{service}.service")
        )
        service_proxy = bus.get_object("org.freedesktop.systemd1", str(service_unit))
        service_props = Interface(
            service_proxy, dbus_interface="org.freedesktop.DBus.Properties"
        )
        service_load_state = service_props.Get(
            "org.freedesktop.systemd1.Unit", "LoadState"
        )
        service_active_state = service_props.Get(
            "org.freedesktop.systemd1.Unit", "ActiveState"
        )
        if service_load_state == "loaded" and service_active_state == "active":
            service_running = True
    except DBusException:
        pass
    return service_running
コード例 #2
0
def main():
    print(
        "starting to monitor your spotify tracks, make sure you start the spotify client before you run this program"
    )
    while True:
        try:
            session_bus = SessionBus()

            bus_data = ("org.mpris.MediaPlayer2.spotify",
                        "/org/mpris/MediaPlayer2")
            spotify_bus = session_bus.get_object(*bus_data)

            interface = Interface(spotify_bus,
                                  "org.freedesktop.DBus.Properties")

            metadata = interface.Get("org.mpris.MediaPlayer2.Player",
                                     "Metadata")
            status = str(
                interface.Get("org.mpris.MediaPlayer2.Player",
                              "PlaybackStatus"))
            is_playing = False

            if status == "Playing":
                is_playing = True

            data = {"artist": None, "song": None, "album": None}

            artist_data = metadata.get("xesam:albumArtist")

            artist = str(next(iter(artist_data)))
            song_name = str(metadata.get("xesam:title"))
            album = str(metadata.get("xesam:album"))

            thread = Thread(target=handle_track,
                            args=(
                                song_name,
                                album,
                                artist,
                                is_playing,
                                prev_track,
                            ))
            thread.start()

            # if is_playing:
            #     print('{} - {}'.format(song_name, artist))

            sleep(1)
        except Exception as e:
            print("exception occurred")
            print(e)
            sleep(1)

    print('exiting? wtf?')
コード例 #3
0
    def _get_rhythmbox_player(self):
        # Para controlar el reproductor, usaremos la interfaz estándar que
        # define FreeDestkop.org, es decir MPRIS

        # Información de D-Bus para Rhythmbox usando interfaz estándar MPRIS
        rhythmbox_bus_name = 'org.mpris.MediaPlayer2.rhythmbox'
        rhythmbox_object_path = '/org/mpris/MediaPlayer2'
        rhythmbox_dbus_interface_player = 'org.mpris.MediaPlayer2.Player'
        rhythmbox_dbus_interface_playlists = 'org.mpris.MediaPlayer2.Playlists'

        # Se obtiene el objeto remoto de Rhythmbox desde el bus de sesión
        rhythmbox_object = self._session_bus.get_object(
            rhythmbox_bus_name, rhythmbox_object_path)

        # Se obtiene la interfaz Player del objeto remoto del reproductor
        rhythmbox_player = Interface(rhythmbox_object,
                                     rhythmbox_dbus_interface_player)

        # Se obtiene la interfaz Playerlists del objeto remoto del reproductor
        rhythmbox_playlists = Interface(rhythmbox_object,
                                        rhythmbox_dbus_interface_playlists)

        # Se necesita obtener la cantidad de listas de reproducción contenidas
        # en el reproductor. Eso lo devuelve la propiedad "PlaylistCount"
        playlists_properties = Interface(rhythmbox_object,
                                         'org.freedesktop.DBus.Properties')
        pl_count = playlists_properties.Get(rhythmbox_dbus_interface_playlists,
                                            'PlaylistCount')

        return rhythmbox_player, rhythmbox_playlists, pl_count
コード例 #4
0
	def mpris(self):
		from dbus import Interface
		player = self.NPCommand.get_text()
		dbus_mpris_service = u'org.mpris.MediaPlayer2.'
		dbus_mpris_player_service = u'org.mpris.MediaPlayer2.Player'
		dbus_mpris_path = u'/org/mpris/MediaPlayer2'
		dbus_property = u'org.freedesktop.DBus.Properties'
		if not player:
			names = self.bus.list_names()
			players = []
			for name in names:
				if name.startswith(dbus_mpris_service):
					players.append(name[len(dbus_mpris_service):])
			if not players:
				self.frame.logMessage(_("Could not find a suitable MPRIS player."))
				return None
			player = players[0]
			if len(players) > 1:
				self.frame.logMessage(_("Found multiple MPRIS players: %(players)s. Using: %(player)s") % {'players': players, 'player': player})
			else:
				self.frame.logMessage(_("Auto-detected MPRIS player: %s.") % player)
		try:
			player_obj          = self.bus.get_object(dbus_mpris_service + player, dbus_mpris_path)
			player_property_obj = Interface(player_obj, dbus_interface=dbus_property)
			metadata            = player_property_obj.Get(dbus_mpris_player_service, "Metadata")
		except Exception, exception:
			self.frame.logMessage(_("Something went wrong while querying %(player)s: %(exception)s") % {'player': player, 'exception': exception})
			return None
コード例 #5
0
ファイル: dbus.py プロジェクト: julienmalik/packages
class DBusProperties(object):
    """
    Dbus property map abstraction.

    Wraps properties of a DBus interface on a DBus object as attributes.
    """
    def __init__(self, dbus_object, interface):
        """
        Initialize a proxy object with standard DBus property interface.

        :param dbus.proxies.ProxyObject dbus_object: accessed object
        :param str interface: accessed interface name
        """
        self.__proxy = Interface(
            dbus_object, dbus_interface='org.freedesktop.DBus.Properties')
        self.__interface = interface

    def __getattr__(self, property):
        """
        Retrieve the property via the DBus proxy.

        :param str property: name of the dbus property
        :returns: the property
        """
        return self.__proxy.Get(self.__interface, property)
コード例 #6
0
    def get_service_status(self, service=None, unit=None):
        """Returns tuple of unit, service name, state, substate and pid."""
        if not unit:
            unit = self._bus.get_object('org.freedesktop.systemd1',\
                                    self._manager.LoadUnit(service))

        Iunit = Interface(unit,
                          dbus_interface='org.freedesktop.DBus.Properties')

        if not service:
            service = str(Iunit.Get('org.freedesktop.systemd1.Unit', 'Id'))

        state = str(Iunit.Get('org.freedesktop.systemd1.Unit', 'ActiveState'))
        substate = str(Iunit.Get('org.freedesktop.systemd1.Unit', 'SubState'))
        pid = str(Iunit.Get('org.freedesktop.systemd1.Service', 'ExecMainPID'))

        return (unit, service, state, substate, pid)
コード例 #7
0
ファイル: minecraft.py プロジェクト: Gagogaa/jim
def get_minecraft_info():
    if not alpm_imported or not dbus_imported:
        out = "Minecraft info not available due to modules:"
        out += "" if alpm_imported else " pyalpm"
        out += "" if dbus_imported else " dbus"
        return out

    bus = SystemBus()
    systemd = bus.get_object('org.freedesktop.systemd1',
                             '/org/freedesktop/systemd1')
    manager = Interface(systemd,
                        dbus_interface='org.freedesktop.systemd1.Manager')
    unit = manager.LoadUnit(config_get("minecraft", "unit"))
    uproxy = bus.get_object('org.freedesktop.systemd1', str(unit))
    state = Interface(uproxy, dbus_interface='org.freedesktop.DBus.Properties')
    active_state = str(
        state.Get('org.freedesktop.systemd1.Unit',
                  'ActiveState',
                  dbus_interface='org.freedesktop.DBus.Properties'))

    if active_state == 'active':
        active_time = int(
            state.Get('org.freedesktop.systemd1.Unit',
                      'ActiveEnterTimestamp',
                      dbus_interface='org.freedesktop.DBus.Properties'))
    else:
        active_time = 0

    alpm_handle = pyalpm.Handle(config_get("alpm", "rootdir"),
                                config_get("alpm", "dbdir"))
    local_db = alpm_handle.get_localdb()
    mc_pkg = local_db.get_pkg(config_get("minecraft", "pkgname"))
    ver = mc_pkg.version
    sanitized_ver = ''.join(re.findall(r'(\d+\.)(\d+\.)?(\*|\d*)', ver)[0])

    if active_state == 'active':
        out = "Minecraft server is up!\nUptime: %s\nVersion: %s\nAddress: %s" % \
              (datetime.datetime.now() - datetime.datetime.fromtimestamp(int(active_time/1000000)),
               sanitized_ver,
               config_get("minecraft", "address"))
    else:
        out = "Minecraft server is down!"

    return out
コード例 #8
0
    def _get_device_mount_path(self, device_object_path):
        # Información necesaria para procesar los dispositivos de UDisks
        udisks_bus_name = 'org.freedesktop.UDisks'
        device_dbus_interface = 'org.freedesktop.UDisks.Device'

        # Se obtiene el objeto remoto del dispositivo insertado a través
        # de la conexión al bus de sistema del demonio UDisks.
        device_object = self._system_bus.get_object(udisks_bus_name,
                                                    device_object_path)

        # Para acceder a las propiedades de un objeto FreeDesktop.org
        # establece una interfaz estándar: 'org.freedesktop.DBus.Properties'
        device = Interface(device_object, 'org.freedesktop.DBus.Properties')

        # Con el método 'Get' de la interfaz 'org.freedesktop.DBus.Properties'
        # se obtiene el valor de una propiedad en una interfaz determinada.

        # La propiedad 'DeviceFile' devuelve el archivo de dispositivo en /dev
        # En nuestro caso no lo necesitamos, se pone a modo de enseñanza.
        dev_file = device.Get(device_dbus_interface, 'DeviceFile')

        # La propiedad 'DeviceIsMounted' devuelve si está montado
        is_mounted = device.Get(device_dbus_interface, 'DeviceIsMounted')
        print u'¿Está montado %s? : %s' % (dev_file, str(bool(is_mounted)))

        # Si el dispositivo ya fue escaneado y no está montado, significa que
        # recién se desmontó, hay que olvidarlo.
        mount_path = None
        if device_object_path in self._already_scanned:
            if not is_mounted:
                del self._already_scanned[device_object_path]
        # Si no ha sido escaneado y está montado, significa que recién se
        # ha montado y hay que escanearlo y recordarlo, se devuelve el punto
        # de montaje. En otros casos, no se hace nada y no se devuelve nada.
        elif is_mounted:
            self._already_scanned[device_object_path] = True
            # La propiedad 'DeviceMountPaths' devuelve todos los directorios
            # del sistema de archivos donde se ha montado este dispositivo.
            mount_paths = device.Get(device_dbus_interface, 'DeviceMountPaths')
            mount_path = mount_paths[0]
        return mount_path
コード例 #9
0
ファイル: wifi.py プロジェクト: kandiki/my-tank
 def is_ap_mode(self) -> bool:
     bus = SystemBus()
     systemd = bus.get_object('org.freedesktop.systemd1',
                              '/org/freedesktop/systemd1')
     manager = Interface(systemd,
                         dbus_interface='org.freedesktop.systemd1.Manager')
     appliance_unit = manager.LoadUnit('hostapd.service')
     appliance_proxy = bus.get_object('org.freedesktop.systemd1',
                                      str(appliance_unit))
     appliance_properties = Interface(
         appliance_proxy, dbus_interface='org.freedesktop.DBus.Properties')
     return appliance_properties.Get('org.freedesktop.systemd1.Unit',
                                     'ActiveState') != 'inactive'
コード例 #10
0
def appliance_state():
    bus = SystemBus()
    systemd = bus.get_object('org.freedesktop.systemd1',
                             '/org/freedesktop/systemd1')
    manager = Interface(systemd,
                        dbus_interface='org.freedesktop.systemd1.Manager')
    appliance_unit = manager.LoadUnit('observer-appliance.service')
    appliance_proxy = bus.get_object('org.freedesktop.systemd1',
                                     str(appliance_unit))
    appliance_properties = Interface(
        appliance_proxy, dbus_interface='org.freedesktop.DBus.Properties')
    return appliance_properties.Get('org.freedesktop.systemd1.Unit',
                                    'ActiveState')
コード例 #11
0
	def getActiveState(self, name) :
		unit = DBusInterface(
			self._bus.get_object(
				'org.freedesktop.systemd1',
				str(self._systemd_manager.LoadUnit(name + '.service'))
			),
			'org.freedesktop.systemd1.Unit'
		)
		active_state = unit.Get(
			'org.freedesktop.systemd1.Unit',
			'ActiveState',
			dbus_interface='org.freedesktop.DBus.Properties'
		)
		return active_state
コード例 #12
0
ファイル: minecraft.py プロジェクト: apbodnar/jim
def get_minecraft_info():
    bus = SystemBus()
    systemd = bus.get_object('org.freedesktop.systemd1',
                             '/org/freedesktop/systemd1')
    manager = Interface(systemd,
                        dbus_interface='org.freedesktop.systemd1.Manager')
    unit = manager.LoadUnit('spigot.service')
    uproxy = bus.get_object('org.freedesktop.systemd1', str(unit))
    state = Interface(uproxy, dbus_interface='org.freedesktop.DBus.Properties')
    active_state = str(
        state.Get('org.freedesktop.systemd1.Unit',
                  'ActiveState',
                  dbus_interface='org.freedesktop.DBus.Properties'))

    if active_state == 'active':
        active_time = int(
            state.Get('org.freedesktop.systemd1.Unit',
                      'ActiveEnterTimestamp',
                      dbus_interface='org.freedesktop.DBus.Properties'))
    else:
        active_time = 0

    alpm_handle = pyalpm.Handle("/", "/var/lib/pacman")
    local_db = alpm_handle.get_localdb()
    spigot_pkg = local_db.get_pkg("spigot")
    ver = spigot_pkg.version

    if active_state == 'active':
        out = "Minecraft server is up!\nUptime: %s\nVersion: %s\nAddress: %s" % \
              (datetime.datetime.now() - datetime.datetime.fromtimestamp(int(active_time/1000000)),
               ver.split(":")[1].split("-")[0],
               config_get("minecraft", "address"))
    else:
        out = "Minecraft server is down!"

    return out
コード例 #13
0
ファイル: common.py プロジェクト: cherti/udiskie
class DBusProperties(object):
    """
    Dbus property map abstraction.

    Properties of the object can be accessed as attributes.

    """
    def __init__(self, dbus_object, interface):
        """Initialize a proxy object with standard DBus property interface."""
        self.__proxy = Interface(
            dbus_object, dbus_interface='org.freedesktop.DBus.Properties')
        self.__interface = interface

    def __getattr__(self, property):
        """Retrieve the property via the DBus proxy."""
        return self.__proxy.Get(self.__interface, property)
コード例 #14
0
ファイル: oxt_dbus.py プロジェクト: OpenXT/sync-client
class ServiceObject:
    def __init__(self, service, intf, obj_path):
        obj = SystemBus().get_object(service, obj_path)
        self.intf = Interface(obj, dbus_interface=intf)
        self.propi = Interface(obj, dbus_interface='org.freedesktop.DBus.Properties')

    def __getattr__(self, name):
        # if wrapped dbus intf has it, call it
        if isinstance(getattr(self.intf, name, None), collections.Callable):
            return getattr(self.intf, name)

    def get_property(self, key):
        """Lookup key on interface at path"""
        return self.propi.Get(self.intf.dbus_interface, key)

    def set_property(self, key, value):
        """Set key to value on interface at path"""
        return str(self.propi.Set(self.intf.dbus_interface, key, value))
コード例 #15
0
class Service:
    """
    The Service class representing systemd service.
    This class use various internals states for managing service state effectively.
    """

    alerts = Queue()
    non_active = set()
    # once fault resolved detected for service, add service name
    # into the active_services list.
    active_services = set()
    monitoring_disabled = set()

    def __init__(self, unit):
        """
        Initialize Service.
        """
        self.unit = unit
        self.properties_iface = Interface(self.unit,
                                          dbus_interface=PROPERTIES_IFACE)
        self.name = str(self.properties_iface.Get(UNIT_IFACE, 'Id'))
        self.state = "N/A"
        self.substate = "N/A"
        self.pid = "N/A"
        self.previous_state = "N/A"
        self.previous_substate = "N/A"
        self.previous_pid = "N/A"
        self.nonactive_enter_timestamp = time.time()
        self.active_enter_timestamp = time.time()
        self.nonactive_threshold = int(
            Conf.get(SSPL_CONF,
                     f"{ServiceMonitor.name().upper()}>threshold_inactive_time",
                     '60'))
        self.active_threshold = int(Conf.get(SSPL_CONF,
                     f"{ServiceMonitor.name().upper()}>threshold_active_time",
                     '30'))
        self.properties_changed_signal = None
        self._service_state = ActiveState
        self._unit_state = None

    @property
    def is_enabled(self):
        if self.properties_iface.Get(UNIT_IFACE, 'UnitFileState'):
            return 'disabled' not in self.properties_iface.Get(
                UNIT_IFACE, 'UnitFileState')
        return False

    def is_nonactive_for_threshold_time(self):
        return time.time() - self.nonactive_enter_timestamp > self.nonactive_threshold

    def is_active_for_threshold_time(self):
        return time.time() - self.active_enter_timestamp > self.active_threshold

    def new_service_state(self, new_state):
        if self._service_state != new_state:
            self._service_state = new_state
            new_state.enter(self)

    def new_unit_state(self, new_state):
        if new_state != self._unit_state:
            self._unit_state = new_state
            new_state.enter(self)

    def properties_changed_handler(self, interface, changed_properties,
                                   invalidated_properties):

        state = str(self.properties_iface.Get(
            UNIT_IFACE, 'ActiveState'))
        substate = str(self.properties_iface.Get(
            UNIT_IFACE, 'SubState'))
        pid = str(self.properties_iface.Get(
            SERVICE_IFACE, 'ExecMainPID'))
        if state != self.state:
            self.previous_state = self.state
            self.state = state
        if substate != self.substate:
            self.previous_substate = self.substate
            self.substate = substate
        if pid != self.pid:
            self.previous_pid = self.pid
            self.pid = pid

        if self.state != self.previous_state:
            if self.state == "active":
                if self._service_state is FailedState:
                    self.new_service_state(ActiveState)
                    Service.active_services.add(self.name)
                if self._service_state is InactiveState:
                    self.new_service_state(ActiveState)
            elif self.state == "failed":
                if self._service_state is not FailedState:
                    Service.alerts.put(
                        ServiceMonitor.get_alert(self, FailedAlert))
                self.new_service_state(FailedState)
            else:
                # Avoid raising duplicate alerts
                if self._service_state != FailedState:
                    self.new_service_state(InactiveState)
                self.dump_to_cache()

    def handle_unit_state_change(self):
        # TODO: Check if alert needs to be generated for UnitFileState change
        if self.is_enabled:
            self.new_unit_state(EnabledState)
        else:
            self.new_unit_state(DisabledState)

    @classmethod
    def from_cache(cls, service_name, unit):
        """
        Initialize service from cache
        """
        data = store.get(f"{CACHE_PATH}/{service_name}")
        service = cls(unit)
        service.new_service_state(data["service_monitor_state"])
        service.state = data["service_state"]
        service.nonactive_enter_timestamp = data["nonactive_enter_timestamp"]
        service.active_enter_timestamp = data["active_enter_timestamp"]
        return service

    def dump_to_cache(self):
        """
        Write service status to cache
        """
        data = {
            "service_state": self.state,
            "service_monitor_state": self._service_state,
            "nonactive_enter_timestamp": self.nonactive_enter_timestamp,
            "active_enter_timestamp": self.active_enter_timestamp
        }
        store.put(data, f"{CACHE_PATH}/{self.name}")

    @staticmethod
    def cache_exists(service_name):
        exists, _ = store.exists(f"{CACHE_PATH}/{service_name}")
        return exists
コード例 #16
0
ファイル: dbus_helper.py プロジェクト: 4uf04eG/music-overlay
def get_dbus_param(properties_interface: dbus.Interface, param_name: str):
    return properties_interface.Get('org.mpris.MediaPlayer2.Player',
                                    param_name)
コード例 #17
0
    def get_systemd_service_info(self, log, service_name):
        """Get info of specified service using dbus API."""
        try:
            unit = self._bus.get_object(SYSTEMD_BUS,
                                        self._manager.LoadUnit(service_name))
            properties_iface = Interface(unit, dbus_interface=PROPERTIES_IFACE)
        except DBusException as err:
            logger.error(
                log.svc_log(
                    f"Unable to initialize {service_name} due to {err}"))
            return None
        path_array = properties_iface.Get(SERVICE_IFACE, 'ExecStart')
        try:
            command_line_path = str(path_array[0][0])
        except IndexError as err:
            logger.error(
                log.svc_log(
                    f"Unable to find {service_name} path due to {err}"))
            command_line_path = "NA"

        is_installed = True if command_line_path != "NA" or 'invalid' in properties_iface.Get(
            UNIT_IFACE, 'UnitFileState') else False
        uid = str(properties_iface.Get(UNIT_IFACE, 'Id'))
        if not is_installed:
            health_status = "NA"
            health_description = f"Software enabling {uid} is not installed"
            recommendation = "NA"
            specifics = [{
                "service_name": uid,
                "description": "NA",
                "installed": str(is_installed).lower(),
                "pid": "NA",
                "state": "NA",
                "substate": "NA",
                "status": "NA",
                "license": "NA",
                "version": "NA",
                "command_line_path": "NA"
            }]
        else:
            service_license = "NA"
            version = "NA"
            service_description = str(
                properties_iface.Get(UNIT_IFACE, 'Description'))
            state = str(properties_iface.Get(UNIT_IFACE, 'ActiveState'))
            substate = str(properties_iface.Get(UNIT_IFACE, 'SubState'))
            service_status = 'enabled' if 'disabled' not in properties_iface.Get(
                UNIT_IFACE, 'UnitFileState') else 'disabled'
            pid = "NA" if state == "inactive" else str(
                properties_iface.Get(SERVICE_IFACE, 'ExecMainPID'))
            try:
                version = self.get_service_info_from_rpm(uid, "VERSION")
            except ServiceError as err:
                logger.error(
                    log.svc_log(f"Unable to get service version due to {err}"))
            try:
                service_license = self.get_service_info_from_rpm(
                    uid, "LICENSE")
            except ServiceError as err:
                logger.error(
                    log.svc_log(f"Unable to get service license due to {err}"))

            specifics = [{
                "service_name": uid,
                "description": service_description,
                "installed": str(is_installed).lower(),
                "pid": pid,
                "state": state,
                "substate": substate,
                "status": service_status,
                "license": service_license,
                "version": version,
                "command_line_path": command_line_path
            }]
            if state == 'active' and substate == 'running':
                health_status = 'OK'
                health_description = f"{uid} is in good health"
                recommendation = "NA"
            else:
                health_status = state
                health_description = f"{uid} is not in good health"
                recommendation = DEFAULT_RECOMMENDATION

        return uid, health_status, health_description, recommendation, specifics
コード例 #18
0
 def get_unit_uptime(self, unit):
     unit = self.manager.LoadUnit(unit)
     unit_object = self.bus.get_object(SYSTEMD_BUSNAME, unit)
     unit_properties = Interface(unit_object, DBUS_INTERFACE)
     return unit_properties.Get(SYSTEMD_UNIT_INTERFACE,
                                'ActiveEnterTimestamp')
コード例 #19
0
ファイル: bt.py プロジェクト: petitchameau/scripts-perso
from dbus import Interface, SystemBus
from dbus.exceptions import DBusException

from wait import wait

DEVICE = '00:0C:8A:67:96:90'
DEVICE = DEVICE.replace(':', '_')

index = 0

bus = SystemBus()

proxy_power = bus.get_object('org.bluez', '/org/bluez/hci0')
interface_power = Interface(proxy_power, dbus_interface='org.freedesktop.DBus.Properties')

while not interface_power.Get('org.bluez.Adapter1', 'Powered'):
    interface_power.Set('org.bluez.Adapter1', 'Powered', True)
    index = wait(index, text='powering')
else:
    print('\nInterface powered')

proxy_connected = bus.get_object('org.bluez', '/org/bluez/hci0/dev_{}'.format(DEVICE))
interface_connected = Interface(proxy_connected, dbus_interface='org.freedesktop.DBus.Properties')

while not interface_connected.Get('org.bluez.Device1', 'Connected'):
    interface_connect = Interface(proxy_connected, dbus_interface='org.bluez.Device1')
    try:
        interface_connect.Connect()
        index = wait(index, text='connecting')
    except DBusException as e:
        index = wait(index, text=e.get_dbus_message())
コード例 #20
0
 def get_unit_load_state(self, unit):
     unit = self.manager.LoadUnit(unit)
     unit_object = self.bus.get_object(SYSTEMD_BUSNAME, unit)
     unit_properties = Interface(unit_object, DBUS_INTERFACE)
     return unit_properties.Get(SYSTEMD_UNIT_INTERFACE, 'LoadState')