diff options
Diffstat (limited to 'extensions/cpsection/aboutcomputer/model.py')
-rw-r--r-- | extensions/cpsection/aboutcomputer/model.py | 101 |
1 files changed, 83 insertions, 18 deletions
diff --git a/extensions/cpsection/aboutcomputer/model.py b/extensions/cpsection/aboutcomputer/model.py index 898d79c..3219dd1 100644 --- a/extensions/cpsection/aboutcomputer/model.py +++ b/extensions/cpsection/aboutcomputer/model.py @@ -22,31 +22,45 @@ 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') + def get_aboutcomputer(): msg = 'Serial Number: %s \nBuild Number: %s \nFirmware Number: %s \n' \ % (get_serial_number(), get_build_number(), get_firmware_number()) return msg + def print_aboutcomputer(): print get_aboutcomputer() + def get_serial_number(): serial_no = _read_file('/ofw/serial-number') if serial_no is None: serial_no = _not_available return serial_no - + + def print_serial_number(): serial_no = get_serial_number() if serial_no is None: serial_no = _not_available print serial_no + def get_build_number(): build_no = _read_file('/boot/olpc_build') @@ -68,38 +82,88 @@ def get_build_number(): return build_no + def print_build_number(): print get_build_number() -def get_firmware_number(): + +def get_firmware_number(): firmware_no = _read_file('/ofw/openprom/model') if firmware_no is None: firmware_no = _not_available else: - firmware_no = re.split(" +", firmware_no) + firmware_no = re.split(' +', firmware_no) if len(firmware_no) == 3: firmware_no = firmware_no[1] - return firmware_no + return firmware_no + -def print_firmware_number(): +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(): print get_wireless_firmware() + def _read_file(path): if os.access(path, os.R_OK) == 0: return None @@ -114,17 +178,18 @@ def _read_file(path): _logger.debug('No information in file or directory: %s', path) return None + def get_license(): license_file = os.path.join(config.data_path, 'GPLv2') lang = os.environ['LANG'] - if lang.endswith("UTF-8"): + if lang.endswith('UTF-8'): lang = lang[:-6] - try_file = license_file + "." + lang + try_file = license_file + '.' + lang if os.path.isfile(try_file): license_file = try_file else: - try_file = license_file + "." + lang.split("_")[0] + try_file = license_file + '.' + lang.split('_')[0] if os.path.isfile(try_file): license_file = try_file |