From 28e7cf4072651e0e32aaf3c0bff32bf3cbc30f33 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Sun, 25 Jan 2015 19:54:34 +0100 Subject: [PATCH] On ajoute watch_net.sh --- files/usr/share/watch_net/watch_net.sh | 91 ++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 files/usr/share/watch_net/watch_net.sh diff --git a/files/usr/share/watch_net/watch_net.sh b/files/usr/share/watch_net/watch_net.sh new file mode 100644 index 0000000000..04cf5e161d --- /dev/null +++ b/files/usr/share/watch_net/watch_net.sh @@ -0,0 +1,91 @@ +#!/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