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