# Uses wpa_supplicant to check for association to a network # wpa_check interface [timeout] wpa_check() { local timeout=0 INTERFACE="$1" TIMEOUT="${2:-15}" CONDITION="${3:-COMPLETED}" # CONDITION is required as wired connections are ready at ASSOCIATED not COMPLETED FS#20150 while [[ $timeout -lt "$TIMEOUT" ]]; do ( # Sometimes wpa_supplicant isn't ready so silence errors for 2s only to avoid hiding real errors if [[ $timeout -lt 2 ]]; then eval $(wpa_cli -i "$INTERFACE" status 2> /dev/null | fgrep "wpa_state=") else eval $(wpa_cli -i "$INTERFACE" status | fgrep "wpa_state=") fi [[ "$wpa_state" = "$CONDITION" ]] ) && return 0 sleep 1 let timeout++ done echo "$wpa_state" # wpa_cli -i "$INTERFACE" terminate >/dev/null 2>&1 # callers sometimes called stop_wpa, which does more but seems redundant # termination should either be handled properly here, or by callers stop_wpa "$INTERFACE" return 1 } start_wpa() { local INTERFACE="$1" WPA_CONF="$2" WPA_DRIVER="$3" shift 3 local WPA_OPTS="$*" wpa_supplicant -B -P "/var/run/wpa_supplicant_${INTERFACE}.pid" -i "$INTERFACE" -D "$WPA_DRIVER" -c "$WPA_CONF" $WPA_OPTS sleep 1 if [[ ! -f "/var/run/wpa_supplicant_${INTERFACE}.pid" ]]; then return 1 fi } stop_wpa() { wpa_cli -i "$1" terminate &> /dev/null sleep 1 # JP: need this else the file tends to disappear after [[ -f ... ]] but before cat... # see if [[ -f "/var/run/wpa_supplicant_$1.pid" ]]; then kill "$(cat "/var/run/wpa_supplicant_$1.pid")" &>/dev/null & fi } # Requires already loaded profile make_wpa_config_file() { local interface=$1 local WPA_CONF="${TMPDIR:-/tmp}/wpa.${interface}" # substitute spaces out # make empty tmp dir with correct permissions, rename it rm -rf "$WPA_CONF" mv -f "$(mktemp -d)" "$WPA_CONF" || return 1 echo "ctrl_interface=/var/run/wpa_supplicant" >> "$WPA_CONF/wpa.conf" # we know $WPA_CONF now has no spaces, but it may have other nasty chars, so still needs to be quoted echo "ctrl_interface_group=${WPA_GROUP:-wheel}" >> "$WPA_CONF/wpa.conf" [[ $WPA_COUNTRY ]] && echo "country=$WPA_COUNTRY" >> "$WPA_CONF/wpa.conf" [[ -n "$ADHOC" ]] && echo "ap_scan=2" >> "$WPA_CONF/wpa.conf" echo "$WPA_CONF/wpa.conf" } # Requires already loaded profile make_wpa_config() { case $SECURITY in wep|wep-old|wpa|none|none-old) echo "ssid=\"$ESSID\"" if [[ -n "$AP" ]]; then echo "bssid=$AP" fi [[ -n "$ADHOC" ]] && echo "mode=1" ;; wpa-configsection) echo "$CONFIGSECTION" ;; *) return 1 ;; esac # Key management case $SECURITY in wep|wep-old) echo "key_mgmt=NONE" echo "wep_tx_idx=0" if [[ ${KEY:0:2} == "s:" ]]; then # TODO: does wpa_supplicant handle this as expected? echo "wep_key0=\"${KEY:2}\"" else echo "wep_key0=$KEY" fi none|none-old) echo "key_mgmt=NONE" ;; wpa) if [[ "${#KEY}" -eq 64 ]]; then echo "proto=RSN WPA\npsk=$KEY" else echo "proto=RSN WPA\npsk=\"$KEY\"" fi ;; esac # Hidden SSID if checkyesno ${HIDDEN:-no}; then echo "scan_ssid=1" fi } # vim: ft=sh ts=4 et sw=4: