annotate service/tomatoWifi/wifi.py @ 36:0ab069867c64

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