From patchwork Wed Nov 1 22:44:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: fff-hoods: Use alfred for hood file redistribution From: Adrian Schmutzler X-Patchwork-Id: 645 Message-Id: <1509576279-3473-1-git-send-email-freifunk@adrianschmutzler.de> To: franken-dev@freifunk.net Date: Wed, 1 Nov 2017 23:44:39 +0100 Please read inline comments. UNTESTED. Signed-off-by: Adrian Schmutzler --- .../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.@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