Mercurial > code > home > repos > homeauto
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) |