comparison service/tomatoWifi/wifi.py @ 0:6fd208b97616

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