[PATCH v14 4/6] Add fff-hoods
Adrian Schmutzler
freifunk at adrianschmutzler.de
Di Okt 3 15:18:34 CEST 2017
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
---
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 | 222 +++++++++++++++++++++
.../fff/fff-vpn-select/files/usr/sbin/vpn-select | 2 -
src/packages/fff/fff/Makefile | 3 +-
6 files changed, 268 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..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..8d6ebde
--- /dev/null
+++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
@@ -0,0 +1,222 @@
+#!/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
+
+ 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)
+
+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
+ 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";
+
+ # 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. 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
+
+ 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-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
--
2.7.4
Mehr Informationen über die Mailingliste franken-dev