Mercurial > code > home > repos > homeauto
annotate service/wifi/wifi.py @ 421:47d7dd31bb2c
port to py3
Ignore-this: e1a2e6bb730111e76f5a5dd2366d498a
author | drewp@bigasterisk.com |
---|---|
date | Sat, 30 Mar 2019 18:27:17 -0700 |
parents | service/wifi/tomatoWifi.py@a530d9c5b280 |
children | 19460b3f7baf |
rev | line source |
---|---|
0 | 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 | |
162 | 12 |
0 | 13 """ |
14 from __future__ import division | |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
15 import sys, cyclone.web, json, traceback, time, pystache, datetime, logging |
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
16 from cyclone.httpclient import fetch |
383
8f5a16a55f64
various docker setups and build fixes
drewp@bigasterisk.com
parents:
340
diff
changeset
|
17 |
0 | 18 from dateutil import tz |
19 from twisted.internet import reactor, task | |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
20 from twisted.internet.defer import inlineCallbacks |
189 | 21 import docopt |
309 | 22 from influxdb import InfluxDBClient |
417 | 23 from pymongo import MongoClient as Connection, DESCENDING |
340 | 24 from rdflib import Namespace, Literal, URIRef, ConjunctiveGraph |
383
8f5a16a55f64
various docker setups and build fixes
drewp@bigasterisk.com
parents:
340
diff
changeset
|
25 |
421 | 26 from scrape import Wifi |
383
8f5a16a55f64
various docker setups and build fixes
drewp@bigasterisk.com
parents:
340
diff
changeset
|
27 |
340 | 28 from patchablegraph import PatchableGraph, CycloneGraphEventsHandler, CycloneGraphHandler |
383
8f5a16a55f64
various docker setups and build fixes
drewp@bigasterisk.com
parents:
340
diff
changeset
|
29 |
0 | 30 from cycloneerr import PrettyErrorHandler |
1 | 31 from logsetup import log |
0 | 32 |
36 | 33 |
0 | 34 DEV = Namespace("http://projects.bigasterisk.com/device/") |
35 ROOM = Namespace("http://projects.bigasterisk.com/room/") | |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
36 reasoning = "http://bang:9071/" |
1 | 37 |
0 | 38 class Index(PrettyErrorHandler, cyclone.web.RequestHandler): |
39 def get(self): | |
40 | |
41 age = time.time() - self.settings.poller.lastPollTime | |
42 if age > 10: | |
43 raise ValueError("poll data is stale. age=%s" % age) | |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
44 |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
45 self.set_header("Content-Type", "text/html") |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
46 self.write(open("index.html").read()) |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
47 |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
48 def whenConnected(mongo, macThatIsNowConnected): |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
49 lastArrive = None |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
50 for ev in mongo.find({'address': macThatIsNowConnected.upper()}, |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
51 sort=[('created', -1)], |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
52 max_scan=100000): |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
53 if ev['action'] == 'arrive': |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
54 lastArrive = ev |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
55 if ev['action'] == 'leave': |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
56 break |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
57 if lastArrive is None: |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
58 raise ValueError("no past arrivals") |
0 | 59 |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
60 return lastArrive['created'] |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
61 |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
62 def connectedAgoString(conn): |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
63 return web.utils.datestr( |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
64 conn.astimezone(tz.tzutc()).replace(tzinfo=None)) |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
65 |
0 | 66 class Table(PrettyErrorHandler, cyclone.web.RequestHandler): |
67 def get(self): | |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
68 def rowDict(row): |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
69 row['cls'] = "signal" if row.get('connected') else "nosignal" |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
70 if 'name' not in row: |
74
bca6d6c63bdc
handle wifi users with no clientHostname
drewp@bigasterisk.com
parents:
62
diff
changeset
|
71 row['name'] = row.get('clientHostname', '-') |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
72 if 'signal' not in row: |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
73 row['signal'] = 'yes' if row.get('connected') else 'no' |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
74 |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
75 try: |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
76 conn = whenConnected(self.settings.mongo, row.get('mac', '??')) |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
77 row['connectedAgo'] = connectedAgoString(conn) |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
78 except ValueError: |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
79 row['connectedAgo'] = 'yes' if row.get('connected') else '' |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
80 row['router'] = row.get('ssid', '') |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
81 return row |
0 | 82 |
83 self.set_header("Content-Type", "application/xhtml+xml") | |
84 self.write(pystache.render( | |
85 open("table.mustache").read(), | |
86 dict( | |
87 rows=sorted(map(rowDict, self.settings.poller.lastAddrs), | |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
88 key=lambda a: (not a.get('connected'), |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
89 a.get('name')))))) |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
90 |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
91 |
0 | 92 class Json(PrettyErrorHandler, cyclone.web.RequestHandler): |
93 def get(self): | |
94 self.set_header("Content-Type", "application/json") | |
95 age = time.time() - self.settings.poller.lastPollTime | |
96 if age > 10: | |
97 raise ValueError("poll data is stale. age=%s" % age) | |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
98 self.write(json.dumps({"wifi" : self.settings.poller.lastAddrs, |
0 | 99 "dataAge" : age})) |
100 | |
101 class Poller(object): | |
102 def __init__(self, wifi, mongo): | |
103 self.wifi = wifi | |
104 self.mongo = mongo | |
105 self.lastAddrs = [] | |
106 self.lastWithSignal = [] | |
107 self.lastPollTime = 0 | |
108 | |
109 def assertCurrent(self): | |
110 dt = time.time() - self.lastPollTime | |
111 assert dt < 10, "last poll was %s sec ago" % dt | |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
112 |
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
113 @inlineCallbacks |
340 | 114 def poll(self): |
309 | 115 now = int(time.time()) |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
116 |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
117 # UVA mode: |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
118 addDhcpData = lambda *args: None |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
119 |
0 | 120 try: |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
121 newAddrs = yield self.wifi.getPresentMacAddrs() |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
122 addDhcpData(newAddrs) |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
123 |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
124 newWithSignal = [a for a in newAddrs if a.get('connected')] |
0 | 125 |
126 actions = self.computeActions(newWithSignal) | |
309 | 127 points = [] |
0 | 128 for action in actions: |
1 | 129 log.info("action: %s", action) |
0 | 130 action['created'] = datetime.datetime.now(tz.gettz('UTC')) |
131 mongo.save(action) | |
309 | 132 points.append( |
133 self.influxPoint(now, action['address'].lower(), | |
134 1 if action['action'] == 'arrive' else 0)) | |
0 | 135 try: |
136 self.doEntranceMusic(action) | |
421 | 137 except Exception as e: |
1 | 138 log.error("entrancemusic error: %r", e) |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
139 |
309 | 140 if now // 3600 > self.lastPollTime // 3600: |
141 log.info('hourly writes') | |
142 for addr in newWithSignal: | |
143 points.append(self.influxPoint(now, addr['mac'].lower(), 1)) | |
144 | |
145 influx.write_points(points, time_precision='s') | |
0 | 146 self.lastWithSignal = newWithSignal |
50 | 147 if actions: # this doesn't currently include signal strength changes |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
148 fetch(reasoning + "immediateUpdate", |
279 | 149 method='PUT', |
52 | 150 timeout=2, |
151 headers={'user-agent': ['tomatoWifi']}).addErrback(log.warn) | |
0 | 152 self.lastAddrs = newAddrs |
309 | 153 self.lastPollTime = now |
340 | 154 |
155 self.updateGraph(masterGraph) | |
421 | 156 except Exception as e: |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
157 log.error("poll error: %r\n%s", e, traceback.format_exc()) |
0 | 158 |
309 | 159 def influxPoint(self, now, address, value): |
160 return { | |
161 'measurement': 'presence', | |
162 'tags': {'sensor': 'wifi', 'address': address,}, | |
163 'fields': {'value': value}, | |
164 'time': now, | |
165 } | |
166 | |
0 | 167 def computeActions(self, newWithSignal): |
168 actions = [] | |
169 | |
170 def makeAction(addr, act): | |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
171 d = dict(sensor="wifi", |
175
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
172 address=addr.get('mac').upper(), # mongo data is legacy uppercase |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
173 name=addr.get('name'), |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
174 networkName=addr.get('clientHostname'), |
c81a451f9b26
rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents:
162
diff
changeset
|
175 action=act) |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
176 if act == 'arrive' and 'ip' in addr: |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
177 # this won't cover the possible case that you get on |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
178 # wifi but don't have an ip yet. We'll record an |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
179 # action with no ip and then never record your ip. |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
180 d['ip'] = addr['ip'] |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
181 return d |
0 | 182 |
183 for addr in newWithSignal: | |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
184 if addr['mac'] not in [r['mac'] for r in self.lastWithSignal]: |
0 | 185 actions.append(makeAction(addr, 'arrive')) |
186 | |
187 for addr in self.lastWithSignal: | |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
188 if addr['mac'] not in [r['mac'] for r in newWithSignal]: |
0 | 189 actions.append(makeAction(addr, 'leave')) |
190 | |
191 return actions | |
192 | |
193 | |
1 | 194 # these need to move out to their own service |
0 | 195 def doEntranceMusic(self, action): |
383
8f5a16a55f64
various docker setups and build fixes
drewp@bigasterisk.com
parents:
340
diff
changeset
|
196 import restkit, json |
0 | 197 dt = self.deltaSinceLastArrive(action['name']) |
1 | 198 log.debug("dt=%s", dt) |
0 | 199 if dt > datetime.timedelta(hours=1): |
200 hub = restkit.Resource( | |
201 # PSHB not working yet; "http://bang:9030/" | |
202 "http://slash:9049/" | |
203 ) | |
204 action = action.copy() | |
205 del action['created'] | |
1 | 206 del action['_id'] |
207 log.info("post to %s", hub) | |
383
8f5a16a55f64
various docker setups and build fixes
drewp@bigasterisk.com
parents:
340
diff
changeset
|
208 hub.post("visitorNet", payload=json.dumps(action)) |
0 | 209 |
210 def deltaSinceLastArrive(self, name): | |
211 results = list(self.mongo.find({'name' : name}).sort('created', | |
212 DESCENDING).limit(1)) | |
213 if not results: | |
214 return datetime.timedelta.max | |
215 now = datetime.datetime.now(tz.gettz('UTC')) | |
216 last = results[0]['created'].replace(tzinfo=tz.gettz('UTC')) | |
217 return now - last | |
51
d2842eedd56d
rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents:
50
diff
changeset
|
218 |
340 | 219 def updateGraph(self, masterGraph): |
220 | |
221 g = ConjunctiveGraph() | |
222 ctx = DEV['wifi'] | |
223 | |
224 # someday i may also record specific AP and their strength, | |
225 # for positioning. But many users just want to know that the | |
226 # device is connected to some bigasterisk AP. | |
227 age = time.time() - self.lastPollTime | |
228 if age > 10: | |
229 raise ValueError("poll data is stale. age=%s" % age) | |
230 | |
231 for dev in self.lastAddrs: | |
232 if not dev.get('connected'): | |
233 continue | |
234 uri = URIRef("http://bigasterisk.com/mac/%s" % dev['mac'].lower()) | |
235 g.add((uri, ROOM['macAddress'], Literal(dev['mac'].lower()), ctx)) | |
236 | |
237 g.add((uri, ROOM['connected'], { | |
238 'wireless': URIRef("http://bigasterisk.com/wifiAccessPoints"), | |
239 '2.4G': URIRef("http://bigasterisk.com/wifiAccessPoints"), | |
240 '5G': URIRef("http://bigasterisk.com/wifiAccessPoints"), | |
418 | 241 '-': URIRef("http://bigasterisk.com/wifiUnknownConnectionType"), |
242 'Unknown': URIRef("http://bigasterisk.com/wifiUnknownConnectionType"), | |
340 | 243 'wired': URIRef("http://bigasterisk.com/houseOpenNet")}[dev['contype']], ctx)) |
244 if 'clientHostname' in dev and dev['clientHostname']: | |
245 g.add((uri, ROOM['wifiNetworkName'], Literal(dev['clientHostname']), ctx)) | |
246 if 'name' in dev and dev['name']: | |
247 g.add((uri, ROOM['deviceName'], Literal(dev['name']), ctx)) | |
248 if 'signal' in dev: | |
249 g.add((uri, ROOM['signalStrength'], Literal(dev['signal']), ctx)) | |
250 if 'model' in dev: | |
251 g.add((uri, ROOM['networkModel'], Literal(dev['model']), ctx)) | |
252 try: | |
253 conn = whenConnected(mongo, dev['mac']) | |
254 except ValueError: | |
255 traceback.print_exc() | |
256 pass | |
257 else: | |
258 g.add((uri, ROOM['connectedAgo'], | |
259 Literal(connectedAgoString(conn)), ctx)) | |
260 g.add((uri, ROOM['connected'], Literal(conn), ctx)) | |
261 masterGraph.setToGraph(g) | |
262 | |
0 | 263 |
264 if __name__ == '__main__': | |
189 | 265 args = docopt.docopt(''' |
266 Usage: | |
267 tomatoWifi [options] | |
268 | |
269 Options: | |
270 -v, --verbose more logging | |
271 --port=<n> serve on port [default: 9070] | |
272 --poll=<freq> poll frequency [default: .2] | |
273 ''') | |
274 if args['--verbose']: | |
275 from twisted.python import log as twlog | |
276 twlog.startLogging(sys.stdout) | |
277 log.setLevel(10) | |
278 log.setLevel(logging.DEBUG) | |
0 | 279 |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
280 mongo = Connection('bang', 27017, tz_aware=True)['visitor']['visitor'] |
309 | 281 influx = InfluxDBClient('bang', 9060, 'root', 'root', 'main') |
0 | 282 |
340 | 283 masterGraph = PatchableGraph() |
0 | 284 wifi = Wifi() |
285 poller = Poller(wifi, mongo) | |
189 | 286 task.LoopingCall(poller.poll).start(1/float(args['--poll'])) |
0 | 287 |
189 | 288 reactor.listenTCP(int(args['--port']), |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
289 cyclone.web.Application( |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
290 [ |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
291 (r"/", Index), |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
292 (r'/json', Json), |
340 | 293 (r'/graph', CycloneGraphHandler, {'masterGraph': masterGraph}), |
294 (r'/graph/events', CycloneGraphEventsHandler, {'masterGraph': masterGraph}), | |
62
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
295 (r'/table', Table), |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
296 #(r'/activity', Activity), |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
297 ], |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
298 wifi=wifi, |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
299 poller=poller, |
f8cc3d1baa85
redo wifi scraper to work with zyxel router report page too. add last connected time (from mongo) to web table
drewp@bigasterisk.com
parents:
52
diff
changeset
|
300 mongo=mongo)) |
421 | 301 import twisted; print('twisted', twisted.__version__) |
0 | 302 reactor.run() |