#!/usr/bin/python

import sys
import dbus

def make_variant(string):
	return dbus.String(string, variant_level=1)

def extract_values(values):
	val = "{"
	for key in values.keys():
		val += " " + key + "="
		if key in ["Servers", "Excludes"]:
			val += extract_list(values[key])
		else:
			val += str(values[key])
	val += " }"
	return val

def extract_list(list):
	val = "["
	for i in list:
		if type(i).__name__ == 'Dictionary':
			val += extract_values(i)
		elif type(i).__name__ == 'Struct':
			val += extract_list(i)
		else:
			val += " " + str(i)
	val += "]"
	return val

argc = len(sys.argv)

if (argc < 2):
	print "Usage: %s <VPN connection id> [<property name>] [<property values>]" % (sys.argv[0])
	sys.exit(1)

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object("net.connman.vpn", "/"),
					"net.connman.vpn.Manager")

connections = manager.GetConnections()

path = "/net/connman/vpn/connection/" + sys.argv[1]

print "Attempting to connect VPN %s" % (path)

connection = dbus.Interface(bus.get_object("net.connman.vpn", path),
					    "net.connman.vpn.Connection")

if (argc < 3):
	properties = connection.GetProperties()
	for key in properties.keys():
		if key in ["IPv4", "IPv6" ]:
			val = extract_values(properties[key])
		elif key in ["Nameservers","ServerRoutes","UserRoutes"]:
			val = extract_list(properties[key])
		else:
			val = str(properties[key])
		print "    %s = %s" % (key, val)

elif (argc < 4):
	try:
		connection.ClearProperty(sys.argv[2])
	except dbus.DBusException, error:
		print "%s: %s" % (error._dbus_error_name, error.message)
else:
	try:
		connection.SetProperty(sys.argv[2], sys.argv[3])
	except dbus.DBusException, error:
		print "%s: %s" % (error._dbus_error_name, error.message)
