[v9,4/4] Add fff-hoods

Christian Dresel fff at chrisi01.de
Mi Sep 27 10:52:42 CEST 2017


Falls jemand damit arbeiten will, einige Syntaxfehler:

On 27.09.2017 09:54, Christian Dresel wrote:
> hi
> 
> Das ganze Paket muss noch in der fff-base aktiviert werden, das hab aber
> wohl schon ich vermasselt da es wohl auch schon in den früheren
> Patchversionen von mir fehlt. Sollte bei der nächsten Version mit
> nachgetragen werden.
> 
> mfg
> 
> Christian
> 
> (sry wegen der doppelten Mail, ich hab die Absenderadresse mal wieder
> vermurkst...)
> 
> On 21.09.2017 16:02, Adrian Schmutzler wrote:
>> From: Christian Dresel <fff at chrisi01.de>
>>
>> this packages connect to keyxchangev2
>> after review we must change the serveradress! This is only a example
>>
>> Signed-off-by: Christian Dresel <fff at chrisi01.de>
>> Signed-off-by: Jan Kraus <mayosemmel at gmail.com>
>>
>> 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
>> ---
>>  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     | 205 +++++++++++++++++++++
>>  4 files changed, 250 insertions(+)
>>  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..bfec822
>> --- /dev/null
>> +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
>> @@ -0,0 +1,205 @@
>> +#!/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 true;
>> +	else
>> +		return false;
>> +	fi
>> +}
>> +
>> +
>> +# hidden AP check
>> +
>> +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 here a fix ip adress
>> +			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. at system[0].latitude)
>> +long=$(uci get system. at system[0].longitude)
>> +hostname=$(cat /proc/sys/kernel/hostname)
>> +[ "$hostname" = "OpenWrt" ] && hostname=""
>> +[ "$hostname" = "" ] &&  hostname="$mac"
>> +
>> +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 from the next router the json File -O /tmp/keyxchangev2data
>> +	# only to that, when we have no gateway in range. If the Uplinkrouter change the hood, we lost the GW and to 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" "$BATMAN_CHANNEL")
>> +				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" "$BATMAN_CHANNEL_5GHZ")
>> +				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 | cut -f1 -d " ")
>> +	if [ "$sumnew" != "$sumold" ] && [ -f /tmp/keyxchangev2data]; then

möp wichtiges Leerzeichen vor ]

>> +		echo "New file detect, we reconfigure the Node";
>> +
>> +		# copy the file to webroot that other Meshrouter can download them
>> +		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
>> +
>> +		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" "1")
>> +				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" "13")
>> +				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 or we have no file get. 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

hier ist (warum auch immer) ein:

json_load "$(cat /tmp/keyxchangev2data)"

nötig obwohl es oben schon gemacht wurde, warum? Weiß ich gerade nicht
genau aber ohne geht es nicht.

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

möp, wichtiges Leerzeichen vor ]

mfg

Christian

>> +			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
>> +		echo "###" >> /tmp/fastd_fff_output
>> +	done
>> +	#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
>> +fi
> 
> 
> 
> 

-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 819 bytes
Beschreibung: OpenPGP digital signature
URL         : <http://lists.freifunk.net/pipermail/franken-dev-freifunk.net/attachments/20170927/bedb9058/attachment.sig>


Mehr Informationen über die Mailingliste franken-dev