From b42ae1949ebfeef57ea7d8ede77f46cfeea96963 Mon Sep 17 00:00:00 2001 From: Sascha Silbe Date: Tue, 30 Nov 2010 12:36:40 +0000 Subject: About my computer: use NetworkManager to acquire list of devices The hardcoded name 'eth0' that is used for querying the firmware version doesn't match the interface name actually assigned to the wireless device in recent OLPC builds or on most non-XO hardware. Querying NetworkManager for the list of devices will work even on systems where the interface has been renamed during boot (persistent device names). If there are multiple wireless interfaces, firmware information for all of them will be shown (prefixed by interface name). Signed-off-by: Sascha Silbe Reviewed-by: James Cameron --- (limited to 'extensions') diff --git a/extensions/cpsection/aboutcomputer/model.py b/extensions/cpsection/aboutcomputer/model.py index e3b9687..3219dd1 100644 --- a/extensions/cpsection/aboutcomputer/model.py +++ b/extensions/cpsection/aboutcomputer/model.py @@ -22,9 +22,17 @@ import subprocess from gettext import gettext as _ import errno +import dbus + from jarabe import config +_NM_SERVICE = 'org.freedesktop.NetworkManager' +_NM_PATH = '/org/freedesktop/NetworkManager' +_NM_IFACE = 'org.freedesktop.NetworkManager' +_NM_DEVICE_IFACE = 'org.freedesktop.NetworkManager.Device' +_NM_DEVICE_TYPE_WIFI = 2 + _logger = logging.getLogger('ControlPanel - AboutComputer') _not_available = _('Not available') @@ -94,18 +102,62 @@ def print_firmware_number(): print get_firmware_number() -def get_wireless_firmware(): +def _get_wireless_interfaces(): try: - info = subprocess.Popen(['/usr/sbin/ethtool', '-i', 'eth0'], - stdout=subprocess.PIPE).stdout.readlines() - except OSError: + bus = dbus.SystemBus() + manager_object = bus.get_object(_NM_SERVICE, _NM_PATH) + network_manager = dbus.Interface(manager_object, _NM_IFACE) + except dbus.DBusException: + _logger.warning('Cannot connect to NetworkManager, falling back to' + ' static list of devices') + return ['wlan0', 'eth0'] + + interfaces = [] + for device_path in network_manager.GetDevices(): + device_object = bus.get_object(_NM_SERVICE, device_path) + properties = dbus.Interface(device_object, + 'org.freedesktop.DBus.Properties') + device_type = properties.Get(_NM_DEVICE_IFACE, 'DeviceType') + if device_type != _NM_DEVICE_TYPE_WIFI: + continue + + interfaces.append(properties.Get(_NM_DEVICE_IFACE, 'Interface')) + + return interfaces + + +def get_wireless_firmware(): + environment = os.environ.copy() + environment['PATH'] = '%s:/usr/sbin' % (environment['PATH'], ) + firmware_info = {} + for interface in _get_wireless_interfaces(): + try: + output = subprocess.Popen(['ethtool', '-i', interface], + stdout=subprocess.PIPE, + env=environment).stdout.readlines() + except OSError: + _logger.exception('Error running ethtool for %r', interface) + continue + + try: + version = ([line for line in output + if line.startswith('firmware')][0].split()[1]) + except IndexError: + _logger.exception('Error parsing ethtool output for %r', + interface) + continue + + firmware_info[interface] = version + + if not firmware_info: return _not_available - try: - wireless_firmware = [line for line in info - if line.startswith('firmware')][0].split()[1] - except IndexError: - wireless_firmware = _not_available - return wireless_firmware + + if len(firmware_info) == 1: + return firmware_info.values()[0] + + return ', '.join([_('%(interface)s: %(version)s') % + {'interface': interface, 'version': version} + for interface, version in firmware_info.items()]) def print_wireless_firmware(): -- cgit v0.9.1