summaryrefslogtreecommitdiffstats
path: root/src/connections
diff options
context:
space:
mode:
authorJames Rayner <james@archlinux.org>2008-12-18 11:20:32 +0100
committerJames Rayner <james@archlinux.org>2008-12-18 11:20:32 +0100
commitd68313a616c8a4b46ae6192e966176aab3bdd49b (patch)
treeb1c9e823469b37fd131ccd71ae77b8583f1d9e2c /src/connections
parent5c2dc23703f1261b5b6eb0fd9906a2975e1c37ea (diff)
downloadnetctl-d68313a616c8a4b46ae6192e966176aab3bdd49b.tar.gz
netctl-d68313a616c8a4b46ae6192e966176aab3bdd49b.tar.xz
Add early wireless via dbus/wpa_supplicant support
Diffstat (limited to 'src/connections')
-rwxr-xr-xsrc/connections/wireless-dbus137
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))