#!/usr/bin/env python3 import sys try: import dbus import yaml except ImportError: sys.exit(0) bus = dbus.SystemBus() bus_name = 'org.freedesktop.machine1' # dest object_path = '/org/freedesktop/machine1' try: machined_proxy = bus.get_object(bus_name=bus_name, object_path=object_path) except: sys.exit(1) iface = dbus.Interface(machined_proxy, dbus_interface='org.freedesktop.machine1.Manager') machines = iface.ListMachines() machine_names = [] machines_info = {} for (machine_name, *_) in machines: machine = iface.GetMachine(machine_name) pp = bus.get_object(bus_name='org.freedesktop.machine1', object_path=machine) ii = dbus.Interface(pp, dbus_interface='org.freedesktop.DBus.Properties') out_dict = {} for key, value in ii.GetAll('org.freedesktop.machine1.Machine').items(): # see help(dbus.types) t = type(value) if t == dbus.ByteArray: raise NotImplementedError('Byte array') elif t == dbus.Double: v = float(value) elif t == dbus.Boolean: v = bool(value) elif t in [ dbus.Byte, dbus.Int16, dbus.Int32, dbus.Int64, dbus.UInt16, dbus.UInt32, dbus.UInt64 ]: v = int(value) elif t in [ dbus.ObjectPath, dbus.Signature ]: # string likes v = str(value) elif t == dbus.Dictionary: # dict like raise NotImplementedError('Dictionary') elif t == dbus.Array: if value.signature == dbus.Signature('y'): v = bytes(int(x) for x in value) elif value.signature == dbus.Signature('i'): v = [int(x) for x in value] else: print(repr(value)) print(repr(value.signature)) raise NotImplementedError('Array') # case dbus.UnixFd: # raise NotImplementedError() elif t == dbus.String: v = str(value) elif t == dbus.Struct: # tuple like raise NotImplementedError('Struct') out_dict[str(key)] = v machine_names.append(str(machine_name)) machines_info[str(machine_name)] = out_dict out = { 'machined-machines': machine_names, 'machined-info': machines_info, } print(yaml.dump(out))