From 8049a8733933ef586d6d49279a291ba367b38625 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 1 Mar 2014 21:07:57 +0100 Subject: add discstats MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/plugins/discstats.py | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/plugins/discstats.py (limited to 'src') 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 . +''' + + +class DiscStats: + ''' + Retrieve disc statistics + + @variable devices:dict Map from device name to disc + @variable majors:dict> 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 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] + -- cgit v1.2.3-70-g09d2