From f268888d0b21a7edbe9e4d3a8ac5ce5233ff8aaf Mon Sep 17 00:00:00 2001 From: mfrasca <> Date: Tue, 6 Sep 2005 17:03:32 +0000 Subject: [PATCH] up to version 0.1.3 --- pywmhdmon/INSTALL | 2 +- pywmhdmon/README | 11 ++++-- pywmhdmon/pywmhdmon.py | 69 ++++++++++++++++++++++++++++++------ pywmhdmon/sample.pywmhdmonrc | 26 ++++++++++++++ 4 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 pywmhdmon/sample.pywmhdmonrc diff --git a/pywmhdmon/INSTALL b/pywmhdmon/INSTALL index 038e3b9..4d84676 100644 --- a/pywmhdmon/INSTALL +++ b/pywmhdmon/INSTALL @@ -4,5 +4,5 @@ 2. Copy pywmhdmon.py to somewhere in your path (like ~/bin or /usr/local/bin). -3. Copy the sample.pywmhdmon to ~/.pywmhdmon and edit as you like. +3. Copy the sample.pywmhdmonrc to ~/.pywmhdmonrc and edit as you like. diff --git a/pywmhdmon/README b/pywmhdmon/README index 9010aa3..87b5010 100644 --- a/pywmhdmon/README +++ b/pywmhdmon/README @@ -10,7 +10,12 @@ As usual, I didn't find a dockapp that fitted me. And I really like to see the current disk activity since my disks are so quiet that I can't hear when they work. -[CONTACT] -Mail anything related to this program to me, Kristoffer Erlandsson, - +[BUGS] +The activity bar does not work with the proc filesystem that comes with +the 2.6 kernels. It is just a matter of rewriting the app to parse the +new format, but I'm low on time personally. + +[CONTACT] +Contact me with anything regarding this program, see +http://errl.info/contact.html for ways to do this. diff --git a/pywmhdmon/pywmhdmon.py b/pywmhdmon/pywmhdmon.py index 2f55782..525dfe1 100755 --- a/pywmhdmon/pywmhdmon.py +++ b/pywmhdmon/pywmhdmon.py @@ -11,6 +11,16 @@ Licensed under the GNU General Public License. Changes +2004-07-15 Kristoffer Erlandsson +Added a patch from Mario Frasca (Thanks!) which prevents the app from showing +the data from the host file system if there is no filesystem mounted at the +given point. + +2003-09-01 Kristoffer Erlandsson +Fixed a bug where the numbers wouldn't show if they were between 1000 and 1024. + +2003-06-25 Kristoffer Erlandsson +Fixed a bug where a mouse click caused the app to enter an infinite loop 2003-06-24 Kristoffer Erlandsson Additional fine tuning @@ -71,9 +81,12 @@ digits = '0123456789:/-%. ' defaultConfigFile = '~/.pywmhdmonrc' defaultRGBFiles = ('/usr/lib/X11/rgb.txt', '/usr/X11R6/lib/X11/rgb.txt') defaultProcStat = '/proc/stat' -displayModes = ('bar', 'percent', 'free') +displayModes = ('bar', 'percent', 'free', 'used') defaultMode = 'bar' +class NotMounted(OSError): + pass + class PywmHDMon: def __init__(self, pathsToMonitor, procStat='/proc/stat', actMonEnabled=1): self._pathsToMonitor = pathsToMonitor @@ -97,10 +110,20 @@ class PywmHDMon: '''Get the free and total space of the filesystem which path is on. Return a tuple with (, ) in bytes. Raise - OSError if we can't stat the path. + OSError if we can't stat the path. Raise NotMounted if not mounted. These operations are quite costly, not adviced to perform these checks more than once every 10 seconds. ''' + # check if is mounted <- st_dev(/mount/point) == st_dev(/mount) + if path is not '/': + statOwn = os.stat(path) + + # the following is a bit ugly: it removes the trailing + # dirname from the mount point. split by '/', leave the + # last string, join back, check for empty string. + statCnt = os.stat('/'.join(path.split('/')[:-1]) or '/') + if statOwn[2] == statCnt[2]: + raise NotMounted stat = os.statvfs(path) blockSize = stat.f_bsize availableBlocks = stat.f_bavail @@ -133,13 +156,19 @@ class PywmHDMon: def paintHdData(self, line, data, mode): total, free = data xStart = width - xOffset - 6 * letterWidth - 1 - if mode == 'percent': + if total==0: + self.addString('-----', xStart, self.getY(line)) + pass + elif mode == 'percent': percent = (float(free) / float(total)) * 100.0 percentStr = (str(int(round(percent))) + '%').rjust(5) self.addString(percentStr, xStart, self.getY(line)) elif mode == 'free': freeStr = bytesToStr(free).rjust(5) self.addString(freeStr, xStart, self.getY(line)) + elif mode == 'used': + totalStr = bytesToStr(total).rjust(5) + self.addString(totalStr, xStart, self.getY(line)) elif mode == 'bar': percentUsed = (float(total - free) / float(total)) * 100.0 self.paintGraph(percentUsed, xStart, self.getY(line) + 2, @@ -201,6 +230,7 @@ class PywmHDMon: while not event is None: if event['type'] == 'destroynotify': sys.exit(0) + event = pywmhelpers.getEvent() def mainLoop(self): counter = -1 @@ -217,6 +247,8 @@ class PywmHDMon: self.paintLabel(index + 1, label) try: hdData = self.getHdInfo(path) + except NotMounted: + hdData = (0, 0) except OSError, e: sys.stderr.write( "Can't get hd data from %s: %s\n" % (path, str(e))) @@ -316,19 +348,36 @@ def bytesToStr(bytes): gb = 1024 * mb tb = 1024 * gb pb = 1024 * tb - numDigits = 3 if bytes < kb: - return makeNumDigits(bytes, numDigits) + 'B' + size = bytes + letter = 'B' + #return makeNumDigits(bytes, numDigits) + 'B' elif bytes < mb: - return makeNumDigits(bytes/kb, numDigits) + 'k' + size = bytes / kb + letter = 'k' + #return makeNumDigits(bytes/kb, numDigits) + 'k' elif bytes < gb: - return makeNumDigits(bytes/mb, numDigits) + 'M' + size = bytes / mb + letter = 'M' + #return makeNumDigits(bytes/mb, numDigits) + 'M' elif bytes < tb: - return makeNumDigits(bytes/gb, numDigits) + 'G' + size = bytes / gb + letter = 'G' + #return makeNumDigits(bytes/gb, numDigits) + 'G' elif bytes < pb: - return makeNumDigits(bytes/tb, numDigits) + 'T' + size = bytes / tb + letter = 'T' + #return makeNumDigits(bytes/tb, numDigits) + 'T' else: - return makeNumDigits(bytes/pb, numDigits) + 'P' + size = bytes / pb + letter = 'p' + #return makeNumDigits(bytes/pb, numDigits) + 'P' + if size >= 1000: + res = makeNumDigits(size, 4) + else: + res = makeNumDigits(size, 3) + res += letter + return res def main(): diff --git a/pywmhdmon/sample.pywmhdmonrc b/pywmhdmon/sample.pywmhdmonrc new file mode 100644 index 0000000..c618201 --- /dev/null +++ b/pywmhdmon/sample.pywmhdmonrc @@ -0,0 +1,26 @@ +[DEFAULT] +# Displaymodes are free, percent or bar, displays the free size, free percent +# and a bar representing space, respectively. +1.label=/ +1.path=/ +1.displaymode=free + +2.label=c +2.path=/mnt/c +2.displaymode=free + +3.label=d +3.path=/mnt/d +3.displaymode=free + +4.label=e +4.path=/mnt/e +4.displaymode=free + +textcolor=light sea green +background=black +barfgcolor=light sea green +barbgcolor=grey45 + +#rgbfile=/usr/lib/X11/rgb.txt +