#!/usr/bin/python import os import sys import gobject import dbus import dbus.mainloop.glib from optparse import OptionParser import neardutils from dbus.lowlevel import MethodCallMessage, HANDLER_RESULT_NOT_YET_HANDLED mainloop = gobject.MainLoop() def device_added(path, interfaces): for iface, props in interfaces.iteritems(): if "org.neard.Device" in interfaces: print("Pairing with %s" % (path)) device = dbus.Interface(bus.get_object("org.neard", path), "org.neard.Device") device.Push(({ "Type" : "Handover", "Carrier" : "bluetooth"})) break def device_removed(path, interfaces): for iface in interfaces: if "org.neard.Device" in interfaces: print("Lost device %s" % (path)) mainloop.quit() break def remove_paired_devices(bt_adapter): manager = dbus.Interface(bus.get_object("org.bluez", "/"), "org.freedesktop.DBus.ObjectManager") objects = manager.GetManagedObjects() all_adapters = (path for path, interfaces in objects.iteritems() if "org.bluez.Adapter1" in interfaces.keys() and path.endswith(bt_adapter)) bluez_adapter = None for adapter in sorted(all_adapters): bluez_adapter = dbus.Interface(bus.get_object("org.bluez", adapter), "org.bluez.Adapter1") break if(bluez_adapter is None): print("Bluetooth adapter %s could not be found" % bluez_adapter) exit() adapter_path = bluez_adapter.object_path print("Using %s" % adapter_path) adapter_props = dbus.Interface(bus.get_object("org.bluez", adapter_path), "org.freedesktop.DBus.Properties") powered = adapter_props.Get("org.bluez.Adapter1", "Powered") if (powered == dbus.Boolean(0)): print("Bluetooth adapter %s is not powered" % adapter_path ) exit() all_devices = (path for path, interfaces in objects.iteritems() if ("org.bluez.Device1" in interfaces.keys() and path.startswith(bluez_adapter.object_path))) for device in all_devices: print("Removing %s" % (device)) bluez_adapter.RemoveDevice(device) def remove_paired_devices_bluez4(): bluez_manager = dbus.Interface(bus.get_object("org.bluez", "/"), "org.bluez.Manager") bluez_adapter_path = bluez_manager.DefaultAdapter() bluez_adapter = dbus.Interface(bus.get_object("org.bluez", bluez_adapter_path), "org.bluez.Adapter") print("Using %s" % bluez_adapter.object_path) for bluez_path in bluez_adapter.ListDevices(): print("Removing %s" % (bluez_path)) bluez_adapter.RemoveDevice(bluez_path) if __name__ == '__main__': parser = OptionParser() parser.add_option("", "--bluez4", action="store_true", dest="use_bluez4", help="Use BlueZ 4 to remove paired devices.") parser.add_option("-a", "--adapter", metavar="BT_ADAPTER", dest="bt_adapter", default="", help="The bluetooth adapter that is used by " "the bluetooth stack. This options is " "ignored when using BlueZ 4, instead " "the default adapter is used.") (options, args) = parser.parse_args() dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() adapter_path = neardutils.find_adapter().object_path print("Adapter path %s" % (adapter_path)) adapter = dbus.Interface(bus.get_object("org.neard", adapter_path), "org.neard.Adapter") adapter_props = dbus.Interface(bus.get_object("org.neard", adapter_path), "org.freedesktop.DBus.Properties") powered = adapter_props.Get("org.neard.Adapter", "Powered") if (powered == dbus.Boolean(0)): adapter_props.Set("org.neard.Adapter", "Powered", dbus.Boolean(1)) if (options.use_bluez4): remove_paired_devices_bluez4() else: remove_paired_devices(options.bt_adapter) polling = adapter_props.Get("org.neard.Adapter", "Polling") if (polling == dbus.Boolean(0)): adapter.StartPollLoop("Initiator") bus.add_signal_receiver(device_added, bus_name="org.neard", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesAdded") bus.add_signal_receiver(device_removed, bus_name="org.neard", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesRemoved") mainloop.run()