[RFC PATCH v3] fff-autorestart: Add autorestart package

Adrian Schmutzler freifunk at adrianschmutzler.de
So Jul 9 23:58:32 CEST 2017


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. Setting
/tmp/gatewayoff to '0' disables the whole process.

This is an RFC patch, as I'm interested in implementing this into
the firmware of the routers I administer. Thus, any comments,
suggestions and so forth are welcome!

Signed-off-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>

Tested-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>
---
 src/packages/fff/fff-autorestart/Makefile          | 40 ++++++++++++++++++++++
 .../files/usr/lib/micron.d/fff-autorestart         |  1 +
 .../fff-autorestart/files/usr/sbin/offlinerestart  | 40 ++++++++++++++++++++++
 src/packages/fff/fff/Makefile                      |  1 +
 4 files changed, 82 insertions(+)
 create mode 100755 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/offlinerestart

diff --git a/src/packages/fff/fff-autorestart/Makefile b/src/packages/fff/fff-autorestart/Makefile
new file mode 100755
index 0000000..b48542a
--- /dev/null
+++ b/src/packages/fff/fff-autorestart/Makefile
@@ -0,0 +1,40 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=fff-autorestart
+PKG_VERSION:=1
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/fff-autorestart
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/fff-autorestart
+    SECTION:=base
+    CATEGORY:=Freifunk
+    TITLE:= Freifunk-Franken Auto-Restart
+    URL:=http://www.freifunk-franken.de
+    DEPENDS:=+micrond
+endef
+
+define Package/fff-autorestart/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/fff-autorestart/install
+    $(CP) ./files/* $(1)/
+endef
+
+$(eval $(call BuildPackage,fff-autorestart))
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..885b50a
--- /dev/null
+++ b/src/packages/fff/fff-autorestart/files/usr/lib/micron.d/fff-autorestart
@@ -0,0 +1 @@
+*/5 * * * * /usr/sbin/offlinerestart
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..36e8582
--- /dev/null
+++ b/src/packages/fff/fff-autorestart/files/usr/sbin/offlinerestart
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+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 [ -s /tmp/gatewayoff ] && grep -q '0' /tmp/gatewayoff ; then
+    exit 0
+fi
+
+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"
+	if [ -s /tmp/gatewayoff ] ; then 
+		rm -f /tmp/gatewayoff
+	fi
+fi
+if [ $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
+	if [ "$(cat /tmp/gatewayoff)" -lt "$OFFLINESINCE" ] ; then
+		#rm -f /tmp/gatewayoff
+		reboot && exit
+	fi
+fi
+if [ $GATEWAY_TQ -ge $LOWER_LIMIT ] && [ $GATEWAY_TQ -le $UPPER_LIMIT ]; # This is just to get a clean run if we are in-between the grace periode
+then
+	echo "Gateway TQ is $GATEWAY_TQ - Do nothing"
+fi
diff --git a/src/packages/fff/fff/Makefile b/src/packages/fff/fff/Makefile
index b039c2d..21ed827 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-nodewatcher \
              +fff-web \
              +fff-uradvd \
-- 
2.7.4



Mehr Informationen über die Mailingliste franken-dev