375 lines
12 KiB
Python
Executable file
375 lines
12 KiB
Python
Executable file
#!/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()
|