From 869148cb39a06131c1d60e5eff7ee8fa47aafc6a Mon Sep 17 00:00:00 2001 From: Paul Fox Date: Mon, 22 Mar 2010 12:44:49 +0000 Subject: Use rfkill to manage radio state --- diff --git a/extensions/cpsection/network/model.py b/extensions/cpsection/network/model.py index 87db6d9..6e9a0f0 100644 --- a/extensions/cpsection/network/model.py +++ b/extensions/cpsection/network/model.py @@ -15,9 +15,13 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # +import logging import dbus from gettext import gettext as _ import gconf +import os + +_logger = logging.getLogger('ControlPanel - Network') _NM_SERVICE = 'org.freedesktop.NetworkManager' _NM_PATH = '/org/freedesktop/NetworkManager' @@ -64,7 +68,10 @@ def _restart_jabber(): raise ReadError('%s service not available' % _PS_SERVICE) ps.RestartServerConnection() -def get_radio(): +def print_radio(): + print ('off', 'on')[get_radio()] + +def get_radio_nm(): bus = dbus.SystemBus() try: obj = bus.get_object(_NM_SERVICE, _NM_PATH) @@ -78,10 +85,12 @@ def get_radio(): else: raise ReadError(_('State is unknown.')) -def print_radio(): - print ('off', 'on')[get_radio()] - -def set_radio(state): + +# set_radio_nm/get_radio_nm aren't currently used, but it's +# rumored that in NM 0.8, NM will be able to adjust the +# rfkill state itself. if it does, and restores it at boot +# time, we can go back to using NM. leaving this code for now. +def set_radio_nm(state): """Turn Radio 'on' or 'off' state : 'on/off' """ @@ -106,6 +115,53 @@ def set_radio(state): return 0 +def get_radio_rfkill(): + pipe_stdout = os.popen('/sbin/rfkill list wifi', 'r') + try: + output = pipe_stdout.read() + _logger.debug('rfkill said: %s' % output) + blocked = " blocked: yes" in output + # if not soft- or hard-blocked, radio is on + return not blocked + + finally: + pipe_stdout.close() + +RFKILL_STATE_FILE = '/home/olpc/.rfkill_block_wifi' + +def set_radio_rfkill(state): + """Turn Radio 'on' or 'off' + state : 'on/off' + """ + if state == 'on' or state == 1: + os.spawnl(os.P_WAIT, "/sbin/rfkill", "rfkill", "unblock", "wifi") + # remove the flag file (checked at boot) + try: + os.unlink(RFKILL_STATE_FILE) + except + _logger.debug('File %s was not unlinked' % RFKILL_STATE_FILE) + elif state == 'off' or state == 0: + os.spawnl(os.P_WAIT, "/sbin/rfkill", "rfkill", "block", "wifi") + # touch the flag file + try: + fd = open(RFKILL_STATE_FILE, 'w') + except IOError: + _logger.debug('File %s is not writeable' % RFKILL_STATE_FILE) + else: + fd.close() + else: + raise ValueError(_("Error in specified radio argument use on/off.")) + + return 0 + +# get current status from rfkill +def get_radio(): + return get_radio_rfkill() + +# set new status to both the dot-file and rfkill +def set_radio(state): + set_radio_rfkill(state) + def clear_registration(): """Clear the registration with the schoolserver """ @@ -122,7 +178,7 @@ def get_publish_information(): client = gconf.client_get_default() publish = client.get_bool('/desktop/sugar/collaboration/publish_gadget') return publish - + def print_publish_information(): print get_publish_information() diff --git a/extensions/cpsection/power/model.py b/extensions/cpsection/power/model.py index 33ec905..c580439 100644 --- a/extensions/cpsection/power/model.py +++ b/extensions/cpsection/power/model.py @@ -66,7 +66,10 @@ def set_automatic_pm(enabled): else: fd.close() else: - os.unlink(POWERD_INHIBIT_FLAG) + try: + os.unlink(POWERD_INHIBIT_FLAG) + except: + _logger.debug('File %s was not unlinked' % POWERD_INHIBIT_FLAG) return 0 # ohmd @@ -87,29 +90,3 @@ def set_automatic_pm(enabled): client.set_bool('/desktop/sugar/power/automatic', enabled) return 0 -def get_extreme_pm(): - client = gconf.client_get_default() - return client.get_bool('/desktop/sugar/power/extreme') - -def print_extreme_pm(): - print ('off', 'on')[get_extreme_pm()] - -def set_extreme_pm(enabled): - """Extreme power management on/off.""" - - bus = dbus.SystemBus() - proxy = bus.get_object(OHM_SERVICE_NAME, OHM_SERVICE_PATH) - keystore = dbus.Interface(proxy, OHM_SERVICE_IFACE) - - if enabled == 'on' or enabled == 1: - keystore.SetKey("suspend.extreme_pm", 1) - enabled = True - elif enabled == 'off' or enabled == 0: - keystore.SetKey("suspend.extreme_pm", 0) - enabled = False - else: - raise ValueError(_("Error in extreme pm argument, use on/off.")) - - client = gconf.client_get_default() - client.set_bool('/desktop/sugar/power/extreme', enabled) - return 0 diff --git a/extensions/cpsection/power/view.py b/extensions/cpsection/power/view.py index 8f1ed56..d6e2b8c 100644 --- a/extensions/cpsection/power/view.py +++ b/extensions/cpsection/power/view.py @@ -29,8 +29,6 @@ class Power(SectionView): self._model = model self.restart_alerts = alerts self._automatic_pm_valid = True - self._extreme_pm_valid = True - self._extreme_pm_change_handler = None self._automatic_pm_change_handler = None self.set_border_width(style.DEFAULT_SPACING * 2) @@ -38,7 +36,6 @@ class Power(SectionView): group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) self._automatic_pm_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) - self._extreme_pm_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) separator_pm = gtk.HSeparator() self.pack_start(separator_pm, expand=False) @@ -80,35 +77,6 @@ class Power(SectionView): self._automatic_pm_alert.props.msg = self.restart_msg self._automatic_pm_alert.show() - box_extreme_pm = gtk.HBox(spacing=style.DEFAULT_SPACING) - label_extreme_pm = gtk.Label( - _('Extreme power management (disables' \ - 'wireless radio, increases battery life)')) - label_extreme_pm.set_alignment(0, 0.5) - self._extreme_button = gtk.CheckButton() - self._extreme_button.set_alignment(0, 0) - box_extreme_pm.pack_start(self._extreme_button, expand=False) - self._extreme_button.show() - box_extreme_pm.pack_start(label_extreme_pm, expand=False) - group.add_widget(label_extreme_pm) - label_extreme_pm.show() - box_pm.pack_start(box_extreme_pm, expand=False) - box_extreme_pm.show() - - self._extreme_pm_alert = InlineAlert() - label_extreme_pm_error = gtk.Label() - group.add_widget(label_extreme_pm_error) - self._extreme_pm_alert_box.pack_start(label_extreme_pm_error, - expand=False) - label_extreme_pm_error.show() - self._extreme_pm_alert_box.pack_start(self._extreme_pm_alert, - expand=False) - box_pm.pack_end(self._extreme_pm_alert_box, expand=False) - self._extreme_pm_alert_box.show() - if 'extreme_pm' in self.restart_alerts: - self._extreme_pm_alert.props.msg = self.restart_msg - self._extreme_pm_alert.show() - self.pack_start(box_pm, expand=False) box_pm.show() @@ -117,38 +85,26 @@ class Power(SectionView): def setup(self): try: automatic_state = self._model.get_automatic_pm() - extreme_state = self._model.get_extreme_pm() except Exception, detail: self._automatic_pm_alert.props.msg = detail self._automatic_pm_alert.show() - self._extreme_pm_alert.props.msg = detail - self._extreme_pm_alert.show() else: self._automatic_button.set_active(automatic_state) - self._extreme_button.set_active(extreme_state) - self._extreme_pm_valid = True self._automatic_pm_valid = True self.needs_restart = False self._automatic_pm_change_handler = self._automatic_button.connect( \ 'toggled', self.__automatic_pm_toggled_cb) - self._extreme_pm_change_handler = self._extreme_button.connect( \ - 'toggled', self.__extreme_pm_toggled_cb) def undo(self): self._automatic_button.disconnect(self._automatic_pm_change_handler) - self._extreme_button.disconnect(self._extreme_pm_change_handler) self._model.undo() - self._extreme_pm_alert.hide() self._automatic_pm_alert.hide() def _validate(self): - if self._extreme_pm_valid and self._automatic_pm_valid: - self.props.is_valid = True - else: - self.props.is_valid = False + self.props.is_valid = self._automatic_pm_valid def __automatic_pm_toggled_cb(self, widget, data=None): state = widget.get_active() @@ -163,15 +119,3 @@ class Power(SectionView): self._validate() return False - def __extreme_pm_toggled_cb(self, widget, data=None): - state = widget.get_active() - try: - self._model.set_extreme_pm(state) - except Exception, detail: - print detail - self._extreme_pm_alert.props.msg = detail - else: - self._extreme_pm_valid = True - - self._validate() - return False -- cgit v0.9.1