Mercurial > templog
diff py/uploader.py @ 293:d15dda1b1f76
merge
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 06 Jul 2019 18:29:45 +0800 |
parents | 28eb733cb803 26eee8591f61 |
children | 6bacd8ca9f8f |
line wrap: on
line diff
--- a/py/uploader.py Thu Mar 19 21:50:52 2015 +0800 +++ b/py/uploader.py Sat Jul 06 18:29:45 2019 +0800 @@ -1,29 +1,28 @@ import json import hmac +import hashlib import zlib import binascii import logging +import asyncio -import gevent -import requests +import aiohttp import config from utils import L,D,EX,W,E import utils -class Uploader(gevent.Greenlet): +class Uploader(object): def __init__(self, server): - gevent.Greenlet.__init__(self) self.server = server - requests_log = logging.getLogger("requests") - requests_log.setLevel(logging.WARNING) - - def _run(self): - gevent.sleep(5) + @asyncio.coroutine + def run(self): + # wait for the first read + yield from asyncio.sleep(5) while True: - self.do() - self.server.sleep(config.UPLOAD_SLEEP) + yield from self.do() + yield from asyncio.sleep(config.UPLOAD_SLEEP) def get_tosend(self, readings): tosend = {} @@ -37,33 +36,38 @@ tosend['fridge_name'] = self.server.wort_name tosend['current_params'] = dict(self.server.params) + tosend['current_params_epoch'] = self.server.params.get_epoch() tosend['start_time'] = self.server.start_time tosend['uptime'] = utils.uptime() return tosend + @asyncio.coroutine def send(self, tosend): js = json.dumps(tosend) - js_enc = binascii.b2a_base64(zlib.compress(js)) - mac = hmac.new(config.HMAC_KEY, js_enc).hexdigest() - send_data = {'data': js_enc, 'hmac': mac} - r = requests.post(config.UPDATE_URL, data=send_data, timeout=60) - result = r.text - if result != 'OK': + if self.server.test_mode(): + D("Would upload %s to %s" % (js, config.UPDATE_URL)) + return + js_enc = binascii.b2a_base64(zlib.compress(js.encode())).strip() + mac = hmac.new(config.HMAC_KEY.encode(), js_enc, hashlib.sha256).hexdigest() + send_data = {'data': js_enc.decode(), 'hmac': mac} + r = yield from asyncio.wait_for(aiohttp.request('post', config.UPDATE_URL, data=send_data), 60) + result = yield from asyncio.wait_for(r.text(), 60) + if r.status == 200 and result != 'OK': raise Exception("Server returned %s" % result) + @asyncio.coroutine def do(self): - readings = self.server.take_readings() try: + readings = self.server.take_readings() tosend = self.get_tosend(readings) + D("tosend >>>%s<<<" % str(tosend)) nreadings = len(readings) - self.send(tosend) + yield from self.send(tosend) readings = None D("Sent updated %d readings" % nreadings) - except requests.exceptions.RequestException, e: - E("Error in uploader: %s" % str(e)) - except Exception, e: + except Exception as e: EX("Error in uploader: %s" % str(e)) finally: if readings is not None: