diff options
Diffstat (limited to '')
-rw-r--r-- | src/plugins/df.py | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/plugins/df.py b/src/plugins/df.py new file mode 100644 index 0000000..81ad5a2 --- /dev/null +++ b/src/plugins/df.py @@ -0,0 +1,116 @@ +# -*- 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/>. +''' + +from util import * + + +class Discs: + ''' + Retrieve information about mounted discs + + @variable filesystems:dict<str, Disc> Map from filesystem to disc + @variable mountpoints:dict<str, Disc> Map from mountpoint to disc + ''' + + + def __init__(self): + ''' + Constructor + ''' + self.filesystems = {} + self.mountpoints = {} + listed = {} + + df = spawn_read('df', '-B1', '-T').split('\n')[1:] + dfi = spawn_read('df', '-i').split('\n')[1:] + + # Disc usage information + for line in df: + line = line + buf = '' + cells = [] + for c in line: + if (c == ' ') and (len(cells) < 6): + if not buf == '': + cells.append(buf) + buf = '' + else: + buf += c + cells.append(buf) + (fs, fstype, blocks, used, avail, _use, mount) = cells + listed[fs] = mount + disc = Disc() + self.filesystems[fs] = disc + self.mountpoints[mount] = disc + disc.filesystem = fs + disc.mountpoint = mount + disc.fstype = fstype + disc.blocks = int(blocks) + disc.used = int(used) + disc.available = int(avail) + + # Inode usage information + for line in dfi: + line = line + buf = '' + cells = [] + for c in line: + if (c == ' ') and (len(cells) < 5): + if not buf == '': + cells.append(buf) + buf = '' + else: + buf += c + cells.append(buf) + (fs, inodes, iused, ifree, _use, _mount) = cells + if fs in self.filesystems: + del listed[fs] + disc = self.filesystems[fs] + disc.inodes = int(inodes) + disc.iused = int(iused) + disc.ifree = int(ifree) + + # Perhaps an umount appeared between `df -B1 -T` and `df -i` + for fs in listed.keys(): + del self.filesystems[fs] + del self.mountpoints[listed[fs]] + + +class Disc: + ''' + Information about a single disc + + @variable filesystem:str The filesystem, a device or API filesystem name + @variable mountpoint:str The filesystem mountpoint, the one with shortest name if there are multiple + @variable fstype:str The filesystem type + @variable blocks:int The total number of 1 byte blocks, the value is close or equal to `used + available` + @variable used:int The number of used bytes + @variable available:int The number of unused bytes + @variable inodes:int The total number of index nodes + @variable iused:int The number of used index nodes + @variable ifree:int The number of available index nodes + ''' + + + def __init__(self): + ''' + Constructor + ''' + pass + |