#!/usr/bin/python

import sys
import dbus

if (len(sys.argv) < 2):
	print "Usage:"
	print "%s <service> direct" % (sys.argv[0])
	print "%s <service> manual [servers=uri1,uri2,...] [excludes=host1,host2,...]" % (sys.argv[0])
	print "%s <service> auto url=[pac-url]" % (sys.argv[0])
	print "Example: %s service0 manual servers=proxy.example.com:8080" % sys.argv[0]
	print "         This would set the proxy uri and the method to manual"
	sys.exit(1)

bus = dbus.SystemBus()
path = "/net/connman/service/" + sys.argv[1]
service = dbus.Interface(bus.get_object('net.connman', path),
					'net.connman.Service')

values = { "Method" : sys.argv[2] }

properties = service.GetProperties()

for arg in sys.argv[3:]:
	if arg.startswith("url="):
		url = arg.replace("url=", "", 1)
		values["URL"] = url
	if arg.startswith("servers="):
		try:
			servers_uris = arg.replace("servers=","",1).split(",")
		except:
			servers_uris = []
		values["Servers"] = servers_uris
	if arg.startswith("excludes="):
		try:
			excludes_uris = arg.replace("excludes=","",1).split(",")
		except:
			excludes_uris = []
		values["Excludes"] = excludes_uris

try:
	service.SetProperty("Proxy.Configuration", dbus.Dictionary(values, signature='sv'))
except dbus.exceptions.DBusException, e_msg:
	print e_msg
