Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Fox <pgf@laptop.org>2010-03-22 12:44:49 (GMT)
committer Sayamindu Dasgupta <sayamindu@gmail.com>2010-03-22 12:44:49 (GMT)
commit869148cb39a06131c1d60e5eff7ee8fa47aafc6a (patch)
tree715cce2b8b4843a25b2e8dc8ec2b4450e9ad1e2d
parentbaad17494bfc48967a145c99b195c9f6dd9766ad (diff)
Use rfkill to manage radio state
-rw-r--r--extensions/cpsection/network/model.py68
-rw-r--r--extensions/cpsection/power/model.py31
-rw-r--r--extensions/cpsection/power/view.py58
3 files changed, 67 insertions, 90 deletions
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