diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-03-01 21:07:57 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-03-01 21:07:57 +0100 |
commit | 8049a8733933ef586d6d49279a291ba367b38625 (patch) | |
tree | 06170b4746d808979b9335df07aa67763a82391f /src | |
parent | add mem (diff) | |
download | xpybar-8049a8733933ef586d6d49279a291ba367b38625.tar.gz xpybar-8049a8733933ef586d6d49279a291ba367b38625.tar.bz2 xpybar-8049a8733933ef586d6d49279a291ba367b38625.tar.xz |
add discstats
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/discstats.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/plugins/discstats.py b/src/plugins/discstats.py new file mode 100644 index 0000000..57b2844 --- /dev/null +++ b/src/plugins/discstats.py @@ -0,0 +1,83 @@ +# -*- 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 DiscStats: + ''' + Retrieve disc statistics + + @variable devices:dict<str, Disc> Map from device name to disc + @variable majors:dict<int, dict<int, Disc>> Map from major to minor and then to disc + ''' + + + def __init__(self): + ''' + Constructor + ''' + discstats = None + with open('/proc/diskstats', 'rb') as file: + discstats = file.read() + discstats = discstats.decode('utf-8', 'replace') + discstats = filter(lambda x : not x == '', discstats.split('\n')) + + self.devices, self.majors = {}, {} + + for line in discstats: + line = list(filter(lambda x : not x == '', line.split(' '))) + line = [line[i] if i == 2 else int(line[i]) for i in range(len(line))] + disc = DiscStat(line) + self.devices[disc.device] = disc + if disc.major not in self.majors: + self.majors[disc.major] = {} + self.majors[disc.major][disc.minor] = disc + + +class DiscStat: + ''' + Statistics about a single disc or partition + + @variable major:int Device major number + @variable minor:int Device minor mumber + @variable device:str Device name + @variable r_complete:int Reads completed successfully + @variable r_merge:int Reads merged + @variable r_sectors:int Sectors read + @variable r_time:int Time spent reading, in ms + @variable w_complete:int Writes completed + @variable w_merge:int Writes merged + @variable w_sectors:int Sectors written + @variable w_time:int Time spent writing, in ms + @variable io_current:int I/O:s currently in progress + @variable io_time:int Time spent doing I/Os:, in ms + @variable io_weighted_time:int Weighted time spent doing I/O:s, in ms + ''' + + + def __init__(self, fields): + ''' + Constructor + + @param fields:list<str|int> Fields from /proc/diskstats converted to proper data type + ''' + (self.major, self.minor, self.device) = fields[0 : 3] + (self.r_complete, self.r_merge, self.r_sectors, self.r_time) = fields[3 : 7] + (self.w_complete, self.w_merge, self.w_sectors, self.w_time) = fields[7 : 11] + (self.io_current, self.io_time, self.io_weighted_time) = fields[11 : 14] + |