[v12,4/6] Add fff-hoods

Submitted by Adrian Schmutzler on Oct. 2, 2017, 4:05 p.m.

Details

Message ID 1506960349-3212-4-git-send-email-freifunk@adrianschmutzler.de
State Superseded
Headers show

Commit Message

Adrian Schmutzler Oct. 2, 2017, 4:05 p.m.
From: Christian Dresel <fff@chrisi01.de>

This package connects to keyxchangev2
After review we must change the serveradress! This is only a example

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

Update in v2:
 - clean tabstops
 - move the json vpn out of the if because we need this after reboot

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

Update 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

Update in v7:
	!!UNTESTED!!
 - delete keyxchangev2data at start of the script
 - do only things with keyxchangev2data if available
 - change keyxchangev2 url

Update in v8/v9:
 - rebase onto 20170918-beta

Update 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

Update 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 hyphens
 - Fixed vpn loop so it works for more than one host (TESTED)
 - Fixed "else" if no file received

Changes in v12:
 - Removed obsolete hostname

ToDo:
 - Mesh routers do not connect to config
---
 src/packages/fff/fff-hoods/Makefile                |  39 ++++
 .../files/etc/hotplug.d/iface/50-fff-hoods         |   5 +
 .../fff/fff-hoods/files/usr/lib/micron.d/fff-hoods |   1 +
 .../fff/fff-hoods/files/usr/sbin/configurehood     | 210 +++++++++++++++++++++
 src/packages/fff/fff/Makefile                      |   3 +-
 5 files changed, 257 insertions(+), 1 deletion(-)
 create mode 100644 src/packages/fff/fff-hoods/Makefile
 create mode 100644 src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-hoods
 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/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/etc/hotplug.d/iface/50-fff-hoods b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-hoods
new file mode 100644
index 0000000..49f53e3
--- /dev/null
+++ b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-hoods
@@ -0,0 +1,5 @@ 
+#!/bin/sh 
+[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && {
+       sleep 3
+       /usr/sbin/configurehood
+}
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..ca8d798
--- /dev/null
+++ b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
@@ -0,0 +1 @@ 
+*/5 * * * * /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..5346a90
--- /dev/null
+++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
@@ -0,0 +1,210 @@ 
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+. /lib/functions/fff/wireless
+
+rm /tmp/keyxchangev2data
+
+# Gatewaycheck function
+isGatewayAvailable() {
+	if [ "$(batctl gwl | wc -l)" -gt 2 ]; then
+		return 0
+	else
+		return 1
+	fi
+}
+
+chan2ghz="1"
+chan5ghz="13"
+
+# Hidden AP check
+
+radio="radio0"
+if [ -f /tmp/hiddenapflag ]; then
+	if isGatewayAvailable ; then
+		if ! wifiAddAP "$radio" "config.franken.freifunk.net" "configap" "configap" "1"; then
+			echo "Can't add AP interface on $radio."
+			exit 1
+		else
+			# We must set a fixed ip address here
+			uci set network.configap=interface
+			uci set network.configap.proto='static'
+			uci set network.configap.ip6addr='fe80::1/64'
+			uci commit network
+		fi
+	else
+		rm /tmp/hiddenapflag
+	fi
+fi
+
+lat=$(uci get system.@system[0].latitude)
+long=$(uci get system.@system[0].longitude)
+
+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 we have Internet, we download the Hoodfile from the keyxchangev2
+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
+	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
+		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
+			if iw phy "$phy" info | grep -q -m1 "2... MHz"; then
+				echo "$phy is 2.4 GHz"
+				radio="$(wifiAddPhy "$phy" "$chan2ghz")"
+				if [ -z "$radio" ]; then
+					echo "Can't create radio for $phy"
+					exit 1
+				fi
+			fi
+			if iw phy "$phy" info | grep -q -m1 "5... MHz"; then
+				echo "$phy is 5 GHz"
+				radio="$(wifiAddPhy "$phy" "$chan5ghz")"
+				if [ -z "$radio" ]; then
+					echo "Can't create radio for $phy"
+					exit 1
+				fi
+			fi
+			#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
+			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!
+
+	json_load "$(cat /tmp/keyxchangev2data)"
+	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d " ")
+	sumold=$(sha256sum /www/public/keyxchangev2data &>/dev/null | cut -f1 -d " ")
+	if [ "$sumnew" != "$sumold" ]; then
+		echo "New file detect, we reconfigure the Node";
+
+		# copy the file to webroot so that other Meshrouter can download it
+		cp /tmp/keyxchangev2data /www/public/
+
+		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
+			if iw phy "$phy" info | grep -q -m1 "2... MHz"; then
+				echo "$phy is 2.4 GHz"
+				radio="$(wifiAddPhy "$phy" "$chan2ghz")"
+				if [ -z "$radio" ]; then
+					echo "Can't create radio for $phy"
+					exit 1
+				fi
+			fi
+			if iw phy "$phy" info | grep -q -m1 "5... MHz"; then
+				echo "$phy is 5 GHz"
+				radio="$(wifiAddPhy "$phy" "$chan5ghz")"
+				if [ -z "$radio" ]; then
+					echo "Can't create radio for $phy"
+					exit 1
+				fi
+			fi
+
+			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
+
+	else
+		echo "We have no new file. We do nothing. We try it again in 5 minutes...";
+		exit 0
+	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
+	sh /usr/sbin/vpn-select
+	
+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/Makefile b/src/packages/fff/fff/Makefile
index 166d423..305ab8d 100644
--- a/src/packages/fff/fff/Makefile
+++ b/src/packages/fff/fff/Makefile
@@ -29,7 +29,8 @@  define Package/fff-base
              +fff-wireless \
              +fff-timeserver \
              +fff-vpn-select \
-             +simple-tc
+             +simple-tc \
+             +fff-hoods
 endef
 
 define Package/fff-base/description

Comments

Adrian Schmutzler Oct. 3, 2017, 11:13 a.m.
Hallo,

der keyserver v2 schickt einen timestamp mit, daher ist der Vergleich der
SHA sinnlos und jeder File wird als neu behandelt!

> +	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d " ")
> +	sumold=$(sha256sum /www/public/keyxchangev2data &>/dev/null
> | cut -f1 -d " ")
> +	if [ "$sumnew" != "$sumold" ]; then

Das muss am Server korrigiert werden, alternativ baue ich in den nächsten
Patch folgenden Workaround:

        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 " ")
        if [ "$sumnew" != "$sumold" ]; then


Grüße

Adrian





> -----Original Message-----
> From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf
> Of Adrian Schmutzler
> Sent: Montag, 2. Oktober 2017 18:06
> To: franken-dev@freifunk.net
> Cc: Jan Kraus <mayosemmel@gmail.com>
> Subject: [PATCH v12 4/6] Add fff-hoods
> 
> From: Christian Dresel <fff@chrisi01.de>
> 
> This package connects to keyxchangev2
> After review we must change the serveradress! This is only a example
> 
> Signed-off-by: Christian Dresel <fff@chrisi01.de>
> Signed-off-by: Jan Kraus <mayosemmel@gmail.com>
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> Update in v2:
>  - clean tabstops
>  - move the json vpn out of the if because we need this after reboot
> 
> Update in v5:
> 	!!UNTESTED!!
>  - change hidden AP ip to locallink
>  - Open hidden AP after more checks
>  - Load json File from Gateway if Gateway in Batman in Range
> 
> Update 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
> 
> Update in v7:
> 	!!UNTESTED!!
>  - delete keyxchangev2data at start of the script
>  - do only things with keyxchangev2data if available
>  - change keyxchangev2 url
> 
> Update in v8/v9:
>  - rebase onto 20170918-beta
> 
> Update 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
> 
> Update 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 hyphens
>  - Fixed vpn loop so it works for more than one host (TESTED)
>  - Fixed "else" if no file received
> 
> Changes in v12:
>  - Removed obsolete hostname
> 
> ToDo:
>  - Mesh routers do not connect to config
> ---
>  src/packages/fff/fff-hoods/Makefile                |  39 ++++
>  .../files/etc/hotplug.d/iface/50-fff-hoods         |   5 +
>  .../fff/fff-hoods/files/usr/lib/micron.d/fff-hoods |   1 +
>  .../fff/fff-hoods/files/usr/sbin/configurehood     | 210
> +++++++++++++++++++++
>  src/packages/fff/fff/Makefile                      |   3 +-
>  5 files changed, 257 insertions(+), 1 deletion(-)  create mode 100644
> src/packages/fff/fff-hoods/Makefile
>  create mode 100644 src/packages/fff/fff-
> hoods/files/etc/hotplug.d/iface/50-fff-hoods
>  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/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/etc/hotplug.d/iface/50-fff-hoods
> b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-hoods
> new file mode 100644
> index 0000000..49f53e3
> --- /dev/null
> +++ b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-hoods
> @@ -0,0 +1,5 @@
> +#!/bin/sh
> +[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && {
> +       sleep 3
> +       /usr/sbin/configurehood
> +}
> 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..ca8d798
> --- /dev/null
> +++ b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
> @@ -0,0 +1 @@
> +*/5 * * * * /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..5346a90
> --- /dev/null
> +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> @@ -0,0 +1,210 @@
> +#!/bin/sh
> +
> +. /usr/share/libubox/jshn.sh
> +. /lib/functions/fff/wireless
> +
> +rm /tmp/keyxchangev2data
> +
> +# Gatewaycheck function
> +isGatewayAvailable() {
> +	if [ "$(batctl gwl | wc -l)" -gt 2 ]; then
> +		return 0
> +	else
> +		return 1
> +	fi
> +}
> +
> +chan2ghz="1"
> +chan5ghz="13"
> +
> +# Hidden AP check
> +
> +radio="radio0"
> +if [ -f /tmp/hiddenapflag ]; then
> +	if isGatewayAvailable ; then
> +		if ! wifiAddAP "$radio" "config.franken.freifunk.net"
> "configap" "configap" "1"; then
> +			echo "Can't add AP interface on $radio."
> +			exit 1
> +		else
> +			# We must set a fixed ip address here
> +			uci set network.configap=interface
> +			uci set network.configap.proto='static'
> +			uci set network.configap.ip6addr='fe80::1/64'
> +			uci commit network
> +		fi
> +	else
> +		rm /tmp/hiddenapflag
> +	fi
> +fi
> +
> +lat=$(uci get system.@system[0].latitude) long=$(uci get
> +system.@system[0].longitude)
> +
> +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 we have Internet, we download the Hoodfile from the keyxchangev2
> +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
> +	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
> +		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
> +			if iw phy "$phy" info | grep -q -m1 "2... MHz"; then
> +				echo "$phy is 2.4 GHz"
> +				radio="$(wifiAddPhy "$phy" "$chan2ghz")"
> +				if [ -z "$radio" ]; then
> +					echo "Can't create radio for $phy"
> +					exit 1
> +				fi
> +			fi
> +			if iw phy "$phy" info | grep -q -m1 "5... MHz"; then
> +				echo "$phy is 5 GHz"
> +				radio="$(wifiAddPhy "$phy" "$chan5ghz")"
> +				if [ -z "$radio" ]; then
> +					echo "Can't create radio for $phy"
> +					exit 1
> +				fi
> +			fi
> +			#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
> +			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!
> +
> +	json_load "$(cat /tmp/keyxchangev2data)"
> +	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d " ")
> +	sumold=$(sha256sum /www/public/keyxchangev2data &>/dev/null
> | cut -f1 -d " ")
> +	if [ "$sumnew" != "$sumold" ]; then
> +		echo "New file detect, we reconfigure the Node";
> +
> +		# copy the file to webroot so that other Meshrouter can
> download it
> +		cp /tmp/keyxchangev2data /www/public/
> +
> +		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
> +			if iw phy "$phy" info | grep -q -m1 "2... MHz"; then
> +				echo "$phy is 2.4 GHz"
> +				radio="$(wifiAddPhy "$phy" "$chan2ghz")"
> +				if [ -z "$radio" ]; then
> +					echo "Can't create radio for $phy"
> +					exit 1
> +				fi
> +			fi
> +			if iw phy "$phy" info | grep -q -m1 "5... MHz"; then
> +				echo "$phy is 5 GHz"
> +				radio="$(wifiAddPhy "$phy" "$chan5ghz")"
> +				if [ -z "$radio" ]; then
> +					echo "Can't create radio for $phy"
> +					exit 1
> +				fi
> +			fi
> +
> +			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
> +
> +	else
> +		echo "We have no new file. We do nothing. We try it again in
> 5 minutes...";
> +		exit 0
> +	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
> +	sh /usr/sbin/vpn-select
> +
> +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/Makefile b/src/packages/fff/fff/Makefile
> index 166d423..305ab8d 100644
> --- a/src/packages/fff/fff/Makefile
> +++ b/src/packages/fff/fff/Makefile
> @@ -29,7 +29,8 @@ define Package/fff-base
>               +fff-wireless \
>               +fff-timeserver \
>               +fff-vpn-select \
> -             +simple-tc
> +             +simple-tc \
> +             +fff-hoods
>  endef
> 
>  define Package/fff-base/description
> --
> 2.7.4
> 
> --
> franken-dev mailing list
> franken-dev@freifunk.net
> http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Tim Niemeyer Oct. 3, 2017, 12:21 p.m.
Hi Adrian

Ich hab das zum Anlass genommen den Code vom keyXchangeV2 noch etwas
umzuschreiben. Der Timestamp war eh bisher nur pro Aufruf eingefügt. 

Ich habe das jetzt mit dem Timestamp der letzten Änderung der Hood aus
der Datenbank ersetzt.

Tim

Am Dienstag, den 03.10.2017, 13:13 +0200 schrieb
mail@adrianschmutzler.de:
> Hallo,
> 
> der keyserver v2 schickt einen timestamp mit, daher ist der Vergleich
> der
> SHA sinnlos und jeder File wird als neu behandelt!
> 
> > +	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d " ")
> > +	sumold=$(sha256sum /www/public/keyxchangev2data
> > &>/dev/null
> > > cut -f1 -d " ")
> > 
> > +	if [ "$sumnew" != "$sumold" ]; then
> 
> Das muss am Server korrigiert werden, alternativ baue ich in den
> nächsten
> Patch folgenden Workaround:
> 
>         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 " ")
>         if [ "$sumnew" != "$sumold" ]; then
> 
> 
> Grüße
> 
> Adrian
> 
> 
> 
> 
> 
> > -----Original Message-----
> > From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On
> > Behalf
> > Of Adrian Schmutzler
> > Sent: Montag, 2. Oktober 2017 18:06
> > To: franken-dev@freifunk.net
> > Cc: Jan Kraus <mayosemmel@gmail.com>
> > Subject: [PATCH v12 4/6] Add fff-hoods
> > 
> > From: Christian Dresel <fff@chrisi01.de>
> > 
> > This package connects to keyxchangev2
> > After review we must change the serveradress! This is only a
> > example
> > 
> > Signed-off-by: Christian Dresel <fff@chrisi01.de>
> > Signed-off-by: Jan Kraus <mayosemmel@gmail.com>
> > Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> > 
> > Update in v2:
> >  - clean tabstops
> >  - move the json vpn out of the if because we need this after
> > reboot
> > 
> > Update in v5:
> > 	!!UNTESTED!!
> >  - change hidden AP ip to locallink
> >  - Open hidden AP after more checks
> >  - Load json File from Gateway if Gateway in Batman in Range
> > 
> > Update 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
> > 
> > Update in v7:
> > 	!!UNTESTED!!
> >  - delete keyxchangev2data at start of the script
> >  - do only things with keyxchangev2data if available
> >  - change keyxchangev2 url
> > 
> > Update in v8/v9:
> >  - rebase onto 20170918-beta
> > 
> > Update 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
> > 
> > Update 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 hyphens
> >  - Fixed vpn loop so it works for more than one host (TESTED)
> >  - Fixed "else" if no file received
> > 
> > Changes in v12:
> >  - Removed obsolete hostname
> > 
> > ToDo:
> >  - Mesh routers do not connect to config
> > ---
> >  src/packages/fff/fff-hoods/Makefile                |  39 ++++
> >  .../files/etc/hotplug.d/iface/50-fff-hoods         |   5 +
> >  .../fff/fff-hoods/files/usr/lib/micron.d/fff-hoods |   1 +
> >  .../fff/fff-hoods/files/usr/sbin/configurehood     | 210
> > +++++++++++++++++++++
> >  src/packages/fff/fff/Makefile                      |   3 +-
> >  5 files changed, 257 insertions(+), 1 deletion(-)  create mode
> > 100644
> > src/packages/fff/fff-hoods/Makefile
> >  create mode 100644 src/packages/fff/fff-
> > hoods/files/etc/hotplug.d/iface/50-fff-hoods
> >  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/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/etc/hotplug.d/iface/50-fff-hoods
> > b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-hoods
> > new file mode 100644
> > index 0000000..49f53e3
> > --- /dev/null
> > +++ b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-
> > hoods
> > @@ -0,0 +1,5 @@
> > +#!/bin/sh
> > +[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && {
> > +       sleep 3
> > +       /usr/sbin/configurehood
> > +}
> > 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..ca8d798
> > --- /dev/null
> > +++ b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
> > @@ -0,0 +1 @@
> > +*/5 * * * * /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..5346a90
> > --- /dev/null
> > +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> > @@ -0,0 +1,210 @@
> > +#!/bin/sh
> > +
> > +. /usr/share/libubox/jshn.sh
> > +. /lib/functions/fff/wireless
> > +
> > +rm /tmp/keyxchangev2data
> > +
> > +# Gatewaycheck function
> > +isGatewayAvailable() {
> > +	if [ "$(batctl gwl | wc -l)" -gt 2 ]; then
> > +		return 0
> > +	else
> > +		return 1
> > +	fi
> > +}
> > +
> > +chan2ghz="1"
> > +chan5ghz="13"
> > +
> > +# Hidden AP check
> > +
> > +radio="radio0"
> > +if [ -f /tmp/hiddenapflag ]; then
> > +	if isGatewayAvailable ; then
> > +		if ! wifiAddAP "$radio"
> > "config.franken.freifunk.net"
> > "configap" "configap" "1"; then
> > +			echo "Can't add AP interface on $radio."
> > +			exit 1
> > +		else
> > +			# We must set a fixed ip address here
> > +			uci set network.configap=interface
> > +			uci set network.configap.proto='static'
> > +			uci set
> > network.configap.ip6addr='fe80::1/64'
> > +			uci commit network
> > +		fi
> > +	else
> > +		rm /tmp/hiddenapflag
> > +	fi
> > +fi
> > +
> > +lat=$(uci get system.@system[0].latitude) long=$(uci get
> > +system.@system[0].longitude)
> > +
> > +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 we have Internet, we download the Hoodfile from the
> > keyxchangev2
> > +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
> > +	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
> > +		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
> > +			if iw phy "$phy" info | grep -q -m1 "2...
> > MHz"; then
> > +				echo "$phy is 2.4 GHz"
> > +				radio="$(wifiAddPhy "$phy"
> > "$chan2ghz")"
> > +				if [ -z "$radio" ]; then
> > +					echo "Can't create radio
> > for $phy"
> > +					exit 1
> > +				fi
> > +			fi
> > +			if iw phy "$phy" info | grep -q -m1 "5...
> > MHz"; then
> > +				echo "$phy is 5 GHz"
> > +				radio="$(wifiAddPhy "$phy"
> > "$chan5ghz")"
> > +				if [ -z "$radio" ]; then
> > +					echo "Can't create radio
> > for $phy"
> > +					exit 1
> > +				fi
> > +			fi
> > +			#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
> > +			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]/keyxchangev2
> > data" -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]/keyxchange
> > v2data"
> > -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!
> > +
> > +	json_load "$(cat /tmp/keyxchangev2data)"
> > +	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d " ")
> > +	sumold=$(sha256sum /www/public/keyxchangev2data
> > &>/dev/null
> > > cut -f1 -d " ")
> > 
> > +	if [ "$sumnew" != "$sumold" ]; then
> > +		echo "New file detect, we reconfigure the Node";
> > +
> > +		# copy the file to webroot so that other
> > Meshrouter can
> > download it
> > +		cp /tmp/keyxchangev2data /www/public/
> > +
> > +		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
> > +			if iw phy "$phy" info | grep -q -m1 "2...
> > MHz"; then
> > +				echo "$phy is 2.4 GHz"
> > +				radio="$(wifiAddPhy "$phy"
> > "$chan2ghz")"
> > +				if [ -z "$radio" ]; then
> > +					echo "Can't create radio
> > for $phy"
> > +					exit 1
> > +				fi
> > +			fi
> > +			if iw phy "$phy" info | grep -q -m1 "5...
> > MHz"; then
> > +				echo "$phy is 5 GHz"
> > +				radio="$(wifiAddPhy "$phy"
> > "$chan5ghz")"
> > +				if [ -z "$radio" ]; then
> > +					echo "Can't create radio
> > for $phy"
> > +					exit 1
> > +				fi
> > +			fi
> > +
> > +			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
> > +
> > +	else
> > +		echo "We have no new file. We do nothing. We try
> > it again in
> > 5 minutes...";
> > +		exit 0
> > +	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
> > +	sh /usr/sbin/vpn-select
> > +
> > +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/Makefile
> > b/src/packages/fff/fff/Makefile
> > index 166d423..305ab8d 100644
> > --- a/src/packages/fff/fff/Makefile
> > +++ b/src/packages/fff/fff/Makefile
> > @@ -29,7 +29,8 @@ define Package/fff-base
> >               +fff-wireless \
> >               +fff-timeserver \
> >               +fff-vpn-select \
> > -             +simple-tc
> > +             +simple-tc \
> > +             +fff-hoods
> >  endef
> > 
> >  define Package/fff-base/description
> > --
> > 2.7.4
> > 
> > --
> > franken-dev mailing list
> > franken-dev@freifunk.net
> > http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
> 
>
Peter J. Philipp Oct. 3, 2017, 12:27 p.m.
Finde ich komisch warum „cat“ überhaupt auf STDERR schreibt, wann kann das passieren?  Doch eigentlich nur wenn der file gar nicht existiert, oder eine pipe oder so ist?
Wäre es besser dann erst mit -f zu testen?  Ich weiss das LEDE ein Linux ist aber ich habe mir die sourcen von OpenBSD angeschaut die auf korrektheit aufbauen,
https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/bin/cat/cat.c?rev=1.26&content-type=text/plain <https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/bin/cat/cat.c?rev=1.26&content-type=text/plain> da ist eigentlich nur die gelegenheit von cat zu stderr zu schreiben wenn es zum beispiel nicht malloc()’en kann, also kein RAM speicher hat.

Was ich sagen will wir sollten uns einigen entweder cat $file 2>/dev/null schreiben und es überall so tun oder gar nicht.  Was glaubt ihr?

Gruß,
-peter


> Am 03.10.2017 um 13:13 schrieb <mail@adrianschmutzler.de> <mail@adrianschmutzler.de>:
> 
> Hallo,
> 
> der keyserver v2 schickt einen timestamp mit, daher ist der Vergleich der
> SHA sinnlos und jeder File wird als neu behandelt!
> 
>> +	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d " ")
>> +	sumold=$(sha256sum /www/public/keyxchangev2data &>/dev/null
>> | cut -f1 -d " ")
>> +	if [ "$sumnew" != "$sumold" ]; then
> 
> Das muss am Server korrigiert werden, alternativ baue ich in den nächsten
> Patch folgenden Workaround:
> 
>        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 " ")
>        if [ "$sumnew" != "$sumold" ]; then
> 
> 
> Grüße
> 
> Adrian
> 
> 
> 
> 
> 
>> -----Original Message-----
>> From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf
>> Of Adrian Schmutzler
>> Sent: Montag, 2. Oktober 2017 18:06
>> To: franken-dev@freifunk.net
>> Cc: Jan Kraus <mayosemmel@gmail.com>
>> Subject: [PATCH v12 4/6] Add fff-hoods
>> 
>> From: Christian Dresel <fff@chrisi01.de>
>> 
>> This package connects to keyxchangev2
>> After review we must change the serveradress! This is only a example
>> 
>> Signed-off-by: Christian Dresel <fff@chrisi01.de>
>> Signed-off-by: Jan Kraus <mayosemmel@gmail.com>
>> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
>> 
>> Update in v2:
>> - clean tabstops
>> - move the json vpn out of the if because we need this after reboot
>> 
>> Update in v5:
>> 	!!UNTESTED!!
>> - change hidden AP ip to locallink
>> - Open hidden AP after more checks
>> - Load json File from Gateway if Gateway in Batman in Range
>> 
>> Update 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
>> 
>> Update in v7:
>> 	!!UNTESTED!!
>> - delete keyxchangev2data at start of the script
>> - do only things with keyxchangev2data if available
>> - change keyxchangev2 url
>> 
>> Update in v8/v9:
>> - rebase onto 20170918-beta
>> 
>> Update 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
>> 
>> Update 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 hyphens
>> - Fixed vpn loop so it works for more than one host (TESTED)
>> - Fixed "else" if no file received
>> 
>> Changes in v12:
>> - Removed obsolete hostname
>> 
>> ToDo:
>> - Mesh routers do not connect to config
>> ---
>> src/packages/fff/fff-hoods/Makefile                |  39 ++++
>> .../files/etc/hotplug.d/iface/50-fff-hoods         |   5 +
>> .../fff/fff-hoods/files/usr/lib/micron.d/fff-hoods |   1 +
>> .../fff/fff-hoods/files/usr/sbin/configurehood     | 210
>> +++++++++++++++++++++
>> src/packages/fff/fff/Makefile                      |   3 +-
>> 5 files changed, 257 insertions(+), 1 deletion(-)  create mode 100644
>> src/packages/fff/fff-hoods/Makefile
>> create mode 100644 src/packages/fff/fff-
>> hoods/files/etc/hotplug.d/iface/50-fff-hoods
>> 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/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/etc/hotplug.d/iface/50-fff-hoods
>> b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-hoods
>> new file mode 100644
>> index 0000000..49f53e3
>> --- /dev/null
>> +++ b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-hoods
>> @@ -0,0 +1,5 @@
>> +#!/bin/sh
>> +[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && {
>> +       sleep 3
>> +       /usr/sbin/configurehood
>> +}
>> 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..ca8d798
>> --- /dev/null
>> +++ b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
>> @@ -0,0 +1 @@
>> +*/5 * * * * /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..5346a90
>> --- /dev/null
>> +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
>> @@ -0,0 +1,210 @@
>> +#!/bin/sh
>> +
>> +. /usr/share/libubox/jshn.sh
>> +. /lib/functions/fff/wireless
>> +
>> +rm /tmp/keyxchangev2data
>> +
>> +# Gatewaycheck function
>> +isGatewayAvailable() {
>> +	if [ "$(batctl gwl | wc -l)" -gt 2 ]; then
>> +		return 0
>> +	else
>> +		return 1
>> +	fi
>> +}
>> +
>> +chan2ghz="1"
>> +chan5ghz="13"
>> +
>> +# Hidden AP check
>> +
>> +radio="radio0"
>> +if [ -f /tmp/hiddenapflag ]; then
>> +	if isGatewayAvailable ; then
>> +		if ! wifiAddAP "$radio" "config.franken.freifunk.net"
>> "configap" "configap" "1"; then
>> +			echo "Can't add AP interface on $radio."
>> +			exit 1
>> +		else
>> +			# We must set a fixed ip address here
>> +			uci set network.configap=interface
>> +			uci set network.configap.proto='static'
>> +			uci set network.configap.ip6addr='fe80::1/64'
>> +			uci commit network
>> +		fi
>> +	else
>> +		rm /tmp/hiddenapflag
>> +	fi
>> +fi
>> +
>> +lat=$(uci get system.@system[0].latitude) long=$(uci get
>> +system.@system[0].longitude)
>> +
>> +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 we have Internet, we download the Hoodfile from the keyxchangev2
>> +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
>> +	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
>> +		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
>> +			if iw phy "$phy" info | grep -q -m1 "2... MHz"; then
>> +				echo "$phy is 2.4 GHz"
>> +				radio="$(wifiAddPhy "$phy" "$chan2ghz")"
>> +				if [ -z "$radio" ]; then
>> +					echo "Can't create radio for $phy"
>> +					exit 1
>> +				fi
>> +			fi
>> +			if iw phy "$phy" info | grep -q -m1 "5... MHz"; then
>> +				echo "$phy is 5 GHz"
>> +				radio="$(wifiAddPhy "$phy" "$chan5ghz")"
>> +				if [ -z "$radio" ]; then
>> +					echo "Can't create radio for $phy"
>> +					exit 1
>> +				fi
>> +			fi
>> +			#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
>> +			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!
>> +
>> +	json_load "$(cat /tmp/keyxchangev2data)"
>> +	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d " ")
>> +	sumold=$(sha256sum /www/public/keyxchangev2data &>/dev/null
>> | cut -f1 -d " ")
>> +	if [ "$sumnew" != "$sumold" ]; then
>> +		echo "New file detect, we reconfigure the Node";
>> +
>> +		# copy the file to webroot so that other Meshrouter can
>> download it
>> +		cp /tmp/keyxchangev2data /www/public/
>> +
>> +		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
>> +			if iw phy "$phy" info | grep -q -m1 "2... MHz"; then
>> +				echo "$phy is 2.4 GHz"
>> +				radio="$(wifiAddPhy "$phy" "$chan2ghz")"
>> +				if [ -z "$radio" ]; then
>> +					echo "Can't create radio for $phy"
>> +					exit 1
>> +				fi
>> +			fi
>> +			if iw phy "$phy" info | grep -q -m1 "5... MHz"; then
>> +				echo "$phy is 5 GHz"
>> +				radio="$(wifiAddPhy "$phy" "$chan5ghz")"
>> +				if [ -z "$radio" ]; then
>> +					echo "Can't create radio for $phy"
>> +					exit 1
>> +				fi
>> +			fi
>> +
>> +			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
>> +
>> +	else
>> +		echo "We have no new file. We do nothing. We try it again in
>> 5 minutes...";
>> +		exit 0
>> +	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
>> +	sh /usr/sbin/vpn-select
>> +
>> +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/Makefile b/src/packages/fff/fff/Makefile
>> index 166d423..305ab8d 100644
>> --- a/src/packages/fff/fff/Makefile
>> +++ b/src/packages/fff/fff/Makefile
>> @@ -29,7 +29,8 @@ define Package/fff-base
>>              +fff-wireless \
>>              +fff-timeserver \
>>              +fff-vpn-select \
>> -             +simple-tc
>> +             +simple-tc \
>> +             +fff-hoods
>> endef
>> 
>> define Package/fff-base/description
>> --
>> 2.7.4
>> 
>> --
>> franken-dev mailing list
>> franken-dev@freifunk.net
>> http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
> 
> -- 
> franken-dev mailing list
> franken-dev@freifunk.net
> http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Tim Niemeyer Oct. 3, 2017, 1:10 p.m.
Am Dienstag, den 03.10.2017, 14:27 +0200 schrieb Peter J. Philipp:
> Finde ich komisch warum „cat“ überhaupt auf STDERR schreibt, wann
> kann das passieren?  Doch eigentlich nur wenn der file gar nicht
> existiert, oder eine pipe oder so ist?

Ich hab jetzt nicht genau rein geschaut, aber ich vermute die Datei
kann nicht da sein. Da hier quasi nur geprüft wird ob es einen
Unterschied gibt um anschließend die Datei ggfs zu kopieren, wäre es
mMn ok den Fehler weg zu filtern.

Tim


> Wäre es besser dann erst mit -f zu testen?  Ich weiss das LEDE ein
> Linux ist aber ich habe mir die sourcen von OpenBSD angeschaut die
> auf korrektheit aufbauen,
> https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/bin/cat/cat.
> c?rev=1.26&content-type=text/plain da ist eigentlich nur die
> gelegenheit von cat zu stderr zu schreiben wenn es zum beispiel nicht
> malloc()’en kann, also kein RAM speicher hat.
> 
> Was ich sagen will wir sollten uns einigen entweder cat $file
> 2>/dev/null schreiben und es überall so tun oder gar nicht.  Was
> glaubt ihr?
> 
> Gruß,
> -peter
> 
> 
> > Am 03.10.2017 um 13:13 schrieb <mail@adrianschmutzler.de> <mail@adr
> > ianschmutzler.de>:
> > 
> > Hallo,
> > 
> > der keyserver v2 schickt einen timestamp mit, daher ist der
> > Vergleich der
> > SHA sinnlos und jeder File wird als neu behandelt!
> > 
> > > +	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d "
> > > ")
> > > +	sumold=$(sha256sum /www/public/keyxchangev2data
> > > &>/dev/null
> > > | cut -f1 -d " ")
> > > +	if [ "$sumnew" != "$sumold" ]; then
> > 
> > Das muss am Server korrigiert werden, alternativ baue ich in den
> > nächsten
> > Patch folgenden Workaround:
> > 
> >        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 " ")
> >        if [ "$sumnew" != "$sumold" ]; then
> > 
> > 
> > Grüße
> > 
> > Adrian
> > 
> > 
> > 
> > 
> > 
> > > -----Original Message-----
> > > From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On
> > > Behalf
> > > Of Adrian Schmutzler
> > > Sent: Montag, 2. Oktober 2017 18:06
> > > To: franken-dev@freifunk.net
> > > Cc: Jan Kraus <mayosemmel@gmail.com>
> > > Subject: [PATCH v12 4/6] Add fff-hoods
> > > 
> > > From: Christian Dresel <fff@chrisi01.de>
> > > 
> > > This package connects to keyxchangev2
> > > After review we must change the serveradress! This is only a
> > > example
> > > 
> > > Signed-off-by: Christian Dresel <fff@chrisi01.de>
> > > Signed-off-by: Jan Kraus <mayosemmel@gmail.com>
> > > Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> > > 
> > > Update in v2:
> > > - clean tabstops
> > > - move the json vpn out of the if because we need this after
> > > reboot
> > > 
> > > Update in v5:
> > > 	!!UNTESTED!!
> > > - change hidden AP ip to locallink
> > > - Open hidden AP after more checks
> > > - Load json File from Gateway if Gateway in Batman in Range
> > > 
> > > Update 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
> > > 
> > > Update in v7:
> > > 	!!UNTESTED!!
> > > - delete keyxchangev2data at start of the script
> > > - do only things with keyxchangev2data if available
> > > - change keyxchangev2 url
> > > 
> > > Update in v8/v9:
> > > - rebase onto 20170918-beta
> > > 
> > > Update 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
> > > 
> > > Update 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 hyphens
> > > - Fixed vpn loop so it works for more than one host (TESTED)
> > > - Fixed "else" if no file received
> > > 
> > > Changes in v12:
> > > - Removed obsolete hostname
> > > 
> > > ToDo:
> > > - Mesh routers do not connect to config
> > > ---
> > > src/packages/fff/fff-hoods/Makefile                |  39 ++++
> > > .../files/etc/hotplug.d/iface/50-fff-hoods         |   5 +
> > > .../fff/fff-hoods/files/usr/lib/micron.d/fff-hoods |   1 +
> > > .../fff/fff-hoods/files/usr/sbin/configurehood     | 210
> > > +++++++++++++++++++++
> > > src/packages/fff/fff/Makefile                      |   3 +-
> > > 5 files changed, 257 insertions(+), 1 deletion(-)  create mode
> > > 100644
> > > src/packages/fff/fff-hoods/Makefile
> > > create mode 100644 src/packages/fff/fff-
> > > hoods/files/etc/hotplug.d/iface/50-fff-hoods
> > > 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/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/etc/hotplug.d/iface/50-fff-hoods
> > > b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-fff-
> > > hoods
> > > new file mode 100644
> > > index 0000000..49f53e3
> > > --- /dev/null
> > > +++ b/src/packages/fff/fff-hoods/files/etc/hotplug.d/iface/50-
> > > fff-hoods
> > > @@ -0,0 +1,5 @@
> > > +#!/bin/sh
> > > +[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && {
> > > +       sleep 3
> > > +       /usr/sbin/configurehood
> > > +}
> > > 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..ca8d798
> > > --- /dev/null
> > > +++ b/src/packages/fff/fff-hoods/files/usr/lib/micron.d/fff-hoods
> > > @@ -0,0 +1 @@
> > > +*/5 * * * * /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..5346a90
> > > --- /dev/null
> > > +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> > > @@ -0,0 +1,210 @@
> > > +#!/bin/sh
> > > +
> > > +. /usr/share/libubox/jshn.sh
> > > +. /lib/functions/fff/wireless
> > > +
> > > +rm /tmp/keyxchangev2data
> > > +
> > > +# Gatewaycheck function
> > > +isGatewayAvailable() {
> > > +	if [ "$(batctl gwl | wc -l)" -gt 2 ]; then
> > > +		return 0
> > > +	else
> > > +		return 1
> > > +	fi
> > > +}
> > > +
> > > +chan2ghz="1"
> > > +chan5ghz="13"
> > > +
> > > +# Hidden AP check
> > > +
> > > +radio="radio0"
> > > +if [ -f /tmp/hiddenapflag ]; then
> > > +	if isGatewayAvailable ; then
> > > +		if ! wifiAddAP "$radio"
> > > "config.franken.freifunk.net"
> > > "configap" "configap" "1"; then
> > > +			echo "Can't add AP interface on $radio."
> > > +			exit 1
> > > +		else
> > > +			# We must set a fixed ip address here
> > > +			uci set network.configap=interface
> > > +			uci set network.configap.proto='static'
> > > +			uci set
> > > network.configap.ip6addr='fe80::1/64'
> > > +			uci commit network
> > > +		fi
> > > +	else
> > > +		rm /tmp/hiddenapflag
> > > +	fi
> > > +fi
> > > +
> > > +lat=$(uci get system.@system[0].latitude) long=$(uci get
> > > +system.@system[0].longitude)
> > > +
> > > +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 we have Internet, we download the Hoodfile from the
> > > keyxchangev2
> > > +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
> > > +	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
> > > +		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
> > > +			if iw phy "$phy" info | grep -q -m1
> > > "2... MHz"; then
> > > +				echo "$phy is 2.4 GHz"
> > > +				radio="$(wifiAddPhy "$phy"
> > > "$chan2ghz")"
> > > +				if [ -z "$radio" ]; then
> > > +					echo "Can't create radio
> > > for $phy"
> > > +					exit 1
> > > +				fi
> > > +			fi
> > > +			if iw phy "$phy" info | grep -q -m1
> > > "5... MHz"; then
> > > +				echo "$phy is 5 GHz"
> > > +				radio="$(wifiAddPhy "$phy"
> > > "$chan5ghz")"
> > > +				if [ -z "$radio" ]; then
> > > +					echo "Can't create radio
> > > for $phy"
> > > +					exit 1
> > > +				fi
> > > +			fi
> > > +			#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
> > > +			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]/keyxchange
> > > v2data" -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]/keyxchan
> > > gev2data"
> > > -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!
> > > +
> > > +	json_load "$(cat /tmp/keyxchangev2data)"
> > > +	sumnew=$(sha256sum /tmp/keyxchangev2data | cut -f1 -d "
> > > ")
> > > +	sumold=$(sha256sum /www/public/keyxchangev2data
> > > &>/dev/null
> > > | cut -f1 -d " ")
> > > +	if [ "$sumnew" != "$sumold" ]; then
> > > +		echo "New file detect, we reconfigure the Node";
> > > +
> > > +		# copy the file to webroot so that other
> > > Meshrouter can
> > > download it
> > > +		cp /tmp/keyxchangev2data /www/public/
> > > +
> > > +		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
> > > +			if iw phy "$phy" info | grep -q -m1
> > > "2... MHz"; then
> > > +				echo "$phy is 2.4 GHz"
> > > +				radio="$(wifiAddPhy "$phy"
> > > "$chan2ghz")"
> > > +				if [ -z "$radio" ]; then
> > > +					echo "Can't create radio
> > > for $phy"
> > > +					exit 1
> > > +				fi
> > > +			fi
> > > +			if iw phy "$phy" info | grep -q -m1
> > > "5... MHz"; then
> > > +				echo "$phy is 5 GHz"
> > > +				radio="$(wifiAddPhy "$phy"
> > > "$chan5ghz")"
> > > +				if [ -z "$radio" ]; then
> > > +					echo "Can't create radio
> > > for $phy"
> > > +					exit 1
> > > +				fi
> > > +			fi
> > > +
> > > +			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
> > > +
> > > +	else
> > > +		echo "We have no new file. We do nothing. We try
> > > it again in
> > > 5 minutes...";
> > > +		exit 0
> > > +	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
> > > +	sh /usr/sbin/vpn-select
> > > +
> > > +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/Makefile
> > > b/src/packages/fff/fff/Makefile
> > > index 166d423..305ab8d 100644
> > > --- a/src/packages/fff/fff/Makefile
> > > +++ b/src/packages/fff/fff/Makefile
> > > @@ -29,7 +29,8 @@ define Package/fff-base
> > >              +fff-wireless \
> > >              +fff-timeserver \
> > >              +fff-vpn-select \
> > > -             +simple-tc
> > > +             +simple-tc \
> > > +             +fff-hoods
> > > endef
> > > 
> > > define Package/fff-base/description
> > > --
> > > 2.7.4
> > > 
> > > --
> > > franken-dev mailing list
> > > franken-dev@freifunk.net
> > > http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.n
> > > et
> > 
> > -- 
> > franken-dev mailing list
> > franken-dev@freifunk.net
> > http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
> 
>