diff --git a/README.md b/README.md index a893698c0ead17abf58869352a41a16691fec57a..c7e075f082a2036d9b5206e404cb168becd1d413 100644 --- a/README.md +++ b/README.md @@ -12,24 +12,22 @@ Adapt and add this block to your site.conf: ``` ssid_changer = { - switch_timeframe = 1, -- only once every timeframe (in minutes) the SSID will change to OFFLINE - -- set to 1440 to change once a day - -- set to 1 minute to change every time the router gets offline - first = 5, -- the first few minutes directly after reboot within which an Offline-SSID always may be activated - prefix = 'FF_OFFLINE_', -- use something short to leave space for the nodename (no '~' allowed!) - suffix = 'nodename', -- generate the ssid with either 'nodename', 'mac' or to use only the prefix: 'none' - - limits = { - disabled = false, -- if true, the offline ssid will only be set if there is no gateway reacheable - -- upper and lower limit to turn the offline_ssid on and off - -- in-between these two values the SSID will never be changed to preven it from toggeling every Minute. - tq_max = '55', -- upper limit, above that the online SSID will be used - tq_min = '45' -- lower limit, below that the offline SSID will be used - }, + switch_timeframe = 1, -- only once every timeframe (in minutes) the SSID will change to OFFLINE + -- set to 1440 to change once a day + -- set to 1 minute to change every time the router gets offline + first = 5, -- the first few minutes directly after reboot within which an Offline-SSID always may be activated + prefix = 'FF_OFFLINE_', -- use something short to leave space for the nodename (no '~' allowed!) + suffix = 'nodename', -- generate the SSID with either 'nodename', 'mac' or to use only the prefix: 'none' + + tq_limit_enabled = 0, -- if false, the offline SSID will only be set if there is no gateway reacheable + -- upper and lower limit to turn the offline_ssid on and off + -- in-between these two values the SSID will never be changed to prevent it from toggeling every minute. + tq_limit_max = '55', -- upper limit, above that the online SSID will be used + tq_limit_min = '45' -- lower limit, below that the offline SSID will be used }, ``` -if limits are disabled, then it will be only checked, if the gateway is reachable with +if tq_limit is disabled, then it will be only checked, if the gateway is reachable with batctl gwl -H diff --git a/files/etc/config/ssid-changer b/files/etc/config/ssid-changer new file mode 100644 index 0000000000000000000000000000000000000000..1ad4a1e5cd78b2aeb47384e326321913eafe39c7 --- /dev/null +++ b/files/etc/config/ssid-changer @@ -0,0 +1 @@ +config main 'settings' diff --git a/files/lib/gluon/ssid-changer/ssid-changer.sh b/files/lib/gluon/ssid-changer/ssid-changer.sh index 349020dd5ddf4bf669b458cfc4352894c60bbd89..255e658902d10967f8cc2e9829462c3d59c6f852 100755 --- a/files/lib/gluon/ssid-changer/ssid-changer.sh +++ b/files/lib/gluon/ssid-changer/ssid-changer.sh @@ -1,26 +1,59 @@ #!/bin/sh -MINUTES=1440 # only once every timeframe the SSID will change to OFFLINE (set to 1 minute to change every time the router gets offline) -FIRST=5 # the first few minutes directly after reboot within which an Offline-SSID always may be activated -OFFLINE_PREFIX='FF_OFFLINE_' # use something short to leave space for the nodename (no '~' allowed!) +# only once every timeframe the SSID will change to OFFLINE (set to 1 minute to change every time the router gets offline) +MINUTES="$(uci get ssid-changer.settings.switch_timeframe -q)" +# the first few minutes directly after reboot within which an Offline-SSID always may be activated +: ${MINUTES:=1} -ONLINE_SSID="$(uci get wireless.client_radio0.ssid -q)" -: ${ONLINE_SSID:="FREIFUNK"} # if for whatever reason ONLINE_SSID is NULL +FIRST="$(uci get ssid-changer.settings.first -q)" +# use something short to leave space for the nodename (no '~' allowed!) +: ${FIRST:=5} + +PREFIX="$(uci get ssid-changer.settings.prefix -q)" +# generate the ssid with either 'nodename', 'mac' or to use only the prefix: 'none' +: ${PREFIX:='FF_OFFLINE_'} + +SETTINGS_SUFFIX="$(uci get ssid-changer.settings.suffix -q)" -# 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 +TQ_LIMIT_ENABLED="$(uci get ssid-changer.settings.tq_limit_disabled -q)" +: ${TQ_LIMIT_ENABLED:='0'} # if true, the offline ssid will only be set if there is no gateway reacheable + # upper and lower limit to turn the offline_ssid on and off + # in-between these two values the SSID will never be changed to preven it from toggeling every Minute. + +TQ_LIMIT_MAX="$(uci get ssid-changer.settings.tq_limit_max -q)" +: ${TQ_LIMIT_MAX:='55'} # upper limit, above that the online SSID will be used +TQ_LIMIT_MIN="$(uci get ssid-changer.settings.tq_limit_min -q)" +: ${TQ_LIMIT_MIN:='45'} # lower limit, below that the offline SSID will be used + +if [ "$(uci get ssid-changer.settings.enabled -q)" = '0' ]; then + DISABLED='1' else - OFFLINE_SSID="$OFFLINE_PREFIX$NODENAME" # great! we are able to use the full nodename in the offline ssid + DISABLED='0' fi -# maximum simplified, no more ttvn rating -CHECK=$(batctl gwl -H|grep -v "gateways in range"|wc -l) +if [ $SETTINGS_SUFFIX = 'nodename' ]; then + SUFFIX="$(uname -n)" + if [ ${#SUFFIX} -gt $((30 - ${#PREFIX})) ]; then # 32 would be possible as well + HALF=$(( (28 - ${#PREFIX} ) / 2 )) # calculate the length of the first part of the node identifier in the offline-ssid + SKIP=$(( ${#SUFFIX} - $HALF )) # jump to this charakter for the last part of the name + SUFFIX=${SUFFIX:0:$HALF}...${SUFFIX:$SKIP:${#SUFFIX}} # use the first and last part of the nodename for nodes with long name + fi +elif [ $SETTINGS_SUFFIX = 'mac' ]; then + SUFFIX="$(uci get network.bat0.macaddr -q)" +else + SUFFIX='' +fi + +OFFLINE_SSID="$PREFIX$SUFFIX" + +# TODO: ffac tq limits has to be implemented here if enabled +TQ_LIMIT_ENABLED=0 # disabled for now +ONLINE_SSID="$(uci get wireless.client_radio0.ssid -q)" +: ${ONLINE_SSID:="FREIFUNK"} # if for whatever reason ONLINE_SSID is NULL + +CHECK="$(batctl gwl -H|grep -v "gateways in range"|wc -l)" HUP_NEEDED=0 -if [ $CHECK -gt 0 ]; then +if [ "$CHECK" -gt 0 ] || [ "$DISABLED" = '1' ]; then echo "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)" @@ -31,14 +64,14 @@ if [ $CHECK -gt 0 ]; then 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 "SSID is $CURRENT_SSID, change to $ONLINE_SSID" + logger -s -t "gluon-ssid-changer" -p 5 "SSID is $CURRENT_SSID, change to $ONLINE_SSID" 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" + logger -s -t "gluon-ssid-changer" -p 5 "could not set to online state: did neither find SSID '$ONLINE_SSID' nor '$OFFLINE_SSID'. Please reboot" fi done -elif [ $CHECK -eq 0 ]; then +elif [ "$CHECK" -eq 0 ]; then echo "node is considered offline" UP=$(cat /proc/uptime | sed 's/\..*//g') if [ $(($UP / 60)) -lt $FIRST ] || [ $(($UP / 60 % $MINUTES)) -eq 0 ]; then @@ -50,11 +83,11 @@ elif [ $CHECK -eq 0 ]; then 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 "SSID is $CURRENT_SSID, change to $OFFLINE_SSID" + logger -s -t "gluon-ssid-changer" -p 5 "SSID is $CURRENT_SSID, change to $OFFLINE_SSID" sed -i "s~^ssid=$ONLINE_SSID~ssid=$OFFLINE_SSID~" $HOSTAPD HUP_NEEDED=1 else - echo "There is something wrong: did neither find SSID '$ONLINE_SSID' nor '$OFFLINE_SSID'" + logger -s -t "gluon-ssid-changer" -p 5 "could not set to offline state: did neither find SSID '$ONLINE_SSID' nor '$OFFLINE_SSID'. Please reboot" fi done fi diff --git a/files/lib/gluon/upgrade/500-ssid-changer b/files/lib/gluon/upgrade/500-ssid-changer new file mode 100644 index 0000000000000000000000000000000000000000..02d21883b87b366581595512b9349d5ea8516517 --- /dev/null +++ b/files/lib/gluon/upgrade/500-ssid-changer @@ -0,0 +1,23 @@ +#!/usr/bin/lua + +local site = require 'gluon.site_config' + +local legacy_uci = require 'luci.model.uci' +local uci = legacy_uci.cursor() + +-- LEDE: local uci = require('simple-uci').cursor() + +if not uci:get('ssid-changer', 'settings', 'enabled') then +uci:section('ssid-changer', 'main', 'settings', { + enabled = '1', + switch_timeframe = site.switch_timeframe or '1', + first = site.first or '5', + prefix = site.prefix or 'FF_OFFLINE_', + suffix = site.suffix or 'nodename', + tq_limit_enabled = site.tq_limit_enabled or '0', + tq_limit_max = site.tq_limit_max or '55', + tq_limit_min = site.tq_limit_min or '45', +}) +end + +uci:save('ssid-changer')