#!/usr/bin/python

import sys
import dbus
import flimflam

bus = dbus.SystemBus()

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

if len(sys.argv) < 2:
    print "Usage: %s <command>" % (sys.argv[0])
    print ""
    print "  state"
    print "  recheck-portal"
    print "  services"
    print "  passphrase <service> [passphrase]"
    print "  autoconnect <service> [autoconnect]"
    print "  connect <service>"
    print "  disconnect <service>"
    print "  remove <service>"
    print ""
    print "  scan [type]"
    print "  enable <type>"
    print "  disable <type>"
    print "  offlinemode [on|off]"
    print ""
    print "  dev <interface>"
    print "  dev <interface> networks"
    print "  dev <interface> connect <network>"
    print "  dev <interface> disconnect [network]"
    print "  dev <interface> powered [on|off]"
    sys.exit(1)

def print_properties(object_path, properties):
    print "[ %s ]" % (object_path)
    for key in properties.keys():
        if key == "Networks":
            continue

        if key in ["Powered", "Scanning", "Connected",
                   "Available", "Remember", "Default"]:
            if properties[key] == dbus.Boolean(1):
                val = "true"
            else:
                val = "false"
        elif key in ["Strength", "Priority"]:
            val = int(properties[key])
        else:
            val = str(properties[key])

        print "     %s = %s" % (key, val)

def print_networks(networks):
    for object_path in networks:
        network = dbus.Interface(
            bus.get_object("org.chromium.flimflam", object_path),
            "org.chromium.flimflam.Network")

        properties = network.GetProperties(utf8_strings = True)

        if properties["Connected"] == dbus.Boolean(1):
            connected = "*"
        else:
            connected = " "

        if "Name" in properties.keys():
            name = properties["Name"]
        else:
            name = ""

        strength = int(properties["Strength"])

        details = ""
        try:
            details += "{" + properties["WiFi.Mode"] + "} "
        except Exception, _:
            pass
        try:
            details += "{" + properties["WiFi.Security"] + "} "
        except Exception, _:
            pass
        if "WiFi.Passphrase" in properties.keys():
            if properties["WiFi.Passphrase"] != "":
                details += "{passphrase present}"

        print "%s %-26s %3d%%  %s" % (connected, name, strength, details)

def select_network(networks, name):
    for object_path in networks:
        network = dbus.Interface(
            bus.get_object("org.chromium.flimflam", object_path),
            "org.chromium.flimflam.Network")

        properties = network.GetProperties(utf8_strings = True)

        if properties["Name"] != name:
            continue

        if properties["Connected"] == dbus.Boolean(1):
            print "Already connected to network %s" % (name)
            break

        print "Selecting network %s" % (name)

        network.Connect()

def disconnect_network(networks, name):
    for object_path in networks:
        network = dbus.Interface(
            bus.get_object("org.chromium.flimflam", object_path),
            "org.chromium.flimflam.Network")

        properties = network.GetProperties(utf8_strings = True)

        if name != "" and properties["Name"] != name:
            continue

        if properties["Connected"] == dbus.Boolean(1):
            name = properties["Name"]
            print "Disconnecting from network %s" % (name)
            network.Disconnect()

def print_services(services):
    for object_path in services:
        service = dbus.Interface(
            bus.get_object("org.chromium.flimflam", object_path),
            "org.chromium.flimflam.Service")

        properties = service.GetProperties(utf8_strings = True)

        identifier = object_path[object_path.rfind("/") + 1:]

        if properties["IsActive"] == dbus.Boolean(1):
            active = "*"
        else:
            active = " "

        if "Name" in properties.keys():
            name = properties["Name"]
        else:
            name = "{" + properties["Type"] + "}"

        print "%s %-26s { %s }" % (active, name, identifier)

def main():
    if sys.argv[1] == "state":
        properties = manager.GetProperties(utf8_strings = True)

        print "System is %s" % (properties["State"])

    elif sys.argv[1] == "recheck-portal":
        manager.RecheckPortal()
        print "Rechecking portal state"

    elif sys.argv[1] in ["services", "list", "show"]:
        properties = manager.GetProperties(utf8_strings = True)

        print_services(properties["Services"])

    elif sys.argv[1] in ["passphrase", "pass"]:
        if (len(sys.argv) < 3):
            print "Need at least service parameter"
            sys.exit(1)

        path = "/profile/default/" + sys.argv[2]

        service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
                                 "org.chromium.flimflam.Service")

        if (len(sys.argv) > 3):
            passphrase = sys.argv[3]

            service.SetProperty("Passphrase", passphrase)

            print "Passphrase %s set for %s" % (passphrase, sys.argv[2])
        else:
            properties = service.GetProperties(utf8_strings = True)

            if "Name" in properties.keys():
                name = properties["Name"]
            else: name = "{" + properties["Type"] + "}"

            if "Passphrase" in properties.keys():
                passphrase = properties["Passphrase"]
            else:
                passphrase = "not set"

            print "Passphrase for %s is %s" % (name, passphrase)

    elif sys.argv[1] in ["autoconnect", "autoconn"]:
        if (len(sys.argv) < 3):
            print "Need at least service parameter"
            sys.exit(1)

        path = "/profile/default/" + sys.argv[2]

        service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
                                 "org.chromium.flimflam.Service")

        if (len(sys.argv) > 3):
            autoconnect = flimflam.make_dbus_boolean(sys.argv[3])

            service.SetProperty("AutoConnect", autoconnect)

            print "Auto connect %s for %s" % (autoconnect, sys.argv[2])
        else:
            properties = service.GetProperties(utf8_strings = True)

            if "Name" in properties.keys():
                name = properties["Name"]
            else:
                name = "{" + properties["Type"] + "}"

            if "AutoConnect" in properties.keys():
                autoconnect = properties["AutoConnect"]
            else:
                autoconnect = dbus.Boolean(0)

            print "Auto connect %s for %s" % (autoconnect, name)

    elif sys.argv[1] in ["connect", "conn"]:
        if (len(sys.argv) < 3):
            print "Need at least service parameter"
            sys.exit(1)

        path = "/profile/default/" + sys.argv[2]

        service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
                                 "org.chromium.flimflam.Service")

        try:
            service.Connect(timeout=60000)
        except dbus.DBusException, error:
            print "%s: %s" % (error.get_dbus_name(), error.message)

    elif sys.argv[1] in ["disconnect", "disc"]:
        if (len(sys.argv) < 3):
            print "Need at least service parameter"
            sys.exit(1)

        path = "/profile/default/" + sys.argv[2]

        service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
                                 "org.chromium.flimflam.Service")

        try:
            service.Disconnect()
        except dbus.DBusException, error:
            print "%s: %s" % (error.get_dbus_name(), error.message)

    elif sys.argv[1] in ["remove"]:
        if (len(sys.argv) < 3):
            print "Need at least service parameter"
            sys.exit(1)

        path = "/profile/default/" + sys.argv[2]

        service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
                                 "org.chromium.flimflam.Service")

        properties = service.GetProperties(utf8_strings = True)

        try:
            service.Remove()
        except dbus.DBusException, error:
            print "%s: %s" % (error.get_dbus_name(), error.message)

    elif sys.argv[1] == "scan":
        if len(sys.argv) > 2:
            manager.RequestScan(sys.argv[2])
        else:
            manager.RequestScan("")

    elif sys.argv[1] == "enable":
        if len(sys.argv) > 2:
            manager.EnableTechnology(sys.argv[2])
        else:
            manager.EnableTechnology("")

    elif sys.argv[1] == "disable":
        if len(sys.argv) > 2:
            manager.DisableTechnology(sys.argv[2])
        else:
            manager.DisableTechnology("")

    elif sys.argv[1] in ["offlinemode", "flightmode"]:
        if len(sys.argv) > 2:
            active = flimflam.make_dbus_boolean(sys.argv[2])
            manager.SetProperty("OfflineMode", active)
        else:
            properties = manager.GetProperties(utf8_strings = True)
            print "Offline mode is %s" % (properties["OfflineMode"])

    elif sys.argv[1] == "dev":
        properties = manager.GetProperties(utf8_strings = True)

        interface = ""
        command = ""
        value = ""

        if len(sys.argv) > 2:
            interface = sys.argv[2]
            if len(sys.argv) > 3:
                command = sys.argv[3]
                if len(sys.argv) > 4:
                    value = sys.argv[4]

        for path in properties["Devices"]:
            device = dbus.Interface(
                bus.get_object("org.chromium.flimflam", path),
                "org.chromium.flimflam.Device")

            properties = device.GetProperties(utf8_strings = True)

            if (interface != "" and
                properties.get("Interface", "") != interface and
                path != interface):
                continue

            if command in ["networks", "net"]:
                if "Networks" in properties.keys():
                    print_networks(properties["Networks"])
                else:
                    print "Device has no networks"
            elif command in ["connect", "conn"] and value != "":
                if "Networks" in properties.keys():
                    select_network(properties["Networks"], value)
                else:
                    print "Device can't connect networks"
            elif command in ["connect", "conn"]:
                print "Need to specify network"
            elif command in ["disconnect", "disc"] and value != "":
                if "Networks" in properties.keys():
                    disconnect_network(properties["Networks"], value)
                else:
                    print "Device has no networks"
            elif command in ["discconnect", "disc"]:
                if "Networks" in properties.keys():
                    disconnect_network(properties["Networks"], "")
                else:
                    print "Device has no networks"
            elif command == "powered" and value != "":
                powered = flimflam.make_dbus_boolean(value)
                device.SetProperty("Powered", powered)
            elif command == "powered":
                interface = properties.get("Interface", "unknown")
                if properties["Powered"] == dbus.Boolean(1):
                    powered = "on"
                else:
                    powered = "off"
                print "Device %s is powered %s" % (interface, powered)
            elif command == "list" or command == "":
                print_properties(path, properties)
            else:
                print "Unknown command"

    else:
        print "Unknown command"

if __name__ == "__main__":
    main()
