#!/usr/bin/python

import sys
import time
import dbus
from optparse import OptionParser, make_option

bus = dbus.SystemBus()

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

option_list = [
		make_option("-i", "--device", action="store",
				type="string", dest="dev_id"),
		]
parser = OptionParser(option_list=option_list)

(options, args) = parser.parse_args()

if options.dev_id:
	adapter_path = manager.FindAdapter(options.dev_id)
else:
	adapter_path = manager.DefaultAdapter()

adapter = dbus.Interface(bus.get_object("org.bluez", adapter_path),
							"org.bluez.Adapter")

if (len(args) < 1):
	print "Usage: %s <address> [service]" % (sys.argv[0])
	sys.exit(1)

address = args[0]

if (len(args) < 2):
	service = "panu"
else:
	service = args[1]

device = adapter.FindDevice(address)

network = dbus.Interface(bus.get_object("org.bluez", device),
						"org.bluez.Network")

iface = network.Connect(service)

print "Connected %s to %s" % (device, address)

print "Press CTRL-C to disconnect"

try:
	time.sleep(1000)
	print "Terminating connection"
except:
	pass

network.Disconnect()
