#!/usr/bin/env python3 import dbus import yaml bus = dbus.SystemBus() bus_name = 'org.freedesktop.machine1' # dest object_path = '/org/freedesktop/machine1' machined_proxy = bus.get_object(bus_name=bus_name, object_path=object_path) 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) match type(value): case dbus.ByteArray: raise NotImplementedError('Byte array') case dbus.Double: v = float(value) case dbus.Boolean: v = bool(value) case dbus.Byte | dbus.Int16 | dbus.Int32 | dbus.Int64 | dbus.UInt16 | dbus.UInt32 | dbus.UInt64: v = int(value) case dbus.ObjectPath | dbus.Signature: # string likes v = str(value) case dbus.Dictionary: # dict like raise NotImplementedError('Dictionary') case dbus.Array: match value.signature: case dbus.Signature('y'): v = bytes(int(x) for x in value) case dbus.Signature('i'): v = [int(x) for x in value] case _: print(repr(value)) print(repr(value.signature)) raise NotImplementedError('Array') # case dbus.UnixFd: # raise NotImplementedError() case dbus.String: v = str(value) case 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))