|
|
# so we can fail gracefully without even trying to connect | # so we can fail gracefully without even trying to connect |
iwconfig_associate() { | iwconfig_associate() { |
local iface="$1" mode="${2:-managed}" | local iface="$1" mode="${2:-managed}" |
local mac="$3" wep_required="$4" freq="$5" w="(WEP Disabled)" |
local mac="$3" wep_required="$4" freq="$5" chan="$6" w="(WEP Disabled)" |
local dessid="${ESSID//\\\\/\\\\}" key= | local dessid="${ESSID//\\\\/\\\\}" key= |
| |
iwconfig_set_mode "${iface}" "${mode}" | iwconfig_set_mode "${iface}" "${mode}" |
|
|
[[ ${key} != "off" ]] && w=$(iwconfig_get_wep_status "${iface}") | [[ ${key} != "off" ]] && w=$(iwconfig_get_wep_status "${iface}") |
fi | fi |
| |
[[ -n ${freq} ]] && iwconfig "${iface}" freq "${freq}" |
# Only use channel or frequency |
|
if [[ -n ${chan} ]] ; then |
|
iwconfig "${iface}" channel "${chan}" |
|
elif [[ -n ${freq} ]] ; then |
|
iwconfig "${iface}" freq "${freq}" |
|
fi |
[[ -n ${mac} ]] && iwconfig "${iface}" ap "${mac}" | [[ -n ${mac} ]] && iwconfig "${iface}" ap "${mac}" |
| |
if ! iwconfig "${iface}" essid "${ESSID}" ; then | if ! iwconfig "${iface}" essid "${ESSID}" ; then |
|
|
[[ -z ${!x} || ${!x} -gt 0 ]] && sleep "${!x:-1}" | [[ -z ${!x} || ${!x} -gt 0 ]] && sleep "${!x:-1}" |
| |
local error=true i=-1 line= | local error=true i=-1 line= |
local -a mac=() essid=() enc=() qual=() mode=() |
local -a mac=() essid=() enc=() qual=() mode=() freq=() chan=() |
| |
while read line; do | while read line; do |
error=false | error=false |
|
|
;; | ;; |
*Frequency:*) | *Frequency:*) |
freq[i]="${line#*:}" | freq[i]="${line#*:}" |
|
freq[i]="${freq[i]%% *}" |
|
;; |
|
*Channel:*) |
|
chan[i]="${line#*:}" |
|
chan[i]="${chan[i]%% *}" |
;; | ;; |
*Quality*) | *Quality*) |
qual[i]="${line#*:}" | qual[i]="${line#*:}" |
|
|
esac | esac |
done < <(iwlist "${iface}" scan 2>/dev/null) | done < <(iwlist "${iface}" scan 2>/dev/null) |
| |
|
# HUP the interface as some drivers/cards need it |
|
interface_down ${iface} |
|
interface_up ${iface} |
|
|
if ${error}; then | if ${error}; then |
ewarn "${iface} does not support scanning" | ewarn "${iface} does not support scanning" |
x="adhoc_essid_${ifvar}" | x="adhoc_essid_${ifvar}" |
|
|
unset mode[y] | unset mode[y] |
unset enc[y] | unset enc[y] |
unset freq[y] | unset freq[y] |
|
unset chan[y] |
fi | fi |
done | done |
done | done |
|
|
mode=( "${mode[@]}" ) | mode=( "${mode[@]}" ) |
enc=( "${enc[@]}" ) | enc=( "${enc[@]}" ) |
freq=( "${freq[@]}" ) | freq=( "${freq[@]}" ) |
|
chan=( "${chan[@]}" ) |
| |
for (( i=0; i<${#mac[@]}; i++ )); do | for (( i=0; i<${#mac[@]}; i++ )); do |
# Don't like ad-hoc nodes by default | # Don't like ad-hoc nodes by default |
|
|
mode_APs[i]="${mode[${sortline[x]}]}" | mode_APs[i]="${mode[${sortline[x]}]}" |
enc_APs[i]="${enc[${sortline[x]}]}" | enc_APs[i]="${enc[${sortline[x]}]}" |
freq_APs[i]="${freq[${sortline[x]}]}" | freq_APs[i]="${freq[${sortline[x]}]}" |
|
chan_APs[i]="${chan[${sortline[x]}]}" |
done | done |
| |
return 0 | return 0 |
|
|
unset mac_APs[i] | unset mac_APs[i] |
unset enc_APs[i] | unset enc_APs[i] |
unset freq_APs[i] | unset freq_APs[i] |
|
unset chan_APs[i] |
done | done |
| |
# We need to squash our arrays so indexes work again | # We need to squash our arrays so indexes work again |
|
|
mac_APs=( "${mac_APs[@]}" ) | mac_APs=( "${mac_APs[@]}" ) |
enc_APs=( "${enc_APs[@]}" ) | enc_APs=( "${enc_APs[@]}" ) |
freq_APs=( "${freq_APs[@]}" ) | freq_APs=( "${freq_APs[@]}" ) |
|
chan_APs=( "${chan_APs[@]}" ) |
} | } |
| |
# bool iwconfig_force_preferred(char *iface) | # bool iwconfig_force_preferred(char *iface) |
|
|
if [[ ${essid} == "${essid_APs[i]}" ]]; then | if [[ ${essid} == "${essid_APs[i]}" ]]; then |
ESSID="${essid}" | ESSID="${essid}" |
iwconfig_associate "${iface}" "${mode_APs[i]}" "${mac_APs[i]}" \ | iwconfig_associate "${iface}" "${mode_APs[i]}" "${mac_APs[i]}" \ |
"${enc_APs[i]}" "${freq_APs[i]}" && return 0 |
"${enc_APs[i]}" "${freq_APs[i]}" "${chan_APs[i]}" && return 0 |
break | break |
fi | fi |
done | done |
|
|
if ! ${has_preferred} ; then | if ! ${has_preferred} ; then |
ESSID="${essid_APs[i]}" | ESSID="${essid_APs[i]}" |
iwconfig_associate "${iface}" "${mode_APs[i]}" "${mac_APs[i]}" \ | iwconfig_associate "${iface}" "${mode_APs[i]}" "${mac_APs[i]}" \ |
"${enc_APs[i]}" "${freq_APs[i]}" && return 0 |
"${enc_APs[i]}" "${freq_APs[i]}" "${chan_APs[i]}" && return 0 |
fi | fi |
done | done |
| |
|
|
unset mac_APs[j] | unset mac_APs[j] |
unset enc_APs[j] | unset enc_APs[j] |
unset freq_APs[j] | unset freq_APs[j] |
|
unset chan_APs[j] |
# We need to squash our arrays so that indexes work | # We need to squash our arrays so that indexes work |
essid_APs=( "${essid_APs[@]}" ) | essid_APs=( "${essid_APs[@]}" ) |
mode_APs=( "${mode_APs[@]}" ) | mode_APs=( "${mode_APs[@]}" ) |
mac_APs=( "${mac_APs[@]}" ) | mac_APs=( "${mac_APs[@]}" ) |
enc_APs=( "${enc_APs[@]}" ) | enc_APs=( "${enc_APs[@]}" ) |
freq_APs=( "${freq_APs[@]}" ) | freq_APs=( "${freq_APs[@]}" ) |
|
chan_APs=( "${chan_APs[@]}" ) |
break | break |
fi | fi |
done | done |
|
|
# variables for the ESSID | # variables for the ESSID |
iwconfig_configure() { | iwconfig_configure() { |
local iface="$1" e= x= ifvar=$(bash_variable "$1") | local iface="$1" e= x= ifvar=$(bash_variable "$1") |
local -a essid_APs=() mac_APs=() mode_APs=() enc_APs=() freq_APs=() |
local -a essid_APs=() mac_APs=() mode_APs=() |
|
local -a enc_APs=() freq_APs=() chan_APs=() |
| |
ESSID="essid_${ifvar}" | ESSID="essid_${ifvar}" |
ESSID="${!ESSID}" | ESSID="${!ESSID}" |