#!/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> scan" 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["Favorite"] == dbus.Boolean(1): favorite = "*" else: favorite = " " if "Name" in properties.keys(): name = properties["Name"] else: name = "{" + properties["Type"] + "}" print "%s %-26s { %s }" % (favorite, 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) if properties["Favorite"] == dbus.Boolean(0): print "Only favorite services can be removed" sys.exit(1) 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 == "scan": if properties["Type"] in ["wifi", "wimax"]: interface = properties["Interface"] print "Scan for device %s" % (interface) device.ProposeScan() else: print "No scanning for device %s" % (interface) elif 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()