#!/usr/bin/python

import dbus

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object("org.bluez", "/"),
						"org.bluez.Manager")

def extract_uuids(uuid_list):
	list = ""
	for uuid in uuid_list:
		if (uuid.endswith("-0000-1000-8000-00805f9b34fb")):
			if (uuid.startswith("0000")):
				val = "0x" + uuid[4:8]
			else:
				val = "0x" + uuid[0:8]
		else:
			val = str(uuid)
		list = list + val + " "
	return list

adapter_list = manager.ListAdapters()

for i in adapter_list:
	adapter = dbus.Interface(bus.get_object("org.bluez", i),
							"org.bluez.Adapter")
	print "[ " + i + " ]"

	properties  = adapter.GetProperties()
	for key in properties.keys():
		print "    %s = %s" % (key, properties[key])

	device_list = adapter.ListDevices()

	for n in device_list:
		device = dbus.Interface(bus.get_object("org.bluez", n),
							"org.bluez.Device")
		print "    [ " + n + " ]"

		properties = device.GetProperties()
		for key in properties.keys():
			value = properties[key]
			if (key == "UUIDs"):
				list = extract_uuids(value)
				print "        %s = %s" % (key, list)
			elif (key == "Class"):
				print "        %s = 0x%06x" % (key, value)
			else:
				print "        %s = %s" % (key, value)

	print
