From patchwork Mon Oct 2 14:08:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [v11,4/4] Add fff-hoods From: Adrian Schmutzler X-Patchwork-Id: 502 Message-Id: <1506953285-2234-1-git-send-email-freifunk@adrianschmutzler.de> To: franken-dev@freifunk.net Cc: Jan Kraus Date: Mon, 2 Oct 2017 16:08:05 +0200 From: Christian Dresel This package connects to keyxchangev2 After review we must change the serveradress! This is only a example Signed-off-by: Christian Dresel Signed-off-by: Jan Kraus Signed-off-by: Adrian Schmutzler 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 hyphens - Fixed vpn loop so it works for more than one host (TESTED) - Fixed "else" if no file received ToDo: - Mesh routers do not connect to config --- 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 | 214 +++++++++++++++++++++ src/packages/fff/fff/Makefile | 3 +- 5 files changed, 261 insertions(+), 1 deletion(-) 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..4d7e9d7 --- /dev/null +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood @@ -0,0 +1,214 @@ +#!/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 + fi + else + rm /tmp/hiddenapflag + fi +fi + +lat=$(uci get system.@system[0].latitude) +long=$(uci get system.@system[0].longitude) +hostname=$(cat /proc/sys/kernel/hostname) +mac=$(awk '{ mac=toupper($1); gsub(":", "", mac); print mac }' /sys/class/net/br-mesh/address 2>/dev/null) +[ "$hostname" = "LEDE" ] && 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 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 + 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 &>/dev/null | cut -f1 -d " ") + 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.@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/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