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