[PATCH v7 2/2] fff-network: Make custom port configuration update-safe

Adrian Schmutzler freifunk at adrianschmutzler.de
Mo Aug 21 18:46:28 CEST 2017


This writes CLIENT/BATMAN/WAN port configurations for devices
with switches to a separate file. This file can be changed
based on the desired setup and is then preserved during
firmware upgrade. In case of a future bugfix concerning the
entries of a specific network.* file, this will still be
effective as only the port configurations reside in the
new file, while the other settings could be overwritten by
the upgrade.

For one- and two-port devices, adjustments have been made so
that their relevant settings also reside in the new file now.

This also adds a WebUI interface for setting the two-port
devices (CPE210 and CPE510).

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

Tested-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>
---
 src/packages/fff/fff-network/Makefile              |  2 +-
 src/packages/fff/fff-network/ar71xx/network.cpe210 | 19 +----
 src/packages/fff/fff-network/ar71xx/network.cpe510 | 19 +----
 .../fff/fff-network/ar71xx/network.gl-ar150        | 13 +---
 .../fff-network/files/usr/sbin/configurenetwork    | 55 ++++++++++++++
 .../files/etc/uci-defaults/99-fff-sysupgrade       |  2 +-
 .../fff/fff-web/files/www/ssl/cgi-bin/ports.html   | 83 +++++++++++++++++++---
 7 files changed, 137 insertions(+), 56 deletions(-)

diff --git a/src/packages/fff/fff-network/Makefile b/src/packages/fff/fff-network/Makefile
index d34016c..23a1345 100644
--- a/src/packages/fff/fff-network/Makefile
+++ b/src/packages/fff/fff-network/Makefile
@@ -1,7 +1,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=fff-network
-PKG_VERSION:=0.0.7
+PKG_VERSION:=8
 PKG_RELEASE:=1
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
diff --git a/src/packages/fff/fff-network/ar71xx/network.cpe210 b/src/packages/fff/fff-network/ar71xx/network.cpe210
index 8180789..6764c64 100644
--- a/src/packages/fff/fff-network/ar71xx/network.cpe210
+++ b/src/packages/fff/fff-network/ar71xx/network.cpe210
@@ -8,20 +8,5 @@ ETHMESHMAC="w2ap"
 
 . /etc/network.mode
 
-#LAN0: default: BATMAN
-if [ "${LAN0MODE}" = "BATMAN" ] ; then
-  BATMAN_PORTS="${BATMAN_PORTS} 5"
-elif [ "${LAN0MODE}" = "CLIENT" ] ; then
-  CLIENT_PORTS="${CLIENT_PORTS} 5"
-else
-  WAN_PORTS="${WAN_PORTS} 5"
-fi
-
-#LAN1: default: BATMAN
-if [ "${LAN1MODE}" = "WAN" ] ; then
-  WAN_PORTS="${WAN_PORTS} 4"
-elif [ "${LAN1MODE}" = "CLIENT" ] ; then
-  CLIENT_PORTS="${CLIENT_PORTS} 4"
-else
-  BATMAN_PORTS="${BATMAN_PORTS} 4"
-fi
+LAN0PORT=5
+LAN1PORT=4
diff --git a/src/packages/fff/fff-network/ar71xx/network.cpe510 b/src/packages/fff/fff-network/ar71xx/network.cpe510
index 8180789..6764c64 100644
--- a/src/packages/fff/fff-network/ar71xx/network.cpe510
+++ b/src/packages/fff/fff-network/ar71xx/network.cpe510
@@ -8,20 +8,5 @@ ETHMESHMAC="w2ap"
 
 . /etc/network.mode
 
-#LAN0: default: BATMAN
-if [ "${LAN0MODE}" = "BATMAN" ] ; then
-  BATMAN_PORTS="${BATMAN_PORTS} 5"
-elif [ "${LAN0MODE}" = "CLIENT" ] ; then
-  CLIENT_PORTS="${CLIENT_PORTS} 5"
-else
-  WAN_PORTS="${WAN_PORTS} 5"
-fi
-
-#LAN1: default: BATMAN
-if [ "${LAN1MODE}" = "WAN" ] ; then
-  WAN_PORTS="${WAN_PORTS} 4"
-elif [ "${LAN1MODE}" = "CLIENT" ] ; then
-  CLIENT_PORTS="${CLIENT_PORTS} 4"
-else
-  BATMAN_PORTS="${BATMAN_PORTS} 4"
-fi
+LAN0PORT=5
+LAN1PORT=4
diff --git a/src/packages/fff/fff-network/ar71xx/network.gl-ar150 b/src/packages/fff/fff-network/ar71xx/network.gl-ar150
index 4e59b86..61ce71a 100644
--- a/src/packages/fff/fff-network/ar71xx/network.gl-ar150
+++ b/src/packages/fff/fff-network/ar71xx/network.gl-ar150
@@ -1,19 +1,12 @@
 WANDEV=eth0
 SWITCHDEV=eth1
 WAN_PORTS=
+BATMAN_PORTS="0t"
+CLIENT_PORTS="0t"
 
 ETHMESHMAC=eth1
 ROUTERMAC=eth0
 
 . /etc/network.mode
 
-if [ "$ETHMODE" = "CLIENT" ] ; then
-  ## Activate Client:
-  CLIENT_PORTS="1 0t"
-  BATMAN_PORTS="0t"
-else
-  ## Activate BATMAN:
-  BATMAN_PORTS="1 0t"
-  CLIENT_PORTS="0t"
-fi
-
+ETHPORT=1
diff --git a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
index 5b06009..c6b3113 100755
--- a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
+++ b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
@@ -12,6 +12,61 @@
 BOARD="$(uci get board.model.name)"
 . /etc/network.$BOARD
 
+if [ -s /etc/network.config ] ; then
+    . /etc/network.config
+else
+    echo "CLIENT_PORTS='$CLIENT_PORTS'" > /etc/network.config
+    echo "BATMAN_PORTS='$BATMAN_PORTS'" >> /etc/network.config
+    if [ -n "$WAN_PORTS" ] ; then
+        echo "WAN_PORTS='$WAN_PORTS'" >> /etc/network.config
+    fi
+    if [ "$ONE_PORT" = "YES" ] || [ -n "$ETHPORT" ] ; then
+        echo "ETHMODE='$ETHMODE' # use BATMAN, CLIENT or WAN" >> /etc/network.config
+    fi
+    if [ -n "$LAN0PORT" ] ; then
+        echo "LAN0MODE='$LAN0MODE' # use BATMAN, CLIENT or WAN" >> /etc/network.config
+    fi
+    if [ -n "$LAN1PORT" ] ; then
+        echo "LAN1MODE='$LAN1MODE' # use BATMAN, CLIENT or WAN" >> /etc/network.config
+    fi
+    echo "FORCEPARSE='0' # Parse at: 0=first boot only, 1=every reboot, 2=next reboot (once)" >> /etc/network.config
+fi
+
+if [ "$FORCEPARSE" = '2' ] ; then
+    sed -i '/^FORCEPARSE/d' /etc/network.config
+    echo "FORCEPARSE='0' # Parse at: 0=first boot only, 1=every reboot, 2=next reboot (once)" >> /etc/network.config
+    FORCEPARSE='1'
+fi
+
+if [ -n "$ETHPORT" ] ; then
+    #LAN at AR150: default: BATMAN
+    if [ "${ETHMODE}" = "BATMAN" ] ; then
+        BATMAN_PORTS="${BATMAN_PORTS} ${ETHPORT}"
+    else
+        CLIENT_PORTS="${CLIENT_PORTS} ${ETHPORT}"
+    fi
+fi
+if [ -n "$LAN0PORT" ] ; then
+    #LAN0 at two-port: default: BATMAN
+    if [ "${LAN0MODE}" = "BATMAN" ] ; then
+        BATMAN_PORTS="${BATMAN_PORTS} ${LAN0PORT}"
+    elif [ "${LAN0MODE}" = "CLIENT" ] ; then
+        CLIENT_PORTS="${CLIENT_PORTS} ${LAN0PORT}"
+    else
+        WAN_PORTS="${WAN_PORTS} ${LAN0PORT}"
+    fi
+fi
+if [ -n "$LAN1PORT" ] ; then
+    #LAN1 at two-port: default: BATMAN
+    if [ "${LAN1MODE}" = "WAN" ] ; then
+        WAN_PORTS="${WAN_PORTS} ${LAN1PORT}"
+    elif [ "${LAN1MODE}" = "CLIENT" ] ; then
+        CLIENT_PORTS="${CLIENT_PORTS} ${LAN1PORT}"
+    else
+        BATMAN_PORTS="${BATMAN_PORTS} ${LAN1PORT}"
+    fi
+fi
+
 if ! uci -q get network.$SWITCHDEV > /dev/null || [ "$FORCEPARSE" = '1' ] ; then
 
     SWITCHHW=$(swconfig list | awk '{ print $4 }')
diff --git a/src/packages/fff/fff-sysupgrade/files/etc/uci-defaults/99-fff-sysupgrade b/src/packages/fff/fff-sysupgrade/files/etc/uci-defaults/99-fff-sysupgrade
index 61f2d1f..ab6f2de 100644
--- a/src/packages/fff/fff-sysupgrade/files/etc/uci-defaults/99-fff-sysupgrade
+++ b/src/packages/fff/fff-sysupgrade/files/etc/uci-defaults/99-fff-sysupgrade
@@ -7,6 +7,6 @@ cat > /etc/sysupgrade.conf <<-__EOF__
 /etc/dropbear/dropbear_dss_host_key
 /etc/dropbear/dropbear_rsa_host_key
 /etc/dropbear/authorized_keys
-/etc/network.mode
+/etc/network.config
 /etc/config/system
 __EOF__
diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/ports.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/ports.html
index 26de8d5..9d54be7 100755
--- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/ports.html
+++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/ports.html
@@ -1,18 +1,32 @@
 #!/usr/bin/haserl
 
 <%                                                                                
+board_name=$(uci -q get board.model.name)
 # write
 if [ "$REQUEST_METHOD" == "POST" ] ; then
-	sed -i '/^.*# set via WebUI/d' /etc/network.mode
-	echo "ETHMODE=\"${POST_mode}\" # set via WebUI" >> /etc/network.mode
-	do_reboot=1
-	MSG='<span class="green">Port Modus geändert! Router startet neu...</span>'
+	if [ "$POST_change_mode" != "" ] ; then
+		sed -i '/^.*# set via WebUI/d' /etc/network.config
+		echo "ETHMODE=\"${POST_mode}\" # set via WebUI" >> /etc/network.config
+		sed -i '/^FORCEPARSE/d' /etc/network.config
+		echo "FORCEPARSE='2'" >> /etc/network.config
+		do_reboot=1
+		MSG='<span class="green">Port Modus geändert! Router startet neu...</span>'
+	fi
+	if [ "$POST_change_twoport" != "" ] ; then
+		sed -i '/^.*# set via WebUI/d' /etc/network.config
+		echo "LAN0MODE=\"${POST_mode0}\" # set via WebUI" >> /etc/network.config
+		echo "LAN1MODE=\"${POST_mode1}\" # set via WebUI" >> /etc/network.config
+		sed -i '/^FORCEPARSE/d' /etc/network.config
+		echo "FORCEPARSE='2'" >> /etc/network.config
+		do_reboot=1
+		MSG='<span class="green">Port Modus geändert! Router startet neu...</span>'
+	fi
 fi
 %>
 <%in /www/ssl/cgi-bin/header %>
 <%in /www/ssl/cgi-bin/helpers %>
 <% show_msg %>
-<form method="POST">
+<form method="post">
 <table style="width: 100%;">
 <% if swconfig list | grep -q switch0 ; then %>
 	<%# Device has a switch %>
@@ -53,10 +67,11 @@ fi
 	</fieldset>
 	</td></tr>
 <% fi %>
-<% if grep -q network.mode /etc/network.$(uci -q get board.model.name) ; then %>
+<% if grep -q "ONE_PORT" "/etc/network.$board_name" || grep -q "ETHPORT" "/etc/network.$board_name" ; then %>
 	<%
-		# Device has only one or two ports and makes use of /etc/network.mode
+		# Device has a port set by $ETHMODE
 		. /etc/network.mode
+		. /etc/network.config
 	%>
 	<tr><td>
 	<fieldset>
@@ -66,9 +81,11 @@ fi
 				<th style="width: 1em;">Anschluss Modus:</th>
 				<td>
 					<select name="mode">
-						<option value="WAN" <% [ "$ETHMODE" == "WAN" ] && echo -n selected %>>WAN</option>
-						<option value="CLIENT" <% [ "$ETHMODE" == "CLIENT" ] && echo -n selected %>>Client</option>
-						<option value="BATMAN" <% [ "$ETHMODE" == "BATMAN" ] && echo -n selected %>>BATMAN</option>
+						<option value="BATMAN" <% [ "$ETHMODE" == "BATMAN" ] && echo -n 'selected="selected" ' %>>BATMAN</option>
+						<option value="CLIENT" <% [ "$ETHMODE" == "CLIENT" ] && echo -n 'selected="selected" ' %>>CLIENT</option>
+						<% if grep -q "ONE_PORT" "/etc/network.$board_name" ; then %>
+						<option value="WAN" <% [ "$ETHMODE" == "WAN" ] && echo -n 'selected="selected" ' %>>WAN</option>
+						<% fi %>
 					</select>
 				</td>
 			</tr>
@@ -87,6 +104,52 @@ fi
 	</fieldset>
 	</td></tr>
 <% fi %>
+<% if grep -q "LAN0PORT" "/etc/network.$board_name" || grep -q "LAN1PORT" "/etc/network.$board_name" ; then %>
+	<%
+		# Device has two ports
+		. /etc/network.mode
+		. /etc/network.config
+	%>
+	<tr><td>
+	<fieldset>
+		<legend>Ethernet Anschlüsse</legend>
+		<table>
+			<tr>
+				<th style="width: 15em;text-align:left">Modus Anschluss 0:</th>
+				<th style="width: 15em;text-align:left">Modus Anschluss 1:</th>
+				<th></th>
+			</tr>
+			<tr>
+				<td>
+					<select name="mode0">
+						<option value="BATMAN" <% [ "$LAN0MODE" == "BATMAN" ] && echo -n 'selected="selected" ' %>>BATMAN</option>
+						<option value="CLIENT" <% [ "$LAN0MODE" == "CLIENT" ] && echo -n 'selected="selected" ' %>>CLIENT</option>
+						<option value="WAN" <% [ "$LAN0MODE" == "WAN" ] && echo -n 'selected="selected" ' %>>WAN</option>
+					</select>
+				</td>
+				<td>
+					<select name="mode1">
+						<option value="BATMAN" <% [ "$LAN1MODE" == "BATMAN" ] && echo -n 'selected="selected" ' %>>BATMAN</option>
+						<option value="CLIENT" <% [ "$LAN1MODE" == "CLIENT" ] && echo -n 'selected="selected" ' %>>CLIENT</option>
+						<option value="WAN" <% [ "$LAN1MODE" == "WAN" ] && echo -n 'selected="selected" ' %>>WAN</option>
+					</select>
+				</td>
+				<td><input type="submit" name="change_twoport" /></td>
+			</tr>
+			<tr><td colspan="3"></td></tr>
+			<tr><td colspan="3">
+				WAN: Knoten stellt über Ethernet Anschluss Verbindung zum Internet her.<br />
+				Client: Normale Clients stellen über Ethernet Anschluss des Knotens Verbindung zum Freifunk Netz her.<br />
+				BATMAN: Knoten stellt über Ethernet Anschluss Verbindung zu anderen MESH Knoten her.<br /><br />
+
+				Wenn diese Einstellung verändert wird, wird eine evtl. vorhandene manuelle Netzwerkkonfiguration in der
+				<tt>/etc/config/network</tt> überschrieben.<br />
+				Anschließend wird der Router neugestartet.
+			</td></tr>
+		</table>
+	</fieldset>
+	</td></tr>
+<% fi %>
 </table>
 </form>
 <%in /www/ssl/cgi-bin/footer %>
-- 
2.7.4



Mehr Informationen über die Mailingliste franken-dev