Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Silbe <silbe@activitycentral.com>2010-11-30 12:36:40 (GMT)
committer Sascha Silbe <sascha-pgp@silbe.org>2011-02-05 15:24:53 (GMT)
commitb42ae1949ebfeef57ea7d8ede77f46cfeea96963 (patch)
treea627b154f696d63a6150b0acd44cefefa659937e
parent4b6a534e6b60c01f2021edb91faf039008294b4b (diff)
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 <silbe@activitycentral.com> Reviewed-by: James Cameron <quozl@laptop.org>
-rw-r--r--extensions/cpsection/aboutcomputer/model.py72
1 files changed, 62 insertions, 10 deletions
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():