#!/usr/bin/python

import dbus, flimflam, sys

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

(_, address) = sys.argv

flim = flimflam.FlimFlam(dbus.SystemBus())

for device in flim.GetObjectList("Device"):
    device_properties = device.GetProperties(utf8_strings = True)

    for path in device_properties["IPConfigs"]:
        ipconfig = flim.GetObjectInterface("IPConfig", path)
        ipconfig_properties = ipconfig.GetProperties(utf8_strings = True)

        if ipconfig_properties["Method"] not in ["ipv4","ipv6"]:
            print "Skip %s; method %s" % (ipconfig.object_path,
                ipconfig_properties["Method"])
            continue

        ipconfig.SetProperty("Address", address)
