From patchwork Mon Aug 28 10:58:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [v10,6/6] fff-autorestart: Add autorestart package From: Adrian Schmutzler X-Patchwork-Id: 455 X-Patchwork-Delegate: freifunk@adrianschmutzler.de Message-Id: <1503917927-46450-1-git-send-email-freifunk@adrianschmutzler.de> To: franken-dev@freifunk.net Date: Mon, 28 Aug 2017 12:58:47 +0200 This package implements an auto-restart if the router has not been able to connect to a gateway for more than 30 minutes. If there had been an error or crash causing the interruption, it may be resolved by the restart while no harm is done. After the second restart, the delay is raised so the third and subsequent restarts are limited to one per day. This is a merge of my 3 previous patches introducing the autorestart capability. Now, the autorestart is disabled by default. Changed in v10: - Reduced micron.d freq to 3 min - Batman version selector introduced to match correctly => Correct line selected for 2013.4.0 => First line selected for other versions Changed in v9: - batctl gwl | Further fix to support BATMAN 2016.5 - Changed to elif structure Changes in v8: - batctl gwl | grep should now work for BATMAN 2016.5 - Makefile uses PKG_NAME Signed-off-by: Adrian Schmutzler --- src/packages/fff/fff-autorestart/Makefile | 40 ++++++++++++++++ .../files/usr/lib/micron.d/fff-autorestart | 1 + .../files/usr/sbin/disable_autorestart.sh | 15 ++++++ .../files/usr/sbin/enable_autorestart.sh | 15 ++++++ .../fff-autorestart/files/usr/sbin/offlinerestart | 56 ++++++++++++++++++++++ .../fff-web/files/www/ssl/cgi-bin/settings.html | 15 ++++++ src/packages/fff/fff/Makefile | 1 + 7 files changed, 143 insertions(+) create mode 100644 src/packages/fff/fff-autorestart/Makefile create mode 100644 src/packages/fff/fff-autorestart/files/usr/lib/micron.d/fff-autorestart create mode 100755 src/packages/fff/fff-autorestart/files/usr/sbin/disable_autorestart.sh create mode 100755 src/packages/fff/fff-autorestart/files/usr/sbin/enable_autorestart.sh create mode 100755 src/packages/fff/fff-autorestart/files/usr/sbin/offlinerestart diff --git a/src/packages/fff/fff-autorestart/Makefile b/src/packages/fff/fff-autorestart/Makefile new file mode 100644 index 0000000..e984e34 --- /dev/null +++ b/src/packages/fff/fff-autorestart/Makefile @@ -0,0 +1,40 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=fff-autorestart +PKG_VERSION:=2 +PKG_RELEASE:=1 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=base + CATEGORY:=Freifunk + TITLE:= Freifunk-Franken Auto-Restart + URL:=http://www.freifunk-franken.de + DEPENDS:=+micrond +fff-config +endef + +define Package/$(PKG_NAME)/description + This restarts the router if no connection + to gateways is available +endef + +define Build/Prepare + echo "all: " > $(PKG_BUILD_DIR)/Makefile +endef + +define Build/Configure + # nothing +endef + +define Build/Compile + # nothing +endef + +define Package/$(PKG_NAME)/install + $(CP) ./files/* $(1)/ +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/src/packages/fff/fff-autorestart/files/usr/lib/micron.d/fff-autorestart b/src/packages/fff/fff-autorestart/files/usr/lib/micron.d/fff-autorestart new file mode 100644 index 0000000..cc2fd10 --- /dev/null +++ b/src/packages/fff/fff-autorestart/files/usr/lib/micron.d/fff-autorestart @@ -0,0 +1 @@ +*/3 * * * * /usr/sbin/offlinerestart diff --git a/src/packages/fff/fff-autorestart/files/usr/sbin/disable_autorestart.sh b/src/packages/fff/fff-autorestart/files/usr/sbin/disable_autorestart.sh new file mode 100755 index 0000000..f83907b --- /dev/null +++ b/src/packages/fff/fff-autorestart/files/usr/sbin/disable_autorestart.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# This disables the auto-restart feature permanently +# (setting is preserved during upgrades) + +uci -q set "fff.autorestart=settings" +uci -q set "fff.autorestart.enabled=0" + +uci -q commit fff + +if [ -s /tmp/gatewayoff ] ; then + rm -f /tmp/gatewayoff +fi +if [ -s /etc/autorestartcount ] ; then + rm -f /etc/autorestartcount +fi diff --git a/src/packages/fff/fff-autorestart/files/usr/sbin/enable_autorestart.sh b/src/packages/fff/fff-autorestart/files/usr/sbin/enable_autorestart.sh new file mode 100755 index 0000000..4f7c3cb --- /dev/null +++ b/src/packages/fff/fff-autorestart/files/usr/sbin/enable_autorestart.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# This enables the auto-restart feature permanently +# (setting is preserved during upgrades) + +uci -q set "fff.autorestart=settings" +uci -q set "fff.autorestart.enabled=1" + +uci -q commit fff + +if [ -s /tmp/gatewayoff ] ; then + rm -f /tmp/gatewayoff +fi +if [ -s /etc/autorestartcount ] ; then + rm -f /etc/autorestartcount +fi diff --git a/src/packages/fff/fff-autorestart/files/usr/sbin/offlinerestart b/src/packages/fff/fff-autorestart/files/usr/sbin/offlinerestart new file mode 100755 index 0000000..c557ee6 --- /dev/null +++ b/src/packages/fff/fff-autorestart/files/usr/sbin/offlinerestart @@ -0,0 +1,56 @@ +#!/bin/sh + +if [ ! "$(uci -q get fff.autorestart.enabled)" = "1" ] ; then + exit 0 +fi + +UPPER_LIMIT='50' # Above this limit the gateway will be considered online +LOWER_LIMIT='20' # Below this limit the gateway will be considered offline +# In-between these two values the state is not changed + +NOW=$(date +%s) + +if batctl -v | grep -q '2013\.4\.0' ; then + BATCTLGW=$(batctl gwl | grep '^=>') +else + BATCTLGW=$(batctl gwl | grep -m 1 "Bit") +fi + +GATEWAY_TQ=$(echo "$BATCTLGW" | 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 a valid value if there is no gateway +fi +if [ $GATEWAY_TQ -gt $UPPER_LIMIT ]; then + echo "Gateway TQ is $GATEWAY_TQ - Node is online" + if [ -s /tmp/gatewayoff ] ; then + rm -f /tmp/gatewayoff + fi + if [ -s /etc/autorestartcount ] ; then + rm -f /etc/autorestartcount + fi +elif [ $GATEWAY_TQ -lt $LOWER_LIMIT ] ; then + echo "Gateway TQ is $GATEWAY_TQ - Node is considered offline" + if [ ! -s /tmp/gatewayoff ] ; then + echo "$NOW" > /tmp/gatewayoff + fi + OFFLINESINCE=$(($(date +%s)-1800)) # Restart after 30 minutes + OFFLINEDAY=$(($(date +%s)-86400)) # Restart after 1 day + if [ "$(cat /tmp/gatewayoff)" -lt "$OFFLINESINCE" ] ; then + if [ -s /etc/autorestartcount ] ; then # Auto-restart has already taken place + restartcount="$(cat /etc/autorestartcount)" + if [ "$restartcount" -lt 2 ] || [ "$(cat /tmp/gatewayoff)" -lt "$OFFLINEDAY" ] ; then + # 1st and 2nd restart after 30 minutes, 3rd+ restart after one day + echo $((restartcount + 1)) > /etc/autorestartcount + reboot && exit + fi + else + echo "1" > /etc/autorestartcount + reboot && exit + fi + fi +elif [ $GATEWAY_TQ -ge $LOWER_LIMIT ] && [ $GATEWAY_TQ -le $UPPER_LIMIT ] ; then # This is just to get a clean run if we are in-between the grace periode + echo "Gateway TQ is $GATEWAY_TQ - Do nothing" +else + echo "Parsing error" +fi diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html index f510431..73e3e59 100755 --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html @@ -64,6 +64,13 @@ if [ "$REQUEST_METHOD" == "POST" ] ; then fi fi + uci -q set "fff.autorestart=settings" + if [ "$POST_autorestart_enabled" == "on" ] ; then + uci -q set "fff.autorestart.enabled=1" + else + uci -q set "fff.autorestart.enabled=0" + fi + uci commit MSG='Daten gespeichert! - Bitte Router neustarten.' fi @@ -89,6 +96,11 @@ if [ "$(uci -q get 'fff.notifyupdate.resetonupgrade')" == "0" ] ; then # not set else upgrade_reset_checked="$chkd" fi +if [ "$(uci -q get 'fff.autorestart.enabled')" == "1" ] ; then # not set=0 + autorestart_checked="$chkd" +else + autorestart_checked="" +fi %> <% show_msg %>
@@ -145,6 +157,9 @@ fi <% fi %> + Auto-restart enabled: + /> + diff --git a/src/packages/fff/fff/Makefile b/src/packages/fff/fff/Makefile index 594406d..9eaa0cd 100644 --- a/src/packages/fff/fff/Makefile +++ b/src/packages/fff/fff/Makefile @@ -18,6 +18,7 @@ define Package/fff-base +ip6tables \ +odhcp6c \ +micrond \ + +fff-autorestart \ +fff-config \ +fff-nodewatcher \ +fff-web \