#!/bin/bash ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2012 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 . # # # ############################################################################### HOSTAPD_CONTROL_INTERFACE_DIR="/run/hostapd/ctrl" function hostapd_config_write() { local device=${1} assert isset device local file=${2} assert isset file # Shift the device and file argument. shift 2 local broadcast_ssid local channel local country_code local encryption local key local mode local ssid while [ $# -gt 0 ]; do case "${1}" in --broadcast-ssid=*) broadcast_ssid=$(cli_get_val ${1}) ;; --channel=*) channel=$(cli_get_val ${1}) ;; --country-code=*) country_code=$(cli_get_val ${1}) ;; --mode=*) mode=$(cli_get_val ${1}) ;; --ssid=*) ssid=$(cli_get_val ${1}) ;; --encryption=*) encryption=$(cli_get_val ${1}) ;; --key=*) key=$(cli_get_val ${1}) ;; *) warning_log "Ignoring unknown argument '${1}'." ;; esac shift done assert isset broadcast_ssid assert isbool broadcast_ssid assert isset channel assert isinteger channel assert isset country_code assert isset mode assert isset ssid # Check if key is set when encryption is used. if isset encryption; then assert isoneof encryption WPA WPA2 WPA/WPA2 assert isset key fi # Create configuration directory. local config_dir=$(dirname ${file}) mkdir -p ${HOSTAPD_CONTROL_INTERFACE_DIR} ${config_dir} 2>/dev/null config_header "hostapd" > ${file} # Interface configuration ( print "# Interface configuration" print "driver=nl80211" print "interface=${device}" print ) >> ${file} # Wireless configuration local ignore_broadcast_ssid if enabled broadcast_ssid; then ignore_broadcast_ssid="0" else ignore_broadcast_ssid="1" fi local hw_mode ieee80211n="0" if [ "${mode}" = "n" ]; then if [ ${channel} -le 15 ]; then hw_mode="g" else hw_mode="a" fi ieee80211n="1" else hw_mode="${mode}" fi ( print "# Wireless configuration" print "channel=${channel}" print "country_code=${country_code}" print "hw_mode=${hw_mode}" print "ieee80211n=${ieee80211n}" print "ignore_broadcast_ssid=${ignore_broadcast_ssid}" if contains_spaces "${ssid}"; then print "ssid=\"${ssid}\"" else print "ssid=${ssid}" fi print ) >> ${file} # Control interface. ( print "# Control interface" print "ctrl_interface=${HOSTAPD_CONTROL_INTERFACE_DIR}" print "ctrl_interface_group=0" print ) >> ${file} # Encryption settings if isset encryption; then local encryption_mode=0 case "${encryption}" in WPA) encryption_mode=1 ;; WPA2) encryption_mode=2 ;; WPA/WPA2) encryption_mode=3 ;; esac ( print "# Encryption settings" print "wpa=${encryption_mode}" print "wpa_passphrase=${key}" print "wpa_key_mgmt=WPA-PSK" print "wpa_pairwise=TKIP" print "rsn_pairwise=CCMP" print ) >> ${file} fi return ${EXIT_OK} } function hostapd_start() { local device=${1} assert isset device service_start "hostapd@${device}.service" local ret=$? if [ ${ret} -eq ${EXIT_OK} ]; then log DEBUG "hostapd has been successfully started on '${device}'" else log ERROR "Could not start hostapd on '${device}': ${ret}" return ${EXIT_ERROR} fi return ${EXIT_OK} } function hostapd_stop() { local device=${1} assert isset device service_stop "hostapd@${device}.service" }