#!/usr/bin/env python import sys import os import re import time import socket def bringup(interface): if os.system("/sbin/ifconfig %s up" % interface) != 0: os.system("/sbin/modprobe iwlagn; sleep 1") else: return os.system("/sbin/route del default dev tap0") if os.system("/sbin/ifconfig %s up" % interface) != 0: raise Exception('Failed bringing up interface') def scan(interface): '''Returns [{bssid, essid, enckey, channel, quality}, ...]''' bringup(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]+)/[0-9]+')} 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': 0, 'quality': 0} 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") # Sivari def netsettings_sivari(interface): netsettings_dhcp(interface) socket.setdefaulttimeout(2.0) params = urllib.urlencode({'f_user': '200808244', 'f_pass': ''}) try: data = urllib.urlopen('https://10.2.0.250:444/cgi-bin/hslogin.cgi', params).read() if 'Success' not in data: print "Sivari login failed" except Exception, e: print e open("/etc/resolv.conf", "w").write("nameserver 192.168.0.1\n") if os.system("/sbin/ifup tap0; /sbin/route add 80.221.159.18 gw 10.2.0.1 dev %s ; /sbin/route add default gw 192.168.0.1 dev tap0 ; /sbin/route del default dev %s" % (interface, interface)) != 0: raise Exception("VPN failed") def netsettings_wpa(interface): status = os.system("/sbin/wpa_supplicant -i%s -Dwext -B -c /etc/wpa_supplicant.conf" % interface) if status != 0: raise Exception("WPA supplicant failed") print "Setting WPA password" password = open("/etc/tutpass", "r").readline().strip() status = os.system("/sbin/wpa_cli password LANGATON-WPA %s" % password) if status != 0: raise Exception("WPA password 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') def asknet(scanresult): show_scanlist(scanresult) print "" while True: sid = raw_input("Select AP: ") try: return scanresult[int(sid) - 1] except IndexError: continue except ValueError: continue def autonet(scanresult): scanresult.sort(key = lambda a: a['quality'], reverse = True) prefer = ['luola', 'mursu', 'murmeli', 'murmeli-WPA', 'TUT', 'Sivari-wlan'] for essid in prefer: for params in scanresult: if params['essid'] == essid: return params return None wepkeys = { .. } if __name__ == '__main__': interface = 'wlan0' scanresult = scan(interface) if '--mursu' in sys.argv: scanresult.append({'essid': 'mursu', 'bssid': '00:18:e7:47:88:30', 'quality': 80, 'enckey': True, 'channel': 0}) if '--auto' in sys.argv: params = autonet(scanresult) else: params = asknet(scanresult) wpa = 'WPA' in params['essid'] if params['enckey'] and not wepkeys.has_key(params['essid']) and not wpa: print "No wep key for %s" % params['essid'] sys.exit(1) print "Connecting to %s" % params['bssid'] os.system("killall -q dhclient") os.system("killall -q wpa_supplicant") if params['enckey'] and not wpa: set_wlanparam(interface, 'key', wepkeys[params['essid']]) else: set_wlanparam(interface, 'key', 'off') # set_wlanparam(interface, 'ap', params['bssid']) set_wlanparam(interface, 'essid', params['essid']) set_wlanparam(interface, 'ap', 'any') if params['essid'] == 'luola': netsettings_toas(interface) elif params['essid'] == 'murmeli-WPA': netsettings_wpa(interface) netsettings_dhcp(interface) elif params['essid'] == 'TUT': netsettings_tut(interface) elif params['essid'] == 'LANGATON-WPA': netsettings_wpa(interface) netsettings_dhcp(interface) elif params['essid'] == 'Sivari-wlan': netsettings_sivari(interface) else: netsettings_dhcp(interface)