Home | History | Annotate | Download | only in test-scripts
      1 #!/usr/bin/python
      2 
      3 import sys
      4 import dbus
      5 import flimflam
      6 
      7 bus = dbus.SystemBus()
      8 
      9 manager = dbus.Interface(bus.get_object("org.chromium.flimflam", "/"),
     10                                         "org.chromium.flimflam.Manager")
     11 
     12 if len(sys.argv) < 2:
     13     print "Usage: %s <command>" % (sys.argv[0])
     14     print ""
     15     print "  state"
     16     print "  recheck-portal"
     17     print "  services"
     18     print "  passphrase <service> [passphrase]"
     19     print "  autoconnect <service> [autoconnect]"
     20     print "  connect <service>"
     21     print "  disconnect <service>"
     22     print "  remove <service>"
     23     print ""
     24     print "  scan [type]"
     25     print "  enable <type>"
     26     print "  disable <type>"
     27     print "  offlinemode [on|off]"
     28     print ""
     29     print "  dev <interface>"
     30     print "  dev <interface> scan"
     31     print "  dev <interface> networks"
     32     print "  dev <interface> connect <network>"
     33     print "  dev <interface> disconnect [network]"
     34     print "  dev <interface> powered [on|off]"
     35     sys.exit(1)
     36 
     37 def print_properties(object_path, properties):
     38     print "[ %s ]" % (object_path)
     39     for key in properties.keys():
     40         if key == "Networks":
     41             continue
     42 
     43         if key in ["Powered", "Scanning", "Connected",
     44                    "Available", "Remember", "Default"]:
     45             if properties[key] == dbus.Boolean(1):
     46                 val = "true"
     47             else:
     48                 val = "false"
     49         elif key in ["Strength", "Priority"]:
     50             val = int(properties[key])
     51         else:
     52             val = str(properties[key])
     53 
     54         print "     %s = %s" % (key, val)
     55 
     56 def print_networks(networks):
     57     for object_path in networks:
     58         network = dbus.Interface(
     59             bus.get_object("org.chromium.flimflam", object_path),
     60             "org.chromium.flimflam.Network")
     61 
     62         properties = network.GetProperties(utf8_strings = True)
     63 
     64         if properties["Connected"] == dbus.Boolean(1):
     65             connected = "*"
     66         else:
     67             connected = " "
     68 
     69         if "Name" in properties.keys():
     70             name = properties["Name"]
     71         else:
     72             name = ""
     73 
     74         strength = int(properties["Strength"])
     75 
     76         details = ""
     77         try:
     78             details += "{" + properties["WiFi.Mode"] + "} "
     79         except Exception, _:
     80             pass
     81         try:
     82             details += "{" + properties["WiFi.Security"] + "} "
     83         except Exception, _:
     84             pass
     85         if "WiFi.Passphrase" in properties.keys():
     86             if properties["WiFi.Passphrase"] != "":
     87                 details += "{passphrase present}"
     88 
     89         print "%s %-26s %3d%%  %s" % (connected, name, strength, details)
     90 
     91 def select_network(networks, name):
     92     for object_path in networks:
     93         network = dbus.Interface(
     94             bus.get_object("org.chromium.flimflam", object_path),
     95             "org.chromium.flimflam.Network")
     96 
     97         properties = network.GetProperties(utf8_strings = True)
     98 
     99         if properties["Name"] != name:
    100             continue
    101 
    102         if properties["Connected"] == dbus.Boolean(1):
    103             print "Already connected to network %s" % (name)
    104             break
    105 
    106         print "Selecting network %s" % (name)
    107 
    108         network.Connect()
    109 
    110 def disconnect_network(networks, name):
    111     for object_path in networks:
    112         network = dbus.Interface(
    113             bus.get_object("org.chromium.flimflam", object_path),
    114             "org.chromium.flimflam.Network")
    115 
    116         properties = network.GetProperties(utf8_strings = True)
    117 
    118         if name != "" and properties["Name"] != name:
    119             continue
    120 
    121         if properties["Connected"] == dbus.Boolean(1):
    122             name = properties["Name"]
    123             print "Disconnecting from network %s" % (name)
    124             network.Disconnect()
    125 
    126 def print_services(services):
    127     for object_path in services:
    128         service = dbus.Interface(
    129             bus.get_object("org.chromium.flimflam", object_path),
    130             "org.chromium.flimflam.Service")
    131 
    132         properties = service.GetProperties(utf8_strings = True)
    133 
    134         identifier = object_path[object_path.rfind("/") + 1:]
    135 
    136         if properties["Favorite"] == dbus.Boolean(1):
    137             favorite = "*"
    138         else:
    139             favorite = " "
    140 
    141         if "Name" in properties.keys():
    142             name = properties["Name"]
    143         else:
    144             name = "{" + properties["Type"] + "}"
    145 
    146         print "%s %-26s { %s }" % (favorite, name, identifier)
    147 
    148 def main():
    149     if sys.argv[1] == "state":
    150         properties = manager.GetProperties(utf8_strings = True)
    151 
    152         print "System is %s" % (properties["State"])
    153 
    154     elif sys.argv[1] == "recheck-portal":
    155         manager.RecheckPortal()
    156         print "Rechecking portal state"
    157 
    158     elif sys.argv[1] in ["services", "list", "show"]:
    159         properties = manager.GetProperties(utf8_strings = True)
    160 
    161         print_services(properties["Services"])
    162 
    163     elif sys.argv[1] in ["passphrase", "pass"]:
    164         if (len(sys.argv) < 3):
    165             print "Need at least service parameter"
    166             sys.exit(1)
    167 
    168         path = "/profile/default/" + sys.argv[2]
    169 
    170         service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
    171                                  "org.chromium.flimflam.Service")
    172 
    173         if (len(sys.argv) > 3):
    174             passphrase = sys.argv[3]
    175 
    176             service.SetProperty("Passphrase", passphrase)
    177 
    178             print "Passphrase %s set for %s" % (passphrase, sys.argv[2])
    179         else:
    180             properties = service.GetProperties(utf8_strings = True)
    181 
    182             if "Name" in properties.keys():
    183                 name = properties["Name"]
    184             else: name = "{" + properties["Type"] + "}"
    185 
    186             if "Passphrase" in properties.keys():
    187                 passphrase = properties["Passphrase"]
    188             else:
    189                 passphrase = "not set"
    190 
    191             print "Passphrase for %s is %s" % (name, passphrase)
    192 
    193     elif sys.argv[1] in ["autoconnect", "autoconn"]:
    194         if (len(sys.argv) < 3):
    195             print "Need at least service parameter"
    196             sys.exit(1)
    197 
    198         path = "/profile/default/" + sys.argv[2]
    199 
    200         service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
    201                                  "org.chromium.flimflam.Service")
    202 
    203         if (len(sys.argv) > 3):
    204             autoconnect = flimflam.make_dbus_boolean(sys.argv[3])
    205 
    206             service.SetProperty("AutoConnect", autoconnect)
    207 
    208             print "Auto connect %s for %s" % (autoconnect, sys.argv[2])
    209         else:
    210             properties = service.GetProperties(utf8_strings = True)
    211 
    212             if "Name" in properties.keys():
    213                 name = properties["Name"]
    214             else:
    215                 name = "{" + properties["Type"] + "}"
    216 
    217             if "AutoConnect" in properties.keys():
    218                 autoconnect = properties["AutoConnect"]
    219             else:
    220                 autoconnect = dbus.Boolean(0)
    221 
    222             print "Auto connect %s for %s" % (autoconnect, name)
    223 
    224     elif sys.argv[1] in ["connect", "conn"]:
    225         if (len(sys.argv) < 3):
    226             print "Need at least service parameter"
    227             sys.exit(1)
    228 
    229         path = "/profile/default/" + sys.argv[2]
    230 
    231         service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
    232                                  "org.chromium.flimflam.Service")
    233 
    234         try:
    235             service.Connect(timeout=60000)
    236         except dbus.DBusException, error:
    237             print "%s: %s" % (error.get_dbus_name(), error.message)
    238 
    239     elif sys.argv[1] in ["disconnect", "disc"]:
    240         if (len(sys.argv) < 3):
    241             print "Need at least service parameter"
    242             sys.exit(1)
    243 
    244         path = "/profile/default/" + sys.argv[2]
    245 
    246         service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
    247                                  "org.chromium.flimflam.Service")
    248 
    249         try:
    250             service.Disconnect()
    251         except dbus.DBusException, error:
    252             print "%s: %s" % (error.get_dbus_name(), error.message)
    253 
    254     elif sys.argv[1] in ["remove"]:
    255         if (len(sys.argv) < 3):
    256             print "Need at least service parameter"
    257             sys.exit(1)
    258 
    259         path = "/profile/default/" + sys.argv[2]
    260 
    261         service = dbus.Interface(bus.get_object("org.chromium.flimflam", path),
    262                                  "org.chromium.flimflam.Service")
    263 
    264         properties = service.GetProperties(utf8_strings = True)
    265 
    266         if properties["Favorite"] == dbus.Boolean(0):
    267             print "Only favorite services can be removed"
    268             sys.exit(1)
    269 
    270         try:
    271             service.Remove()
    272         except dbus.DBusException, error:
    273             print "%s: %s" % (error.get_dbus_name(), error.message)
    274 
    275     elif sys.argv[1] == "scan":
    276         if len(sys.argv) > 2:
    277             manager.RequestScan(sys.argv[2])
    278         else:
    279             manager.RequestScan("")
    280 
    281     elif sys.argv[1] == "enable":
    282         if len(sys.argv) > 2:
    283             manager.EnableTechnology(sys.argv[2])
    284         else:
    285             manager.EnableTechnology("")
    286 
    287     elif sys.argv[1] == "disable":
    288         if len(sys.argv) > 2:
    289             manager.DisableTechnology(sys.argv[2])
    290         else:
    291             manager.DisableTechnology("")
    292 
    293     elif sys.argv[1] in ["offlinemode", "flightmode"]:
    294         if len(sys.argv) > 2:
    295             active = flimflam.make_dbus_boolean(sys.argv[2])
    296             manager.SetProperty("OfflineMode", active)
    297         else:
    298             properties = manager.GetProperties(utf8_strings = True)
    299             print "Offline mode is %s" % (properties["OfflineMode"])
    300 
    301     elif sys.argv[1] == "dev":
    302         properties = manager.GetProperties(utf8_strings = True)
    303 
    304         interface = ""
    305         command = ""
    306         value = ""
    307 
    308         if len(sys.argv) > 2:
    309             interface = sys.argv[2]
    310             if len(sys.argv) > 3:
    311                 command = sys.argv[3]
    312                 if len(sys.argv) > 4:
    313                     value = sys.argv[4]
    314 
    315         for path in properties["Devices"]:
    316             device = dbus.Interface(
    317                 bus.get_object("org.chromium.flimflam", path),
    318                 "org.chromium.flimflam.Device")
    319 
    320             properties = device.GetProperties(utf8_strings = True)
    321 
    322             if (interface != "" and
    323                 properties.get("Interface", "") != interface and
    324                 path != interface):
    325                 continue
    326 
    327             if command == "scan":
    328                 if properties["Type"] in ["wifi", "wimax"]:
    329                     interface = properties["Interface"]
    330                     print "Scan for device %s" % (interface)
    331                     device.ProposeScan()
    332                 else:
    333                     print "No scanning for device %s" % (interface)
    334             elif command in ["networks", "net"]:
    335                 if "Networks" in properties.keys():
    336                     print_networks(properties["Networks"])
    337                 else:
    338                     print "Device has no networks"
    339             elif command in ["connect", "conn"] and value != "":
    340                 if "Networks" in properties.keys():
    341                     select_network(properties["Networks"], value)
    342                 else:
    343                     print "Device can't connect networks"
    344             elif command in ["connect", "conn"]:
    345                 print "Need to specify network"
    346             elif command in ["disconnect", "disc"] and value != "":
    347                 if "Networks" in properties.keys():
    348                     disconnect_network(properties["Networks"], value)
    349                 else:
    350                     print "Device has no networks"
    351             elif command in ["discconnect", "disc"]:
    352                 if "Networks" in properties.keys():
    353                     disconnect_network(properties["Networks"], "")
    354                 else:
    355                     print "Device has no networks"
    356             elif command == "powered" and value != "":
    357                 powered = flimflam.make_dbus_boolean(value)
    358                 device.SetProperty("Powered", powered)
    359             elif command == "powered":
    360                 interface = properties.get("Interface", "unknown")
    361                 if properties["Powered"] == dbus.Boolean(1):
    362                     powered = "on"
    363                 else:
    364                     powered = "off"
    365                 print "Device %s is powered %s" % (interface, powered)
    366             elif command == "list" or command == "":
    367                 print_properties(path, properties)
    368             else:
    369                 print "Unknown command"
    370 
    371     else:
    372         print "Unknown command"
    373 
    374 if __name__ == "__main__":
    375     main()
    376