| #!/usr/bin/env python3 | |
| # Copyright 2019 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| from __future__ import print_function | |
| 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('') | |
| print(' dev <interface>') | |
| 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() | |
| 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() | |
| 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() | |
| 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() | |
| identifier = object_path[object_path.rfind('/') + 1:] | |
| if properties['IsConnected'] == dbus.Boolean(1): | |
| connected = '*' | |
| else: | |
| connected = ' ' | |
| if 'Name' in properties.keys(): | |
| name = properties['Name'] | |
| else: | |
| name = '{' + properties['Type'] + '}' | |
| print('%s %-26s { %s }' % (connected, name, identifier)) | |
| def main(): | |
| if sys.argv[1] == 'state': | |
| properties = manager.GetProperties() | |
| 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() | |
| 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() | |
| 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() | |
| 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 as 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 as 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() | |
| try: | |
| service.Remove() | |
| except dbus.DBusException as 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] == 'dev': | |
| properties = manager.GetProperties() | |
| 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() | |
| if (interface != '' and | |
| properties.get('Interface', '') != interface and | |
| path != interface): | |
| continue | |
| if 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() |