ipfire-2.x/src/initscripts/system/wlanclient

336 lines
6.3 KiB
Bash

#!/bin/sh
########################################################################
# Begin $rc_base/init.d/wlan_client
#
# Description : Wireless client initscript
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings)
WIRELESS_CONFIG="/var/ipfire/ethernet/wireless"
function device_is_wireless() {
local device=${1}
if [ -d "/sys/class/net/${device}/wireless" ]; then
return 0
fi
return 1
}
function wpa_supplicant_make_config() {
local device=${1}
local config=${2}
shift 2
# Check if device is wireless.
local wireless="false"
if device_is_wireless ${device}; then
wireless="true"
fi
# Write a configuration file header.
(
echo "#"
echo "# THIS FILE IS AUTOMATICALLY GENERATED AND"
echo "# ANY CUSTOM CHANGES WILL BE OVERWRITTEN!"
echo "#"
echo
echo "ctrl_interface=/var/run/wpa_supplicant"
echo
) > ${config}
local items=0
local line
while IFS="," read -ra line; do
# Skip commented lines.
[ "${line:0:1}" = "#" ] && continue
# Skip disabled entries.
[ "${line[2]}" = "on" ] || continue
wpa_supplicant_config_line \
${device} ${config} \
--wireless="${wireless}" \
--mode="${line[3]}" \
--wpa-mode="${line[4]}" \
--ssid="${line[5]}" \
--psk="${line[6]}" \
--priority="${line[7]}" \
--auth-mode="${line[8]}" \
--anonymous-identity="${line[9]}" \
--identity="${line[10]}" \
--password="${line[11]}"
items=$(( ${items} + 1 ))
done < ${WIRELESS_CONFIG}
# Return exit code 2, when there are no entries in the
# configuration file.
if [ "${items}" = "0" ]; then
return 2
fi
return 0
}
function wpa_supplicant_config_line() {
local device=${1}
local config=${2}
shift 2
local ieee80211w
local anonymous_identity
local auth_alg
local auth_mode
local identity
local proto
local key_mgmt
local pairwise
local group
local mode
local password
local priority
local psk
local ssid
local wep_tx_keyidx
local wep_key0
local wireless="true"
local wpa_mode
while [ $# -gt 0 ]; do
case "${1}" in
--anonymous-identity=*)
anonymous_identity=${1#--anonymous-identity=}
;;
--auth-mode=*)
auth_mode=${1#--auth-mode=}
;;
--identity=*)
identity=${1#--identity=}
;;
--mode=*)
mode=${1#--mode=}
;;
--password=*)
password=${1#--password=}
;;
--priority=*)
priority=${1#--priority=}
;;
--psk=*)
psk=${1#--psk=}
;;
--ssid=*)
ssid=${1#--ssid=}
;;
--wireless=*)
wireless=${1#--wireless=}
;;
--wpa-mode=*)
wpa_mode=${1#--wpa-mode=}
;;
esac
shift
done
case "${mode}" in
EAP)
key_mgmt="WPA-EAP-SHA256 WPA-EAP"
;;
WPA3)
key_mgmt="SAE"
ieee80211w="2"
;;
WPA2)
auth_alg="OPEN"
proto="RSN"
key_mgmt="WPA-PSK-SHA256 WPA-PSK"
;;
WPA)
auth_alg="OPEN"
proto="WPA"
key_mgmt="WPA-PSK-SHA256 WPA-PSK"
;;
WEP)
auth_alg="SHARED"
key_mgmt="NONE"
wep_tx_keyidx=0
wep_key0=${psk}
psk=""
;;
NONE)
auth_alg="OPEN"
key_mgmt="NONE"
;;
*)
# Unsupported mode.
return 1
;;
esac
if [ "${mode}" = "EAP" -o "${mode}" = "WPA" -o "${mode}" = "WPA2" ]; then
case "${wpa_mode}" in
CCMP-CCMP)
pairwise="CCMP"
group="CCMP"
;;
CCMP-TKIP)
pairwise="CCMP"
group="TKIP"
;;
TKIP-TKIP)
pairwise="TKIP"
group="TKIP"
;;
*)
pairwise="CCMP TKIP"
group="CCMP TKIP"
;;
esac
fi
(
echo "network={"
if [ -n "${ssid}" ]; then
echo " ssid=\"${ssid}\""
fi
if [ "${wireless}" = "true" ]; then
echo " scan_ssid=1"
fi
if [ -n "${auth_alg}" ]; then
echo " auth_alg=${auth_alg}"
fi
if [ -n "${key_mgmt}" ]; then
echo " key_mgmt=${key_mgmt}"
fi
if [ -n "${psk}" ]; then
if [ "${key_mgmt}" = "SAE" ]; then
echo " sae_password=\"${psk}\""
else
echo " psk=\"${psk}\""
fi
fi
if [ -n "${wep_tx_keyidx}" ]; then
echo " wep_tx_keyidx=${wep_tx_keyidx}"
fi
if [ -n "${wep_key0}" ]; then
echo " wep_key0=\"${wep_key0}\""
fi
if [ -n "${proto}" ]; then
echo " proto=${proto}"
fi
if [ -n "${pairwise}" -a -n "${group}" ]; then
echo " pairwise=${pairwise}"
echo " group=${group}"
fi
if [ -n "${priority}" ]; then
echo " priority=${priority}"
fi
if [ -n "${ieee80211w}" ]; then
echo " ieee80211w=${ieee80211w}"
fi
# EAP
if [ "${mode}" = "EAP" ]; then
if [ -n "${auth_mode}" ]; then
echo " eap=${auth_mode}"
else
echo " eap=PEAP TTLS"
fi
if [ "${auth_mode}" = "TTLS" -a -n "${anonymous_identity}" ]; then
echo " anonymous_identity=\"${anonymous_identity}\""
fi
if [ -n "${identity}" -a -n "${password}" ]; then
echo " identity=\"${identity}\""
echo " password=\"${password}\""
fi
fi
echo "}"
echo
) >> ${config}
}
function wpa_supplicant_start() {
local device=${1}
local config="/etc/wpa_supplicant.conf"
# Write configuration file.
wpa_supplicant_make_config ${device} ${config}
[ $? -eq 0 ] || return 0
# Build wpa_supplicant command line.
local wpa_suppl_cmd="wpa_supplicant -B -qqq -i${device} -c${config}"
if ! device_is_wireless ${device}; then
wpa_suppl_cmd="${wpa_suppl_cmd} -Dwired"
fi
# Run the shiz.
boot_mesg "Starting wireless client on ${RED_DEV}..."
loadproc ${wpa_suppl_cmd}
# Run wpa_cli to handle reconnection events.
boot_mesg "Starting wireless event handler on ${RED_DEV}..."
wpa_cli -B -a /etc/rc.d/init.d/networking/wpa_supplicant.exe
}
function wpa_supplicant_stop() {
boot_mesg "Stopping wireless event handler on ${RED_DEV}..."
killproc wpa_cli
# wpa_cli does not send a disconnect event when get stopped.
# So we manually have to send it to the wpa_supplicant.exe.
/etc/rc.d/init.d/networking/wpa_supplicant.exe "${RED_DEV}" DISCONNECTED
boot_mesg "Stopping wireless client on ${RED_DEV}..."
killproc wpa_supplicant
# Tidy up /tmp directory.
rm -f /tmp/wpa_ctrl_*
}
case "${1}" in
start)
if [ -n "${RED_DEV}" ] && device_is_wireless ${RED_DEV}; then
wpa_supplicant_start ${RED_DEV}
fi
;;
stop)
if [ -n "${RED_DEV}" ] && device_is_wireless ${RED_DEV}; then
wpa_supplicant_stop
fi
;;
restart)
${0} stop
sleep 1
${0} start
;;
status)
statusproc wpa_supplicant
;;
*)
echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;
esac
# End $rc_base/init.d/wlan_client