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 <freifunk@adrianschmutzler.de>
Reviewed-by: Christian Dresel <fff@chrisi01.de>
Tested-by: Christian Dresel <fff@chrisi01.de>
Reviewed-by: Tim Niemeyer <tim@tn-x.org>
This commit is contained in:
Adrian Schmutzler 2017-12-18 15:03:34 +01:00 committed by Tim Niemeyer
parent 696c983f22
commit 6cc6b4b786
1 changed files with 36 additions and 1 deletions

View File

@ -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