Mercurial > templog
annotate py/uploader.py @ 607:282fae1c12e4 rust
NotTooOften
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 17 Feb 2017 22:27:44 +0800 |
parents | 78c542f03030 |
children | 6bacd8ca9f8f 424f1446f214 |
rev | line source |
---|---|
145 | 1 import json |
2 import hmac | |
233
19569cb5ed46
better arg parser. seems close to ready
Matt Johnston <matt@ucc.asn.au>
parents:
231
diff
changeset
|
3 import hashlib |
145 | 4 import zlib |
160 | 5 import binascii |
215
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
6 import logging |
228 | 7 import asyncio |
160 | 8 |
228 | 9 import aiohttp |
160 | 10 |
11 import config | |
12 from utils import L,D,EX,W,E | |
13 import utils | |
145 | 14 |
228 | 15 class Uploader(object): |
145 | 16 def __init__(self, server): |
17 self.server = server | |
265 | 18 self.limitlog = utils.NotTooOften(600) |
145 | 19 |
228 | 20 @asyncio.coroutine |
21 def run(self): | |
22 # wait for the first read | |
23 yield from asyncio.sleep(5) | |
145 | 24 while True: |
228 | 25 yield from self.do() |
259 | 26 yield from asyncio.sleep(config.UPLOAD_SLEEP) |
145 | 27 |
28 def get_tosend(self, readings): | |
29 tosend = {} | |
30 | |
31 tosend['fridge_on'] = self.server.fridge.is_on() | |
32 | |
33 tosend['now'] = self.server.now() | |
34 tosend['readings'] = readings | |
35 | |
36 tosend['wort_name'] = self.server.wort_name | |
160 | 37 tosend['fridge_name'] = self.server.wort_name |
145 | 38 |
190 | 39 tosend['current_params'] = dict(self.server.params) |
253
0a1b642e3086
long polling config updates
Matt Johnston <matt@ucc.asn.au>
parents:
241
diff
changeset
|
40 tosend['current_params_epoch'] = self.server.params.get_epoch() |
145 | 41 |
42 tosend['start_time'] = self.server.start_time | |
43 tosend['uptime'] = utils.uptime() | |
44 | |
45 return tosend | |
46 | |
265 | 47 class BadServerResponse(Exception): |
48 pass | |
49 | |
228 | 50 @asyncio.coroutine |
145 | 51 def send(self, tosend): |
52 js = json.dumps(tosend) | |
233
19569cb5ed46
better arg parser. seems close to ready
Matt Johnston <matt@ucc.asn.au>
parents:
231
diff
changeset
|
53 if self.server.test_mode(): |
19569cb5ed46
better arg parser. seems close to ready
Matt Johnston <matt@ucc.asn.au>
parents:
231
diff
changeset
|
54 D("Would upload %s to %s" % (js, config.UPDATE_URL)) |
19569cb5ed46
better arg parser. seems close to ready
Matt Johnston <matt@ucc.asn.au>
parents:
231
diff
changeset
|
55 return |
241 | 56 js_enc = binascii.b2a_base64(zlib.compress(js.encode())).strip() |
57 mac = hmac.new(config.HMAC_KEY.encode(), js_enc, hashlib.sha256).hexdigest() | |
58 send_data = {'data': js_enc.decode(), 'hmac': mac} | |
228 | 59 r = yield from asyncio.wait_for(aiohttp.request('post', config.UPDATE_URL, data=send_data), 60) |
60 result = yield from asyncio.wait_for(r.text(), 60) | |
253
0a1b642e3086
long polling config updates
Matt Johnston <matt@ucc.asn.au>
parents:
241
diff
changeset
|
61 if r.status == 200 and result != 'OK': |
265 | 62 raise BadServerResponse("Server returned %s" % result) |
145 | 63 |
228 | 64 @asyncio.coroutine |
160 | 65 def do(self): |
145 | 66 try: |
254
ffe25107d520
put more things inside "try"
Matt Johnston <matt@ucc.asn.au>
parents:
241
diff
changeset
|
67 readings = self.server.take_readings() |
146
3b4277aaed3c
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
145
diff
changeset
|
68 tosend = self.get_tosend(readings) |
259 | 69 D("tosend >>>%s<<<" % str(tosend)) |
160 | 70 nreadings = len(readings) |
228 | 71 yield from self.send(tosend) |
160 | 72 readings = None |
163 | 73 D("Sent updated %d readings" % nreadings) |
265 | 74 except aiohttp.errors.ClientError as e: |
75 self.limitlog.log("Error with uploader: %s" % str(e)) | |
76 except asyncio.TimeoutError as e: | |
77 self.limitlog.log("uploader http timed out: %s" % str(e)) | |
78 except self.BadServerResponse as e: | |
79 self.limitlog.log("Bad reply with uploader: %s" % str(e)) | |
230 | 80 except Exception as e: |
259 | 81 EX("Error in uploader: %s" % str(e)) |
145 | 82 finally: |
83 if readings is not None: | |
84 self.server.pushfront(readings) |