]> andersk Git - routeradvert-scan.git/blobdiff - routeradvert-scan.py
Move to -c rcc-auto.
[routeradvert-scan.git] / routeradvert-scan.py
index b7c592eec90cba1b298d271984675c736fb3fc17..1e1f62b197a67db0c6bc564565282328ec8b0a14 100755 (executable)
 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
+import BeautifulSoup
 import errno
 import math
+import mechanize
 import os
 import re
 import signal
@@ -34,13 +36,15 @@ import socket
 import subprocess
 import sys
 import time
+import urllib
 
 # configuration
 interface = 'eth1'
-timeout = 30
-zclass = 'andersk-auto'
+timeout = 120
+zclass = 'rcc-auto'
 zinstance = '6to4'
 zsig = '%s on %s' % (sys.argv[0], socket.gethostname())
+cert_file = os.path.join(os.path.dirname(__file__), 'sipbcert.pem')
 # end configuration
 
 mac_re = re.compile(r'^(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$')
@@ -48,15 +52,44 @@ mac_re = re.compile(r'^(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$')
 seen_macs = {}
 
 def msg(m):
-    os.spawnlp(os.P_WAIT, 'zwrite', 'zwrite', '-q', '-d', '-c', zclass, '-i', zinstance, '-s', zsig, '-m', m)
+    os.spawnlp(os.P_WAIT, 'zwrite', 'zwrite', '-q', '-d', '-c', zclass, '-i', zinstance, '-s', zsig, '-O', 'auto', '-m', m)
+
+br = mechanize.Browser()
+br.add_client_certificate("https://nic.mit.edu", cert_file, cert_file)
+
+def get_owner(mac):
+    for lookup in ('host', 'less'):
+        try:
+            data = urllib.urlencode({
+                        'action': 'Lookup Host',
+                        'lookup': lookup,
+                        'mac': mac
+                        })
+            br.open('https://nic.mit.edu/bin/dynareg',
+                    data)
+            soup = BeautifulSoup.BeautifulSoup(br.response().read())
+            for tag in soup.findAll('td'):
+                if tag.string == 'owner:':
+                    return tag.nextSibling.string or \
+                        tag.nextSibling.contents[0]['value']
+        except:
+            pass
+    return None
+
+def show_mac(mac, (t, owner)):
+    return '%s (%s)' % (mac, 'unknown owner' if owner is None else owner)
+
+def show_macs():
+    return ', '.join(show_mac(mac, v) for mac, v in seen_macs.iteritems())
 
 def check_gone():
     now = time.time()
     next = None
-    for (mac, t) in seen_macs.items():
+    for (mac, (t, owner)) in seen_macs.items():
         if t < now:
             del seen_macs[mac]
-            msg('Gone 6to4 router: %s\nCurrent 6to4 routers: %s' % (mac, seen_macs.keys()))
+            msg('Gone 6to4 router: %s\nCurrent 6to4 routers: %s' %
+                (show_mac(mac, (t, owner)), show_macs()))
         elif next is None or next > t:
             next = t
     if next is None:
@@ -64,8 +97,6 @@ def check_gone():
     else:
         signal.alarm(int(math.ceil(next - now)))
 
-msg('Starting %s' % sys.argv[0])
-
 signal.signal(signal.SIGALRM, lambda signum, frame: check_gone())
 
 p = subprocess.Popen(['tcpdump', '-elnp', '-i', interface, 'icmp6 and (ip6[40] = 134)'], stdout=subprocess.PIPE)
@@ -86,9 +117,12 @@ while True:
         mac = words[1]
         t = time.time() + timeout
         if mac in seen_macs:
-            seen_macs[mac] = t
+            seen_macs[mac][0] = t
         else:
-            seen_macs[mac] = t
-            msg('New 6to4 router: %s\n%s\nCurrent 6to4 routers: %s' % (mac, line.rstrip('\n'), seen_macs.keys()))
+            seen_macs[mac] = [t, get_owner(mac)]
+            msg('New 6to4 router: %s\n%s\nCurrent 6to4 routers: %s' %
+                (show_mac(mac, seen_macs[mac]),
+                 line.rstrip('\n'),
+                 show_macs()))
     else:
         print >>sys.stderr, 'Unrecognized line: ', line.rstrip('\n')
This page took 0.681554 seconds and 4 git commands to generate.