From 6cc6b4b786d24faf067a6b29118e997c28c4e70b Mon Sep 17 00:00:00 2001 From: Adrian Schmutzler Date: Mon, 18 Dec 2017 15:03:34 +0100 Subject: [PATCH] configurehood: Prevent connecting two hoods To prevent connecting hoods, this patch loads keyxchange files from the local network (eth0.3/eth0) before it uses the gateway. Thus, if other files are provided via wXconfigap, they are just ignored. If a router is connected to two hoods by cable, it will just disable the interfaces where a second hood file is detected and wait until the next call of configurehood. If cable and wXmesh are different, the cable has precedence. If two hoods are present via cable on the same eth, wXmesh has precedence. If two hoods are present via cable on different eth, the first eth has precedence and all others are disabled. If cable has precedence, wXmesh is configured with the hood file from cable. Signed-off-by: Adrian Schmutzler Reviewed-by: Christian Dresel Tested-by: Christian Dresel Reviewed-by: Tim Niemeyer --- .../fff-hoods/files/usr/sbin/configurehood | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood index 7681f4ae..2b9c47ed 100755 --- a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood @@ -10,6 +10,7 @@ sectorlocal=/etc/sectorfile sectortmp=/tmp/sectorfile sectorcopy=/www/hood/sectorfile hiddenapfile=/tmp/hiddenapflag +resetnetworkfile=/tmp/resetnetwork rm -f "$hoodfile" @@ -65,6 +66,12 @@ fi lat=$(uci -q get fff.system.latitude) long=$(uci -q get fff.system.longitude) +# reenable network interfaces in case we disabled them earlier +if [ -f "$resetnetworkfile" ]; then + /etc/init.d/network restart + rm "$resetnetworkfile" +fi + # if we have Internet, we download the Hoodfile from the keyxchangev2 if hasInternet ; then wget -T15 -t5 "http://keyserver.freifunk-franken.de/v2/?lat=$lat&long=$long" -O "$hoodfile" @@ -121,7 +128,35 @@ else fi else echo "We have a Gateway in Range, we load the keyxchangev2data from fe80::1" - wget -T15 -t5 "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O "$hoodfile" + # check eth first + oldhood="" + ethfile="${hoodfile}eth" + for eth in $(batctl if | grep "eth" | sed -nE 's/.*(eth[^:]+):.*/\1/p'); do + for mac in $(batctl n | grep "$eth" | sed -nE 's/.*eth[0-9.]+\s+([^\s]+)\s.*/\1/p'); do + EUI="$(echo "$mac" | awk -F: '{ printf("%02x%s:%sff:fe%s:%s%s\n", xor(("0x"$1),2), $2, $3, $4, $5, $6) }')" + wget -T2 -t3 "http://[fe80::${EUI}%${eth}]:2342/keyxchangev2data" -O "$ethfile" + if [ -s "$ethfile" ]; then + json_load "$(cat "$ethfile")" + json_select hood + json_get_var newhood name + if [ -n "$oldhood" ] && [ -n "$newhood" ] && ( ! [ "$newhood" = "$oldhood" ] ) ; then + # 2nd hood found, kill interface and go on (next try in 5 min.) + echo "Two hoods detected. Remove cables to stay in just one." + ifconfig "$eth" down + touch "$resetnetworkfile" + continue 2 # go to the next interface + fi + mv "$ethfile" "$hoodfile" # Only use hoodfile if sane + [ -n "$oldhood" ] || oldhood="$newhood" # only set oldhood once + fi + done + done + if [ ! -s "$hoodfile" ]; then + # Only load hoodfile from gateway if not already present from local network + # - This gives local network a precedence (take the hood from local network) + # - This prevents file insertion from a third person, as I will only connect via LAN to who I trust + wget -T15 -t5 "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O "$hoodfile" + fi #UPLINK: Do nothing fi fi