#!/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 }