[SQUASHED,v17,4/8] Add fff-hoods

Submitted by Tim Niemeyer on Oct. 14, 2017, 5:19 p.m.

Details

Message ID 20171014171959.25099-5-tim@tn-x.org
State Superseded
Headers show

Commit Message

Tim Niemeyer Oct. 14, 2017, 5:19 p.m.
From: Christian Dresel <fff@chrisi01.de>

This package connects to keyxchangev2

Signed-off-by: Christian Dresel <fff@chrisi01.de>
Signed-off-by: Jan Kraus <mayosemmel@gmail.com>
Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>

Signed-off-by: Tim Niemeyer <tim@tn-x.org>
---

Changes in v17:
- Fix resetting interfaces during connection drop
- Remove exit before vpn-select
- Use function for conditional wifiAddPhy

Changes in v16:
- Open configap for both 2.4 and 5 GHz

Changes in v15:
- Fixed 5 GHz channel
- Only start vpn-select if router has internet
- Put ping into function since it is used twice
- Check for started in micrond to prevent race condition
- Moved copy of keyxchangev2data to the end

Changes in v14:
- Tested, working Inet+mesh:
- Fixed stderr redirect
- Added call of configurehood to rc.local, so it is triggered if wan does not come up. To prevent race condition, hotplug.d is removed.
- Added wifi call to configAP setup
- Remove hiddenap flag after successful setup
- Added -q to uci calls
- Added network interface configSta
- Substitute timestamp to enable SHA comparison
- Removed started-check from vpn-select

Changes in v13: None
Changes in v12:
- Removed obsolete hostname

Changes in v11:
- Changed isGatewayAvailable to return integers (bool is not valid) and removed brackets for evaluations
- Added variables for channels as they are used twice
- Fixed $radio not set at the beginning (WORKAROUND!)
- Changed OpenWRT to LEDE
- Correctly reset json_select before reuse
- Some tidying-up of comments and quotes
- Fixed vpn loop so it works for more than one host (TESTED)
- Fixed "else" if no file received

Changes in v10:
- Minor code fixes
- Added fff-hoods to fff-base Makefile
- Removed trailing whitespaces and harmonized tabs
- Fixed some comments spelling
- Added mac for hostname rewrite
- Removed redundant check for /tmp/keyxchangev2data

Changes in v9:
- rebase onto 20170918-beta

Changes in v8:
- rebase onto 20170918-beta

Changes in v7: None
Changes in v6:
- !!UNTESTED!!
- fix hidden station v6
- fix -n to -f if
- Add function to check for a gateway and use this
- remove /etc/community.cfg and variables
- send fewer infos to keyxchangev2
- add a check if /tmp/keyxchangev2 not downloadable and edit a bit  on the wgets
- change the position from json_load and do this only 1 times
- !!UNTESTED!!
- delete keyxchangev2data at start of the script
- do only things with keyxchangev2data if available
- change keyxchangev2 url

Changes in v5:
- clean tabstops
- !!UNTESTED!!
- change hidden AP ip to locallink
- Open hidden AP after more checks
- Load json File from Gateway if Gateway in Batman in Range

Changes in v4: None
Changes in v3: None
Changes in v2:
- clean tabstops
- move the json vpn out of the if because we need this after reboot

 bsp/default/root_file_system/etc/rc.local          |   4 +
 src/packages/fff/fff-hoods/Makefile                |  39 ++++
 .../fff/fff-hoods/files/usr/lib/micron.d/fff-hoods |   1 +
 .../fff/fff-hoods/files/usr/sbin/configurehood     | 206 +++++++++++++++++++++
 .../fff/fff-vpn-select/files/usr/sbin/vpn-select   |   2 -
 .../fff-wireless/files/lib/functions/fff/wireless  |  23 +++
 src/packages/fff/fff/Makefile                      |   3 +-
 7 files changed, 275 insertions(+), 3 deletions(-)
 create mode 100644 src/packages/fff/fff-hoods/Makefile
 create mode 100644 src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
 create mode 100755 src/packages/fff/fff-hoods/files/usr/sbin/configurehood

Patch hide | download patch | download mbox

diff --git a/bsp/default/root_file_system/etc/rc.local b/bsp/default/root_file_system/etc/rc.local
index bd972fb..59042c3 100755
--- a/bsp/default/root_file_system/etc/rc.local
+++ b/bsp/default/root_file_system/etc/rc.local
@@ -4,6 +4,10 @@ 
 
 /usr/sbin/configurenetwork
 
+sleep 3
+
+/usr/sbin/configurehood
+
 touch /tmp/started
 
 exit 0
diff --git a/src/packages/fff/fff-hoods/Makefile b/src/packages/fff/fff-hoods/Makefile
new file mode 100644
index 0000000..f85178d
--- /dev/null
+++ b/src/packages/fff/fff-hoods/Makefile
@@ -0,0 +1,39 @@ 
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=fff-hoods
+PKG_VERSION:=0.0.1
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/fff-hoods
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/fff-hoods
+    SECTION:=base
+    CATEGORY:=Freifunk
+    TITLE:= Freifunk-Franken hoods
+    URL:=http://www.freifunk-franken.de
+    DEPENDS:=+fff-network
+endef
+
+define Package/fff-hoods/description
+    This package load and configures the current hood
+endef
+
+define Build/Prepare
+	echo "all: " > $(PKG_BUILD_DIR)/Makefile
+endef
+
+define Build/Configure
+	# nothing
+endef
+
+define Build/Compile
+	# nothing
+endef
+
+define Package/fff-hoods/install
+	$(CP) ./files/* $(1)/
+endef
+
+$(eval $(call BuildPackage,fff-hoods))
diff --git a/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
new file mode 100644
index 0000000..39e800e
--- /dev/null
+++ b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
@@ -0,0 +1 @@ 
+*/5 * * * * [ -f /tmp/started ] && /usr/sbin/configurehood
diff --git a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
new file mode 100755
index 0000000..09c2069
--- /dev/null
+++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
@@ -0,0 +1,206 @@ 
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+. /lib/functions/fff/wireless
+
+rm /tmp/keyxchangev2data
+
+# Gatewaycheck function
+isGatewayAvailable() {
+	if [ "$(batctl gwl | wc -l)" -gt 2 ]; then
+		return 0
+	else
+		return 1
+	fi
+}
+
+# Ping test
+hasInternet() {
+	test_ipv4_host1="keyserver.freifunk-franken.de" # Freifunk-Franken keyserver
+	test_ipv4_host2="8.8.8.8"        # Google DNS
+	test_ipv6_host1="heise.de"       # heise Zeitschriftenverlag
+	if ping -w5 -c3 "$test_ipv4_host1" &>/dev/null ||
+		ping -w5 -c3 "$test_ipv4_host2" &>/dev/null ||
+		ping6 -w5 -c3 "$test_ipv6_host1" &>/dev/null ; then
+		return 0
+	fi
+	return 1
+}
+
+chan2ghz="1"
+chan5ghz="36"
+
+# Hidden AP check
+
+if [ -f /tmp/hiddenapflag ]; then
+	if isGatewayAvailable ; then
+
+		uci set network.configap=interface
+		uci set network.configap.proto='static'
+		uci set network.configap.ip6addr='fe80::1/64'
+		uci commit network
+
+		for radio in $(uci show wireless | sed -n 's,.*\.\([a-z0-9]*\)=wifi-device,\1,p'); do
+			if ! wifiAddAP "$radio" "config.franken.freifunk.net" "configap" "configap" "1"; then
+				echo "Can't add Config interface on $radio."
+				exit 1
+			fi
+		done
+
+		wifi
+	fi
+	rm /tmp/hiddenapflag
+fi
+
+lat=$(uci -q get system.@system[0].latitude)
+long=$(uci -q get system.@system[0].longitude)
+
+# 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 /tmp/keyxchangev2data
+	#if no Internet, we connect to the hidden AP and download the file from another Node in range
+else
+	# connect to wireless hidden ap here and download the json File from the nearest router
+	# Only do that, when we have no gateway in range. If the Uplinkrouter changed the hood, we lost the GW and do this automatically again, I think! Nice idea?
+	if ! isGatewayAvailable ; then
+		#now we haven't a gateway in Range, we search for a hidden AP to get a keyxchangev2data file!
+		#first we delete all wifi settings
+		rm /www/public/keyxchangev2data # delete this, so interfaces are recreated if reconnect with unchanged hood file takes place
+
+		if ! wifiDelAll; then
+			echo "Can't delete current wifi setup"
+			exit 1
+		fi
+		#now we look for phy and add this
+		for phy in $(iw phy | awk '/^Wiphy/{ print $2 }'); do
+			radio="$(wifiAddPhyCond "$phy" "2" "$chan2ghz")"
+			radio5="$(wifiAddPhyCond "$phy" "5" "$chan5ghz")"
+			[ -n "$radio5" ] && radio="$radio5"
+
+			#and here we add the station
+			if ! wifiAddSta "$radio" "config.franken.freifunk.net" "configSta"; then
+				echo "Can't add Sta interface on $radio."
+				exit 1
+			else
+				uci -q set network.configSta=interface
+				uci -q set network.configSta.proto='static'
+				uci -q commit network
+			fi
+		done
+		
+		wifi
+		# wait a moment to start the interface
+		sleep 10;
+		# and here we can download the Hoodfile from the other node
+		wget -T15 -t5 "http://[fe80::1%w2sta]/keyxchangev2data" -O /tmp/keyxchangev2data
+	else
+		echo "We have a Gateway in Range, we load the keyxchangev2data from fe80::1"
+		wget -T15 -t5 "http://[fe80::1%br-mesh]/keyxchangev2data" -O /tmp/keyxchangev2data
+	fi
+fi
+
+if [ -s /tmp/keyxchangev2data ]; then
+
+	# we get a json file in this format: 
+	# https://pw.freifunk-franken.de/patch/205/
+	# but without signature, every hood file we get is valid!
+
+	catnew="$(cat /tmp/keyxchangev2data | sed 's/"timestamp":[0-9]*/"timestamp":0/')"
+	catold="$(cat /www/public/keyxchangev2data 2>/dev/null | sed 's/"timestamp":[0-9]*/"timestamp":0/')"
+	sumnew=$(echo "$catnew" | sha256sum | cut -f1 -d " ")
+	sumold=$(echo "$catold" | sha256sum | cut -f1 -d " ")
+
+	json_load "$(cat /tmp/keyxchangev2data)"
+
+	if [ "$sumnew" != "$sumold" ]; then
+		echo "New file detect, we reconfigure the Node";
+
+		json_select hood
+
+		json_get_var hood name
+		json_get_var mesh_bssid mesh_bssid
+		json_get_var mesh_essid mesh_essid
+		json_get_var essid essid
+		# i think the next things we don't active this in the first version! we can do it later
+		#json_get_var channel2 channel2
+		#json_get_var mode2 mode2
+		#json_get_var type2 type2
+		#json_get_var channel5 channel5
+		#json_get_var mode5 mode5
+		#json_get_var type5 type5
+		#json_get_var protocol protocol
+		
+		json_select ".." # back to root
+
+		echo "Setting hood name: $hood"
+		uci set "system.@system[0].hood=$hood"
+
+		if ! wifiDelAll; then
+			echo "Can't delete current wifi setup"
+			exit 1
+		fi
+
+		for phy in $(iw phy | awk '/^Wiphy/{ print $2 }'); do
+			radio="$(wifiAddPhyCond "$phy" "2" "$chan2ghz")"
+			radio5="$(wifiAddPhyCond "$phy" "5" "$chan5ghz")"
+			[ -n "$radio5" ] && radio="$radio5"
+
+			if ! wifiAddAP "$radio" "$essid" "mesh" "ap" "0"; then
+				echo "Can't add AP interface on $radio."
+				exit 1
+			fi
+
+			# here we set a bit for add hidden AP
+			touch /tmp/hiddenapflag
+
+			if ! wifiAddAdHocMesh "$radio" "$mesh_essid" "$mesh_bssid"; then
+				echo "Can't add AP interface on $radio."
+				exit 1
+			fi
+		done
+
+		echo "Loading wifi"
+		wifi
+
+		# copy the file to webroot so that other Meshrouter can download it;
+		# copy only after all other steps so IF can be reentered if something goes wrong
+		cp /tmp/keyxchangev2data /www/public/
+
+	else
+		echo "We have no new file. We do nothing. We try it again in 5 minutes...";
+	fi
+	
+	# and now we read the VPN Data and give this data to fff-vpn
+	json_select vpn
+	Index=1
+	rm /tmp/fastd_fff_output
+	touch /tmp/fastd_fff_output
+	while json_select "$Index" > /dev/null
+	do
+		json_get_var protocol protocol
+		if [ "$protocol" == "fastd" ]; then
+			json_get_var servername name
+			echo "####${servername}.conf" >> /tmp/fastd_fff_output
+			echo "#name \"${servername}\";" >> /tmp/fastd_fff_output
+			json_get_var key key
+			echo "key \"${key}\";" >> /tmp/fastd_fff_output
+			json_get_var address address
+			json_get_var port port
+			echo "remote ipv4 \"${address}\" port $port float;" >> /tmp/fastd_fff_output
+		fi
+		echo "" >> /tmp/fastd_fff_output
+		json_select ".." # back to vpn
+		Index=$(( Index + 1 ))
+	done
+	echo "###" >> /tmp/fastd_fff_output
+	json_select ".." # back to root
+	#this we do every 5 minutes, because it can change the VPN Protocol
+	#and now we get to vpn-select Script and load VPNs
+	
+	if hasInternet ; then
+		sh /usr/sbin/vpn-select
+	fi
+else
+	echo "We haven't got a file. We do nothing. We try it again in 5 minutes...";
+	exit 0
+fi
diff --git a/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select b/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select
index bb4c933..bbc87cc 100755
--- a/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select
+++ b/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select
@@ -1,7 +1,5 @@ 
 #!/bin/sh
 
-test -f /tmp/started || exit
-
 make_config() {
 # remove old config
 >/etc/config/tunneldigger
diff --git a/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless b/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless
index 8ba9463..2c6dff8 100644
--- a/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless
+++ b/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless
@@ -50,6 +50,27 @@  wifiAddPhy() {
 	return 0
 }
 
+wifiAddPhyCond() {
+	if [ $# -ne "3" ]
+	then
+		return 1
+	fi
+
+	local phy=$1
+	local freq=$2
+	local channel=$3
+	
+	if iw phy "$phy" info | grep -q -m1 "${freq}... MHz"; then
+		radio="$(wifiAddPhy "$phy" "$channel")"
+		if [ -z "$radio" ]; then
+			return 1
+		fi
+	fi
+	
+	echo "$radio"
+	return 0 # also returns success if outermost if is false
+}
+
 wifiAddAdHocMesh() {
 	if [ $# -ne "3" ]
 	then
@@ -122,6 +143,7 @@  wifiAddAP() {
 	__EOF__
 
 	echo "${iface}"
+	return 0
 }
 
 wifiAddSta() {
@@ -152,6 +174,7 @@  wifiAddSta() {
 	__EOF__
 	
 	echo "${iface}"
+	return 0
 }
 
 # vim: set noexpandtab:tabstop=4
diff --git a/src/packages/fff/fff/Makefile b/src/packages/fff/fff/Makefile
index 166d423..305ab8d 100644
--- a/src/packages/fff/fff/Makefile
+++ b/src/packages/fff/fff/Makefile
@@ -29,7 +29,8 @@  define Package/fff-base
              +fff-wireless \
              +fff-timeserver \
              +fff-vpn-select \
-             +simple-tc
+             +simple-tc \
+             +fff-hoods
 endef
 
 define Package/fff-base/description

Comments

Adrian Schmutzler Oct. 14, 2017, 6 p.m.
Hallo Tim,

siehe unten.

> -----Original Message-----
> From: Tim Niemeyer [mailto:tim@tn-x.org]
> Sent: Samstag, 14. Oktober 2017 19:20
> To: franken-dev@freifunk.net
> Cc: Christian Dresel <fff@chrisi01.de>; Jan Kraus
> <mayosemmel@gmail.com>; Adrian Schmutzler
> <freifunk@adrianschmutzler.de>; Tim Niemeyer <tim@tn-x.org>
> Subject: [SQUASHED PATCH v17 4/8] Add fff-hoods
> 
> From: Christian Dresel <fff@chrisi01.de>
> 
> This package connects to keyxchangev2
> 
> Signed-off-by: Christian Dresel <fff@chrisi01.de>
> Signed-off-by: Jan Kraus <mayosemmel@gmail.com>
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---
> 
> Changes in v17:
> - Fix resetting interfaces during connection drop
> - Remove exit before vpn-select
> - Use function for conditional wifiAddPhy
> 
> Changes in v16:
> - Open configap for both 2.4 and 5 GHz
> 
> Changes in v15:
> - Fixed 5 GHz channel
> - Only start vpn-select if router has internet
> - Put ping into function since it is used twice
> - Check for started in micrond to prevent race condition
> - Moved copy of keyxchangev2data to the end
> 
> Changes in v14:
> - Tested, working Inet+mesh:
> - Fixed stderr redirect
> - Added call of configurehood to rc.local, so it is triggered if wan does
not
> come up. To prevent race condition, hotplug.d is removed.
> - Added wifi call to configAP setup
> - Remove hiddenap flag after successful setup
> - Added -q to uci calls
> - Added network interface configSta
> - Substitute timestamp to enable SHA comparison
> - Removed started-check from vpn-select
> 
> Changes in v13: None
> Changes in v12:
> - Removed obsolete hostname
> 
> Changes in v11:
> - Changed isGatewayAvailable to return integers (bool is not valid) and
> removed brackets for evaluations
> - Added variables for channels as they are used twice
> - Fixed $radio not set at the beginning (WORKAROUND!)
> - Changed OpenWRT to LEDE
> - Correctly reset json_select before reuse
> - Some tidying-up of comments and quotes
> - Fixed vpn loop so it works for more than one host (TESTED)
> - Fixed "else" if no file received
> 
> Changes in v10:
> - Minor code fixes
> - Added fff-hoods to fff-base Makefile
> - Removed trailing whitespaces and harmonized tabs
> - Fixed some comments spelling
> - Added mac for hostname rewrite
> - Removed redundant check for /tmp/keyxchangev2data
> 
> Changes in v9:
> - rebase onto 20170918-beta
> 
> Changes in v8:
> - rebase onto 20170918-beta
> 
> Changes in v7: None
> Changes in v6:
> - !!UNTESTED!!
> - fix hidden station v6
> - fix -n to -f if
> - Add function to check for a gateway and use this
> - remove /etc/community.cfg and variables
> - send fewer infos to keyxchangev2
> - add a check if /tmp/keyxchangev2 not downloadable and edit a bit  on the
> wgets
> - change the position from json_load and do this only 1 times
> - !!UNTESTED!!
> - delete keyxchangev2data at start of the script
> - do only things with keyxchangev2data if available
> - change keyxchangev2 url
> 
> Changes in v5:
> - clean tabstops
> - !!UNTESTED!!
> - change hidden AP ip to locallink
> - Open hidden AP after more checks
> - Load json File from Gateway if Gateway in Batman in Range
> 
> Changes in v4: None
> Changes in v3: None
> Changes in v2:
> - clean tabstops
> - move the json vpn out of the if because we need this after reboot
> 
>  bsp/default/root_file_system/etc/rc.local          |   4 +
>  src/packages/fff/fff-hoods/Makefile                |  39 ++++
>  .../fff/fff-hoods/files/usr/lib/micron.d/fff-hoods |   1 +
>  .../fff/fff-hoods/files/usr/sbin/configurehood     | 206
> +++++++++++++++++++++
>  .../fff/fff-vpn-select/files/usr/sbin/vpn-select   |   2 -
>  .../fff-wireless/files/lib/functions/fff/wireless  |  23 +++
>  src/packages/fff/fff/Makefile                      |   3 +-
>  7 files changed, 275 insertions(+), 3 deletions(-)  create mode 100644
> src/packages/fff/fff-hoods/Makefile
>  create mode 100644 src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-
> hoods
>  create mode 100755 src/packages/fff/fff-
> hoods/files/usr/sbin/configurehood
> 
> diff --git a/bsp/default/root_file_system/etc/rc.local
> b/bsp/default/root_file_system/etc/rc.local
> index bd972fb..59042c3 100755
> --- a/bsp/default/root_file_system/etc/rc.local
> +++ b/bsp/default/root_file_system/etc/rc.local
> @@ -4,6 +4,10 @@
> 
>  /usr/sbin/configurenetwork
> 
> +sleep 3
> +
> +/usr/sbin/configurehood
> +
>  touch /tmp/started
> 
>  exit 0
> diff --git a/src/packages/fff/fff-hoods/Makefile b/src/packages/fff/fff-
> hoods/Makefile
> new file mode 100644
> index 0000000..f85178d
> --- /dev/null
> +++ b/src/packages/fff/fff-hoods/Makefile
> @@ -0,0 +1,39 @@
> +include $(TOPDIR)/rules.mk
> +
> +PKG_NAME:=fff-hoods
> +PKG_VERSION:=0.0.1
> +PKG_RELEASE:=1
> +
> +PKG_BUILD_DIR:=$(BUILD_DIR)/fff-hoods
> +
> +include $(INCLUDE_DIR)/package.mk
> +
> +define Package/fff-hoods
> +    SECTION:=base
> +    CATEGORY:=Freifunk
> +    TITLE:= Freifunk-Franken hoods
> +    URL:=http://www.freifunk-franken.de
> +    DEPENDS:=+fff-network
> +endef
> +
> +define Package/fff-hoods/description
> +    This package load and configures the current hood endef
> +
> +define Build/Prepare
> +	echo "all: " > $(PKG_BUILD_DIR)/Makefile endef
> +
> +define Build/Configure
> +	# nothing
> +endef
> +
> +define Build/Compile
> +	# nothing
> +endef
> +
> +define Package/fff-hoods/install
> +	$(CP) ./files/* $(1)/
> +endef
> +
> +$(eval $(call BuildPackage,fff-hoods))
> diff --git a/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
> b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
> new file mode 100644
> index 0000000..39e800e
> --- /dev/null
> +++ b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
> @@ -0,0 +1 @@
> +*/5 * * * * [ -f /tmp/started ] && /usr/sbin/configurehood
> diff --git a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> new file mode 100755
> index 0000000..09c2069
> --- /dev/null
> +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> @@ -0,0 +1,206 @@
> +#!/bin/sh
> +
> +. /usr/share/libubox/jshn.sh
> +. /lib/functions/fff/wireless
> +
> +rm /tmp/keyxchangev2data
> +
> +# Gatewaycheck function
> +isGatewayAvailable() {
> +	if [ "$(batctl gwl | wc -l)" -gt 2 ]; then
> +		return 0
> +	else
> +		return 1
> +	fi
> +}
> +
> +# Ping test
> +hasInternet() {
> +	test_ipv4_host1="keyserver.freifunk-franken.de" # Freifunk-
> Franken keyserver
> +	test_ipv4_host2="8.8.8.8"        # Google DNS
> +	test_ipv6_host1="heise.de"       # heise Zeitschriftenverlag
> +	if ping -w5 -c3 "$test_ipv4_host1" &>/dev/null ||
> +		ping -w5 -c3 "$test_ipv4_host2" &>/dev/null ||
> +		ping6 -w5 -c3 "$test_ipv6_host1" &>/dev/null ; then
> +		return 0
> +	fi
> +	return 1
> +}
> +
> +chan2ghz="1"
> +chan5ghz="36"
> +
> +# Hidden AP check
> +
> +if [ -f /tmp/hiddenapflag ]; then
> +	if isGatewayAvailable ; then
> +
> +		uci set network.configap=interface
> +		uci set network.configap.proto='static'
> +		uci set network.configap.ip6addr='fe80::1/64'
> +		uci commit network
> +
> +		for radio in $(uci show wireless | sed -n 's,.*\.\([a-z0-
> 9]*\)=wifi-device,\1,p'); do
> +			if ! wifiAddAP "$radio"
"config.franken.freifunk.net"
> "configap" "configap" "1"; then
> +				echo "Can't add Config interface on $radio."
> +				exit 1
> +			fi
> +		done
> +
> +		wifi
> +	fi
> +	rm /tmp/hiddenapflag
> +fi
> +
> +lat=$(uci -q get system.@system[0].latitude) long=$(uci -q get
> +system.@system[0].longitude)
> +
> +# 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 /tmp/keyxchangev2data
> +	#if no Internet, we connect to the hidden AP and download the file
> +from another Node in range else
> +	# connect to wireless hidden ap here and download the json File
> from the nearest router
> +	# Only do that, when we have no gateway in range. If the
> Uplinkrouter changed the hood, we lost the GW and do this automatically
> again, I think! Nice idea?
> +	if ! isGatewayAvailable ; then
> +		#now we haven't a gateway in Range, we search for a hidden
> AP to get a keyxchangev2data file!
> +		#first we delete all wifi settings
> +		rm /www/public/keyxchangev2data # delete this, so
> interfaces are
> +recreated if reconnect with unchanged hood file takes place
> +
> +		if ! wifiDelAll; then
> +			echo "Can't delete current wifi setup"
> +			exit 1
> +		fi
> +		#now we look for phy and add this
> +		for phy in $(iw phy | awk '/^Wiphy/{ print $2 }'); do
> +			radio="$(wifiAddPhyCond "$phy" "2" "$chan2ghz")"
> +			radio5="$(wifiAddPhyCond "$phy" "5" "$chan5ghz")"
> +			[ -n "$radio5" ] && radio="$radio5"
> +
> +			#and here we add the station
> +			if ! wifiAddSta "$radio"
"config.franken.freifunk.net"
> "configSta"; then
> +				echo "Can't add Sta interface on $radio."
> +				exit 1
> +			else
> +				uci -q set network.configSta=interface
> +				uci -q set network.configSta.proto='static'
> +				uci -q commit network
> +			fi
> +		done
> +
> +		wifi
> +		# wait a moment to start the interface
> +		sleep 10;
> +		# and here we can download the Hoodfile from the other
> node
> +		wget -T15 -t5 "http://[fe80::1%w2sta]/keyxchangev2data" -O
> /tmp/keyxchangev2data
> +	else
> +		echo "We have a Gateway in Range, we load the
> keyxchangev2data from fe80::1"
> +		wget -T15 -t5 "http://[fe80::1%br-mesh]/keyxchangev2data"
> -O /tmp/keyxchangev2data
> +	fi
> +fi
> +
> +if [ -s /tmp/keyxchangev2data ]; then
> +
> +	# we get a json file in this format:
> +	# https://pw.freifunk-franken.de/patch/205/
> +	# but without signature, every hood file we get is valid!
> +
> +	catnew="$(cat /tmp/keyxchangev2data | sed 's/"timestamp":[0-
> 9]*/"timestamp":0/')"
> +	catold="$(cat /www/public/keyxchangev2data 2>/dev/null | sed
> 's/"timestamp":[0-9]*/"timestamp":0/')"
> +	sumnew=$(echo "$catnew" | sha256sum | cut -f1 -d " ")
> +	sumold=$(echo "$catold" | sha256sum | cut -f1 -d " ")
> +
> +	json_load "$(cat /tmp/keyxchangev2data)"
> +
> +	if [ "$sumnew" != "$sumold" ]; then
> +		echo "New file detect, we reconfigure the Node";
> +
> +		json_select hood
> +
> +		json_get_var hood name
> +		json_get_var mesh_bssid mesh_bssid
> +		json_get_var mesh_essid mesh_essid
> +		json_get_var essid essid
> +		# i think the next things we don't active this in the first
> version! we can do it later
> +		#json_get_var channel2 channel2
> +		#json_get_var mode2 mode2
> +		#json_get_var type2 type2
> +		#json_get_var channel5 channel5
> +		#json_get_var mode5 mode5
> +		#json_get_var type5 type5
> +		#json_get_var protocol protocol
> +
> +		json_select ".." # back to root
> +
> +		echo "Setting hood name: $hood"
> +		uci set "system.@system[0].hood=$hood"
> +
> +		if ! wifiDelAll; then
> +			echo "Can't delete current wifi setup"
> +			exit 1
> +		fi
> +
> +		for phy in $(iw phy | awk '/^Wiphy/{ print $2 }'); do
> +			radio="$(wifiAddPhyCond "$phy" "2" "$chan2ghz")"
> +			radio5="$(wifiAddPhyCond "$phy" "5" "$chan5ghz")"
> +			[ -n "$radio5" ] && radio="$radio5"
> +
> +			if ! wifiAddAP "$radio" "$essid" "mesh" "ap" "0";
then
> +				echo "Can't add AP interface on $radio."
> +				exit 1
> +			fi
> +
> +			# here we set a bit for add hidden AP
> +			touch /tmp/hiddenapflag
> +
> +			if ! wifiAddAdHocMesh "$radio" "$mesh_essid"
> "$mesh_bssid"; then
> +				echo "Can't add AP interface on $radio."
> +				exit 1
> +			fi
> +		done
> +
> +		echo "Loading wifi"
> +		wifi
> +
> +		# copy the file to webroot so that other Meshrouter can
> download it;
> +		# copy only after all other steps so IF can be reentered if
> something goes wrong
> +		cp /tmp/keyxchangev2data /www/public/
> +
> +	else
> +		echo "We have no new file. We do nothing. We try it again in
> 5 minutes...";
> +	fi
> +
> +	# and now we read the VPN Data and give this data to fff-vpn
> +	json_select vpn
> +	Index=1
> +	rm /tmp/fastd_fff_output
> +	touch /tmp/fastd_fff_output
> +	while json_select "$Index" > /dev/null
> +	do
> +		json_get_var protocol protocol
> +		if [ "$protocol" == "fastd" ]; then
> +			json_get_var servername name
> +			echo "####${servername}.conf" >>
> /tmp/fastd_fff_output
> +			echo "#name \"${servername}\";" >>
> /tmp/fastd_fff_output
> +			json_get_var key key
> +			echo "key \"${key}\";" >> /tmp/fastd_fff_output
> +			json_get_var address address
> +			json_get_var port port
> +			echo "remote ipv4 \"${address}\" port $port float;"
> >> /tmp/fastd_fff_output
> +		fi
> +		echo "" >> /tmp/fastd_fff_output
> +		json_select ".." # back to vpn
> +		Index=$(( Index + 1 ))
> +	done
> +	echo "###" >> /tmp/fastd_fff_output
> +	json_select ".." # back to root
> +	#this we do every 5 minutes, because it can change the VPN Protocol
> +	#and now we get to vpn-select Script and load VPNs
> +
> +	if hasInternet ; then
> +		sh /usr/sbin/vpn-select
> +	fi
> +else
> +	echo "We haven't got a file. We do nothing. We try it again in 5
> minutes...";
> +	exit 0
> +fi
> diff --git a/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select
> b/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select
> index bb4c933..bbc87cc 100755
> --- a/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select
> +++ b/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select
> @@ -1,7 +1,5 @@
>  #!/bin/sh
> 
> -test -f /tmp/started || exit
> -
>  make_config() {
>  # remove old config
>  >/etc/config/tunneldigger
> diff --git
a/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless
> b/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless
> index 8ba9463..2c6dff8 100644
> --- a/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless
> +++ b/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless
> @@ -50,6 +50,27 @@ wifiAddPhy() {
>  	return 0
>  }
> 
> +wifiAddPhyCond() {
> +	if [ $# -ne "3" ]
> +	then
> +		return 1
> +	fi
> +
> +	local phy=$1
> +	local freq=$2
> +	local channel=$3

Hier muss ein

local radio=""

rein. Wenn man das nicht macht, nimmt er die radio vom letzten run!


> +
> +	if iw phy "$phy" info | grep -q -m1 "${freq}... MHz"; then
> +		radio="$(wifiAddPhy "$phy" "$channel")"
> +		if [ -z "$radio" ]; then
> +			return 1
> +		fi
> +	fi
> +
> +	echo "$radio"
> +	return 0 # also returns success if outermost if is false }
> +
>  wifiAddAdHocMesh() {
>  	if [ $# -ne "3" ]
>  	then
> @@ -122,6 +143,7 @@ wifiAddAP() {
>  	__EOF__
> 
>  	echo "${iface}"
> +	return 0
>  }
> 
>  wifiAddSta() {
> @@ -152,6 +174,7 @@ wifiAddSta() {
>  	__EOF__
> 
>  	echo "${iface}"
> +	return 0
>  }
> 
>  # vim: set noexpandtab:tabstop=4
> diff --git a/src/packages/fff/fff/Makefile b/src/packages/fff/fff/Makefile
> index 166d423..305ab8d 100644
> --- a/src/packages/fff/fff/Makefile
> +++ b/src/packages/fff/fff/Makefile
> @@ -29,7 +29,8 @@ define Package/fff-base
>               +fff-wireless \
>               +fff-timeserver \
>               +fff-vpn-select \
> -             +simple-tc
> +             +simple-tc \
> +             +fff-hoods
>  endef
> 
>  define Package/fff-base/description
> --
> 2.11.0