#!/usr/bin/env python import sys import os import re def scan(interface): '''Returns [{bssid, essid, enckey, channel, quality}, ...]''' if os.system("/sbin/ifconfig %s up" % interface) != 0: raise Exception('Failed bringing up interface') pipe = os.popen("/sbin/iwlist %s scan" % interface, 'r') result = [] hasap = False appattern = re.compile('Cell ([0-9]+)') patterns = {'bssid': re.compile('Address:\s?([0-9a-fA-F\:]{17})\s*$'), 'essid': re.compile('ESSID:\s?"([^"]*)"'), 'enckey': re.compile('Encryption key:\s?([A-Za-z]+)'), 'channel': re.compile('Channel:\s?([0-9]+)'), 'quality': re.compile('Quality[=:]([0-9]+)/100')} filters = {'bssid': lambda s: s.lower(), 'enckey': lambda s: s.lower() == 'on', 'channel': lambda s: int(s), 'quality': lambda s: int(s)} for line in pipe: if not appattern.search(line): if not hasap: continue else: if hasap and params['bssid'] != None: result.append(params) else: hasap = True params = {'bssid': None, 'essid': None, 'enckey': None, 'channel': None, 'quality': None} for key, pattern in patterns.items(): match = pattern.search(line) if match: value = match.group(1) if filters.has_key(key): value = filters[key](value) params[key] = value if hasap and params['bssid'] != None: result.append(params) return result def show_scanlist(lst): lst.sort(lambda a, b: cmp(a['quality'], b['quality'])) columns = [('bssid', 20), ('essid', 20), ('enckey', 8), ('channel', 9), ('quality', 9)] formats = {'enckey': lambda v: v and 'on' or 'off', 'quality': lambda v: "%d%%" % v} line = ' ' * 5 for name, width in columns: line += (' ' * width + name)[-width:] print line for n, params in enumerate(lst): line = '%2d ' % (n + 1) for name, width in columns: value = params[name] if formats.has_key(name): value = formats[name](value) line += (' ' * width + str(value))[-width:] print line def netsettings_toas(interface): os.system("/sbin/ifconfig %s 195.148.186.185 netmask 255.255.255.0" % interface) os.system("/sbin/route add default gateway 195.148.186.1 dev %s" % interface) open("/etc/resolv.conf", "w").write("nameserver 86.50.0.40\nnameserver 193.166.234.15\n") def netsettings_dhcp(interface): if os.system("/sbin/dhclient %s" % interface) != 0: raise Exception("DHCP failed") # TUT import urllib import re def tut_login(user, password): # Get posturl loginpage = urllib.urlopen("https://signin.public.tut.fi/").read() posturl = re.search('''
''', loginpage).group(1) posturl = "https://signin.public.tut.fi/" + posturl # Login params = urllib.urlencode({'user': user, 'pass': password, 'login': 'login'}) data = urllib.urlopen(posturl, params).read() return 'Logged in' in data def netsettings_tut(interface): user = 'aimonen' password = open("/etc/tutpass", "r").readline().strip() netsettings_dhcp(interface) if not tut_login(user, password): raise Exception("TUT login failed") def set_wlanparam(interface, param, value): status = os.system("/sbin/iwconfig %s %s %s" % (interface, param, value)) if status != 0: raise Exception('Failed setting wlan parameter') wepkeys = { .. } if __name__ == '__main__': interface = 'ra0' scanresult = scan(interface) show_scanlist(scanresult) print "" while True: sid = raw_input("Select AP: ") try: params = scanresult[int(sid) - 1] break except IndexError: continue except ValueError: continue if params['enckey'] and not wepkeys.has_key(params['essid']): print "No wep key for %s" % params['essid'] sys.exit(1) print "Connecting to %s" % params['bssid'] os.system("killall -q dhclient") if params['enckey']: set_wlanparam(interface, 'key', wepkeys[params['essid']]) else: set_wlanparam(interface, 'key', 'off') set_wlanparam(interface, 'ap', params['bssid']) if params['essid'] == 'luola': netsettings_toas(interface) elif params['essid'] == 'TUT': netsettings_tut(interface) else: netsettings_dhcp(interface)