#!/usr/bin/python import gobject import dbus import dbus.mainloop.glib from dbus.lowlevel import MethodCallMessage, HANDLER_RESULT_NOT_YET_HANDLED def extract_list(list): val = "[" for i in list: if type(i).__name__ == 'Dictionary': val += extract_values(i) elif type(i).__name__ == 'Struct': val += extract_list(i) else: val += " " + str(i) val += "]" return val def extract_values(values): val = "{" for key in values.keys(): val += " " + key + "=" if key in ["ProtocolFamily"]: val += "%s" % (int(values[key])) elif key in ["IPv4", "IPv6"]: val += extract_values(values[key]) else: val += str(values[key]) val += " }" return val def extract(name, value): val = None if name in ["Index"]: val = int(value) elif name in ["IPv4", "IPv6" ]: val = extract_values(value) elif name in ["UserRoutes", "ServerRoutes", "Nameservers"]: val = extract_list(value) else: val = str(value) return val def property_changed(name, value, path, interface): iface = interface[interface.rfind(".") + 1:] val = extract(name, value) print "{%s} [%s] %s = %s" % (iface, path, name, val) def message_filter(connection, message): if not isinstance(message, MethodCallMessage): return HANDLER_RESULT_NOT_YET_HANDLED interface = message.get_interface() path = message.get_path() name = message.get_member() args = message.get_args_list() property_changed(name, args, path, interface) if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() bus.add_signal_receiver(property_changed, bus_name="net.connman.vpn", signal_name = "PropertyChanged", path_keyword="path", interface_keyword="interface") bus.add_message_filter(message_filter) mainloop = gobject.MainLoop() mainloop.run()