Advertisement
p2k

poolspeed.py

p2k
Feb 25th, 2012
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.19 KB | None | 0 0
  1. #!/usr/bin/env python2
  2.  
  3. from __future__ import division
  4.  
  5. import sys, csv, time, signal, os, os.path
  6. from datetime import datetime, timedelta
  7.  
  8. def formatValue(v):
  9.     if v > 1000000000:
  10.         return "%.1fG" % (v / 1000000000)
  11.     elif v > 1000000:
  12.         return "%.1fM" % (v / 1000000)
  13.     elif v > 1000:
  14.         return "%.1fk" % (v / 1000)
  15.     else:
  16.         return "%.1f" % (v)
  17.  
  18. class LineUpdater(object):
  19.     def __init__(self):
  20.         self.len = 0
  21.  
  22.     def put(self, text):
  23.         sys.stdout.write('\r')
  24.         if len(text) < self.len:
  25.             sys.stdout.write(' ' * self.len)
  26.             sys.stdout.write('\r')
  27.         sys.stdout.write(text)
  28.         self.len = len(text)
  29.         sys.stdout.flush()
  30.  
  31. class Speedometer(object):
  32.     DATE_FMT = "%Y-%m-%d %H:%M:%S.%f"
  33.     def __init__(self, interval):
  34.         self.ts_queue = []
  35.         self.interval = interval
  36.  
  37.     def feed(self, line):
  38.         # Add
  39.         ts = datetime.strptime(line[0]+"000", self.DATE_FMT)
  40.         end = ts - timedelta(minutes=self.interval)
  41.         self.ts_queue.append(ts)
  42.         # Purge
  43.         while len(self.ts_queue) > 0 and self.ts_queue[0] < end:
  44.             self.ts_queue.pop(0)
  45.  
  46.     def sharesPerSecond(self):
  47.         return len(self.ts_queue) / (self.interval*60)
  48.  
  49. def get_file_id(name):
  50.     return os.stat("log/shares.log").st_ino
  51.  
  52. def preload(name, m):
  53.     if not os.path.exists(name):
  54.         return
  55.     f = open(name, 'rb')
  56.     for l in csv.reader(f, delimiter=';', quotechar='"'):
  57.         if prefix and not l[4].startswith(prefix):
  58.             continue
  59.         if l[8] == "1" or l[8] == "2":
  60.             m.feed(l)
  61.     f.close()
  62.  
  63. if __name__ == "__main__":
  64.     if len(sys.argv) > 1:
  65.         prefix = sys.argv[1]
  66.     else:
  67.         prefix = None
  68.     signal.signal(signal.SIGINT, signal.SIG_DFL)
  69.     u = LineUpdater()
  70.     m = Speedometer(10)
  71.     #preload('log/shares_2.log', m)
  72.     preload('log/shares_1.log', m)
  73.     v = 0
  74.     i = 0
  75.     fid = get_file_id('log/shares.log')
  76.     f = open('log/shares.log', 'rb')
  77.     c = csv.reader(f, delimiter=';', quotechar='"')
  78.     while True:
  79.         p = f.tell()
  80.         try:
  81.             l = c.next()
  82.             if len(l) < 13:
  83.                 raise StopIteration
  84.             if l[8] == "2":
  85.                 sys.stdout.write("\n%s - \\o/ Block #%s solved by %s! \\o/\n" % (l[0], l[12], l[4]))
  86.             if prefix is None or l[4].startswith(prefix):
  87.                 if l[8] == "1" or l[8] == "2":
  88.                     m.feed(l)
  89.                     v += 1
  90.                 else:
  91.                     i += 1
  92.         except StopIteration:
  93.             nfid = get_file_id('log/shares.log')
  94.             if fid != nfid:
  95.                 fid = nfid
  96.                 f.close()
  97.                 f = open('log/shares.log', 'rb')
  98.                 c = csv.reader(f, delimiter=';', quotechar='"')
  99.                 sys.stdout.write("\nLogfile rotated, resetting counters. %d shares seen.\n" % (v+i))
  100.                 i = 0
  101.                 v = 0
  102.             else:
  103.                 f.seek(p)
  104.             time.sleep(1)
  105.             u.put("Rate: %6sH/s - Stales: %2.2f %%" % (formatValue(m.sharesPerSecond() * 4295032833), 100 * i / (v+i) if (v+i) > 0 else 0))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement