# #
###############################################################################
-WIRELESS_NETWORK_CONFIG_SETTINGS="ENCRYPTION_MODE PRIORITY PSK SSID"
+WIRELESS_NETWORK_SUPPORTED_PSK_MODES="WPA2-PSK-SHA256 WPA2-PSK WPA-PSK-SHA256 WPA-PSK"
+
+WIRELESS_NETWORK_SUPPORTED_MODES="${WIRELESS_NETWORK_SUPPORTED_PSK_MODES} NONE"
+
+WIRELESS_NETWORK_CONFIG_SETTINGS="EAP_MODES ENCRYPTION_MODES PRIORITY PSK SSID"
cli_wireless_network() {
case "${1}" in
return ${EXIT_ERROR}
fi
+ # Convert SSID into usable format
+ local handle="$(wireless_network_hash "${ssid}")"
+
case "${key}" in
encryption_mode|pre_shared_key|priority)
- wireless_network_${key} "${ssid}" "$@"
+ wireless_network_${key} "${handle}" "$@"
;;
show)
- wireless_network_show "${ssid}"
+ wireless_network_show "${handle}"
exit $?
;;
*)
local handle
for handle in $(wireless_network_list); do
local ${WIRELESS_NETWORK_CONFIG_SETTINGS}
- if ! wireless_network_read_config_by_handle "${handle}"; then
+ if ! wireless_network_read_config "${handle}"; then
continue
fi
wireless_network_write_config() {
assert [ $# -ge 1 ]
- local ssid="${1}"
-
- local ssid_hash="$(wireless_network_hash "${ssid}")"
- assert isset ssid_hash
-
- if ! wireless_network_exists "${ssid}"; then
- log ERROR "No such wireless network: '${ssid}'"
- return ${EXIT_ERROR}
- fi
+ local handle="${1}"
- local path="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings"
+ local path="${NETWORK_WIRELESS_NETWORKS_DIR}/${handle}/settings"
if ! settings_write "${path}" ${WIRELESS_NETWORK_CONFIG_SETTINGS}; then
- log ERROR "Could not write configuration settings for wireless network ${ssid}"
+ log ERROR "Could not write configuration"
return ${EXIT_ERROR}
fi
wireless_network_write_config_key() {
assert [ $# -ge 3 ]
- local ssid="${1}"
+ local handle="${1}"
local key="${2}"
shift 2
local value="$@"
- if ! wireless_network_exists "${ssid}"; then
- log ERROR "No such wireless network: ${ssid}"
- return ${EXIT_ERROR}
- fi
-
- log DEBUG "Set '${key}' to new value '${value}' in wireless network '${ssid}'"
-
local ${WIRELESS_NETWORK_CONFIG_SETTINGS}
# Read the config settings
- if ! wireless_network_read_config "${ssid}"; then
+ if ! wireless_network_read_config "${handle}"; then
return ${EXIT_ERROR}
fi
+ log DEBUG "Set '${key}' to new value '${value}' in wireless network '${SSID}'"
+
# Set the key to a new value
assign "${key}" "${value}"
- if ! wireless_network_write_config "${ssid}"; then
+ if ! wireless_network_write_config "${handle}"; then
return ${EXIT_ERROR}
fi
return ${EXIT_OK}
}
-wireless_network_read_config() {
- local ssid="${1}"
-
- if ! wireless_network_exists "${ssid}"; then
- log ERROR "No such wireless network : ${ssid}"
- return ${EXIT_ERROR}
- fi
-
- local handle="$(wireless_network_hash "${ssid}")"
- wireless_network_read_config_by_handle "${handle}"
-}
-
# Reads one or more keys out of a settings file or all if no key is provided.
-wireless_network_read_config_by_handle() {
+wireless_network_read_config() {
assert [ $# -ge 1 ]
local handle="${1}"
# This function checks if a wireless network exists
# Returns True when yes and false when not
wireless_network_exists() {
- assert [ $# -eq 1 ]
-
local ssid="${1}"
- local ssid_hash="$(wireless_network_hash "${ssid}")"
- assert isset ssid_hash
- local path="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"
+ local handle="$(wireless_network_hash "${ssid}")"
+ assert isset handle
# We cannot use wireless_network_read_config here beacuse we would end in a loop
local SSID
-
- local path_settings="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings"
-
- if ! settings_read "${path_settings}" SSID; then
+ if ! settings_read "${NETWORK_WIRELESS_NETWORKS_DIR}/${handle}/settings" SSID; then
return ${EXIT_FALSE}
fi
- assert isset SSID
-
- if [ -d "${path}" ] && [[ "${ssid}" = "${SSID}" ]]; then
+ if [ "${SSID}" = "${ssid}" ]; then
return ${EXIT_TRUE}
else
return ${EXIT_FALSE}
fi
local ssid="${1}"
+
if ! isset ssid; then
error "Please provide a SSID"
return ${EXIT_ERROR}
fi
- local ssid_hash="$(wireless_network_hash "${ssid}")"
- assert isset ssid_hash
-
# Check for duplicates
if wireless_network_exists "${ssid}"; then
error "The wireless network ${ssid} already exists"
return ${EXIT_ERROR}
fi
+ local handle="$(wireless_network_hash "${ssid}")"
+ assert isset handle
+
log DEBUG "Creating wireless network '${ssid}'"
- if ! mkdir -p "${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"; then
+ if ! mkdir -p "${NETWORK_WIRELESS_NETWORKS_DIR}/${handle}"; then
log ERROR "Could not create config directory for wireless network ${ssid}"
return ${EXIT_ERROR}
fi
- # When the ssid is not set in the settings file we cannot write it because wireless_network_exists fails
- echo "SSID=\"${ssid}\"" >>"${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings"
-
local ${WIRELESS_NETWORK_CONFIG_SETTINGS}
ENCRYPTION_MODE="${WIRELESS_DEFAULT_ENCRYPTION_MODE}"
SSID="${ssid}"
PRIORITY=500
- if ! wireless_network_write_config "${ssid}"; then
+ if ! wireless_network_write_config "${handle}"; then
log ERROR "Could not write new config file"
return ${EXIT_ERROR}
fi
return ${EXIT_ERROR}
fi
- local ssid_hash="$(wireless_network_hash "${ssid}")"
- assert isset ssid_hash
+ local handle="$(wireless_network_hash "${ssid}")"
+ assert isset handle
- if ! rm -rf "${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"; then
+ if ! rm -rf "${NETWORK_WIRELESS_NETWORKS_DIR}/${handle}"; then
error "Could not delete the wireless network"
return ${EXIT_ERROR}
fi
log ERROR "Not enough arguments"
return ${EXIT_ERROR}
fi
- local ssid="${1}"
+ local handle="${1}"
local mode="${2}"
if ! isoneof mode ${WIRELESS_VALID_ENCRYPTION_MODES}; then
fi
local ${WIRELESS_NETWORK_CONFIG_SETTINGS}
- if ! wireless_network_read_config "${ssid}"; then
- error "Could not read configuration for ${ssid}"
+ if ! wireless_network_read_config "${handle}"; then
+ error "Could not read configuration"
return ${EXIT_ERROR}
fi
# Save new encryption mode
ENCRYPTION_MODE="${mode}"
- if ! wireless_network_write_config "${ssid}"; then
+ if ! wireless_network_write_config "${handle}"; then
log ERROR "Could not write configuration settings"
return ${EXIT_ERROR}
fi
log ERROR "Not enough arguments"
return ${EXIT_ERROR}
fi
- local ssid="${1}"
+
+ local handle="${1}"
local psk="${2}"
local ${WIRELESS_NETWORK_CONFIG_SETTINGS}
- if ! wireless_network_read_config "${ssid}"; then
- error "Could not read configuration for ${ssid}"
+ if ! wireless_network_read_config "${handle}"; then
+ error "Could not read configuration"
return ${EXIT_ERROR}
fi
fi
fi
- if ! wireless_network_write_config_key "${ssid}" "PSK" "${psk}"; then
+ if ! wireless_network_write_config_key "${handle}" "PSK" "${psk}"; then
log ERROR "Could not write configuration settings"
return ${EXIT_ERROR}
fi
log ERROR "Not enough arguments"
return ${EXIT_ERROR}
fi
- local ssid="${1}"
+
+ local handle="${1}"
local priority=${2}
if ! isinteger priority && [ ! ${priority} -ge 0 ]; then
return ${EXIT_ERROR}
fi
- if ! wireless_network_write_config_key "${ssid}" "PRIORITY" "${priority}"; then
+ if ! wireless_network_write_config_key "${handle}" "PRIORITY" "${priority}"; then
log ERROR "Could not write configuration settings"
return ${EXIT_ERROR}
fi
}
+wireless_networks_write_wpa_supplicant_configuration() {
+ local device="${1}"
+
+ local file="${WPA_SUPPLICANT_CONF_DIR}/${device}.conf"
+
+ # Ensure we can write the file
+ make_parent_directory "${file}"
+
+ local country="$(wireless_get_reg_domain)"
+
+ (
+ config_header "WPA supplicant configuration file"
+
+ # Set control socket directory.
+ print "ctrl_interface=${WPA_SUPPLICANT_SOCKET_DIR}"
+
+ # Honour country
+ if isset country; then
+ print "country=${country}"
+ print
+ fi
+
+ wireless_networks_to_wpa_supplicant
+ ) > ${file}
+}
+
wireless_networks_to_wpa_supplicant() {
- local ssid
- for ssid in "$(wireless_network_list_ssids)"; do
- wireless_network_to_wpa_supplicant "${ssid}"
+ local handle
+ for handle in $(wireless_network_list); do
+ wireless_network_to_wpa_supplicant "${handle}"
done
}
wireless_network_to_wpa_supplicant() {
- local ssid="${1}"
+ local handle="${1}"
local ${WIRELESS_NETWORK_CONFIG_SETTINGS}
- if ! wireless_network_read_config "${ssid}"; then
- error "Could not read configuration for ${ssid}"
+ if ! wireless_network_read_config "${handle}"; then
+ error "Could not read configuration for ${handle}"
return ${EXIT_ERROR}
fi
local pairwise
local proto
- case "${ENCRYPTION_MODE}" in
- # Normal WPA
- WPA-PSK)
- auth_alg="OPEN"
- key_mgmt="WPA-PSK"
- proto="WPA"
- pairwise="CCMP TKIP"
- group="CCMP TKIP WEP104 WEP40"
- ;;
-
- # WPA with stronger algorithms
- WPA-PSK-SHA256)
- auth_alg="OPEN"
- key_mgmt="WPA-PSK-SHA256"
- proto="WPA"
- pairwise="CCMP TKIP"
- group="CCMP TKIP WEP104 WEP40"
- ;;
-
- # Normal WPA2 (802.11i)
- WPA2-PSK)
- auth_alg="OPEN"
- key_mgmt="WPA-PSK"
- proto="RSN"
- pairwise="CCMP TKIP"
- group="CCMP TKIP WEP104 WEP40"
- ;;
-
- # WPA2 with stronger algorithms
- WPA2-PSK-SHA256)
- auth_alg="OPEN"
- key_mgmt="WPA-PSK-SHA256"
- proto="RSN"
- pairwise="CCMP TKIP"
- group="CCMP TKIP WEP104 WEP40"
- ;;
-
- # WEP
- WEP)
- auth_alg="SHARED"
- wep_key0="${key}"
- wep_tx_keyidx="0"
+ local mode
+ for mode in ${WIRELESS_NETWORK_SUPPORTED_MODES}; do
+ # Skip any disabled modes
+ if isset ENCRYPTION_MODES && ! list_match "${mode}" ${ENCRYPTION_MODES}; then
+ continue
+ fi
- # Reset PSK.
- psk=""
- ;;
+ case "${mode}" in
+ # WPA2 (802.11i)
+ WPA2-PSK|WPA2-PSK-SHA256)
+ list_append_unique auth_alg "OPEN"
+ list_append_unique key_mgmt "${mode/WPA2/WPA}"
+ list_append_unique proto "RSN"
+
+ local p
+ for p in CCMP TKIP; do
+ list_append_unique pairwise "${p}"
+ done
+
+ local g
+ for g in CCMP TKIP WEP104 WEP40; do
+ list_append_unique group "${g}"
+ done
+ ;;
+
+ # WPA
+ WPA-PSK|WPA-PSK-SHA256)
+ list_append_unique auth_alg "OPEN"
+ list_append_unique key_mgmt "${mode}"
+ list_append_unique proto "WPA"
+
+ local p
+ for p in CCMP TKIP; do
+ list_append_unique pairwise "${p}"
+ done
+
+ local g
+ for g in CCMP TKIP WEP104 WEP40; do
+ list_append_unique group "${g}"
+ done
+ ;;
+
+ # No encryption. DANGEROUS!
+ NONE)
+ list_append_unique auth_alg "OPEN"
+ list_append_unique key_mgmt "NONE"
+ ;;
+ esac
+ done
- # No encryption. DANGEROUS!
- NONE)
- auth_alg="OPEN"
- key_mgmt="NONE"
- ;;
- esac
+ assert isset auth_alg
+ assert isset key_mgmt
print_indent 0 "# ${SSID}"
- print_indent 0 "network = {"
- print_indent 1 "ssid=\"${ssid}\""
+ print_indent 0 "network={"
+ print_indent 1 "ssid=\"${SSID}\""
+
+ # Priority
+ if isinteger PRIORITY; then
+ print_indent 1 "priority=${PRIORITY}"
+ fi
print
# Authentication
print_indent 1 "auth_alg=${auth_alg}"
print_indent 1 "key_mgmt=${key_mgmt}"
- case "${ENCRYPTION_MODE}" in
- WPA*)
- print_indent 1 "proto=${proto}"
- print_indent 1 "pairwise=${pairwise}"
- ;;
- esac
+ local i
+ for i in proto pairwise group; do
+ print_indent 1 "${i}=${!i}"
+ done
+ print
- # PSKs
- case "${ENCRYPTION_MODE}" in
- WPA*PSK)
- print_indent 1 "psk=\"${PSK}\""
- ;;
- WEP)
- print_indent 1 "wep_key0=\"${PSK}\""
- print_indent 1 "wep_tx_keyidx=0"
- ;;
- esac
+ # PSK
+ if isset PSK; then
+ print_indent 1 "# Pre Shared Key"
+ print_indent 1 "psk=\"${PSK}\""
+ fi
+
+ if isset EAP_MODES; then
+ print_indent 1 "# EAP"
+ print_indent 1 "eap=${EAP_MODES}"
+ print
+ fi
print_indent 0 "}"
print