import os import sys import re sys.path.append('/home/users/jpa/remtemp/lib/python2.3/site-packages/') import rrdtool rrdpath = '/home/users/jpa/remtemp/rrds/' def update(name, quantity, samples): 'Samples is a list of tuples (time, value)' print 'U', name, quantity, samples if not samples: return if not quantity.isalnum(): raise Exception('Invalid characters in quantity') path = rrdpath + os.path.basename(name) + '.rrd' try: rrdtool.update(path, "-t" + quantity, *['%d:%f' % s for s in samples]) except rrdtool.error, info: print str(info) # Automatic recovery for the most common problem results = re.findall('illegal attempt to update using time ([0-9]+) when last update time is', str(info)) if results: print "Filtering for", results oldsamples = len(samples) for r in results: time = int(r) # Timestamp of the duplicate entry samples = filter(lambda s: s[0] != time, samples) if oldsamples == len(samples): raise # Nothing was removed, so the message was false (don't recurse infinitely) update(name, quantity, samples) else: # Some other error raise