annotate service/tomatoWifi/wifi.py @ 51:d2842eedd56d

rewrite tomatowifi from restkit to cyclone httpclient Ignore-this: dc012ad1d539d3a1c37c779e63c8cf4b
author drewp@bigasterisk.com
date Mon, 31 Dec 2012 15:01:04 -0800
parents 0ab069867c64
children 875a37be1228
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
1 import re, ast, logging, socket
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
2 from twisted.internet.defer import inlineCallbacks, returnValue
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
3 from cyclone.httpclient import fetch
36
0ab069867c64 rdflib and jsonlib api updates
drewp@bigasterisk.com
parents: 0
diff changeset
4 from rdflib import Literal, Graph
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
5
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
6 log = logging.getLogger()
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
7
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
8 class Router(object):
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
9 def __repr__(self):
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
10 return repr(self.__dict__)
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
11
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
12 class Wifi(object):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
13 """
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
14 gather the users of wifi from the tomato routers
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
15 """
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
16 def __init__(self, tomatoConfig="/my/site/magma/tomato_config.js",
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
17 accessN3="/my/proj/openid_proxy/access.n3"):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
18
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
19 # ideally this would all be in the same rdf store, with int and
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
20 # ext versions of urls
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
21
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
22 txt = open(tomatoConfig).read().replace('\n', '')
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
23 self.knownMacAddr = jsValue(txt, 'knownMacAddr')
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
24 tomatoUrl = jsValue(txt, 'tomatoUrl')
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
25
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
26 g = Graph()
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
27 g.parse(accessN3, format="n3")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
28 repl = {'/tomato1/' : None, '/tomato2/' : None}
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
29 for k in repl:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
30 rows = list(g.query('''
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
31 PREFIX p: <http://bigasterisk.com/openid_proxy#>
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
32 SELECT ?prefix WHERE {
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
33 [
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
34 p:requestPrefix ?public;
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
35 p:proxyUrlPrefix ?prefix
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
36 ]
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
37 }''', initBindings={"public" : Literal(k)}))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
38 repl[k] = str(rows[0][0])
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
39
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
40 self.routers = []
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
41 for url in tomatoUrl:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
42 name = url
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
43 for k, v in repl.items():
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
44 url = url.replace(k, v)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
45
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
46 r = Router()
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
47 r.url = url.replace('root:admin@', '')
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
48 r.headers = {'Authorization': ['Basic cm9vdDphZG1pbg==']}
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
49 r.name = {'tomato1' : 'bigasterisk3',
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
50 'tomato2' : 'bigasterisk4'}[name.split('/')[1]]
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
51 self.routers.append(r)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
52
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
53 @inlineCallbacks
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
54 def getPresentMacAddrs(self):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
55 aboutIp = {}
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
56 byMac = {} # mac : [ip]
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
57
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
58 for router in self.routers:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
59 log.debug("GET %s", router)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
60 try:
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
61 data = yield fetch(router.url, headers=router.headers,
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
62 timeout=2)
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
63 except socket.error:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
64 log.warn("get on %s failed" % router)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
65 continue
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
66
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
67 for (ip, mac, iface) in jsValue(data, 'arplist'):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
68 aboutIp.setdefault(ip, {}).update(dict(
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
69 ip=ip,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
70 router=router.name,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
71 mac=mac,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
72 iface=iface,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
73 ))
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
74
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
75 byMac.setdefault(mac, set()).add(ip)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
76
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
77 for (name, ip, mac, lease) in jsValue(data, 'dhcpd_lease'):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
78 if lease.startswith('0 days, '):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
79 lease = lease[len('0 days, '):]
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
80 aboutIp.setdefault(ip, {}).update(dict(
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
81 router=router.name,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
82 rawName=name,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
83 mac=mac,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
84 lease=lease
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
85 ))
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
86
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
87 byMac.setdefault(mac, set()).add(ip)
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
88
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
89 for iface, mac, signal in jsValue(data, 'wldev'):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
90 matched = False
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
91 for addr in aboutIp.values():
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
92 if (addr['router'], addr['mac']) == (router.name, mac):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
93 addr.update(dict(signal=signal, iface=iface))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
94 matched = True
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
95 if not matched:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
96 aboutIp["mac-%s-%s" % (router, mac)] = dict(
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
97 router=router.name,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
98 mac=mac,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
99 signal=signal,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
100 )
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
101
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
102 ret = []
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
103 for addr in aboutIp.values():
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
104 if addr.get('ip') in ['192.168.1.1', '192.168.1.2', '192.168.0.2']:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
105 continue
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
106 try:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
107 addr['name'] = self.knownMacAddr[addr['mac']]
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
108 except KeyError:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
109 addr['name'] = addr.get('rawName')
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
110 if addr['name'] in [None, '*']:
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
111 addr['name'] = 'unknown'
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
112 ret.append(addr)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
113
51
d2842eedd56d rewrite tomatowifi from restkit to cyclone httpclient
drewp@bigasterisk.com
parents: 36
diff changeset
114 returnValue(ret)
0
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
115
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
116
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
117 def jsValue(js, variableName):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
118 # using literal_eval instead of json parser to handle the trailing commas
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
119 val = re.search(variableName + r'\s*=\s*(.*?);', js, re.DOTALL).group(1)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
120 return ast.literal_eval(val)