Mercurial > templog
annotate web/templog.py @ 488:4792e9910cde
watcher script
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sun, 09 Feb 2014 11:41:13 +0800 |
parents | 931408ce71d9 |
children | 8318d50d766d |
rev | line source |
---|---|
333 | 1 #!/usr/bin/env python2.7 |
2 | |
334 | 3 import binascii |
445
5b9dc87c988f
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
409
diff
changeset
|
4 import json |
334 | 5 import hmac |
335 | 6 import zlib |
375 | 7 from datetime import datetime, timedelta |
337
f575ef538f5d
- Various fixes for web server, kind of works
Matt Johnston <matt@ucc.asn.au>
parents:
336
diff
changeset
|
8 import time |
375 | 9 import urllib |
10 import sys | |
482 | 11 import os |
485 | 12 import traceback |
13 import fcntl | |
334 | 14 |
333 | 15 import bottle |
337
f575ef538f5d
- Various fixes for web server, kind of works
Matt Johnston <matt@ucc.asn.au>
parents:
336
diff
changeset
|
16 from bottle import route, request, response |
333 | 17 |
334 | 18 import config |
19 import log | |
485 | 20 import secure |
334 | 21 |
375 | 22 DATE_FORMAT = '%Y%m%d-%H.%M' |
23 ZOOM_SCALE = 2.0 | |
24 | |
333 | 25 @route('/update', method='post') |
26 def update(): | |
445
5b9dc87c988f
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
409
diff
changeset
|
27 js_enc = request.forms.data |
334 | 28 mac = request.forms.hmac |
29 | |
445
5b9dc87c988f
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
409
diff
changeset
|
30 if hmac.new(config.HMAC_KEY, js_enc).hexdigest() != mac: |
391 | 31 raise bottle.HTTPError(code = 403, output = "Bad key") |
334 | 32 |
445
5b9dc87c988f
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
409
diff
changeset
|
33 js = zlib.decompress(binascii.a2b_base64(js_enc)) |
334 | 34 |
445
5b9dc87c988f
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
409
diff
changeset
|
35 params = json.loads(js) |
5b9dc87c988f
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
409
diff
changeset
|
36 |
5b9dc87c988f
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
409
diff
changeset
|
37 log.parse(params) |
334 | 38 |
39 return "OK" | |
333 | 40 |
41 @route('/graph.png') | |
42 def graph(): | |
375 | 43 length_minutes = int(request.query.length) |
44 end = datetime.strptime(request.query.end, DATE_FORMAT) | |
45 start = end - timedelta(minutes=length_minutes) | |
336
ba4c4df13487
parse the arguments for start/length
Matt Johnston <matt@ucc.asn.au>
parents:
335
diff
changeset
|
46 |
ba4c4df13487
parse the arguments for start/length
Matt Johnston <matt@ucc.asn.au>
parents:
335
diff
changeset
|
47 response.set_header('Content-Type', 'image/png') |
375 | 48 start_epoch = time.mktime(start.timetuple()) |
49 return log.graph_png(start_epoch, length_minutes * 60) | |
333 | 50 |
487 | 51 @route('/set/update', method='post') |
52 def update(): | |
53 post_json = json.loads(request.forms.data) | |
54 | |
55 csrf_blob = post_json['csrf_blob'] | |
56 | |
57 return str(post_json['params']) | |
58 | |
482 | 59 @route('/set') |
60 def set(): | |
488 | 61 allowed = ["false", "true"][secure.get_user_hash() in config.ALLOWED_USERS] |
485 | 62 return bottle.template('set', |
63 inline_data = log.get_params(), | |
488 | 64 csrf_blob = secure.get_csrf_blob(), |
65 allowed = allowed) | |
482 | 66 |
67 @route('/set_current.json') | |
68 def set_fresh(): | |
69 response.set_header('Content-Type', 'application/javascript') | |
70 return log.get_current() | |
71 | |
333 | 72 @route('/') |
73 def top(): | |
375 | 74 |
75 minutes = int(request.query.get('length', 26*60)) | |
76 | |
77 if 'end' in request.query: | |
78 end = datetime.strptime(request.query.end, DATE_FORMAT) | |
79 else: | |
80 end = datetime.now() | |
81 | |
82 if 'zoom' in request.query: | |
83 orig_start = end - timedelta(minutes=minutes) | |
84 orig_end = end | |
85 xpos = int(request.query.x) | |
383 | 86 xpos -= config.GRAPH_LEFT_MARGIN * config.ZOOM |
375 | 87 |
383 | 88 if xpos >= 0 and xpos < config.GRAPH_WIDTH * config.ZOOM: |
375 | 89 click_time = orig_start \ |
383 | 90 + timedelta(minutes=(float(xpos) / (config.GRAPH_WIDTH * config.ZOOM)) * minutes) |
375 | 91 minutes = int(minutes / ZOOM_SCALE) |
92 | |
93 end = click_time + timedelta(minutes=minutes/2) | |
94 else: | |
95 # zoom out | |
96 minutes = int(minutes*ZOOM_SCALE) | |
97 end += timedelta(minutes=minutes/2) | |
98 | |
99 if end > datetime.now(): | |
100 end = datetime.now() | |
101 | |
102 request.query.replace('length', minutes) | |
103 request.query.replace('end', end.strftime(DATE_FORMAT)) | |
104 | |
105 urlparams = urllib.urlencode(request.query) | |
106 return bottle.template('top', urlparams=urlparams, | |
107 end = end.strftime(DATE_FORMAT), | |
108 length = minutes) | |
333 | 109 |
409 | 110 @route('/debug') |
111 def debuglog(): | |
112 response.set_header('Content-Type', 'text/plain') | |
113 return log.tail_debug_log() | |
344
ea1779d27641
- Getting there, update has problems
Matt Johnston <matt@ucc.asn.au>
parents:
337
diff
changeset
|
114 |
482 | 115 @route('/env') |
116 def env(): | |
117 response.set_header('Content-Type', 'text/plain') | |
488 | 118 #return '\n'.join(traceback.format_stack()) |
119 return '\n'.join(("%s %s" % k) for k in request.environ.items()) | |
482 | 120 #return str(request.environ) |
121 #yield "\n" | |
122 #var_lookup = environ['mod_ssl.var_lookup'] | |
123 #return var_lookup("SSL_SERVER_I_DN_O") | |
124 | |
125 @bottle.get('/<filename:re:.*\.js>') | |
126 def javascripts(filename): | |
485 | 127 response.set_header('Cache-Control', "public, max-age=1296000") |
482 | 128 return bottle.static_file(filename, root='static') |
129 | |
485 | 130 secure.setup_csrf() |
482 | 131 |
333 | 132 def main(): |
367 | 133 #bottle.debug(True) |
134 #bottle.run(reloader=True) | |
135 bottle.run(server='cgi', reloader=True) | |
346 | 136 #bottle.run(port=9999, reloader=True) |
333 | 137 |
138 if __name__ == '__main__': | |
139 main() | |
140 | |
141 |