[PATCH v15 4/6] Add fff-hoods

Adrian Schmutzler mail at adrianschmutzler.de
Mi Okt 4 18:04:34 CEST 2017


Problem 2 und 3 entsprechen der Erwartung. Später mehr...

On October 4, 2017 6:01:55 PM GMT+02:00, Christian Dresel <fff at chrisi01.de> wrote:
hi

beim testen auf folgende Probleme gestoßen die ich aber noch nicht
genauer analysiert habe (Zeit und so...):

- fastd im Autostart (rc.local) braucht wieder ewig bis ein key
generiert wird, dadurch hängen Router mit Kabel am WAN Port eine lange
Zeit beim boot ohne das eine LED leuchtet bzw. nur die Power LED
(wr1043v4)

- auf einem c25 mit aktivierten 5GHz (geht bei mir) wird nur ein 5GHz
hiddenconfigap aufgemacht, kein 2,4GHZ hiddenconfigap

- Die Router scheinen auf Kanal 1 zu bleiben obwohl im keyxchange 13
steht, fehlt das noch?

mfg

Christian

On 03.10.2017 18:53, Adrian Schmutzler wrote:
> From: Christian Dresel <fff at chrisi01.de>
> 
> This package connects to keyxchangev2
> 
> Tested-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>
> 
> Signed-off-by: Christian Dresel <fff at chrisi01.de>
> Signed-off-by: Jan Kraus <mayosemmel at gmail.com>
> Signed-off-by: Adrian Schmutzler <freifunk at 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 quotes
>  - Fixed vpn loop so it works for more than one host (TESTED)
>  - Fixed "else" if no file received
> 
> Changes in v12:
>  - Removed obsolete hostname
> 
> 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 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
> ---
>  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     | 232
+++++++++++++++++++++
>  .../fff/fff-vpn-select/files/usr/sbin/vpn-select   |   2 -
>  src/packages/fff/fff/Makefile                      |   3 +-
>  6 files changed, 278 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..bf5058a
> --- /dev/null
> +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> @@ -0,0 +1,232 @@
> +#!/bin/sh
> +
> +. /usr/share/libubox/jshn.sh
> +. /lib/functions/fff/wireless
> +
> +rm /tmp/keyxchangev2data
> +
> +# Gatewaycheck function
> +isGatewayAvailable() {
> +	if [ "$(batctl gwl | wc -l)" -gt 2 ]; then
> +		return 0
> +	else
> +		return 1
> +	fi
> +}
> +
> +# Ping test
> +hasInternet() {
> +	test_ipv4_host1="keyserver.freifunk-franken.de" # Freifunk-Franken
keyserver
> +	test_ipv4_host2="8.8.8.8"        # Google DNS
> +	test_ipv6_host1="heise.de"       # heise Zeitschriftenverlag
> +	if ping -w5 -c3 "$test_ipv4_host1" &>/dev/null ||
> +		ping -w5 -c3 "$test_ipv4_host2" &>/dev/null ||
> +		ping6 -w5 -c3 "$test_ipv6_host1" &>/dev/null ; then
> +		return 0
> +	fi
> +	return 1
> +}
> +
> +chan2ghz="1"
> +chan5ghz="36"
> +
> +# Hidden AP check
> +
> +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
> +
> +			wifi
> +
> +			rm /tmp/hiddenapflag # only add once
> +		fi
> +	else
> +		rm /tmp/hiddenapflag
> +	fi
> +fi
> +
> +lat=$(uci -q get system. at system[0].latitude)
> +long=$(uci -q get system. at 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
> +		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
> +			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. at 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
> +
> +		# 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...";
> +		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
> +	
> +	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/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
> 
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://lists.freifunk.net/pipermail/franken-dev-freifunk.net/attachments/20171004/3c9b6c22/attachment.html>


Mehr Informationen über die Mailingliste franken-dev