diff --git a/tuned/plugins/plugin_wireless.py b/tuned/plugins/plugin_wireless.py index e24fe8d..618b5c2 100644 --- a/tuned/plugins/plugin_wireless.py +++ b/tuned/plugins/plugin_wireless.py @@ -4,6 +4,7 @@ import tuned.monitors import tuned.utils.commands import os import struct +import glob log = tuned.logs.get() @@ -37,16 +38,53 @@ class WirelessPlugin(tuned.plugins.Plugin): # COMMANDS: + def _set_wifi_power_level(self, power_level): + try: + lines = open("/proc/net/wireless").readlines() + except (OSError,IOError) as e: + log.error("Error reading wifi devices from /proc/net/wireless: %s" % (e)) + return None + + ifaces = [] + for line in lines: + if line.find("|") != -1: + continue + try: + ifaces.append(line[:line.find(":")]) + except IndexError: + pass + + if len(ifaces) == 0: + log.info("No wifi interfaces found") + return None + + # TODO: set old_value properly. Is there "get_power"? I don't have wifi here + old_value = "5" + + for iface in ifaces: + tuned.utils.commands.execute(["iwpriv", iface, "set_power", power_level]) + + for sys_file in glob.glob("/sys/bus/pci/devices/*/power_level"): + tuned.utils.commands.write_to_file(sys_file, power_level) + + return old_value + def _apply_wifi_power_level(self): self._revert_wifi_power_level() if len(self._options["wifi_power_level"]) == 0: return False + old_value = self._set_wifi_power_level(self._options["wifi_power_level"]) + if old_value: + storage = tuned.utils.storage.Storage.get_instance() + storage.data["wireless"]["wifi_power_level"] = old_value + storage.save() + return True def _revert_wifi_power_level(self): - #storage = tuned.utils.storage.Storage.get_instance() - #if storage.data["cpu"].has_key("cpu_governor"): - #tuned.utils.commands.execute(["cpupower", "frequency-set", "-g", storage.data["cpu"]["cpu_governor"]]) - #del storage.data["cpu"]["cpu_governor"] + storage = tuned.utils.storage.Storage.get_instance() + if storage.data["wireless"].has_key("wifi_power_level"): + self._set_wifi_power_level(storage.data["wireless"]["wifi_power_level"]) + del storage.data["wireless"]["wifi_power_level"] diff --git a/tuned/utils/commands.py b/tuned/utils/commands.py index 29f3a49..6434fb2 100644 --- a/tuned/utils/commands.py +++ b/tuned/utils/commands.py @@ -26,7 +26,7 @@ from subprocess import * log = tuned.logs.get() -def _write_to_file(f, data): +def write_to_file(f, data): log.debug("Writing to file: %s < %s" % (f, data)) try: fd = open(f, "w") @@ -35,7 +35,7 @@ def _write_to_file(f, data): except (OSError,IOError) as e: log.error("Writing to file %s error: %s" % (f, e)) -def _read_file(f): +def read_file(f): old_value = "" try: f = open(f, "r") @@ -56,7 +56,7 @@ def revert_file(key, subkey, f): return old_value = storage.data[key][subkey] - _write_to_file(f, old_value) + write_to_file(f, old_value) del storage.data[key][subkey] @@ -66,11 +66,11 @@ def set_file(key, subkey, f, data): log.error("Storage file does not contain item with key %s" % (key)) return - old_value = _read_file(f) + old_value = read_file(f) storage.data[key][subkey] = old_value storage.save() - _write_to_file(f, data) + write_to_file(f, data) def execute(args): out = ""