Mercurial > code > home > repos > homeauto
annotate service/tomatoWifi/tomatoWifi.py @ 879:691aa1333073
handle wifi users with no clientHostname
Ignore-this: 41f4c33d9ed84b8e0417c76dd7de58d5
darcs-hash:20130529073051-312f9-706b9d9c02a1fa56fbc4cd0e4fbfa42b8d0b462e
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Wed, 29 May 2013 00:30:51 -0700 |
parents | d9bc9a82dcca |
children | b0c168f562e8 |
rev | line source |
---|---|
805 | 1 #!/usr/bin/python |
2 """ | |
3 scrape the tomato router status pages to see who's connected to the | |
4 wifi access points. Includes leases that aren't currently connected. | |
5 | |
6 Returns: | |
7 json listing (for magma page) | |
8 rdf graph (for reasoning) | |
9 activity stream, when we start saving history | |
10 | |
11 Todo: this should be the one polling and writing to mongo, not entrancemusic | |
12 """ | |
13 from __future__ import division | |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
14 import sys, cyclone.web, json, traceback, time, pystache, datetime, logging |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
15 import web.utils |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
16 from cyclone.httpclient import fetch |
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
17 sys.path.append("/home/drewp/projects/photo/lib/python2.7/site-packages") |
805 | 18 from dateutil import tz |
19 from twisted.internet import reactor, task | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
20 from twisted.internet.defer import inlineCallbacks |
805 | 21 |
22 from pymongo import Connection, DESCENDING | |
23 from rdflib import Namespace, Literal, URIRef | |
24 sys.path.append("/my/site/magma") | |
25 from stategraph import StateGraph | |
26 from wifi import Wifi | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
27 from dhcpparse import addDhcpData |
805 | 28 |
29 sys.path.append("/my/proj/homeauto/lib") | |
30 from cycloneerr import PrettyErrorHandler | |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
31 from logsetup import log |
805 | 32 |
841
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
33 import rdflib |
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
34 from rdflib import plugin |
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
35 plugin.register( |
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
36 "sparql", rdflib.query.Processor, |
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
37 "rdfextras.sparql.processor", "Processor") |
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
38 plugin.register( |
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
39 "sparql", rdflib.query.Result, |
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
40 "rdfextras.sparql.query", "SPARQLQueryResult") |
ddc2cdbfde50
rdflib and jsonlib api updates
drewp <drewp@bigasterisk.com>
parents:
806
diff
changeset
|
41 |
805 | 42 DEV = Namespace("http://projects.bigasterisk.com/device/") |
43 ROOM = Namespace("http://projects.bigasterisk.com/room/") | |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
44 reasoning = "http://bang:9071/" |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
45 |
805 | 46 class Index(PrettyErrorHandler, cyclone.web.RequestHandler): |
47 def get(self): | |
48 | |
49 age = time.time() - self.settings.poller.lastPollTime | |
50 if age > 10: | |
51 raise ValueError("poll data is stale. age=%s" % age) | |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
52 |
805 | 53 self.write("this is wifiusage. needs index page that embeds the table") |
54 | |
55 class Table(PrettyErrorHandler, cyclone.web.RequestHandler): | |
56 def get(self): | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
57 def rowDict(row): |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
58 row['cls'] = "signal" if row.get('connected') else "nosignal" |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
59 if 'name' not in row: |
879
691aa1333073
handle wifi users with no clientHostname
drewp <drewp@bigasterisk.com>
parents:
867
diff
changeset
|
60 row['name'] = row.get('clientHostname', '-') |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
61 if 'signal' not in row: |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
62 row['signal'] = 'yes' if row['connected'] else 'no' |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
63 |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
64 try: |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
65 conn = self.whenConnected(row['mac']) |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
66 row['connectedAgo'] = web.utils.datestr( |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
67 conn.astimezone(tz.tzutc()).replace(tzinfo=None)) |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
68 except ValueError: |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
69 pass |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
70 |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
71 return row |
805 | 72 |
73 self.set_header("Content-Type", "application/xhtml+xml") | |
74 self.write(pystache.render( | |
75 open("table.mustache").read(), | |
76 dict( | |
77 rows=sorted(map(rowDict, self.settings.poller.lastAddrs), | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
78 key=lambda a: (not a.get('connected'), |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
79 a.get('name')))))) |
805 | 80 |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
81 def whenConnected(self, macThatIsNowConnected): |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
82 lastArrive = None |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
83 for ev in self.settings.mongo.find({'address': macThatIsNowConnected}, |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
84 sort=[('created', -1)], |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
85 max_scan=100000): |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
86 if ev['action'] == 'arrive': |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
87 lastArrive = ev |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
88 if ev['action'] == 'leave': |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
89 break |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
90 if lastArrive is None: |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
91 raise ValueError("no past arrivals") |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
92 |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
93 return lastArrive['created'] |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
94 |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
95 |
805 | 96 class Json(PrettyErrorHandler, cyclone.web.RequestHandler): |
97 def get(self): | |
98 self.set_header("Content-Type", "application/json") | |
99 age = time.time() - self.settings.poller.lastPollTime | |
100 if age > 10: | |
101 raise ValueError("poll data is stale. age=%s" % age) | |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
102 self.write(json.dumps({"wifi" : self.settings.poller.lastAddrs, |
805 | 103 "dataAge" : age})) |
104 | |
105 class GraphHandler(PrettyErrorHandler, cyclone.web.RequestHandler): | |
106 def get(self): | |
107 g = StateGraph(ctx=DEV['wifi']) | |
108 | |
109 # someday i may also record specific AP and their strength, | |
110 # for positioning. But many users just want to know that the | |
111 # device is connected to some bigasterisk AP. | |
112 aps = URIRef("http://bigasterisk.com/wifiAccessPoints") | |
113 age = time.time() - self.settings.poller.lastPollTime | |
114 if age > 10: | |
115 raise ValueError("poll data is stale. age=%s" % age) | |
116 | |
117 for dev in self.settings.poller.lastAddrs: | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
118 if not dev.get('connected'): |
805 | 119 continue |
120 uri = URIRef("http://bigasterisk.com/wifiDevice/%s" % dev['mac']) | |
121 g.add((uri, ROOM['macAddress'], Literal(dev['mac']))) | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
122 |
805 | 123 g.add((uri, ROOM['connected'], aps)) |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
124 if 'clientHostname' in dev: |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
125 g.add((uri, ROOM['wifiNetworkName'], Literal(dev['clientHostname']))) |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
126 if 'name' in dev: |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
127 g.add((uri, ROOM['deviceName'], Literal(dev['name']))) |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
128 if 'signal' in dev: |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
129 g.add((uri, ROOM['signalStrength'], Literal(dev['signal']))) |
805 | 130 |
131 self.set_header('Content-type', 'application/x-trig') | |
132 self.write(g.asTrig()) | |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
133 |
805 | 134 class Poller(object): |
135 def __init__(self, wifi, mongo): | |
136 self.wifi = wifi | |
137 self.mongo = mongo | |
138 self.lastAddrs = [] | |
139 self.lastWithSignal = [] | |
140 self.lastPollTime = 0 | |
141 | |
142 def assertCurrent(self): | |
143 dt = time.time() - self.lastPollTime | |
144 assert dt < 10, "last poll was %s sec ago" % dt | |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
145 |
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
146 @inlineCallbacks |
805 | 147 def poll(self): |
148 try: | |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
149 newAddrs = yield self.wifi.getPresentMacAddrs() |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
150 addDhcpData(newAddrs) |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
151 |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
152 newWithSignal = [a for a in newAddrs if a.get('connected')] |
805 | 153 |
154 actions = self.computeActions(newWithSignal) | |
155 for action in actions: | |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
156 log.info("action: %s", action) |
805 | 157 action['created'] = datetime.datetime.now(tz.gettz('UTC')) |
158 mongo.save(action) | |
159 try: | |
160 self.doEntranceMusic(action) | |
161 except Exception, e: | |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
162 log.error("entrancemusic error: %r", e) |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
163 |
805 | 164 self.lastWithSignal = newWithSignal |
855 | 165 if actions: # this doesn't currently include signal strength changes |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
166 fetch(reasoning + "immediateUpdate", |
857
1168b0cd90af
fix fetch calls in tomatowifi
drewp <drewp@bigasterisk.com>
parents:
856
diff
changeset
|
167 timeout=2, |
1168b0cd90af
fix fetch calls in tomatowifi
drewp <drewp@bigasterisk.com>
parents:
856
diff
changeset
|
168 headers={'user-agent': ['tomatoWifi']}).addErrback(log.warn) |
805 | 169 self.lastAddrs = newAddrs |
170 self.lastPollTime = time.time() | |
171 except Exception, e: | |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
172 log.error("poll error: %s\n%s", e, traceback.format_exc()) |
805 | 173 |
174 def computeActions(self, newWithSignal): | |
175 actions = [] | |
176 | |
177 def makeAction(addr, act): | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
178 d = dict(sensor="wifi", |
805 | 179 address=addr.get('mac'), |
180 name=addr.get('name'), | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
181 networkName=addr.get('clientHostname'), |
805 | 182 action=act) |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
183 if act == 'arrive' and 'ip' in addr: |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
184 # this won't cover the possible case that you get on |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
185 # wifi but don't have an ip yet. We'll record an |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
186 # action with no ip and then never record your ip. |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
187 d['ip'] = addr['ip'] |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
188 return d |
805 | 189 |
190 for addr in newWithSignal: | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
191 if addr['mac'] not in [r['mac'] for r in self.lastWithSignal]: |
805 | 192 actions.append(makeAction(addr, 'arrive')) |
193 | |
194 for addr in self.lastWithSignal: | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
195 if addr['mac'] not in [r['mac'] for r in newWithSignal]: |
805 | 196 actions.append(makeAction(addr, 'leave')) |
197 | |
198 return actions | |
199 | |
200 | |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
201 # these need to move out to their own service |
805 | 202 def doEntranceMusic(self, action): |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
203 import restkit, jsonlib |
805 | 204 dt = self.deltaSinceLastArrive(action['name']) |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
205 log.debug("dt=%s", dt) |
805 | 206 if dt > datetime.timedelta(hours=1): |
207 hub = restkit.Resource( | |
208 # PSHB not working yet; "http://bang:9030/" | |
209 "http://slash:9049/" | |
210 ) | |
211 action = action.copy() | |
212 del action['created'] | |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
213 del action['_id'] |
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
214 log.info("post to %s", hub) |
805 | 215 hub.post("visitorNet", payload=jsonlib.dumps(action)) |
216 | |
217 def deltaSinceLastArrive(self, name): | |
218 results = list(self.mongo.find({'name' : name}).sort('created', | |
219 DESCENDING).limit(1)) | |
220 if not results: | |
221 return datetime.timedelta.max | |
222 now = datetime.datetime.now(tz.gettz('UTC')) | |
223 last = results[0]['created'].replace(tzinfo=tz.gettz('UTC')) | |
224 return now - last | |
856
4b386fc51325
rewrite tomatowifi from restkit to cyclone httpclient
drewp <drewp@bigasterisk.com>
parents:
855
diff
changeset
|
225 |
805 | 226 |
227 if __name__ == '__main__': | |
228 config = { | |
229 'servePort' : 9070, | |
230 'pollFrequency' : 1/5, | |
231 } | |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
232 from twisted.python import log as twlog |
805 | 233 #log.startLogging(sys.stdout) |
806
85e50a597244
entrancemusic improve logging
drewp <drewp@bigasterisk.com>
parents:
805
diff
changeset
|
234 #log.setLevel(10) |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
235 #log.setLevel(logging.DEBUG) |
805 | 236 |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
237 mongo = Connection('bang', 27017, tz_aware=True)['visitor']['visitor'] |
805 | 238 |
239 wifi = Wifi() | |
240 poller = Poller(wifi, mongo) | |
241 task.LoopingCall(poller.poll).start(1/config['pollFrequency']) | |
242 | |
867
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
243 reactor.listenTCP(config['servePort'], |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
244 cyclone.web.Application( |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
245 [ |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
246 (r"/", Index), |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
247 (r'/json', Json), |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
248 (r'/graph', GraphHandler), |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
249 (r'/table', Table), |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
250 #(r'/activity', Activity), |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
251 ], |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
252 wifi=wifi, |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
253 poller=poller, |
d9bc9a82dcca
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp <drewp@bigasterisk.com>
parents:
857
diff
changeset
|
254 mongo=mongo)) |
805 | 255 reactor.run() |