From: Michael Tremer Date: Fri, 18 Aug 2017 13:05:43 +0000 (+0200) Subject: Move wireless networks functions into extra file X-Git-Tag: 010~223 X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Fnetwork.git;a=commitdiff_plain;h=49958b8c7416641a6187cb2db0b4091abc94b714 Move wireless networks functions into extra file Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index 994792ef..a39af22a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -164,6 +164,7 @@ dist_network_SCRIPTS = \ src/functions/functions.vpn \ src/functions/functions.vpn-security-policies \ src/functions/functions.wireless \ + src/functions/functions.wireless-networks \ src/functions/functions.wpa_supplicant \ src/functions/functions.zone \ src/network-radvd-config \ diff --git a/src/functions/functions.wireless b/src/functions/functions.wireless index 6b33cf59..d132da68 100644 --- a/src/functions/functions.wireless +++ b/src/functions/functions.wireless @@ -25,13 +25,20 @@ NETWORK_SETTINGS_FILE_PARAMS="${NETWORK_SETTINGS_FILE_PARAMS} WIRELESS_REGULATOR WIRELESS_REGULATORY_DOMAIN_DATABASE="/usr/lib/crda/regulatory.bin" -WIRELESS_NETWORK_CONFIG_SETTINGS="\ - SSID \ - ENCRYPTION_MODE \ - KEY \ - PRIORITY" +cli_wireless() { + local action=${1} + shift 1 -WIRELESS_NETWORKS_VALID_ENCRYPTION_MODES="WPA2-PSK" + case "${action}" in + network) + cli_wireless_network "$@" + ;; + *) + error "Unrecognized argument: ${action}" + exit ${EXIT_ERROR} + ;; + esac +} wireless_create() { local device=${1} @@ -407,312 +414,3 @@ wireless_monitor() { return ${EXIT_OK} } - -cli_wireless() { - local action=${1} - shift 1 - - case "${action}" in - network) - cli_wireless_network "$@" - ;; - *) - error "Unrecognized argument: ${action}" - exit ${EXIT_ERROR} - ;; - esac -} - -cli_wireless_network() { - if wireless_network_exists "${1}"; then - local ssid="${1}" - local key="${2}" - key=${key//-/_} - shift 2 - - case "${key}" in - encryption_mode|key|priority) - wireless_network_${key} "${ssid}" "$@" - ;; - show) - wireless_network_show "${ssid}" - exit $? - ;; - *) - error "Unrecognized argument: ${key}" - exit ${EXIT_ERROR} - ;; - esac - else - local action=${1} - shift - - case "${action}" in - new) - wireless_network_new "$@" - ;; - destroy) - wireless_network_destroy "$@" - ;; - ""|*) - if [ -n "${action}" ]; then - error "Unrecognized argument: '${action}'" - fi - exit ${EXIT_ERROR} - ;; - esac - fi -} - -# This function writes all values to a via ${ssid} specificated wireless network configuration file -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 path="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings" - - if ! settings_write "${path}" ${WIRELESS_NETWORK_CONFIG_SETTINGS}; then - log ERROR "Could not write configuration settings for wireless network ${ssid}" - return ${EXIT_ERROR} - fi - - # When we get here the writing of the config file was successful - return ${EXIT_OK} -} - -# This funtion writes the value for one key to a via ${ssid} specificated -# wireless network configuration file -wireless_network_write_config_key() { - assert [ $# -ge 3 ] - - local ssid="${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 - return ${EXIT_ERROR} - fi - - # Set the key to a new value - assign "${key}" "${value}" - - if ! wireless_network_write_config "${ssid}"; then - return ${EXIT_ERROR} - fi - - return ${EXIT_OK} -} - -# Reads one or more keys out of a settings file or all if no key is provided. -wireless_network_read_config() { - assert [ $# -ge 1 ] - - local ssid="${1}" - shift 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 args - if [ $# -eq 0 ] && [ -n "${WIRELESS_NETWORK_CONFIG_SETTINGS}" ]; then - list_append args ${WIRELESS_NETWORK_CONFIG_SETTINGS} - else - list_append args "$@" - fi - - local path="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings" - - if ! settings_read "${path}" ${args}; then - log ERROR "Could not read settings for wireless network ${ssid}" - return ${EXIT_ERROR} - fi -} - -# 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}" - - # 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 - return ${EXIT_FALSE} - fi - - assert isset SSID - - if [ -d "${path}" ] && [[ "${ssid}" = "${SSID}" ]]; then - return ${EXIT_TRUE} - else - return ${EXIT_FALSE} - fi -} - -wireless_network_hash() { - assert [ $# -eq 1 ] - - local string="${1}" - - local hash=$(echo -n "${string}" | md5sum ) - hash=${hash%% -} - - local path="${NETWORK_WIRELESS_NETWORKS_DIR}/*${hash}" - - if [ -d "${path}" ]; then - basename "${path}" - else - local normalized=$(normalize "${string}") - normalized=${normalized%-} - echo "${normalized}-${hash}" - fi -} - -wireless_network_new() { - if [ $# -gt 1 ]; then - error "Too many arguments" - return ${EXIT_ERROR} - 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 - - log DEBUG "Creating wireless network '${ssid}'" - - if ! mkdir -p "${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"; 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} - SSID="${ssid}" - PRIORITY=500 - - if ! wireless_network_write_config "${ssid}"; then - log ERROR "Could not write new config file" - return ${EXIT_ERROR} - fi -} - -# Function that deletes based on the passed parameters -# one ore more wireless networks -wireless_network_destroy() { - local ssid - for ssid in "$@"; do - local ssid_hash="$(wireless_network_hash "${ssid}")" - assert isset ssid_hash - - if ! wireless_network_exists "${ssid}"; then - log ERROR "The wireless network ${ssid} does not exist." - continue - fi - - log DEBUG "Deleting wireless network ${ssid}" - - if ! rm -rf "${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"; then - log ERROR "Deleting the wireless network ${ssid} was not sucessful" - return ${EXIT_ERROR} - fi - done -} - -wireless_network_encryption_mode() { - if [ ! $# -eq 2 ]; then - log ERROR "Not enough arguments" - return ${EXIT_ERROR} - fi - local ssid="${1}" - local mode="${2}" - - if ! isoneof mode ${WIRELESS_NETWORKS_VALID_ENCRYPTION_MODES}; then - log ERROR "Encryption mode '${mode}' is invalid" - return ${EXIT_ERROR} - fi - - if ! wireless_network_write_config_key "${ssid}" "ENCRYPTION_MODE" ${mode^^}; then - log ERROR "Could not write configuration settings" - return ${EXIT_ERROR} - fi -} - -wireless_network_key() { - if [ ! $# -eq 2 ]; then - log ERROR "Not enough arguments" - return ${EXIT_ERROR} - fi - local ssid="${1}" - local key="${2}" - - if ! wireless_network_write_config_key "${ssid}" "KEY" "${key}"; then - log ERROR "Could not write configuration settings" - return ${EXIT_ERROR} - fi -} - -wireless_network_priority() { - if [ ! $# -eq 2 ]; then - log ERROR "Not enough arguments" - return ${EXIT_ERROR} - fi - local ssid="${1}" - local priority=${2} - - if ! isinteger priority && [ ! ${priority} -ge 0 ]; then - log ERROR "The priority must be an integer greater or eqal zero" - return ${EXIT_ERROR} - fi - - if ! wireless_network_write_config_key "${ssid}" "PRIORITY" "${priority}"; then - log ERROR "Could not write configuration settings" - return ${EXIT_ERROR} - fi -} diff --git a/src/functions/functions.wireless-networks b/src/functions/functions.wireless-networks new file mode 100644 index 00000000..3c317a74 --- /dev/null +++ b/src/functions/functions.wireless-networks @@ -0,0 +1,318 @@ +#!/bin/bash +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2017 IPFire Network Development Team # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### + +WIRELESS_NETWORK_CONFIG_SETTINGS="ENCRYPTION_MODE KEY PRIORITY SSID" + +WIRELESS_NETWORKS_VALID_ENCRYPTION_MODES="WPA2-PSK" + +cli_wireless_network() { + if wireless_network_exists "${1}"; then + local ssid="${1}" + local key="${2}" + key=${key//-/_} + shift 2 + + case "${key}" in + encryption_mode|key|priority) + wireless_network_${key} "${ssid}" "$@" + ;; + show) + wireless_network_show "${ssid}" + exit $? + ;; + *) + error "Unrecognized argument: ${key}" + exit ${EXIT_ERROR} + ;; + esac + else + local action=${1} + shift + + case "${action}" in + new) + wireless_network_new "$@" + ;; + destroy) + wireless_network_destroy "$@" + ;; + ""|*) + if [ -n "${action}" ]; then + error "Unrecognized argument: '${action}'" + fi + exit ${EXIT_ERROR} + ;; + esac + fi +} + +# This function writes all values to a via ${ssid} specificated wireless network configuration file +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 path="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings" + + if ! settings_write "${path}" ${WIRELESS_NETWORK_CONFIG_SETTINGS}; then + log ERROR "Could not write configuration settings for wireless network ${ssid}" + return ${EXIT_ERROR} + fi + + # When we get here the writing of the config file was successful + return ${EXIT_OK} +} + +# This funtion writes the value for one key to a via ${ssid} specificated +# wireless network configuration file +wireless_network_write_config_key() { + assert [ $# -ge 3 ] + + local ssid="${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 + return ${EXIT_ERROR} + fi + + # Set the key to a new value + assign "${key}" "${value}" + + if ! wireless_network_write_config "${ssid}"; then + return ${EXIT_ERROR} + fi + + return ${EXIT_OK} +} + +# Reads one or more keys out of a settings file or all if no key is provided. +wireless_network_read_config() { + assert [ $# -ge 1 ] + + local ssid="${1}" + shift 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 args + if [ $# -eq 0 ] && [ -n "${WIRELESS_NETWORK_CONFIG_SETTINGS}" ]; then + list_append args ${WIRELESS_NETWORK_CONFIG_SETTINGS} + else + list_append args "$@" + fi + + local path="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings" + + if ! settings_read "${path}" ${args}; then + log ERROR "Could not read settings for wireless network ${ssid}" + return ${EXIT_ERROR} + fi +} + +# 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}" + + # 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 + return ${EXIT_FALSE} + fi + + assert isset SSID + + if [ -d "${path}" ] && [[ "${ssid}" = "${SSID}" ]]; then + return ${EXIT_TRUE} + else + return ${EXIT_FALSE} + fi +} + +wireless_network_hash() { + assert [ $# -eq 1 ] + + local string="${1}" + + local hash=$(echo -n "${string}" | md5sum ) + hash=${hash%% -} + + local path="${NETWORK_WIRELESS_NETWORKS_DIR}/*${hash}" + + if [ -d "${path}" ]; then + basename "${path}" + else + local normalized=$(normalize "${string}") + normalized=${normalized%-} + echo "${normalized}-${hash}" + fi +} + +wireless_network_new() { + if [ $# -gt 1 ]; then + error "Too many arguments" + return ${EXIT_ERROR} + 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 + + log DEBUG "Creating wireless network '${ssid}'" + + if ! mkdir -p "${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"; 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} + SSID="${ssid}" + PRIORITY=500 + + if ! wireless_network_write_config "${ssid}"; then + log ERROR "Could not write new config file" + return ${EXIT_ERROR} + fi +} + +# Function that deletes based on the passed parameters +# one ore more wireless networks +wireless_network_destroy() { + local ssid + for ssid in "$@"; do + local ssid_hash="$(wireless_network_hash "${ssid}")" + assert isset ssid_hash + + if ! wireless_network_exists "${ssid}"; then + log ERROR "The wireless network ${ssid} does not exist." + continue + fi + + log DEBUG "Deleting wireless network ${ssid}" + + if ! rm -rf "${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"; then + log ERROR "Deleting the wireless network ${ssid} was not sucessful" + return ${EXIT_ERROR} + fi + done +} + +wireless_network_encryption_mode() { + if [ ! $# -eq 2 ]; then + log ERROR "Not enough arguments" + return ${EXIT_ERROR} + fi + local ssid="${1}" + local mode="${2}" + + if ! isoneof mode ${WIRELESS_NETWORKS_VALID_ENCRYPTION_MODES}; then + log ERROR "Encryption mode '${mode}' is invalid" + return ${EXIT_ERROR} + fi + + if ! wireless_network_write_config_key "${ssid}" "ENCRYPTION_MODE" ${mode^^}; then + log ERROR "Could not write configuration settings" + return ${EXIT_ERROR} + fi +} + +wireless_network_key() { + if [ ! $# -eq 2 ]; then + log ERROR "Not enough arguments" + return ${EXIT_ERROR} + fi + local ssid="${1}" + local key="${2}" + + if ! wireless_network_write_config_key "${ssid}" "KEY" "${key}"; then + log ERROR "Could not write configuration settings" + return ${EXIT_ERROR} + fi +} + +wireless_network_priority() { + if [ ! $# -eq 2 ]; then + log ERROR "Not enough arguments" + return ${EXIT_ERROR} + fi + local ssid="${1}" + local priority=${2} + + if ! isinteger priority && [ ! ${priority} -ge 0 ]; then + log ERROR "The priority must be an integer greater or eqal zero" + return ${EXIT_ERROR} + fi + + if ! wireless_network_write_config_key "${ssid}" "PRIORITY" "${priority}"; then + log ERROR "Could not write configuration settings" + return ${EXIT_ERROR} + fi +}