91 lines
2.6 KiB
Bash
Executable file
91 lines
2.6 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# Watch the different broadcast networks and hide them if they
|
|
# are considered unusable.
|
|
# A new entry in wifi-iface sections of wireless config has been added
|
|
# test_connect can contain a shell command giving the state of the
|
|
# network:
|
|
# for a bridged wifi network (without IP on APs side), this could be:
|
|
# option 'test_connect' 'arping -I br-$(net) $(routeur_ip) -c 4'
|
|
# for wpa2 networks, test_connect can be ommited and connectivity
|
|
# to the radius serveur will be checked.
|
|
# In case of lack of connectivity, the corresponding SSID won't be
|
|
# broadcast anymore, preveting new clients from connecting.
|
|
# Currently, the scripts uses SIGHUP signal to hostapd process which
|
|
# ends up in loosing anyway all associated clients on the >>radio<<
|
|
# (hope this will be fixed)
|
|
|
|
CONF=/var/run/hostapd-phy0.conf
|
|
PID=/var/run/wifi-phy0.pid
|
|
CTRL=/var/run/hostapd/
|
|
|
|
. /lib/functions.sh
|
|
|
|
# Numbered of changed statuses
|
|
changed=0
|
|
|
|
|
|
get_dev_of_ssid() {
|
|
for dev in `ls $CTRL`; do
|
|
hostapd_cli -p$CTRL -i$dev get_config | grep "^ssid=$1$" -q && {
|
|
echo $dev; return;
|
|
}
|
|
|
|
done
|
|
}
|
|
|
|
set_ignore_broadcast_ssid() {
|
|
dev=`get_dev_of_ssid $1`
|
|
echo "ssid $1 in $dev"
|
|
old=`sed -e "/^\(interface\|bss\)=$dev$/,/^bss=/ s/^ignore_broadcast_ssid=\(.*\)$/\1/; t; d" $CONF`
|
|
[ -z "$old" ] && { echo "Old value not found. Skipping"; return; }
|
|
echo "Set to $2 (old=$old)"
|
|
[ "$old" -eq $2 ] && {
|
|
echo "...Unchanged !"
|
|
} || {
|
|
sed -e "/^\(interface\|bss\)=$dev$/,/^bss=/ s/^ignore_broadcast_ssid=.*$/ignore_broadcast_ssid=$2/; " -i $CONF
|
|
changed=$(($changed+1))
|
|
}
|
|
}
|
|
|
|
check_ssid() {
|
|
local iface="$1"
|
|
config_get ssid $iface ssid default
|
|
config_get test_connect $iface test_connect
|
|
config_get disabled $iface disabled 0
|
|
[ $disabled -ne 0 ] && {
|
|
echo "$ssid: skipped (disabled)"
|
|
return
|
|
}
|
|
[ -z "$test_connect" ] && {
|
|
config_get server $iface server
|
|
[ -z "$server" ] && {
|
|
test_connect="true"
|
|
} || {
|
|
test_connect="ping -c 4 $server"
|
|
}
|
|
}
|
|
echo "$ssid: $test_connect ..."
|
|
$test_connect &> /dev/null
|
|
[ 0 -eq $? ] && set_ignore_broadcast_ssid "$ssid" 0 \
|
|
|| set_ignore_broadcast_ssid "$ssid" 1
|
|
|
|
}
|
|
|
|
# TODO: find out why this causes all clients to be disconnected on the radio
|
|
# maybe we should try reload the configuration using "hostapd_cli reconfigure"
|
|
# however we should figure out first what happened to that command
|
|
# (http://lists.shmoo.com/pipermail/hostap/2011-July/023520.html ?)
|
|
reload_hostapd() {
|
|
echo "reload config"
|
|
kill -1 `cat $PID`
|
|
}
|
|
|
|
config_load wireless
|
|
cp $CONF $CONF.bak
|
|
config_foreach check_ssid wifi-iface
|
|
[ 0 -ne "$changed" ] && {
|
|
reload_hostapd
|
|
}
|
|
|
|
exit $changed
|