#!/usr/bin/python

from __future__ import absolute_import, print_function, unicode_literals

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

bus = dbus.SystemBus()

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

(options, args) = parser.parse_args()

adapter_path = bluezutils.find_adapter(options.dev_id).object_path
server = dbus.Interface(bus.get_object("org.bluez", adapter_path),
						"org.bluez.NetworkServer")

service = "nap"

if (len(args) < 1):
	bridge = "tether"
else:
	bridge = args[0]

server.Register(service, bridge)

print("Server for %s registered for %s" % (service, bridge))

print("Press CTRL-C to disconnect")

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

server.Unregister(service)
