diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-06-12 22:18:12 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-06-12 22:19:03 +0200 |
commit | b132530fd8901e0b503855f8429c2c02b563b598 (patch) | |
tree | 7b670a30a6f3905e2b1c46cedac4d48cc75d5ec1 /src | |
parent | typo (diff) | |
download | xpybar-b132530fd8901e0b503855f8429c2c02b563b598.tar.gz xpybar-b132530fd8901e0b503855f8429c2c02b563b598.tar.bz2 xpybar-b132530fd8901e0b503855f8429c2c02b563b598.tar.xz |
add cpuinfo with example
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/cpuinfo.py | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/plugins/cpuinfo.py b/src/plugins/cpuinfo.py new file mode 100644 index 0000000..d6cfc7d --- /dev/null +++ b/src/plugins/cpuinfo.py @@ -0,0 +1,142 @@ +# -*- python -*- +''' +xpybar – xmobar replacement written in python +Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +''' + + +class CPUInfo: # TODO enable setting scaling + ''' + Data from /proc/cpuinfo and /sys/devices/system/cpu + + @variable cpus:list<dict<str, str>> Information about each CPU + ''' + + + BIOS_FREQUENCY_LIMIT = 'cpufreq/bios_limit' + ''' + CPU frequency limit per BIOS, in kHz + + @mapping int + ''' + + SCALING_GOVERNOR = 'cpufreq/scaling_governor' + ''' + CPU frequency scaling governor + + @mapping str + ''' + + CPU_TRANSITION_LATENCY = 'cpufreq/cpuinfo_transition_latency' + ''' + CPU transition latency, in ns + + @mapping int + ''' + + AVAILABLE_FREQUENCIES = 'cpufreq/scaling_available_frequencies' + ''' + Available CPU scaling frequencies, in kHz + + @mapping itr<int> + ''' + + SCALING_DRIVER = 'cpufreq/scaling_driver' + ''' + CPU frequency scaling driver + + @mapping str + ''' + + AVAILABLE_SCALING_GOVERNORS = 'cpufreq/scaling_available_governors' + ''' + Available CPU frequency scaling governor + + @mapping itr<str> + ''' + + CURRENT_FREQUENCY = 'cpufreq/cpuinfo_cur_freq' + MINIMUM_FREQUENCY = 'cpufreq/cpuinfo_min_freq' + MAXIMUM_FREQUENCY = 'cpufreq/cpuinfo_max_freq' + CURRENT_SCALING_FREQUENCY = 'cpufreq/scaling_cur_freq' + MINIMUM_SCALING_FREQUENCY = 'cpufreq/scaling_min_freq' + MAXIMUM_SCALING_FREQUENCY = 'cpufreq/scaling_max_freq' + # TODO more CPU info + #'cpufreq/affected_cpus' + #'cpufreq/related_cpus' + #'cpufreq/scaling_setspeed' + #cache/ + #power/ + #topology/ + #thermal_throttle + #/sys/devices/system/cpu/cpufreq/ + #/sys/devices/system/cpu/cpuidle/ + #/sys/devices/system/cpu/power/ + + + + def __init__(self): + ''' + Constructor + ''' + cpuinfo = None + with open('/proc/cpuinfo', 'rb') as file: + cpuinfo = file.read() + cpuinfo = cpuinfo.decode('utf-8', 'replace').replace('\t', '') + cpuinfo = filter(lambda cpu : not cpu == '', cpuinfo.split('\n\n')) + + def f(line): + cols = line.split(': ') + key, value = cols[0].replace('_', ' '), ': '.join(cols[1:]) + return (key, value) + self.cpus = [dict(f(line) for line in cpu.split('\n') if ': ' in line) for cpu in cpuinfo] + + + def __contains__(self, key): + ''' + Get whether or not a key is available for any CPU + + @param key:str The key + @return :bool The availability + ''' + return any(map(key in self.cpus, self.cpus)) + + + def __getitem__(self, key): + ''' + Look up a field from '/proc/cpuinfo' for each CPU + + @param key:str The key + @return :list<str?> The value associated with the key for each CPU, `None` where missing + ''' + return [cpu[key] if key in cpu else None for cpu in self.cpus] + + + def get(self, cpu, data): + ''' + Read a information from sysfs for a CPU + + @param cpu:int The index of the CPU + @param data:str The file inside the CPU's directory + @return :str The content of the file + ''' + if data == CPUInfo.CURRENT_FREQUENCY: + return str(int(float(self['cpu MHz'][cpu]) * 1000)) + path = '/sys/devices/system/cpu/cpu%i/%s' % (cpu, data) + with open(path, 'rb') as file: + cont = file.read().decode('utf-8', 'replace').rstrip('\n') + return cont + |