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

Submitted by Tim Niemeyer on Oct. 14, 2017, 8:38 p.m.

Details

Message ID 20171014203840.29696-5-tim@tn-x.org
State Accepted
Headers show

Commit Message

Tim Niemeyer Oct. 14, 2017, 8:38 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 v18:
- Initialize variable radio
- Suppress error when deleting non-existent files

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  |  24 +++
 src/packages/fff/fff/Makefile                      |   3 +-
 7 files changed, 276 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..d078d6a
--- /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 -f /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 -f /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..71f566a 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,28 @@  wifiAddPhy() {
 	return 0
 }
 
+wifiAddPhyCond() {
+	if [ $# -ne "3" ]
+	then
+		return 1
+	fi
+
+	local phy=$1
+	local freq=$2
+	local channel=$3
+	local radio=""
+	
+	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 +144,7 @@  wifiAddAP() {
 	__EOF__
 
 	echo "${iface}"
+	return 0
 }
 
 wifiAddSta() {
@@ -152,6 +175,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

Christian Dresel Oct. 15, 2017, 7:34 a.m.
hi

mir ist ja gestern schon aufgefallen das auf den c25 auf den configap
die fe80::1 (manchmal) fehlt. Ich kann jetzt nachvollziehen wann sie
fehlt und wann nicht:

Wenn ich das 5GHz radio deaktiviert habe dann klappt es mit der fe80::1
auf den w2configap wenn ich beide Radios an habe und auf beiden radios
ein configap läuft, dann hat keiner von den beiden die fe80::1 bekommen.
Warum das so ist, ist mir aktuell aber recht unklar. Wäre mal
interessant ob es wieder nur den c25 betrifft oder auch andere 5GHz
Geräte (hat jemand noch welche...?).

mfg

Christian

On 14.10.2017 22:38, Tim Niemeyer wrote:
> 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 v18:
> - Initialize variable radio
> - Suppress error when deleting non-existent files
> 
> 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  |  24 +++
>  src/packages/fff/fff/Makefile                      |   3 +-
>  7 files changed, 276 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..d078d6a
> --- /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 -f /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 -f /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..71f566a 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,28 @@ wifiAddPhy() {
>  	return 0
>  }
>  
> +wifiAddPhyCond() {
> +	if [ $# -ne "3" ]
> +	then
> +		return 1
> +	fi
> +
> +	local phy=$1
> +	local freq=$2
> +	local channel=$3
> +	local radio=""
> +	
> +	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 +144,7 @@ wifiAddAP() {
>  	__EOF__
>  
>  	echo "${iface}"
> +	return 0
>  }
>  
>  wifiAddSta() {
> @@ -152,6 +175,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
>
Christian Dresel Oct. 15, 2017, 9:43 a.m.
hi

wie schon angemerkt würde ich gerne von vornerein noch den Port
festlegen auf welchen vom Gateway die File geholt wird, siehe inline:

On 14.10.2017 22:38, Tim Niemeyer wrote:
> 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 v18:
> - Initialize variable radio
> - Suppress error when deleting non-existent files
> 
> 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  |  24 +++
>  src/packages/fff/fff/Makefile                      |   3 +-
>  7 files changed, 276 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..d078d6a
> --- /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 -f /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 -f /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


wget -T15 -t5 "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O
/tmp/keyxchangev2data

Testen ist grad etwas schwer, da dies nur Meshrouter tun und ich da
aktuell keinen in Betrieb habe, reicht dir folgendes als Test aus?

root@Test:~# wget -T15 -t5
"http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O
/tmp/keyxchangev2dataTEST
Connecting to [fe80::1%br-mesh]:2342 ([fe80::1%br-mesh]:2342)
root@Test:~# cat /tmp/keyxchangev2dataTEST
{"version":1,"network":{"ula_prefix":"fd43:5602:29bd:4:\/64"},"vpn":[{"name":"vm3fffgwcd1","protocol":"fastd","address":"144.76.70.186","port":"10004","key":"373cf6dca701a8b1516b816a13c91dc9df29ac5a822d12331b503982d655399b"}],"hood":{"name":"FuerthV2","essid":"fuerth.freifunk","mesh_bssid":"ca:ff:ee:ba:be:02","mesh_essid":"batman.fuerth.freifunk","mesh_id":"mesh.fuerth.freifunk","protocol":"batman-adv-v15","channel2":"13","mode2":"ht20","mesh_type2":"802.11s","channel5":"40","mode5":"ht20","mesh_type5":"802.11s","upgrade_path":"","ntp_ip":"fd43:5602:29bd:ffff::1","timestamp":"1507655035","location":{"lat":"49.4814","lon":"10.966"}}}root@Test:~#

root@Test:~#

mfg

Christian

> +	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..71f566a 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,28 @@ wifiAddPhy() {
>  	return 0
>  }
>  
> +wifiAddPhyCond() {
> +	if [ $# -ne "3" ]
> +	then
> +		return 1
> +	fi
> +
> +	local phy=$1
> +	local freq=$2
> +	local channel=$3
> +	local radio=""
> +	
> +	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 +144,7 @@ wifiAddAP() {
>  	__EOF__
>  
>  	echo "${iface}"
> +	return 0
>  }
>  
>  wifiAddSta() {
> @@ -152,6 +175,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
>
Robert Langhammer Oct. 15, 2017, 11:10 a.m.
Hi,

ich verstehe nicht ganz, warum du den Port fest in der Firmware moechtest.
Welchen Vorteil haette das gegenueber Standartport 80?
Wenn mehrere Hoods auf nem Gateway sind, muss man sowieso tricksen. z.B.
Port umbiegen und Vhosts auf andere Ports legen. Das muesste man mit
einem anderen Port auch machen.
Robert


Am 15.10.2017 um 11:43 schrieb Christian Dresel:
> hi
>
> wie schon angemerkt würde ich gerne von vornerein noch den Port
> festlegen auf welchen vom Gateway die File geholt wird, siehe inline:
>
> On 14.10.2017 22:38, Tim Niemeyer wrote:
>> 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 v18:
>> - Initialize variable radio
>> - Suppress error when deleting non-existent files
>>
>> 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  |  24 +++
>>  src/packages/fff/fff/Makefile                      |   3 +-
>>  7 files changed, 276 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..d078d6a
>> --- /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 -f /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 -f /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
>
> wget -T15 -t5 "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O
> /tmp/keyxchangev2data
>
> Testen ist grad etwas schwer, da dies nur Meshrouter tun und ich da
> aktuell keinen in Betrieb habe, reicht dir folgendes als Test aus?
>
> root@Test:~# wget -T15 -t5
> "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O
> /tmp/keyxchangev2dataTEST
> Connecting to [fe80::1%br-mesh]:2342 ([fe80::1%br-mesh]:2342)
> root@Test:~# cat /tmp/keyxchangev2dataTEST
> {"version":1,"network":{"ula_prefix":"fd43:5602:29bd:4:\/64"},"vpn":[{"name":"vm3fffgwcd1","protocol":"fastd","address":"144.76.70.186","port":"10004","key":"373cf6dca701a8b1516b816a13c91dc9df29ac5a822d12331b503982d655399b"}],"hood":{"name":"FuerthV2","essid":"fuerth.freifunk","mesh_bssid":"ca:ff:ee:ba:be:02","mesh_essid":"batman.fuerth.freifunk","mesh_id":"mesh.fuerth.freifunk","protocol":"batman-adv-v15","channel2":"13","mode2":"ht20","mesh_type2":"802.11s","channel5":"40","mode5":"ht20","mesh_type5":"802.11s","upgrade_path":"","ntp_ip":"fd43:5602:29bd:ffff::1","timestamp":"1507655035","location":{"lat":"49.4814","lon":"10.966"}}}root@Test:~#
>
> root@Test:~#
>
> mfg
>
> Christian
>
>> +	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..71f566a 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,28 @@ wifiAddPhy() {
>>  	return 0
>>  }
>>  
>> +wifiAddPhyCond() {
>> +	if [ $# -ne "3" ]
>> +	then
>> +		return 1
>> +	fi
>> +
>> +	local phy=$1
>> +	local freq=$2
>> +	local channel=$3
>> +	local radio=""
>> +	
>> +	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 +144,7 @@ wifiAddAP() {
>>  	__EOF__
>>  
>>  	echo "${iface}"
>> +	return 0
>>  }
>>  
>>  wifiAddSta() {
>> @@ -152,6 +175,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
>>
>
>
Christian Dresel Oct. 15, 2017, 11:13 a.m.
hi

weil Port 80 schon für normales http auf den Servern "reserviert" ist,
daher war die Idee da nen anderen Port zu nehmen und einen
"Minihttpserver" o.ä. auf den Port lauschen zu lassen, der exakt auf das
Interface (und nicht IP) hört. Damit man sich da nicht mit einen
"normalen" Webserver in die Quere kommt, eben ein anderer Port.

mfg

Christian

On 15.10.2017 13:10, robert wrote:
> Hi,
> 
> ich verstehe nicht ganz, warum du den Port fest in der Firmware moechtest.
> Welchen Vorteil haette das gegenueber Standartport 80?
> Wenn mehrere Hoods auf nem Gateway sind, muss man sowieso tricksen. z.B.
> Port umbiegen und Vhosts auf andere Ports legen. Das muesste man mit
> einem anderen Port auch machen.
> Robert
> 
> 
> Am 15.10.2017 um 11:43 schrieb Christian Dresel:
>> hi
>>
>> wie schon angemerkt würde ich gerne von vornerein noch den Port
>> festlegen auf welchen vom Gateway die File geholt wird, siehe inline:
>>
>> On 14.10.2017 22:38, Tim Niemeyer wrote:
>>> 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 v18:
>>> - Initialize variable radio
>>> - Suppress error when deleting non-existent files
>>>
>>> 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  |  24 +++
>>>  src/packages/fff/fff/Makefile                      |   3 +-
>>>  7 files changed, 276 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..d078d6a
>>> --- /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 -f /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 -f /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
>>
>> wget -T15 -t5 "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O
>> /tmp/keyxchangev2data
>>
>> Testen ist grad etwas schwer, da dies nur Meshrouter tun und ich da
>> aktuell keinen in Betrieb habe, reicht dir folgendes als Test aus?
>>
>> root@Test:~# wget -T15 -t5
>> "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O
>> /tmp/keyxchangev2dataTEST
>> Connecting to [fe80::1%br-mesh]:2342 ([fe80::1%br-mesh]:2342)
>> root@Test:~# cat /tmp/keyxchangev2dataTEST
>> {"version":1,"network":{"ula_prefix":"fd43:5602:29bd:4:\/64"},"vpn":[{"name":"vm3fffgwcd1","protocol":"fastd","address":"144.76.70.186","port":"10004","key":"373cf6dca701a8b1516b816a13c91dc9df29ac5a822d12331b503982d655399b"}],"hood":{"name":"FuerthV2","essid":"fuerth.freifunk","mesh_bssid":"ca:ff:ee:ba:be:02","mesh_essid":"batman.fuerth.freifunk","mesh_id":"mesh.fuerth.freifunk","protocol":"batman-adv-v15","channel2":"13","mode2":"ht20","mesh_type2":"802.11s","channel5":"40","mode5":"ht20","mesh_type5":"802.11s","upgrade_path":"","ntp_ip":"fd43:5602:29bd:ffff::1","timestamp":"1507655035","location":{"lat":"49.4814","lon":"10.966"}}}root@Test:~#
>>
>> root@Test:~#
>>
>> mfg
>>
>> Christian
>>
>>> +	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..71f566a 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,28 @@ wifiAddPhy() {
>>>  	return 0
>>>  }
>>>  
>>> +wifiAddPhyCond() {
>>> +	if [ $# -ne "3" ]
>>> +	then
>>> +		return 1
>>> +	fi
>>> +
>>> +	local phy=$1
>>> +	local freq=$2
>>> +	local channel=$3
>>> +	local radio=""
>>> +	
>>> +	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 +144,7 @@ wifiAddAP() {
>>>  	__EOF__
>>>  
>>>  	echo "${iface}"
>>> +	return 0
>>>  }
>>>  
>>>  wifiAddSta() {
>>> @@ -152,6 +175,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
>>>
>>
>>
> 
> 
>
Adrian Schmutzler Oct. 15, 2017, 11:34 a.m.
Interessanter Nebenfund:

Wenn ein Meshrouter auf dem falschen Port sucht, kriegt er keine /tmp/keydings und dann geht einiges kaputt.

Man sollte die nachgelagerten Sachen (Zeitserver, Updatepath, usw.) auf die /www/public/keydings ändern. Ist für mich aber kein Grund, das Applien aufzuhalten.

Grüße

Adrian

> -----Original Message-----
> From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf
> Of Christian Dresel
> Sent: Sonntag, 15. Oktober 2017 13:13
> To: robert <rlanghammer@web.de>; franken-dev@freifunk.net
> Subject: Re: [SQUASHED PATCH v18 4/8] Add fff-hoods
> 
> hi
> 
> weil Port 80 schon für normales http auf den Servern "reserviert" ist, daher
> war die Idee da nen anderen Port zu nehmen und einen "Minihttpserver"
> o.ä. auf den Port lauschen zu lassen, der exakt auf das Interface (und nicht
> IP) hört. Damit man sich da nicht mit einen "normalen" Webserver in die
> Quere kommt, eben ein anderer Port.
> 
> mfg
> 
> Christian
> 
> On 15.10.2017 13:10, robert wrote:
> > Hi,
> >
> > ich verstehe nicht ganz, warum du den Port fest in der Firmware
> moechtest.
> > Welchen Vorteil haette das gegenueber Standartport 80?
> > Wenn mehrere Hoods auf nem Gateway sind, muss man sowieso tricksen.
> z.B.
> > Port umbiegen und Vhosts auf andere Ports legen. Das muesste man mit
> > einem anderen Port auch machen.
> > Robert
> >
> >
> > Am 15.10.2017 um 11:43 schrieb Christian Dresel:
> >> hi
> >>
> >> wie schon angemerkt würde ich gerne von vornerein noch den Port
> >> festlegen auf welchen vom Gateway die File geholt wird, siehe inline:
> >>
> >> On 14.10.2017 22:38, Tim Niemeyer wrote:
> >>> 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 v18:
> >>> - Initialize variable radio
> >>> - Suppress error when deleting non-existent files
> >>>
> >>> 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  |  24 +++
> >>>  src/packages/fff/fff/Makefile                      |   3 +-
> >>>  7 files changed, 276 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..d078d6a
> >>> --- /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 -f /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 -f /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
> >>
> >> wget -T15 -t5 "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O
> >> /tmp/keyxchangev2data
> >>
> >> Testen ist grad etwas schwer, da dies nur Meshrouter tun und ich da
> >> aktuell keinen in Betrieb habe, reicht dir folgendes als Test aus?
> >>
> >> root@Test:~# wget -T15 -t5
> >> "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O
> >> /tmp/keyxchangev2dataTEST Connecting to [fe80::1%br-mesh]:2342
> >> ([fe80::1%br-mesh]:2342) root@Test:~# cat /tmp/keyxchangev2dataTEST
> >> {"version":1,"network":{"ula_prefix":"fd43:5602:29bd:4:\/64"},"vpn":[
> >> {"name":"vm3fffgwcd1","protocol":"fastd","address":"144.76.70.186","p
> >>
> ort":"10004","key":"373cf6dca701a8b1516b816a13c91dc9df29ac5a822d12331
> >> b503982d655399b"}],"hood":{"name":"FuerthV2","essid":"fuerth.freifunk
> >> ","mesh_bssid":"ca:ff:ee:ba:be:02","mesh_essid":"batman.fuerth.freifu
> >> nk","mesh_id":"mesh.fuerth.freifunk","protocol":"batman-adv-v15","cha
> >>
> nnel2":"13","mode2":"ht20","mesh_type2":"802.11s","channel5":"40","mo
> >> de5":"ht20","mesh_type5":"802.11s","upgrade_path":"","ntp_ip":"fd43:5
> >> 602:29bd:ffff::1","timestamp":"1507655035","location":{"lat":"49.4814
> >> ","lon":"10.966"}}}root@Test:~#
> >>
> >> root@Test:~#
> >>
> >> mfg
> >>
> >> Christian
> >>
> >>> +	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..71f566a 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,28 @@ wifiAddPhy() {
> >>>  	return 0
> >>>  }
> >>>
> >>> +wifiAddPhyCond() {
> >>> +	if [ $# -ne "3" ]
> >>> +	then
> >>> +		return 1
> >>> +	fi
> >>> +
> >>> +	local phy=$1
> >>> +	local freq=$2
> >>> +	local channel=$3
> >>> +	local radio=""
> >>> +
> >>> +	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 +144,7 @@ wifiAddAP() {
> >>>  	__EOF__
> >>>
> >>>  	echo "${iface}"
> >>> +	return 0
> >>>  }
> >>>
> >>>  wifiAddSta() {
> >>> @@ -152,6 +175,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
> >>>
> >>
> >>
> >
> >
> >