Mercurial > templog
annotate py/uploader.py @ 292:28eb733cb803
60 second timeout
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 19 Mar 2015 21:50:52 +0800 |
parents | 16a83e2c97a0 |
children | d15dda1b1f76 |
rev | line source |
---|---|
145 | 1 import json |
2 import hmac | |
3 import zlib | |
160 | 4 import binascii |
215
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
5 import logging |
160 | 6 |
7 import gevent | |
215
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
8 import requests |
160 | 9 |
10 import config | |
11 from utils import L,D,EX,W,E | |
12 import utils | |
145 | 13 |
14 class Uploader(gevent.Greenlet): | |
15 def __init__(self, server): | |
16 gevent.Greenlet.__init__(self) | |
17 self.server = server | |
18 | |
215
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
19 requests_log = logging.getLogger("requests") |
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
20 requests_log.setLevel(logging.WARNING) |
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
21 |
145 | 22 def _run(self): |
160 | 23 gevent.sleep(5) |
145 | 24 while True: |
25 self.do() | |
219
16a83e2c97a0
sleep on a semaphore so it can start/stop immediately when there's a SIGHUP
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
26 self.server.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) |
145 | 40 |
41 tosend['start_time'] = self.server.start_time | |
42 tosend['uptime'] = utils.uptime() | |
43 | |
44 return tosend | |
45 | |
46 def send(self, tosend): | |
47 js = json.dumps(tosend) | |
48 js_enc = binascii.b2a_base64(zlib.compress(js)) | |
49 mac = hmac.new(config.HMAC_KEY, js_enc).hexdigest() | |
215
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
50 send_data = {'data': js_enc, 'hmac': mac} |
292 | 51 r = requests.post(config.UPDATE_URL, data=send_data, timeout=60) |
215
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
52 result = r.text |
145 | 53 if result != 'OK': |
54 raise Exception("Server returned %s" % result) | |
55 | |
160 | 56 def do(self): |
145 | 57 readings = self.server.take_readings() |
58 try: | |
146
3b4277aaed3c
update web to handle new style params
Matt Johnston <matt@ucc.asn.au>
parents:
145
diff
changeset
|
59 tosend = self.get_tosend(readings) |
160 | 60 nreadings = len(readings) |
145 | 61 self.send(tosend) |
160 | 62 readings = None |
163 | 63 D("Sent updated %d readings" % nreadings) |
215
4d82099d1fe0
use requests rather than urllib2, better ipv6->ipv4 fallback
Matt Johnston <matt@ucc.asn.au>
parents:
190
diff
changeset
|
64 except requests.exceptions.RequestException, e: |
160 | 65 E("Error in uploader: %s" % str(e)) |
145 | 66 except Exception, e: |
160 | 67 EX("Error in uploader: %s" % str(e)) |
145 | 68 finally: |
69 if readings is not None: | |
70 self.server.pushfront(readings) |