summaryrefslogtreecommitdiffstats
path: root/src-wireless
diff options
context:
space:
mode:
authorJim Pryor <profjim@jimpryor.net>2009-08-11 14:05:10 +0200
committerJames Rayner <james@archlinux.org>2009-08-15 04:28:29 +0200
commit9578dda45b86acf3bd25def5de8f1d51f2ec22b2 (patch)
tree214394f032dc086c0c63befc8e22fffc80d16403 /src-wireless
parentc37f2081157b15be719ce8afb0e8e15afbf24253 (diff)
downloadnetctl-9578dda45b86acf3bd25def5de8f1d51f2ec22b2.tar.gz
netctl-9578dda45b86acf3bd25def5de8f1d51f2ec22b2.tar.xz
Add AP argument to profile, also let ESSID arguments be regexps
* AP= arguments in profiles take precedence over ESSID= arguments * ESSID= arguments regexps instead of literals. To avoid screwing up any currently working profiles, I restricted the interpretation as a regexp to just the new wireless-dbus connection types. * But a global change involved in implementing this is that the connection up/down calls will be passed a literal ESSID (which of the local networks matches the regexp) as an additional argument. Signed-off-by: Jim Pryor <profjim@jimpryor.net>
Diffstat (limited to 'src-wireless')
-rw-r--r--src-wireless/netcfg-auto-wireless57
-rw-r--r--src-wireless/wireless-dbus15
2 files changed, 54 insertions, 18 deletions
diff --git a/src-wireless/netcfg-auto-wireless b/src-wireless/netcfg-auto-wireless
index 50d49be..aa2590f 100644
--- a/src-wireless/netcfg-auto-wireless
+++ b/src-wireless/netcfg-auto-wireless
@@ -20,25 +20,58 @@ wifi_auto()
fi
# Loop through all the found essid's, then find a matching profile.
- while read essid; do
- for network in $(list_profiles); do
- load_profile $network
+
+ local found_profile found_essid
+
+ # JP: add ability to use AP instead of ESSID
+ # JP: also, make ESSIDs in wireless-dbus CONNECTIONS a regexp instead of a literal
+ while read ap essid; do
+ while read network; do
+ (
+ unset CONNECTION INTERFACE AP
+ load_profile "$network"
case "$CONNECTION" in
wireless-old|wireless|wireless-dbus)
- if [[ "$essid" = "$ESSID" && "$interface" = "$INTERFACE" ]]; then
- found=$network
+ if [[ "$interface" = "$INTERFACE" ]]; then
+ if [[ "$ap" == "$AP" ]]; then
+ exit 2
+ elif [[ -z "$found_profile" ]]; then
+ if [[ "$CONNECTION" == wireless-dbus ]]; then
+ if expr match "$essid" "^$ESSID\$" 1>/dev/null; then
+ exit 1
fi
+ elif [[ "$essid" == "$ESSID" ]]; then
+ exit 1
+ fi
+ fi
+ fi
;;
esac
- done
- done < $networks
-
- if [[ "$found" ]]; then
- netcfg $found
- exit $?
+ exit 0
+ )
+ case $? in
+ 2) found_profile="$network"
+ found_essid="$essid"
+ break 2;;
+ 1) found_profile="$network"
+ found_essid="$essid"
+ ;;
+ esac
+ done < <(list_profiles) # avoid subshell we'd get by piping list_profiles to while read
+ done < "$networks" # avoid subshell; list_networks returns name of a tmp file
+ rm -f "$networks" # shouldn't we delete the tmp file?
+
+ if [[ -n "$found_profile" ]]; then
+ report_success
+ if profile_up "$found_profile" "$found_essid"; then # JP: now we pass literal essid to profile_up as $2
+ exit 0
+ else
+ exit_fail "Couldn't connect profile $found_profile."
+ fi
+ else
+ exit_fail "No profiles matched the local networks."
fi
- exit_fail "- No profiles matched the found networks"
}
if [[ $(id -u) -ne 0 ]]; then
diff --git a/src-wireless/wireless-dbus b/src-wireless/wireless-dbus
index d30eb21..838609d 100644
--- a/src-wireless/wireless-dbus
+++ b/src-wireless/wireless-dbus
@@ -61,7 +61,7 @@ def fail(msg=None, report_type="fail"):
sys.exit(1)
-def start(profile):
+def start(profile, essid):
# TODO: Add check if it's even a wireless interface
# Interface up - probably redundant, should be 'ip' instead.
#try:
@@ -128,9 +128,11 @@ def start(profile):
rnet = dbus.Interface(net_obj, WPAS_DBUS_NETWORKS_INTERFACE)
iface.selectNetwork(rnet)
+ if not essid:
+ essid = profile["ESSID"]
if profile['SECURITY'] == "wpa":
- opts = dbus.Dictionary({"ssid": dbus.ByteArray(profile['ESSID']),
+ opts = dbus.Dictionary({"ssid": dbus.ByteArray(essid),
"psk": dbus.String(profile['KEY'])},
signature="sv")
report('debug', 'wireless_dbus', 'connect to network with security=wpa')
@@ -145,7 +147,7 @@ def start(profile):
for l in key:
keydbus+=chr(l)
- opts = dbus.Dictionary({"ssid": dbus.ByteArray(profile['ESSID']),
+ opts = dbus.Dictionary({"ssid": dbus.ByteArray(essid),
"key_mgmt": dbus.String("NONE"),
"wep_tx_keyidx": dbus.Int32(1),
"wep_key0": dbus.ByteArray(keydbus)},
@@ -153,7 +155,7 @@ def start(profile):
report('debug', 'wireless_dbus', 'connect to network with security=wep')
rnet.set(opts)
elif profile['SECURITY'] == "none":
- opts = dbus.Dictionary({"ssid": dbus.ByteArray(profile['ESSID'])},
+ opts = dbus.Dictionary({"ssid": dbus.ByteArray(essid)},
signature="sv")
report('debug', 'wireless_dbus', 'connect to network with security=none')
rnet.set(opts)
@@ -201,9 +203,10 @@ if __name__ == "__main__":
try:
profile_name = sys.argv[2]
profile = read_config("/etc/network.d/"+profile_name)
-
+
+ essid = sys.argv[3] if len(sys.argv)>3 else "" # JP: pass literal ESSID as an argument, so that we can have entry in profile be a regexp
if sys.argv[1] == "up":
- start(profile)
+ start(profile, essid)
elif sys.argv[1] == "down":
stop(profile)