diff options
author | James Rayner <james@archlinux.org> | 2008-12-18 11:20:32 +0100 |
---|---|---|
committer | James Rayner <james@archlinux.org> | 2008-12-18 11:20:32 +0100 |
commit | d68313a616c8a4b46ae6192e966176aab3bdd49b (patch) | |
tree | b1c9e823469b37fd131ccd71ae77b8583f1d9e2c | |
parent | 5c2dc23703f1261b5b6eb0fd9906a2975e1c37ea (diff) | |
download | netctl-d68313a616c8a4b46ae6192e966176aab3bdd49b.tar.gz netctl-d68313a616c8a4b46ae6192e966176aab3bdd49b.tar.xz |
Add early wireless via dbus/wpa_supplicant support
-rwxr-xr-x | src/connections/wireless-dbus | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/connections/wireless-dbus b/src/connections/wireless-dbus new file mode 100755 index 0000000..d954577 --- /dev/null +++ b/src/connections/wireless-dbus @@ -0,0 +1,137 @@ +#! /usr/bin/env python +import sys +import dbus +import shlex +import subprocess +from signal import SIGTERM +from os import kill +from time import sleep + +# dbus constants. +WPAS_DBUS_SERVICE = "fi.epitest.hostap.WPASupplicant" +WPAS_DBUS_INTERFACE = "fi.epitest.hostap.WPASupplicant" +WPAS_DBUS_OPATH = "/fi/epitest/hostap/WPASupplicant" + +WPAS_DBUS_INTERFACES_INTERFACE = "fi.epitest.hostap.WPASupplicant.Interface" +WPAS_DBUS_INTERFACES_OPATH = "/fi/epitest/hostap/WPASupplicant/Interfaces" +WPAS_DBUS_BSSID_INTERFACE = "fi.epitest.hostap.WPASupplicant.BSSID" +WPAS_DBUS_NETWORKS_INTERFACE = "fi.epitest.hostap.WPASupplicant.Network" + +def read_config(config): + cfg = shlex.split(open(config, "r").read()) + options = {} + for line in cfg: + (var, delim, value) = line.partition('=') + if not delim: + raise SyntaxError, 'Bad configuration file' + options[var] = value + return options + +def start(profile): + # TODO: Add check if it's even a wireless interface + # Interface up... + try: + subprocess.check_call(["ifconfig", profile['INTERFACE'], "up"]) + except CalledProcessError: + print " - Could not bring interface up" + return False + + # Manually set any iwconfig options, ignoring errors + if profile.has_key('IWCONFIG'): + subprocess.call(["iwconfig", profile['INTERFACE'], profile['IWCONFIG']]) + + + # Base arguments + args=["wpa_supplicant", "-Bu", "-P/var/run/wpa_supplicant.pid"] + + try: + args.append(profile['WPA_OPTS']) + except KeyError: + args.append("-Dwext") + + if profile['SECURITY'] == "wpa-config": + try: + args.append("-c" + profile["WPA_CONF"]) + except KeyError: + args.append("-c/etc/wpa_supplicant.conf") + elif not profile['SECURITY'] in ['yes', 'wpa', 'wep']: + print " - Invalid security chosen" + return False + + # Start wpa_supplicant + supplicant = subprocess.Popen(args,stderr=subprocess.STDOUT,stdout=subprocess.PIPE) + output = supplicant.communicate()[0] + if supplicant.returncode not in [255,0]: + print output + print " - Could not start wpa_supplicant" + return False + + # Connect to wpa_supplicant + bus = dbus.SystemBus() + wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH) + wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE) + + # Add/Get interface path + try: + driver=profile["WPA_DRIVER"] + except KeyError: + driver="wext" + + try: + path = wpas.getInterface("ipw0") + except dbus.exceptions.DBusException: + path = wpas.addInterface("ipw0", {"driver":dbus.String(driver,variant_level=1)}) + + # Get interface object + if_obj = bus.get_object(WPAS_DBUS_SERVICE, path) + iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE); + + # Connect + if profile['SECURITY'] in ['wpa','yes','wep']: + # Add+select the network + path = iface.addNetwork() + net_obj = bus.get_object(WPAS_DBUS_SERVICE, path) + rnet = dbus.Interface(net_obj, WPAS_DBUS_NETWORKS_INTERFACE) + iface.selectNetwork(rnet) + # Set the options + opts = dbus.Dictionary({"ssid": dbus.ByteArray(profile['ESSID']), "psk": dbus.String(profile['KEY'])}, signature="sv") + rnet.set(opts) + + # Determine timeout + try: + timeout = profile["TIMEOUT"] + except KeyError: + timeout = 15 + + # Check for association + n=0 + while n <= timeout: + n+=1 + sleep(1) + state = iface.state() + if state == "COMPLETED": + break + + if n == timeout: + print " - Association/Authentication failed:", state + return False + + # Run ethernet and get an ip. + try: + subprocess.check_call(["/usr/lib/network/connections/ethernet", "up", sys.argv[2]]) + except CalledProcessError: + return False + return True + +def stop(profile): + subprocess.call(["/usr/lib/network/connections/ethernet", "down", sys.argv[2]]) + kill(int(open("/var/run/wpa_supplicant.pid").read()),SIGTERM) + return True + +if __name__ == "__main__": + profile = read_config("/etc/network.d/"+sys.argv[2]) + + if sys.argv[1] == "up": + sys.exit(not start(profile)) + elif sys.argv[1] == "down": + sys.exit(not stop(profile)) |