1#!/usr/bin/python
2
3import sys
4import dbus
5import flimflam
6
7bus = dbus.SystemBus()
8
9manager = dbus.Interface(bus.get_object("org.chromium.flimflam", "/"),
10                                        "org.chromium.flimflam.Manager")
11
12if 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
37def 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
56def 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
91def 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
110def 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
126def 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
148def 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
374if __name__ == "__main__":
375    main()
376