# HG changeset patch # User Matt Johnston # Date 1339808887 -28800 # Node ID ea1779d276416be71e75dc6e09b292c4e38ce1ee # Parent 3baca8d980f44885906c3034859bee19a79a09b7 - Getting there, update has problems diff -r 3baca8d980f4 -r ea1779d27641 web/config.py --- a/web/config.py Fri Jun 15 23:36:41 2012 +0800 +++ b/web/config.py Sat Jun 16 09:08:07 2012 +0800 @@ -1,5 +1,5 @@ -DATA_PATH = 'data' +DATA_PATH = '/home/matt/templog/web/data' HMAC_KEY = 'a hmac key' diff -r 3baca8d980f4 -r ea1779d27641 web/index.py --- a/web/index.py Fri Jun 15 23:36:41 2012 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -#!/usr/bin/env python2.7 - -import binascii -import hmac -import zlib -import datetime -import time - -import bottle -from bottle import route, request, response - -import config -import log - -@route('/update', method='post') -def update(): - enc_lines = request.forms.lines - mac = request.forms.hmac - - if hmac.new(config.HMAC_KEY, enc_lines).hexdigest() != mac: - raise HTTPError(code = 403, output = "Bad key") - - lines = zlib.decompress(binascii.a2b_base64(enc_lines)).split('\n') - - log.parse(lines) - - return "OK" - -@route('/graph.png') -def graph(): - # url takes time in hours or days - if 'day' in request.query: - start_day = datetime.datetime.strptime(request.query.day, '%Y%m%d') - start = time.mktime(start_day.timetuple()) - length = int(request.query.length) * 3600 * 24 - else: - start_hour = datetime.datetime.strptime(request.query.hour, '%Y%m%d%H') - start = time.mktime(start_hour.timetuple()) - length = int(request.query.length) * 3600 - - response.set_header('Content-Type', 'image/png') - return log.graph_png(start, length) - -@route('/') -def top(): - return bottle.template('top', urlparams=request.query_string) - -def main(): - bottle.debug(True) - bottle.run(port=9999, reloader=True) - -if __name__ == '__main__': - main() - - diff -r 3baca8d980f4 -r ea1779d27641 web/log.py --- a/web/log.py Fri Jun 15 23:36:41 2012 +0800 +++ b/web/log.py Sat Jun 16 09:08:07 2012 +0800 @@ -1,3 +1,4 @@ +#:vim:et:ts=4:sts=4:sw=4: import rrdtool import os import os.path @@ -5,6 +6,8 @@ import glob import hashlib import tempfile +import time +import syslog from colorsys import hls_to_rgb import config @@ -67,36 +70,40 @@ except IOError, e: create_rrd(sensor_id) - values = ['%f:%f' % p for p in - zip((first_real_time + time_step*t for t in xrange(len(measurements))), - measurements)] + print>>sys.stderr, sensor_id, measurements, first_real_time, time_step + + if measurements: + values = ['%d:%f' % p for p in + zip((first_real_time + time_step*t for t in xrange(len(measurements))), + measurements)] - rrdfile = sensor_rrd_path(sensor_id) - rrdtool.update(rrdfile, *values) + rrdfile = sensor_rrd_path(sensor_id) + print>>sys.stderr, values + rrdtool.update(rrdfile, *values) - # be paranois - f = file(rrdfile) - os.fsync(f.fileno()) + # be paranoid + f = file(rrdfile) + os.fsync(f.fileno()) def record_debug(lines): - f = open('%s/debug.log', config.DATA_PATH, 'a+') - f.write('===== %s =====' % time.strftime('%a, %d %b %Y %H:%M:%S') + f = open('%s/debug.log' % config.DATA_PATH, 'a+') + f.write('===== %s =====\n' % time.strftime('%a, %d %b %Y %H:%M:%S')) f.writelines(('%s\n' % s for s in lines)) f.flush() return f def parse(lines): - debugf = record_debug(lines): + debugf = record_debug(lines) entries = dict(l.split('=', 1) for l in lines) if len(entries) != len(lines): raise Exception("Keys are not unique") num_sensors = int(entries['sensors']) - num_measurements = int(entries['sensors']) + num_measurements = int(entries['measurements']) - sensor_ids = [entries['sensor_id%d' % n] for n in xrange(num_sensors)] + sensors = [entries['sensor_id%d' % n] for n in xrange(num_sensors)] meas = [] for s in sensors: @@ -107,7 +114,7 @@ return 0.1 * v for n in xrange(num_measurements): - vals = [val_scale(int(entries["meas%d" % n].strip().split()))] + vals = [val_scale(int(x)) for x in entries["meas%d" % n].strip().split()] if len(vals) != num_sensors: raise Exception("Wrong number of sensors for measurement %d" % n) # we make an array of values for each sensor @@ -123,5 +130,5 @@ for sensor_id, measurements in zip(sensors, meas): sensor_update(sensor_id, measurements, first_real_time, time_step) - debugf.write("Updated %d sensors\n" % len(sensors) + debugf.write("Updated %d sensors\n" % len(sensors)) debugf.flush() diff -r 3baca8d980f4 -r ea1779d27641 web/templog.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/templog.py Sat Jun 16 09:08:07 2012 +0800 @@ -0,0 +1,66 @@ +#!/usr/bin/env python2.7 + +import binascii +import hmac +import zlib +import datetime +import time + +import bottle +from bottle import route, request, response + +import config +import log + +@route('/update', method='post') +def update(): + enc_lines = request.forms.lines + mac = request.forms.hmac + + if hmac.new(config.HMAC_KEY, enc_lines).hexdigest() != mac: + raise HTTPError(code = 403, output = "Bad key") + + lines = zlib.decompress(binascii.a2b_base64(enc_lines)).split('\n') + + log.parse(lines) + + return "OK" + +@route('/graph.png') +def graph(): + # url takes time in hours or days + if 'day' in request.query: + start_day = datetime.datetime.strptime(request.query.day, '%Y%m%d') + start = time.mktime(start_day.timetuple()) + length = int(request.query.length) * 3600 * 24 + else: + start_hour = datetime.datetime.strptime(request.query.hour, '%Y%m%d%H') + start = time.mktime(start_hour.timetuple()) + length = int(request.query.length) * 3600 + + response.set_header('Content-Type', 'image/png') + return log.graph_png(start, length) + +@route('/') +def top(): + return bottle.template('top', urlparams=request.query_string) + +@route('/test') +def test(): + import config + import os + f = open('%s/testout' % config.DATA_PATH, 'a+') + f.write("more") + f.flush() + f.close() + + return 'done' + +def main(): + bottle.debug(True) + bottle.run(port=9999, reloader=True) + +if __name__ == '__main__': + main() + +