[arch-projects] [netctl][PATCH] Unify wired and wireless automatic profile selection (FS#35252)

Jouke Witteveen j.witteveen at gmail.com
Thu Jan 8 14:10:33 UTC 2015


The previous wired automatic profile selection procedure was not
properly documented.

Now both wired and wireless automatic profile selection use
ExcludeAuto= and Priority=
---
 docs/netctl.profile.5.txt | 15 +++++++++++----
 src/ifplugd.action        | 42 +++++++++++++++---------------------------
 src/netctl-auto           | 21 +++++++++------------
 3 files changed, 35 insertions(+), 43 deletions(-)

diff --git a/docs/netctl.profile.5.txt b/docs/netctl.profile.5.txt
index c4982fc..82946da 100644
--- a/docs/netctl.profile.5.txt
+++ b/docs/netctl.profile.5.txt
@@ -103,6 +103,11 @@ GENERAL OPTIONS
     Set to `++yes++' to force connecting even if the interface is up.
     Do not use this unless you know what you are doing.
 
+'ExcludeAuto='::
+    Whether or not to exclude this profile from automatic profile
+    selection. Defaults to `++no++' for wireless and DHCP enabled
+    connections and to `++yes++' otherwise.
+
 
 IP OPTIONS
 ----------
@@ -223,6 +228,12 @@ of the `ethernet' type:
     Whether or not the absence of a carrier (plugged-in cable) is
     acceptable. Defaults to `++no++'.
 
+'Priority='::
+    Priority level of the profile. In case of automatic profile
+    selection, profiles are tried in decreasing order of priority.
+    Defaults to `++1++' in DHCP enabled profiles and to `++0++'
+    otherwise.
+
 
 OPTIONS FOR `wireless' CONNECTIONS
 ----------------------------------
@@ -295,10 +306,6 @@ of the `wireless' type:
     variable to `++auto++'. In that case an *rfkill* device that is
     associated with the network interface is used.
 
-'ExcludeAuto='::
-    Whether or not to exclude this profile from automatic profile
-    selection. Defaults to `++no++'.
-
 
 OPTIONS FOR `bond' CONNECTIONS
 ------------------------------
diff --git a/src/ifplugd.action b/src/ifplugd.action
index c87ac0c..14a8bac 100755
--- a/src/ifplugd.action
+++ b/src/ifplugd.action
@@ -8,39 +8,27 @@ PROFILE_FILE="$STATE_DIR/ifplugd_$1.profile"
 
 case "$2" in
   up)
-    # Look for a dhcp based profile to try first
-    # dhcp can actually outright fail, whereas
-    # it's difficult to tell if static succeeded
-    # Also check profile is same iface and is right connection
-    echo "up"
-    declare -a preferred_profiles
-    declare -a dhcp_profiles
-    declare -a static_profiles
-    while read -r profile; do
-        (
-          echo "Reading profile '$profile'"
-          source "$PROFILE_DIR/$profile"
-          [[ "$Interface" == "$1" && "$Connection" == "ethernet" ]] || continue
-          is_yes "${AutoWired:-no}" && exit 1 # user preferred AUTO profile
-          [[ "$IP" == "dhcp" ]] && exit 2 # dhcp profile
-          exit 3 # static profile
-        )
-        case $? in
-          1) preferred_profiles+=("$profile");;
-          2) dhcp_profiles+=("$profile");;
-          3) static_profiles+=("$profile");;
-        esac
-    done < <(list_profiles)
-    if [[ ${#preferred_profiles[@]} > 1 ]]; then
-        echo "AutoWired flag for '$1' set in more than one profile (${preferred_profiles[*]})"
-    fi
-    for profile in "${preferred_profiles[@]}" "${dhcp_profiles[@]}" "${static_profiles[@]}"; do
+    list_profiles | while read -r profile; do
+        report_debug "Examining profile '$profile'"
+        source "$PROFILE_DIR/$profile"
+        [[ $Interface == "$1" && $Connection == "ethernet" ]] || continue
+        # Prioritize dhcp based profiles as they can outright fail, whereas
+        # it is difficult to tell if a profile with a static address fails
+        if [[ $IP == "dhcp" || $IP6 == dhcp* ]]; then
+            : ${ExcludeAuto:=no}
+            : ${Priority:=1}
+        fi
+        is_yes "${ExcludeAuto:-yes}" && continue
+        printf "%i\t%s\n" "${Priority:-0}" "$profile"
+        report_debug "Included profile '$profile'"
+    done | sort -nrs -k 1,1 | cut -f 2- | while read -r profile; do
         if ForceConnect=yes "$SUBR_DIR/network" start "$profile"; then
             mkdir -p "$(dirname "$PROFILE_FILE")"
             printf "%s" "$profile" > "$PROFILE_FILE"
             exit 0
         fi
     done
+    report_error "Could not start any suitable profile"
   ;;
   down)
     if [[ -e "$PROFILE_FILE" ]]; then
diff --git a/src/netctl-auto b/src/netctl-auto
index d9fac3a..df9dcde 100755
--- a/src/netctl-auto
+++ b/src/netctl-auto
@@ -190,18 +190,15 @@ start() {
     local profile
     list_profiles | while read -r profile; do
         report_debug "Examining profile '$profile'"
-        (
-          source "$PROFILE_DIR/$profile"
-          [[ $Interface == "$interface" ]] || continue
-          is_yes "${ExcludeAuto:-no}" && exit 1
-          [[ $Connection != "wireless" ]] && exit 1
-          : ${Security:=none}
-          # Exclude wpa-config, the wpa_conf is 'complete' and doesn't fit in this scheme
-          [[ $Security == "wpa-config" ]] && exit 1
-
-          printf "%s\n" "network={" "$(wpa_make_config_block)" "id_str=\"$profile\"" "}" >> "$wpa_conf"
-          report_notice "Included profile '$profile'"
-        )
+        source "$PROFILE_DIR/$profile"
+        [[ $Interface == "$interface" && $Connection == "wireless" ]] || continue
+        is_yes "${ExcludeAuto:-no}" && continue
+        : ${Security:=none}
+        # Exclude wpa-config, the wpa_conf is 'complete' and doesn't fit in this scheme
+        [[ $Security == "wpa-config" ]] && continue
+
+        printf "%s\n" "network={" "$(wpa_make_config_block)" "id_str=\"$profile\"" "}" >> "$wpa_conf"
+        report_notice "Included profile '$profile'"
     done
 
     # Start the WPA supplicant and wpa_actiond
-- 
2.2.1


More information about the arch-projects mailing list