annotate service/wifi/wifi.py @ 1728:81aa0873b48d

port to skaffold, starlette, etc
author drewp@bigasterisk.com
date Fri, 30 Jun 2023 22:03:55 -0700
parents f88ff1021ee0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
1 """
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
2 scrape the tomato router status pages to see who's connected to the
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
3 wifi access points. Includes leases that aren't currently connected.
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
4
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
5 Returns:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
6 json listing (for magma page)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
7 rdf graph (for reasoning)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
8 activity stream, when we start saving history
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
10 Todo: this should be the one polling and writing to mongo, not entrancemusic
162
bb70eaa45666 whitespace
drewp@bigasterisk.com
parents: 161
diff changeset
11
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
12 """
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
13 import datetime
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
14 import logging
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
15 import time
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
16 import traceback
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
17 from dataclasses import dataclass
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
18 from typing import List
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
19
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
20 import background_loop
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
21 from dateutil import tz
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
22 from patchablegraph import PatchableGraph
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
23 from patchablegraph.handler import GraphEvents, StaticGraph
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
24 from prometheus_client import Counter, Gauge, Summary
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
25 from pymongo import DESCENDING
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
26 from pymongo import MongoClient as Connection
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
27 from pymongo.collection import Collection
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
28 from rdflib import RDF, ConjunctiveGraph, Literal, Namespace
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
29 from starlette.applications import Starlette
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
30 from starlette.routing import Route
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
31 from starlette_exporter import PrometheusMiddleware, handle_metrics
383
8f5a16a55f64 various docker setups and build fixes
drewp@bigasterisk.com
parents: 340
diff changeset
32
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
33 from scrape import SeenNode, Wifi
36
0ab069867c64 rdflib and jsonlib api updates
drewp@bigasterisk.com
parents: 1
diff changeset
34
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
35 logging.basicConfig()
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
36 log = logging.getLogger()
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
37
422
19460b3f7baf factor out some URI generation
drewp@bigasterisk.com
parents: 421
diff changeset
38 AST = Namespace("http://bigasterisk.com/")
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
39 DEV = Namespace("http://projects.bigasterisk.com/device/")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
40 ROOM = Namespace("http://projects.bigasterisk.com/room/")
1
26a6cf58743d entrancemusic improve logging
drewp@bigasterisk.com
parents: 0
diff changeset
41
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
42 # class Index(PrettyErrorHandler, cyclone.web.RequestHandler):
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
43
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
44 # def get(self):
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
45 # age = time.time() - self.settings.poller.lastPollTime
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
46 # if age > 10:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
47 # raise ValueError("poll data is stale. age=%s" % age)
659
ea9ed11598b0 remote suspend, wifi group arg
drewp@bigasterisk.com
parents: 566
diff changeset
48
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
49 # self.set_header("Content-Type", "text/html")
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
50 # self.write(open("index.html").read())
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 50
diff changeset
51
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
52
175
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
53 def whenConnected(mongo, macThatIsNowConnected):
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
54 lastArrive = None
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
55 for ev in mongo.find({'address': macThatIsNowConnected.upper()}, sort=[('created', -1)], max_time_ms=5000):
175
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
56 if ev['action'] == 'arrive':
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
57 lastArrive = ev
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
58 if ev['action'] == 'leave':
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
59 break
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
60 if lastArrive is None:
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
61 raise ValueError("no past arrivals")
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
62
175
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
63 return lastArrive['created']
c81a451f9b26 rewrites for better graph export, removal of dhcp reader
drewp@bigasterisk.com
parents: 162
diff changeset
64
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
65
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
66 # class Table(PrettyErrorHandler, cyclone.web.RequestHandler):
659
ea9ed11598b0 remote suspend, wifi group arg
drewp@bigasterisk.com
parents: 566
diff changeset
67
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
68 # def get(self):
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
69
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
70 # def rowDict(row):
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
71 # row['cls'] = "signal" if row.get('connected') else "nosignal"
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
72 # if 'name' not in row:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
73 # row['name'] = row.get('clientHostname', '-')
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
74 # if 'signal' not in row:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
75 # 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
76
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
77 # try:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
78 # conn = whenConnected(self.settings.mongo, row.get('mac', '??'))
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
79 # row['connectedAgo'] = connectedAgoString(conn)
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
80 # except ValueError:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
81 # row['connectedAgo'] = 'yes' if row.get('connected') else ''
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
82 # row['router'] = row.get('ssid', '')
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
83 # return row
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
84
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
85 # self.set_header("Content-Type", "application/xhtml+xml")
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
86 # self.write(
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
87 # pystache.render(
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
88 # open("table.mustache").read(),
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
89 # dict(rows=sorted(map(rowDict, self.settings.poller.lastAddrs),
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
90 # key=lambda a: (not a.get('connected'), a.get('name'))))))
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 50
diff changeset
91
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
92 # class Json(PrettyErrorHandler, cyclone.web.RequestHandler):
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
93
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
94 # def get(self):
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
95 # self.set_header("Content-Type", "application/json")
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
96 # age = time.time() - self.settings.poller.lastPollTime
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
97 # if age > 10:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
98 # raise ValueError("poll data is stale. age=%s" % age)
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
99 # self.write(json.dumps({"wifi": self.settings.poller.lastAddrs, "dataAge": age}))
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
100
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
101 POLL = Summary('poll', 'Time in HTTP poll requests')
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
102 POLL_SUCCESSES = Counter('poll_successes', 'poll success count')
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
103 POLL_ERRORS = Counter('poll_errors', 'poll error count')
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
104 CURRENTLY_ON_WIFI = Gauge('currently_on_wifi', 'current nodes known to wifi router (some may be wired)')
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
105 MAC_ON_WIFI = Gauge('connected', 'mac addr is currently connected', ['mac'])
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
106
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
107
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
108 @dataclass
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
109 class Poller:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
110 wifi: Wifi
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
111 mongo: Collection
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
112 masterGraph: PatchableGraph
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
113
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
114 def __post_init__(self):
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
115 self.lastAddrs = [] # List[SeenNode]
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
116 self.lastWithSignal = []
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
117 self.lastPollTime = 0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
118
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
119 async def poll(self, first_run):
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
120 with POLL.time():
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
121 try:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
122 newAddrs = await self.wifi.getPresentMacAddrs()
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
123 self.onNodes(newAddrs)
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
124 POLL_SUCCESSES.inc()
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
125 except Exception as e:
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
126 log.error("poll error: %r\n%s", e, traceback.format_exc())
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
127 POLL_ERRORS.inc()
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
128
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
129 def onNodes(self, newAddrs: List[SeenNode]):
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
130 now = int(time.time())
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
131 newWithSignal = [a for a in newAddrs if a.connected]
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
132 CURRENTLY_ON_WIFI.set(len(newWithSignal))
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
133
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
134 actions = self.computeActions(newWithSignal)
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
135 for action in actions:
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
136 log.info("action: %s", action)
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
137 action['created'] = datetime.datetime.now(tz.gettz('UTC'))
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
138 self.mongo.insert_one(action)
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
139 MAC_ON_WIFI.labels(mac=action['address'].lower()).set(1 if action['action'] == 'arrive' else 0)
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
140 if now // 3600 > self.lastPollTime // 3600:
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
141 log.info('hourly writes')
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
142 for addr in newWithSignal:
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
143 MAC_ON_WIFI.labels(mac=addr.mac.lower()).set(1)
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
144
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
145 self.lastWithSignal = newWithSignal
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
146 self.lastAddrs = newAddrs
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
147 self.lastPollTime = now
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
148
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
149 self.updateGraph(self.masterGraph)
566
c3d06c350e24 no more immediateUpdate since we push patch events now. and the code was broken for py3 anyway
drewp@bigasterisk.com
parents: 564
diff changeset
150
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
151 def computeActions(self, newWithSignal):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
152 actions = []
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
153
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
154 def makeAction(addr: SeenNode, act: str):
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
155 d = dict(
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
156 sensor="wifi",
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
157 address=addr.mac.upper(), # mongo data is legacy uppercase
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
158 action=act)
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
159 if act == 'arrive':
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
160 # 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
161 # 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
162 # action with no ip and then never record your ip.
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
163 d['ip'] = addr.ip
659
ea9ed11598b0 remote suspend, wifi group arg
drewp@bigasterisk.com
parents: 566
diff changeset
164 return d
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
165
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
166 for addr in newWithSignal:
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
167 if addr.mac not in [r.mac for r in self.lastWithSignal]:
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
168 actions.append(makeAction(addr, 'arrive'))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
169
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
170 for addr in self.lastWithSignal:
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
171 if addr.mac not in [r.mac for r in newWithSignal]:
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
172 actions.append(makeAction(addr, 'leave'))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
173
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
174 return actions
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
175
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
176 def deltaSinceLastArrive(self, name):
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
177 results = list(self.mongo.find({'name': name}).sort('created', DESCENDING).limit(1))
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
178 if not results:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
179 return datetime.timedelta.max
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
180 now = datetime.datetime.now(tz.gettz('UTC'))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
181 last = results[0]['created'].replace(tzinfo=tz.gettz('UTC'))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
182 return now - last
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 50
diff changeset
183
340
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
184 def updateGraph(self, masterGraph):
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
185 g = ConjunctiveGraph()
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
186 ctx = DEV['wifi']
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
187
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
188 # someday i may also record specific AP and their strength,
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
189 # for positioning. But many users just want to know that the
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
190 # device is connected to some bigasterisk AP.
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
191 age = time.time() - self.lastPollTime
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
192 if age > 10:
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
193 raise ValueError("poll data is stale. age=%s" % age)
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
194
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
195 for dev in self.lastAddrs:
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
196 if not dev.connected:
340
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
197 continue
427
db031d9ec28e don't use 'connected' for time and for network. add rdf:type.
drewp@bigasterisk.com
parents: 423
diff changeset
198 g.add((dev.uri, RDF.type, ROOM['NetworkedDevice'], ctx))
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
199 g.add((dev.uri, ROOM['macAddress'], Literal(dev.mac), ctx))
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
200 g.add((dev.uri, ROOM['ipAddress'], Literal(dev.ip), ctx))
340
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
201
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
202 for s, p, o in dev.stmts:
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
203 g.add((s, p, o, ctx))
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
204
340
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
205 try:
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
206 conn = whenConnected(self.mongo, dev.mac)
340
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
207 except ValueError:
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
208 traceback.print_exc()
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
209 pass
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
210 else:
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
211 g.add((dev.uri, ROOM['connected'], Literal(conn), ctx))
340
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
212 masterGraph.setToGraph(g)
70954bd426be wifi now uses PatchableGraph
drewp@bigasterisk.com
parents: 309
diff changeset
213
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
214
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
215 # class RemoteSuspend(PrettyErrorHandler, cyclone.web.RequestHandler):
659
ea9ed11598b0 remote suspend, wifi group arg
drewp@bigasterisk.com
parents: 566
diff changeset
216
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
217 # def post(self):
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
218 # # windows is running shutter (https://www.den4b.com/products/shutter)
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
219 # fetch('http://DESKTOP-GOU4AC4:8011/action', postdata={'id': 'Sleep'})
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
220
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
221
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
222 def main():
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
223 log.setLevel(logging.INFO)
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
224 masterGraph = PatchableGraph()
1679
f88ff1021ee0 checkpoint service/wifi
drewp@bigasterisk.com
parents: 722
diff changeset
225 mongo = Connection('mongodb.default.svc.cluster.local', 27017, tz_aware=True)['visitor']['visitor']
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
226
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
227 config = ConjunctiveGraph()
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
228 config.parse(open('private_config.n3'), format='n3')
659
ea9ed11598b0 remote suspend, wifi group arg
drewp@bigasterisk.com
parents: 566
diff changeset
229
423
e0703c7824e9 very big rewrite. py3; orbi-only for now; n3 config file; delete or move out dead code
drewp@bigasterisk.com
parents: 422
diff changeset
230 wifi = Wifi(config)
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
231 poller = Poller(wifi, mongo, masterGraph)
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
232 loop = background_loop.loop_forever(poller.poll, 10)
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
233
1728
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
234 app = Starlette(routes=[
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
235 Route('/graph/wifi', StaticGraph(masterGraph)),
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
236 Route('/graph/wifi/events', GraphEvents(masterGraph)),
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
237 ],)
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
238
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
239 app.add_middleware(PrometheusMiddleware, app_name='environment')
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
240 app.add_route("/metrics", handle_metrics)
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
241 return app
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
242
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
243
81aa0873b48d port to skaffold, starlette, etc
drewp@bigasterisk.com
parents: 1679
diff changeset
244 app = main()