]> git.ipfire.org Git - people/stevee/network.git/blobdiff - src/functions/functions.wireless-networks
wpa_supplicant: Doesn't like spaces here
[people/stevee/network.git] / src / functions / functions.wireless-networks
index aaf7cb331eece5807be16be844d56f45fa43784f..e48919f7dd82c128a47aba0d8c6904bde40d1219 100644 (file)
 #                                                                             #
 ###############################################################################
 
-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
@@ -39,12 +43,15 @@ cli_wireless_network() {
                                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 $?
                                        ;;
                                *)
@@ -64,7 +71,7 @@ wireless_network_list_ssids() {
        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
 
@@ -76,20 +83,12 @@ wireless_network_list_ssids() {
 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
 
@@ -102,50 +101,33 @@ wireless_network_write_config() {
 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}"
@@ -169,26 +151,18 @@ wireless_network_read_config_by_handle() {
 # 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}
@@ -221,36 +195,34 @@ wireless_network_new() {
        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
@@ -265,10 +237,10 @@ wireless_network_destroy() {
                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
@@ -282,7 +254,7 @@ wireless_network_encryption_mode() {
                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
@@ -291,8 +263,8 @@ wireless_network_encryption_mode() {
        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
 
@@ -306,7 +278,7 @@ wireless_network_encryption_mode() {
        # 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
@@ -317,12 +289,13 @@ wireless_network_pre_shared_key() {
                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
 
@@ -334,7 +307,7 @@ wireless_network_pre_shared_key() {
                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
@@ -345,7 +318,8 @@ wireless_network_priority() {
                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
@@ -353,25 +327,51 @@ wireless_network_priority() {
                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
 
@@ -381,63 +381,67 @@ wireless_network_to_wpa_supplicant() {
        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
@@ -445,23 +449,23 @@ wireless_network_to_wpa_supplicant() {
        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