SSID ändern wenn kein Gateway in Range

Aus Freifunk Franken
Version vom 27. November 2016, 22:33 Uhr von Chris (Diskussion | Beiträge) (update mit gluon script)
Wechseln zu:Navigation, Suche

Es kommt immer mal wieder vor, das Router "in der Luft hängen" und keine Verbindung zum Freifunknetz haben. Bei anfälligen Routern macht es Sinn dieses Script zu installieren, dann wird die ausgestrahlte SSID geändert sobald kein Gateway (=DHCP Server) mehr in Reichweite ist. Man kann sich immernoch zum internen Freifunknetz verbinden, wird aber keine IP bekommen. Batman bleibt davon unberührt. Daher funktioniert auch weiterhin der ssh Zugriff oder web-login - sofern Verbindung besteht.

Das unten beschriebene Skript basiert auf folgender Vorlage und wurde für freifunk-franken angepasst: https://github.com/eulenfunk/packages/blob/master/gluon-ssid-changer/files/lib/gluon/ssid-changer/ssid-changer.sh

Mit diesem Script wird die SSID geändert in "FF_OFFLINE_"ROUTERNAME"".

vi /usr/sbin/ssidoffline 

i drücken zum Bearbeiten

#!/bin/sh

# At first some Definitions:

ONLINE_SSID=$(uci get wireless.w2ap.ssid -q)
: ${ONLINE_SSID:=franken.freifunk.net}   # if for whatever reason ONLINE_SSID is NULL
OFFLINE_PREFIX='FF_OFFLINE_' # Use something short to leave space for the nodename

UPPER_LIMIT='75' #Above this limit the online SSID will be used
LOWER_LIMIT='30' #Below this limit the offline SSID will be used
# In-between these two values the SSID will never be changed to prevent it from toggeling every Minute.

# Generate an Offline SSID with the first and last Part of the nodename to allow owner to recognise wich node is down
NODENAME=`uname -n`
if [ ${#NODENAME} -gt $((30 - ${#OFFLINE_PREFIX})) ] ; then #32 would be possible as well
	HALF=$(( (28 - ${#OFFLINE_PREFIX} ) / 2 )) #calculate the length of the first part of the node identifier in the offline-ssid
	SKIP=$(( ${#NODENAME} - $HALF )) #jump to this charakter for the last part of the name
	OFFLINE_SSID=$OFFLINE_PREFIX${NODENAME:0:$HALF}...${NODENAME:$SKIP:${#NODENAME}} # use the first and last part of the nodename for nodes with long name
else
	OFFLINE_SSID="$OFFLINE_PREFIX$NODENAME" #greate we are able to use the full nodename in the offline ssid
fi

#Is there an active Gateway?
GATEWAY_TQ=`batctl gwl | grep "^=>" | awk -F'[()]' '{print $2}'| tr -d " "` #Grep the Connection Quality of the Gateway which is currently used
if [ ! $GATEWAY_TQ ]; #If there is no gateway there will be errors in the following if clauses
then
	GATEWAY_TQ=0 #Just an easy way to get an valid value if there is no gateway
fi
if [ $GATEWAY_TQ -gt $UPPER_LIMIT ];
then
	echo "Gateway TQ is $GATEWAY_TQ node is online"
	for HOSTAPD in $(ls /var/run/hostapd-phy*); do #Check status for all physical devices
		CURRENT_SSID=`grep "^ssid=$ONLINE_SSID" $HOSTAPD | cut -d"=" -f2`
		if [ $CURRENT_SSID == $ONLINE_SSID ]
		then
			echo "SSID $CURRENT_SSID is correct, nothing to do"
			HUP_NEEDED=0
			break
		fi
		CURRENT_SSID=`grep "^ssid=$OFFLINE_SSID" $HOSTAPD | cut -d"=" -f2`
		if [ $CURRENT_SSID == $OFFLINE_SSID ]
		then
			logger -s -t "gluon-offline-ssid" -p 5 "TQ is $GATEWAY_TQ, SSID is $CURRENT_SSID, change to $ONLINE_SSID" #Write Info to Syslog
			sed -i s/^ssid=$CURRENT_SSID/ssid=$ONLINE_SSID/ $HOSTAPD
			HUP_NEEDED=1 # HUP here would be to early for dualband devices
		else
			echo "There is something wrong, did not find SSID $ONLINE_SSID or $OFFLINE_SSID"
		fi
	done
fi
if [ $GATEWAY_TQ -lt $LOWER_LIMIT ];
then
	echo "Gateway TQ is $GATEWAY_TQ node is considered offline"
	for HOSTAPD in $(ls /var/run/hostapd-phy*); do #Check status for all physical devices
		CURRENT_SSID=`grep "^ssid=$OFFLINE_SSID" $HOSTAPD | cut -d"=" -f2`
		if [ $CURRENT_SSID == $OFFLINE_SSID ]
		then
			echo "SSID $CURRENT_SSID is correct, noting to do"
			HUP_NEEDED=0
			break
		fi
		CURRENT_SSID=`grep "^ssid=$ONLINE_SSID" $HOSTAPD | cut -d"=" -f2`
		if [ $CURRENT_SSID == $ONLINE_SSID ]
		then
			logger -s -t "gluon-offline-ssid" -p 5 "TQ is $GATEWAY_TQ, SSID is $CURRENT_SSID, change to $OFFLINE_SSID" #Write Info to Syslog
			sed -i s/^ssid=$ONLINE_SSID/ssid=$OFFLINE_SSID/ $HOSTAPD
			HUP_NEEDED=1 # HUP here would be to early for dualband devices
		else
			echo "There is something wrong, did not find SSID $ONLINE_SSID or $OFFLINE_SSID"
		fi
	done
fi
if [ $GATEWAY_TQ -ge $LOWER_LIMIT -a $GATEWAY_TQ -le $UPPER_LIMIT ]; #This is just to get a clean run if we are in-between the grace periode
then
	echo "TQ is $GATEWAY_TQ, do nothing"
	HUP_NEEDED=0
fi
if [ $HUP_NEEDED == 1 ]; then
	killall -HUP hostapd # Send HUP to all hostapd um die neue SSID zu laden
	HUP_NEEDED=0
	echo "HUP!"
fi

ESC und :wq zum speichern

ausführbar machen:

chmod +x /usr/sbin/ssidoffline

noch schnell nen cronjob anlegen:

vi /usr/lib/micron.d/fff-offline

i drücken zum Bearbeiten

*/1 * * * * /usr/sbin/ssidoffline

ESC und :wq zum speichern

micrond neu starten

/etc/init.d/micrond restart 

Achtung beim Test: Nach Abbruch der Verbindung dauert es u.U. ein paar Minuten bis batctl gwl wirklich ein "No gateways in range" liefert, diese Zeit muss abgewartet werden es kann daher nach ziehen der Uplinkverbindung durchaus bis zu 5 Minuten dauern bis die SSID geändert wurde. Um zu prüfen welcher Gateway aktuell Verwendung findet, kann per ssh in der Kommandozeile "batctl gwl" eingegeben werden, der Gateway mit "=>" Kennzeichnung wird verwendet.