2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2017 IPFire Network Development Team #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
22 WIRELESS_NETWORK_CONFIG_SETTINGS
="ENCRYPTION_MODE PRIORITY PSK SSID"
24 WIRELESS_NETWORKS_VALID_ENCRYPTION_MODES
="WPA2-PSK"
26 cli_wireless_network
() {
29 wireless_network_new
"${@:2}"
32 wireless_network_destroy
"${@:2}"
39 if ! wireless_network_exists
"${ssid}"; then
40 error
"No such wireless network: ${ssid}"
45 encryption_mode|pre_shared_key|priority
)
46 wireless_network_
${key} "${ssid}" "$@"
49 wireless_network_show
"${ssid}"
53 error
"Unrecognized argument: ${key}"
61 # This function writes all values to a via ${ssid} specificated wireless network configuration file
62 wireless_network_write_config
() {
67 local ssid_hash
="$(wireless_network_hash "${ssid}")"
68 assert isset ssid_hash
70 if ! wireless_network_exists
"${ssid}"; then
71 log ERROR
"No such wireless network: '${ssid}'"
75 local path
="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings"
77 if ! settings_write
"${path}" ${WIRELESS_NETWORK_CONFIG_SETTINGS}; then
78 log ERROR
"Could not write configuration settings for wireless network ${ssid}"
82 # When we get here the writing of the config file was successful
86 # This funtion writes the value for one key to a via ${ssid} specificated
87 # wireless network configuration file
88 wireless_network_write_config_key
() {
97 if ! wireless_network_exists
"${ssid}"; then
98 log ERROR
"No such wireless network: ${ssid}"
102 log DEBUG
"Set '${key}' to new value '${value}' in wireless network '${ssid}'"
104 local ${WIRELESS_NETWORK_CONFIG_SETTINGS}
106 # Read the config settings
107 if ! wireless_network_read_config
"${ssid}"; then
111 # Set the key to a new value
112 assign
"${key}" "${value}"
114 if ! wireless_network_write_config
"${ssid}"; then
121 # Reads one or more keys out of a settings file or all if no key is provided.
122 wireless_network_read_config
() {
128 local ssid_hash
="$(wireless_network_hash "${ssid}")"
129 assert isset ssid_hash
131 if ! wireless_network_exists
"${ssid}"; then
132 log ERROR
"No such wireless network : ${ssid}"
137 if [ $# -eq 0 ] && [ -n "${WIRELESS_NETWORK_CONFIG_SETTINGS}" ]; then
138 list_append args
${WIRELESS_NETWORK_CONFIG_SETTINGS}
140 list_append args
"$@"
143 local path
="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings"
145 if ! settings_read
"${path}" ${args}; then
146 log ERROR
"Could not read settings for wireless network ${ssid}"
151 # This function checks if a wireless network exists
152 # Returns True when yes and false when not
153 wireless_network_exists
() {
157 local ssid_hash
="$(wireless_network_hash "${ssid}")"
158 assert isset ssid_hash
160 local path
="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"
162 # We cannot use wireless_network_read_config here beacuse we would end in a loop
165 local path_settings
="${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings"
167 if ! settings_read
"${path_settings}" SSID
; then
173 if [ -d "${path}" ] && [[ "${ssid}" = "${SSID}" ]]; then
180 wireless_network_hash
() {
185 local hash=$
(echo -n "${string}" |
md5sum )
188 local path
="${NETWORK_WIRELESS_NETWORKS_DIR}/*${hash}"
190 if [ -d "${path}" ]; then
193 local normalized
=$
(normalize
"${string}")
194 normalized
=${normalized%-}
195 echo "${normalized}-${hash}"
199 wireless_network_new
() {
200 if [ $# -gt 1 ]; then
201 error
"Too many arguments"
206 if ! isset ssid
; then
207 error
"Please provide a SSID"
211 local ssid_hash
="$(wireless_network_hash "${ssid}")"
212 assert isset ssid_hash
214 # Check for duplicates
215 if wireless_network_exists
"${ssid}"; then
216 error
"The wireless network ${ssid} already exists"
220 log DEBUG
"Creating wireless network '${ssid}'"
222 if ! mkdir
-p "${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"; then
223 log ERROR
"Could not create config directory for wireless network ${ssid}"
227 # When the ssid is not set in the settings file we cannot write it because wireless_network_exists fails
228 echo "SSID=\"${ssid}\"" >>"${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}/settings"
230 local ${WIRELESS_NETWORK_CONFIG_SETTINGS}
234 if ! wireless_network_write_config
"${ssid}"; then
235 log ERROR
"Could not write new config file"
240 # Function that deletes based on the passed parameters
241 # one ore more wireless networks
242 wireless_network_destroy
() {
245 local ssid_hash
="$(wireless_network_hash "${ssid}")"
246 assert isset ssid_hash
248 if ! wireless_network_exists
"${ssid}"; then
249 log ERROR
"The wireless network ${ssid} does not exist."
253 log DEBUG
"Deleting wireless network ${ssid}"
255 if ! rm -rf "${NETWORK_WIRELESS_NETWORKS_DIR}/${ssid_hash}"; then
256 log ERROR
"Deleting the wireless network ${ssid} was not sucessful"
262 wireless_network_encryption_mode
() {
263 if [ ! $# -eq 2 ]; then
264 log ERROR
"Not enough arguments"
270 if ! isoneof mode
${WIRELESS_NETWORKS_VALID_ENCRYPTION_MODES}; then
271 log ERROR
"Encryption mode '${mode}' is invalid"
275 if ! wireless_network_write_config_key
"${ssid}" "ENCRYPTION_MODE" ${mode^^}; then
276 log ERROR
"Could not write configuration settings"
281 wireless_network_pre_shared_key
() {
282 if [ ! $# -eq 2 ]; then
283 log ERROR
"Not enough arguments"
289 if ! wireless_network_write_config_key
"${ssid}" "PSK" "${psk}"; then
290 log ERROR
"Could not write configuration settings"
295 wireless_network_priority
() {
296 if [ ! $# -eq 2 ]; then
297 log ERROR
"Not enough arguments"
303 if ! isinteger priority
&& [ ! ${priority} -ge 0 ]; then
304 log ERROR
"The priority must be an integer greater or eqal zero"
308 if ! wireless_network_write_config_key
"${ssid}" "PRIORITY" "${priority}"; then
309 log ERROR
"Could not write configuration settings"