annotate server/ts.py @ 28:e3e0ed7758f9

hmac
author Matt Johnston <matt@ucc.asn.au>
date Tue, 12 Jun 2012 00:35:23 +0800
parents dbbd503119ba
children 048143905092
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1 #!/usr/bin/env python2.7
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
2
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
3 BTADDR = "00:12:03:27:70:88"
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
4 SLEEP_TIME = 180
23
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
5 # time that the bluetooth takes to get going?
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
6 EXTRA_WAKEUP = 0
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
7
24
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
8 FETCH_TRIES = 3
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
9
23
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
10 # avoid turning off the bluetooth etc.
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
11 TESTING = True
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
12
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
13 import sys
27
dbbd503119ba Add some web server handling
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
14 # for wrt
dbbd503119ba Add some web server handling
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
15 sys.path.append('/root/python')
dbbd503119ba Add some web server handling
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
16 import httplib
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
17 import time
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
18 import traceback
28
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
19 import binascii
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
20 import hmac
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
21
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
22 import config
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
23
26
d3e5934fe55c - Move crc16 to utils and fix it
Matt Johnston <matt@ucc.asn.au>
parents: 25
diff changeset
24 from utils import monotonic_time, retry, readline, crc16
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
25
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
26 lightblue = None
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
27 try:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
28 import lightblue
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
29 except ImportError:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
30 import bluetooth
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
31
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
32 def get_socket(addr):
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
33 if lightblue:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
34 s = lightblue.socket()
23
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
35 s.connect((addr, 1))
24
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
36 s.settimeout(3)
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
37 else:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
38 s = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
39 s.connect((addr, 1))
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
40
24
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
41 s.setblocking(False)
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
42
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
43 return s
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
44
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
45
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
46 @retry()
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
47 def fetch(sock):
24
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
48 print "fetch"
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
49 sock.send("fetch\n")
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
50
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
51 crc = 0
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
52
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
53 lines = []
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
54 l = readline(sock)
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
55 if l != 'START\n':
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
56 print>>sys.stderr, "Bad expected START line '%s'\n" % l.rstrip('\n')
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
57 return None
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
58 crc = crc16(l, crc)
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
59 lines.append(l)
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
60
24
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
61 while True:
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
62 l = readline(sock)
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
63
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
64 crc = crc16(l, crc)
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
65
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
66 if l == 'END\n':
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
67 break
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
68
27
dbbd503119ba Add some web server handling
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
69 lines.append(l.rstrip('\n'))
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
70
24
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
71 print lines
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
72
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
73 l = readline(sock)
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
74 recv_crc = None
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
75 try:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
76 k, v = l.rstrip('\n').split('=')
25
2943f62c8e62 - Make the python work on openwrt
Matt Johnston <matt@ucc.asn.au>
parents: 24
diff changeset
77 print k,v
21
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
78 if k == 'CRC':
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
79 recv_crc = int(v)
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
80 if recv_crc < 0 or recv_crc > 0xffff:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
81 recv_crc = None
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
82 except ValueError:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
83 pass
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
84
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
85 if recv_crc is None:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
86 print>>sys.stderr, "Bad expected CRC line '%s'\n" % l.rstrip('\n')
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
87 return None
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
88
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
89 if recv_crc != crc:
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
90 print>>sys.stderr, "Bad CRC: calculated 0x%x vs received 0x%x\n" % (crc, recv_crc)
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
91 return None
2029633912c2 untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
92
27
dbbd503119ba Add some web server handling
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
93 return lines
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
94
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
95 @retry()
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
96 def turn_off(sock):
23
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
97 if TESTING:
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
98 return None
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
99 sock.send("btoff\n");
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
100 # read newline
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
101 l = readline(sock)
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
102 if not l:
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
103 print>>sys.stderr, "Bad response to btoff\n"
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
104 return None
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
105
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
106 off, next_wake = l.rstrip().split(':')
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
107 if off != 'Off':
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
108 print>>sys.stderr, "Bad response to btoff '%s'\n" % l
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
109
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
110 return int(next_wake)
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
111
28
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
112 def send_results(lines):
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
113 enc_lines = binascii.b2a_base64('\n'.join(lines))
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
114 hmac.new(config.HMAC_KEY, enc_lines).hexdigest()
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
115
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
116 url_data = urllib.url_encode( ('lines', enc_lines), ('hmac', mac) )
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
117 con = urllib2.urlopen(config.UPDATE_URL, url_data)
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
118
Matt Johnston <matt@ucc.asn.au>
parents: 27
diff changeset
119
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
120 def do_comms(sock):
25
2943f62c8e62 - Make the python work on openwrt
Matt Johnston <matt@ucc.asn.au>
parents: 24
diff changeset
121 print "do_comms"
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
122 d = None
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
123 # serial could be unreliable, try a few times
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
124 for i in range(FETCH_TRIES):
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
125 d = fetch(sock)
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
126 if d:
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
127 break
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
128 time.sleep(1)
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
129 if not d:
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
130 return
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
131
27
dbbd503119ba Add some web server handling
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
132 res = send_results(d)
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
133 if not res:
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
134 return
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
135
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
136 clear_meas(sock)
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
137
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
138 next_wake = turn_off(sock)
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
139 sock.close()
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
140 return next_wake
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
141
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
142 testcount = 0
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
143
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
144 def sleep_for(secs):
23
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
145 until = monotonic_time() + secs
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
146 while True:
24
44c5ab5ea879 - some fixes for server code
Matt Johnston <matt@ucc.asn.au>
parents: 23
diff changeset
147 length = until - monotonic_time()
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
148 if length <= 0:
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
149 return
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
150 time.sleep(length)
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
151
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
152 def main():
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
153
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
154 while True:
23
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
155 sock = None
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
156 try:
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
157 sock = get_socket(BTADDR)
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
158 except Exception, e:
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
159 print>>sys.stderr, "Error connecting:"
b5925cb4f264 Fix bugs in server code (try actually running it)
Matt Johnston <matt@ucc.asn.au>
parents: 22
diff changeset
160 traceback.print_exc(file=sys.stderr)
22
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
161 sleep_time = SLEEP_TIME
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents: 21
diff changeset
162 if sock:
885532437100 A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>