[PATCH] fff-hoods: Use alfred for hood file redistribution

robert rlanghammer at web.de
Do Nov 2 08:58:46 CET 2017


Hallo,

Mir ist da gerade ein Gedanke gekommen.

Wenn wir das hoodfile über alfred verteilen, dann zieht die gesamte Hood
nach, sobald irgendwo, aus welchem Grund auch immer ein neues Hoodfile
auftaucht. Das bedeutet, jeder der einen Router in der Hood hat, kann
diese umkonfigurieren. Nicht so gut.

Robert


Am 01.11.2017 um 23:44 schrieb Adrian Schmutzler:
> Please read inline comments. UNTESTED.
>
> Signed-off-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>
> ---
>  .../fff-hoods/files/lib/functions/fff/keyxchange   | 28 ++++++++++++++++++
>  .../fff/fff-hoods/files/usr/sbin/configurehood     | 34 ++++++++++++++++++++--
>  2 files changed, 60 insertions(+), 2 deletions(-)
>
> diff --git a/src/packages/fff/fff-hoods/files/lib/functions/fff/keyxchange b/src/packages/fff/fff-hoods/files/lib/functions/fff/keyxchange
> index 9aeb434..2d645d0 100644
> --- a/src/packages/fff/fff-hoods/files/lib/functions/fff/keyxchange
> +++ b/src/packages/fff/fff-hoods/files/lib/functions/fff/keyxchange
> @@ -31,3 +31,31 @@ getUpgradePath() {
>  	fi
>  	return 0
>  }
> +
> +getJsonTimestamp() {
> +	json=$1
> +	
> +	ts=0
> +	if [ -n "$json" ] && json_load "$json" &>/dev/null ; then
> +		json_select "hood" &>/dev/null && json_get_var ts timestamp
> +	fi
> +	echo "$ts"
> +}
> +
> +getJsonFromAlfred() {
> +	datafile=$1
> +
> +	tsold=0
> +	jsonused=""
> +
> +	while read -r line
> +	do
> +		json="$(echo "$line" | sed 's/[^,]*,\s*"//' | sed 's/"\s*},\s*$//' | sed 's/\\"/"/g')"
> +		ts="$(getJsonTimestamp "$json")"
> +		if [ "$ts" -gt "$tsold" ] ; then
> +			jsonused="$json"
> +			tsold="$ts"
> +		fi
> +	done < "$datafile"
> +	echo "$jsonused"
> +}
> diff --git a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> index 8ffaced..981f7aa 100755
> --- a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> @@ -9,6 +9,9 @@ sectorlocal=/etc/sectorfile
>  sectortmp=/tmp/sectorfile
>  sectorcopy=/www/hood/sectorfile
>  
> +alfredfile=/tmp/alfredhood
> +alfrednum="65"
> +
>  rm -f "$hoodfile"
>  
>  # Gatewaycheck function
> @@ -65,6 +68,29 @@ 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 "$hoodfile"
> +	
> +	# Alfred will always have only one "entry" per sender address. Thus, old data will be overwritten by new one.
> +	# If the commented lines are enabled, the behavior will be altered: The router will only send data if no up-to-date information is already present.
> +	
> +	#hoodread="$(cat "$hoodfile")"
> +	#alfred -r "$alfrednum" > "$alfredfile"
> +	#alfrednewest="$(getJsonFromAlfred "$alfredfile")"
> +	#rm -f "$alfredfile"
> +	#tsinet="$(getJsonTimestamp "$hoodread")"
> +	#tsalfred="$(getJsonTimestamp "$alfrednewest")"
> +	#if [ "$tsinet" -gt "$tsalfred" ] ; then
> +		cat "$hoodfile" | alfred -s "$alfrednum"
> +	#fi
> +	
> +	# Note that data sent this way has a lifetime. The following case would be possible:
> +	# 1. The first uplink router will send data via alfred
> +	# 2. All routers won't send any data, since the data from the first is already present and up-to-date
> +	# 3. The alfred data send by the first router expires -> No alfred data present
> +	# 4. A random router will find no data and paste its own, restarting the cycle
> +	# Note that between 3. and 4. there is a gap where no data is present.
> +	# -> Advantage: The alfred information will be much smaller, leading to smaller files and less CPU for parsing (json = about 1 kB per Sender)
> +	# -> Disadvantage: There will be frequent gaps with no data available
> +
>  	rm -f "$sectortmp"
>  	[ -s "$sectorlocal" ] || rm -f "$sectorcopy" # If internet present, no custom config should be distributed, except when local file is present
>  	#UPLINK: No uplink download if internet present
> @@ -115,8 +141,12 @@ else
>  			wget -T15 -t5 "http://[fe80::1%w2sta]:2342/sectorfile" -O "$sectortmp" || wget -T15 -t5 "http://[fe80::1%w5sta]:2342/sectorfile" -O "$sectortmp"
>  		fi
>  	else
> -		echo "We have a Gateway in Range, we load the keyxchangev2data from fe80::1"
> -		wget -T15 -t5 "http://[fe80::1%br-mesh]:2342/keyxchangev2data" -O "$hoodfile"
> +		echo "We have a Gateway in Range, we collect files from the neighborhood"
> +		alfred -r "$alfrednum" > "$alfredfile"
> +		alfrednewest="$(getJsonFromAlfred "$alfredfile")"
> +		rm -f "$alfredfile"
> +		[ -n "$alfrednewest" ] && echo "$alfrednewest" > "$hoodfile"
> +		
>  		#UPLINK: Do nothing
>  	fi
>  fi



Mehr Informationen über die Mailingliste franken-dev