[PATCH 2/3] adds some basic packages

tk+ff at meskal.net tk+ff at meskal.net
Mi Jul 15 19:33:39 CEST 2015


not yet included:
* uci-defaults script to initialize openwrt during first boot
* a lot of other stuff
* everything else we talked about
* ...
---
 README.md                                          |   6 +
 package.config                                     |   1 +
 packages/.keepdir                                  |   0
 packages/fastdstart/Makefile                       |  34 ++++
 packages/fastdstart/files/usr/sbin/fastdstart      |  96 ++++++++++
 packages/freifunk-franken/Makefile                 |  60 ++++++
 .../freifunk-franken/files/etc/config/freifunk     |  13 ++
 .../files/etc/hotplug.d/iface/30-fastd             |   5 +
 .../freifunk-franken/uci-defaults/99_installcron   |   6 +
 packages/nodewatcher/Makefile                      |  37 ++++
 packages/nodewatcher/files/etc/config/configurator |  24 +++
 packages/nodewatcher/files/etc/config/nodewatcher  |   6 +
 packages/nodewatcher/files/usr/sbin/configurator   | 172 +++++++++++++++++
 packages/nodewatcher/files/usr/sbin/nodewatcher    | 210 +++++++++++++++++++++
 14 files changed, 670 insertions(+)
 delete mode 100644 packages/.keepdir
 create mode 100644 packages/fastdstart/Makefile
 create mode 100755 packages/fastdstart/files/usr/sbin/fastdstart
 create mode 100644 packages/freifunk-franken/Makefile
 create mode 100644 packages/freifunk-franken/files/etc/config/freifunk
 create mode 100644 packages/freifunk-franken/files/etc/hotplug.d/iface/30-fastd
 create mode 100644 packages/freifunk-franken/uci-defaults/99_installcron
 create mode 100644 packages/nodewatcher/Makefile
 create mode 100644 packages/nodewatcher/files/etc/config/configurator
 create mode 100644 packages/nodewatcher/files/etc/config/nodewatcher
 create mode 100644 packages/nodewatcher/files/usr/sbin/configurator
 create mode 100755 packages/nodewatcher/files/usr/sbin/nodewatcher

diff --git a/README.md b/README.md
index b92ef5f..aa4e57d 100644
--- a/README.md
+++ b/README.md
@@ -60,6 +60,12 @@ make menuconfig
 </pre>
 
 Now select the "Target System" and "Target Profile" for your AP model.
+Make sure, that you include one of the freifunk franken packages:
+
+freifunk-franken-basic
+or
+freifunk-franken-debug
+
 
 Finally start the build process
 <pre>
diff --git a/package.config b/package.config
index e69de29..b03faa5 100644
--- a/package.config
+++ b/package.config
@@ -0,0 +1 @@
+CONFIG_PACKAGE_freifunk-franken-basic=y
diff --git a/packages/.keepdir b/packages/.keepdir
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/fastdstart/Makefile b/packages/fastdstart/Makefile
new file mode 100644
index 0000000..3a8312c
--- /dev/null
+++ b/packages/fastdstart/Makefile
@@ -0,0 +1,34 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=fastdstart
+PKG_VERSION:=1.0.0
+PKG_VERSION:=1
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/fastdstart
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=fastd key exchange
+  DEPENDS:=+fastd
+endef
+
+define Package/fastdstart/description
+	Simple script to exchange fastd keys and start fastd
+endef
+
+define Build/Prepare
+	echo "all: " > $(PKG_BUILD_DIR)/Makefile
+endef
+
+define Package/fastdstart/install
+	$(CP) ./files/* $(1)/
+	chmod +x $(1)/usr/sbin/fastdstart
+	mkdir -p $(1)/lib/cron
+	echo "#check for new vpn keys every 5 mins" >> $(1)/lib/cron/${PKG_NAME}
+	echo "*/5 * * * * /usr/sbin/fastdstart" >> $(1)/lib/cron/${PKG_NAME}
+endef
+
+$(eval $(call BuildPackage,fastdstart))
diff --git a/packages/fastdstart/files/usr/sbin/fastdstart b/packages/fastdstart/files/usr/sbin/fastdstart
new file mode 100755
index 0000000..cc2fe91
--- /dev/null
+++ b/packages/fastdstart/files/usr/sbin/fastdstart
@@ -0,0 +1,96 @@
+#!/bin/sh
+
+test -f /tmp/fastdstart.lock && exit 1
+
+touch /tmp/fastdstart.lock
+
+SERVER="no"
+#SERVERNAME="--servername--"
+
+project="fff2"
+
+test_ipv4_host1="mastersword.de" # Tims server
+test_ipv4_host2="8.8.8.8"        # Google DNS
+test_ipv6_host1="heise.de"       # heise Zeitschriftenverlag
+
+# Only do something with fastd when the router has internet connection
+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
+	mac=$(awk '{ mac=toupper($1); gsub(":", "", mac); print mac }' /sys/class/net/br-freifunk/address 2>/dev/null)
+	if [ "$SERVER" = "no" ]; then
+		hostname=$(cat /proc/sys/kernel/hostname)
+
+		if [ "$hostname" = "OpenWrt" ]; then
+			hostname=""
+		fi
+
+		if [ "$hostname" = "" ]; then
+			hostname=$mac
+		fi
+	else
+		hostname=$SERVERNAME
+	fi
+
+	if [ ! -d /etc/fastd ]; then
+		mkdir /etc/fastd
+	fi
+
+	if [ ! -d /etc/fastd/$project ]; then
+		mkdir /etc/fastd/$project
+
+		mkdir /tmp/fastd_${project}_peers
+		ln -s /tmp/fastd_${project}_peers /etc/fastd/$project/peers
+		echo "#!/bin/sh" > /etc/fastd/$project/up.sh
+		echo "ip link set up dev ${project}VPN" >> /etc/fastd/$project/up.sh
+		echo "echo enable > /sys/devices/virtual/net/${project}VPN/batman_adv/no_rebroadcast" >> /etc/fastd/$project/up.sh
+		echo "batctl if add ${project}VPN" >> /etc/fastd/$project/up.sh
+		chmod +x /etc/fastd/$project/up.sh
+
+		secret=$(fastd --generate-key 2>&1 | grep -i secret | awk '{ print $2 }')
+		echo "include peers from \"/etc/fastd/$project/peers\";" >> /etc/fastd/${project}/${project}.conf
+		echo "log to syslog level warn;" >> /etc/fastd/${project}/${project}.conf
+		echo "method \"null\";" >> /etc/fastd/${project}/${project}.conf
+#		http://lists.nord-west.net/pipermail/freifunk-ol-dev/2013-July/000322.html
+#		echo "bind 0.0.0.0:10000;" >> /etc/fastd/${project}/${project}.conf
+		echo "interface \"${project}VPN\";" >> /etc/fastd/${project}/${project}.conf
+		echo "mtu 1426;" >> /etc/fastd/${project}/${project}.conf
+		echo "secret \"$secret\";" >> /etc/fastd/${project}/${project}.conf
+		echo "on up \"/etc/fastd/${project}/up.sh\";" >> /etc/fastd/${project}/${project}.conf
+		echo "secure handshakes no;" >> /etc/fastd/${project}/${project}.conf
+	fi
+
+	if [ ! -d /tmp/fastd_${project}_peers ]; then
+		mkdir /tmp/fastd_${project}_peers
+	fi
+
+	pubkey=$(fastd -c /etc/fastd/$project/$project.conf --show-key --machine-readable)
+#	port=666
+
+
+#	fire up
+	if [ "$(/sbin/ifconfig -a | grep -i ethernet | grep $project)" = "" ]; then
+		/bin/rm /var/run/fastd.$project.pid
+		fastd -c /etc/fastd/$project/$project.conf -d --pid-file /var/run/fastd.$project.pid
+	fi
+
+#	register
+	wget -T15 "http://mastersword.de/~reddog/${project}/?mac=$mac&name=$hostname&port=$port&key=$pubkey" -O /tmp/fastd_${project}_output
+
+	filenames=$(awk '/^####/ { gsub(/^####/, "", $0); gsub(/.conf/, "", $0); print $0; }' /tmp/fastd_${project}_output)
+	for file in $filenames; do
+		awk "{ if(a) print }; /^####$file.conf$/{a=1}; /^$/{a=0};" /tmp/fastd_${project}_output | sed 's/ float;/;/g' > /etc/fastd/$project/peers/$file
+		echo 'float yes;' >> /etc/fastd/$project/peers/$file
+	done
+
+	#reload
+	kill -HUP $(cat /var/run/fastd.$project.pid)
+else
+	echo "Der Router kann keine Verbindung zum Fastdserver aufbauen"
+	echo "$0 macht nichts!"
+fi
+
+/bin/rm /tmp/fastdstart.lock
+
+exit 0
+# vim: noexpandtab
diff --git a/packages/freifunk-franken/Makefile b/packages/freifunk-franken/Makefile
new file mode 100644
index 0000000..cad486a
--- /dev/null
+++ b/packages/freifunk-franken/Makefile
@@ -0,0 +1,60 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=freifunk-franken
+PKG_VERSION:=1.0.0
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/freifunk
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/freifunk-franken-basic
+	SECTION:=base
+	CATEGORY:=Config
+	DEFAULT:=n
+	TITLE:= Freifunk-Franken Basic
+	URL:=http://freifunk-franken.de
+	DEPENDS:=+kmod-batman-adv     \
+	         +batctl              \
+	         +alfred              \
+	         +fastd               \
+	         +fastdstart          \
+	         +ip                  \
+	         +odhcpd              \
+	         +dnsmasq-dhcpv6      \
+	         +ebtables            \
+	         +kmod-ebtables-ipv4  \
+	         +kmod-ebtables-ipv6  \
+	         +haveged             \
+	         + at ATH_USER_REGD      \
+	         +nodewatcher
+endef
+
+define Build/Prepare
+	echo "all: " > $(PKG_BUILD_DIR)/Makefile
+endef
+
+define Package/freifunk-franken-basic/install
+	$(CP) ./files/* $(1)/
+	mkdir -p $(1)/lib/cron
+	echo "#reboot every 1 days at 04:05" >> $(1)/lib/cron/$(PKG_NAME)
+	echo "1 4 */5 * * /sbin/reboot" >> $(1)/lib/cron/$(PKG_NAME)
+endef
+
+define Package/freifunk-franken/conffiles
+	/etc/config/freifunk
+endef
+
+define Package/freifunk-franken-debug
+	SECTION:=base
+	CATEGORY:=Config
+	DEFAULT:=n
+	TITLE:=Freifunk-Franken with debug tools
+	DEPENDS:=+freifunk-franken-basic     \
+	         + at KMOD_BATMAN_ADV_DEBUG_LOG \
+	         +iperf                      \
+	         +tcpdump-mini
+endef
+
+$(eval $(call BuildPackage,freifunk-franken-basic))
+$(eval $(call BuildPackage,freifunk-franken-debug))
diff --git a/packages/freifunk-franken/files/etc/config/freifunk b/packages/freifunk-franken/files/etc/config/freifunk
new file mode 100644
index 0000000..c1da43b
--- /dev/null
+++ b/packages/freifunk-franken/files/etc/config/freifunk
@@ -0,0 +1,13 @@
+
+config settings
+	option 'name' ''
+	option 'geo' ''
+	option 'version' '' #will be set on first boot
+	option 'map_publish' '1'
+	option 'access_from' 'lan'
+	option 'service_link' ''
+	option 'service_label' ''
+	option 'service_display_max' 0
+	option 'default_ap_ssid' 'franken.freifunk.net'
+	option 'default_ah_ssid' ''
+	option 'default_ah_bssid' '02:CA:FF:EE:BA:BE'
diff --git a/packages/freifunk-franken/files/etc/hotplug.d/iface/30-fastd b/packages/freifunk-franken/files/etc/hotplug.d/iface/30-fastd
new file mode 100644
index 0000000..b1ea7bd
--- /dev/null
+++ b/packages/freifunk-franken/files/etc/hotplug.d/iface/30-fastd
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+[ "$ACTION" = "ifup" -a "$DEVICE" = "br-wan" ] || exit 0
+
+/usr/sbin/fastdstart
diff --git a/packages/freifunk-franken/uci-defaults/99_installcron b/packages/freifunk-franken/uci-defaults/99_installcron
new file mode 100644
index 0000000..33c7e46
--- /dev/null
+++ b/packages/freifunk-franken/uci-defaults/99_installcron
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+cat /lib/cron/* /etc/crontabs/root
+
+#execute on every restart before initscripts
+exit 1
diff --git a/packages/nodewatcher/Makefile b/packages/nodewatcher/Makefile
new file mode 100644
index 0000000..fe4731e
--- /dev/null
+++ b/packages/nodewatcher/Makefile
@@ -0,0 +1,37 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=nodewatcher
+PKG_VERSION:=1.0.0
+PKG_VERSION:=1
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/nodewatcher
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=Nodewatcher: client component for Netmon
+  DEPENDS:=+uhttpd
+endef
+
+define Package/nodewatcher/description
+	Freifunk Oldenburg Nodewatcher used to provide status data for Netmon
+endef
+
+define Build/Prepare
+	echo "all: " > $(PKG_BUILD_DIR)/Makefile
+endef
+
+define Package/nodewatcher/install
+	$(CP) ./files/* $(1)/
+	chmod +x $(1)/usr/sbin/nodewatcher
+	chmod +x $(1)/usr/sbin/configurator
+	mkdir -p $(1)/lib/cron
+	echo "# netmon" >> $(1)/lib/cron/${PKG_NAME}
+	echo "*/5 * * * * /usr/sbin/nodewatcher; /usr/sbin/configurator" >> $(1)/lib/cron/${PKG_NAME}
+	mkdir -p $(1)/www/public
+	ln -s ../../tmp/node.data $(1)/www/public/node.data
+endef
+
+$(eval $(call BuildPackage,nodewatcher))
diff --git a/packages/nodewatcher/files/etc/config/configurator b/packages/nodewatcher/files/etc/config/configurator
new file mode 100644
index 0000000..83a2879
--- /dev/null
+++ b/packages/nodewatcher/files/etc/config/configurator
@@ -0,0 +1,24 @@
+config 'script'
+	option 'error_level' '0'
+	option 'logfile' '/var/log/configurator.log'
+	option 'version' '1'
+	option 'sync_hostname' '1'
+
+config 'api'
+	option 'ipv4_address' '1'
+	option 'ipv6_interface' 'br-mesh'
+	option 'ipv6_address' 'fd00:fff:2003::ff:feee:1'
+	option 'timeout' '5'
+	option 'retry' '5'
+	option 'api_key' '1'
+
+config 'crawl'
+	option 'method' 'hash'
+	option 'nickname' '1'
+	option 'password' '1'
+	option 'login_string' '1'
+	option 'router_id' '1'
+	option 'update_hash' '1'
+
+config 'netmon'
+	option 'autoadd_ipv6_address' '1'
diff --git a/packages/nodewatcher/files/etc/config/nodewatcher b/packages/nodewatcher/files/etc/config/nodewatcher
new file mode 100644
index 0000000..dfbaa11
--- /dev/null
+++ b/packages/nodewatcher/files/etc/config/nodewatcher
@@ -0,0 +1,6 @@
+config 'script'
+        option 'version' '25'
+	option 'error_level' '0'
+	option 'logfile' '/var/log/nodewatcher.log'
+	option 'data_file' '/tmp/node.data'
+
diff --git a/packages/nodewatcher/files/usr/sbin/configurator b/packages/nodewatcher/files/usr/sbin/configurator
new file mode 100644
index 0000000..850bcf8
--- /dev/null
+++ b/packages/nodewatcher/files/usr/sbin/configurator
@@ -0,0 +1,172 @@
+#!/bin/sh
+# Netmon Configurator (C) 2010-2012 Freifunk Oldenburg
+# Lizenz: GPL v3
+
+#Get the configuration from the uci configuration file
+#If it does not exists, then get it from a normal bash file with variables.
+if [ -f /etc/config/configurator ];then
+	API_IPV4_ADRESS=`uci get configurator. at api[0].ipv4_address`
+	API_IPV6_ADRESS=`uci get configurator. at api[0].ipv6_address`
+	API_IPV6_INTERFACE=`uci get configurator. at api[0].ipv6_interface`
+	API_TIMEOUT=`uci get configurator. at api[0].timeout`
+	API_RETRY=`uci get configurator. at api[0].retry`
+	SCRIPT_VERSION=`uci get configurator. at script[0].version`
+	SCRIPT_ERROR_LEVEL=`uci get configurator. at script[0].error_level`
+	SCRIPT_LOGFILE=`uci get configurator. at script[0].logfile`
+	SCRIPT_SYNC_HOSTNAME=`uci get configurator. at script[0].sync_hostname`
+	CRAWL_METHOD=`uci get configurator. at crawl[0].method`
+	CRAWL_ROUTER_ID=`uci get configurator. at crawl[0].router_id`
+	CRAWL_UPDATE_HASH=`uci get configurator. at crawl[0].update_hash`
+	CRAWL_NICKNAME=`uci get configurator. at crawl[0].nickname`
+	CRAWL_PASSWORD=`uci get configurator. at crawl[0].password`
+	AUTOADD_IPV6_ADDRESS=`uci get configurator. at netmon[0].autoadd_ipv6_address`
+else
+	. `dirname $0`/configurator_config
+fi
+
+API_RETRY=$(($API_RETRY - 1))
+
+if [ "$API_IPV4_ADRESS" != "1" ]; then
+	netmon_api=$API_IPV4_ADRESS
+else
+	netmon_api="[$API_IPV6_ADRESS"%"$API_IPV6_INTERFACE]"
+fi
+
+if [ "$SCRIPT_ERROR_LEVEL" -gt "1" ]; then
+	err() {
+		echo "$(date) [configurator]: $1" >> $SCRIPT_LOGFILE
+	}
+else
+	err() {
+		:
+	}
+fi
+
+sync_hostname() {
+	err "Syncing hostname"
+	api_return=$(wget -T $API_TIMEOUT -q -O - "http://$netmon_api/api_csv_configurator.php?section=get_hostname&authentificationmethod=$CRAWL_METHOD&nickname=$CRAWL_NICKNAME&password=$CRAWL_PASSWORD&router_auto_update_hash=$CRAWL_UPDATE_HASH&router_id=$CRAWL_ROUTER_ID")
+	ret=${api_return%%,*}
+	if [ "$ret" != "success" ]; then
+		err "Ther was an error fetching the hostname"
+		exit 0
+	elif [ "$ret" = "success" ]; then
+		netmon_hostname=${api_return%,*}
+		netmon_hostname=${netmon_hostname#*,}
+
+		#check for valid hostname as specified in rfc 1123
+		#see http://stackoverflow.com/a/3824105
+		regex='^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])'
+		regex=$regex'(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$'
+		if [ "${#netmon_hostname}" -le "255" ]; then
+			if echo -n $netmon_hostname | egrep -q "$regex"; then
+				if [ "$netmon_hostname" != "`cat /proc/sys/kernel/hostname`" ]; then
+					err "Setting new hostname: $netmon_hostname"
+					uci set system. at system[0].hostname=$netmon_hostname
+					uci commit
+					echo $netmon_hostname > /proc/sys/kernel/hostname
+				else
+					err "Hostname is up to date"
+				fi
+			else
+				err "Hostname ist malformed"
+				exit 0
+			fi
+		else
+			err "Hostname exceeds the maximum length of 255 characters"
+			exit 0
+		fi
+	fi
+}
+
+assign_router() {
+	hostname=`cat /proc/sys/kernel/hostname`
+
+	#Choose right login String
+	#Here maybe a ; to much at the end..??
+	login_strings=$(awk '{ mac=toupper($1); gsub(":", "", mac); printf mac ";" }' /sys/class/net/br-mesh/address /sys/class/net/eth0/address /sys/class/net/ath0/address 2> /dev/null)
+	ergebnis=$(wget -T $API_TIMEOUT -q -O - "http://$netmon_api/api_csv_configurator.php?section=test_login_strings&login_strings=$login_strings")
+	router_auto_assign_login_string=${ergebnis#*;}
+	ergebnis=${ergebnis%;*}
+	if [ "$ergebnis" = "error" ]; then
+		router_auto_assign_login_string=${login_strings%%;*}
+		err "A router with this login string does not exist: $login_strings"
+		err "Using $router_auto_assign_login_string as login string"
+	fi
+
+	#Try to assign Router with choosen login string
+	ergebnis=$(wget -T $API_TIMEOUT -q -O - "http://$netmon_api/api_csv_configurator.php?section=router_auto_assign&router_auto_assign_login_string=$router_auto_assign_login_string&hostname=$hostname")
+	ret=${ergebnis%%;*}
+	errstr=${ergebnis#*;}
+	errstr=${errstr%%;*}
+	if [ "$ret" != "success" ]; then
+		err "The router has not been assigned to a router in Netmon"
+		err "Failure on router_auto_assign: $errstr. Exiting"
+		exit 0
+	elif [ "$ret" = "success" ]; then
+		update_hash=${ergebnis%;*;*}
+		update_hash=${update_hash##*;}
+		api_key=${ergebnis##*;}
+		#write new config
+		uci set configurator. at crawl[0].router_id=$errstr
+		uci set configurator. at crawl[0].update_hash=$update_hash
+		uci set configurator. at api[0].api_key=$api_key
+		#set also new router id for nodewatcher
+		#uci set nodewatcher. at crawl[0].router_id=$errstr
+
+		err "The router $errstr has been assigned with a router in Netmon"
+		uci commit
+
+		CRAWL_METHOD=`uci get configurator. at crawl[0].method`
+		CRAWL_ROUTER_ID=$errstr
+		CRAWL_UPDATE_HASH=$update_hash
+		CRAWL_NICKNAME=`uci get configurator. at crawl[0].nickname`
+		CRAWL_PASSWORD=`uci get configurator. at crawl[0].password`
+	fi
+}
+
+autoadd_ipv6_address() {
+	err "Doing IPv6 autoadd"
+	ipv6_link_local_addr=$(ip addr show dev br-mesh scope link | awk '/inet6/{print $2}')
+	ipv6_link_local_netmask=${ipv6_link_local_addr##*/}
+	ipv6_link_local_addr=${ipv6_link_local_addr%%/*}
+	ergebnis=$(wget -T $API_TIMEOUT -q -O - "http://$netmon_api/api_csv_configurator.php?section=autoadd_ipv6_address&authentificationmethod=$CRAWL_METHOD&nickname=$CRAWL_NICKNAME&password=$CRAWL_PASSWORD&router_auto_update_hash=$CRAWL_UPDATE_HASH&router_id=$CRAWL_ROUTER_ID&networkinterface_name=br-mesh&ip=$ipv6_link_local_addr&netmask=$ipv6_link_local_netmask&ipv=6")
+	ret=${ergebnis%%,*}
+	if [ "$ret" = "success" ]; then
+		uci set configurator. at netmon[0].autoadd_ipv6_address='0'
+		uci commit
+		err "The IPv6 address of the router $CRAWL_ROUTER_ID has been added to the router in Netmon"
+		err "IPv6 Autoadd has been disabled cause it is no longer necesarry"
+	else
+		routerid=${ergebnis##*,}
+		if [ "$routerid" = "$CRAWL_ROUTER_ID" ]; then
+			err "The IPv6 address already exists in Netmon on this router. Maybe because of a previos assignment"
+			uci set configurator. at netmon[0].autoadd_ipv6_address='0'
+			uci commit
+			err "IPv6 Autoadd has been disabled cause it is no longer necesarry"
+		else
+			err "The IPv6 address already exists in Netmon on another router $routerid"
+		fi
+	fi
+}
+
+if [ "$CRAWL_METHOD" = "login" ]; then
+	err "Authentification method is: username and passwort"
+elif [ "$CRAWL_METHOD" = "hash" ]; then
+	err "Authentification method: autoassign and hash"
+	err "Checking if the router is already assigned to a router in Netmon"
+	if [ "$CRAWL_UPDATE_HASH" = "1" ]; then
+		err "The router is not assigned to a router in Netmon"
+		err "Trying to assign the router"
+		assign_router
+	else
+		err "The router is already assigned to a router in Netmon"
+	fi
+fi
+
+if [ "$AUTOADD_IPV6_ADDRESS" = "1" ]; then
+	autoadd_ipv6_address
+fi
+
+if [ "$SCRIPT_SYNC_HOSTNAME" = "1" ]; then
+	sync_hostname
+fi
diff --git a/packages/nodewatcher/files/usr/sbin/nodewatcher b/packages/nodewatcher/files/usr/sbin/nodewatcher
new file mode 100755
index 0000000..6406518
--- /dev/null
+++ b/packages/nodewatcher/files/usr/sbin/nodewatcher
@@ -0,0 +1,210 @@
+#!/bin/sh
+# Netmon Nodewatcher (C) 2010-2012 Freifunk Oldenburg
+# License; GPL v3
+
+SCRIPT_VERSION="30"
+
+#Get the configuration from the uci configuration file
+#If it does not exists, then get it from a normal bash file with variables.
+if [ -f /etc/config/nodewatcher ];then
+	SCRIPT_ERROR_LEVEL=`uci get nodewatcher. at script[0].error_level`
+	SCRIPT_LOGFILE=`uci get nodewatcher. at script[0].logfile`
+	SCRIPT_DATA_FILE=`uci get nodewatcher. at script[0].data_file`
+	CLIENT_INTERFACES=`uci get nodewatcher. at network[0].client_interfaces`
+else
+	. `dirname $0`/nodewatcher_config
+fi
+
+if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
+    err() {
+        echo $1 >> $SCRIPT_LOGFILE
+    }
+else
+    err() {
+        :
+    }
+fi
+
+#this method checks id the logfile has bekome too big and deletes the first X lines
+delete_log() {
+	if [ -f $SCRIPT_LOGFILE ]; then
+		if [ `ls -la $SCRIPT_LOGFILE | awk '{ print $5 }'` -gt "6000" ]; then
+			sed -i '1,60d' $SCRIPT_LOGFILE
+            err "`date`: Logfile has been made smaller"
+		fi
+	fi
+}
+
+#this method generates the crawl data xml file that is beeing fetched by netmon
+#and provided by a small local httpd
+crawl() {
+	#Get system data from other locations
+    err "`date`: Collecting basic system status data"
+    hostname="$(cat /proc/sys/kernel/hostname)"
+	uptime=$(awk '{ printf "<uptime>"$1"</uptime><idletime>"$2"</idletime>" }' /proc/uptime)
+
+    memory=$(awk '
+        /^MemTotal/ { printf "<memory_total>"$2"</memory_total>" }
+        /^Cached:/ { printf "<memory_caching>"$2"</memory_caching>" }
+        /^Buffers/ { printf "<memory_buffering>"$2"</memory_buffering>" }
+        /^MemFree/ { printf "<memory_free>"$2"</memory_free>" }
+    ' /proc/meminfo)
+	cpu=$(awk -F': ' '
+        /model/ { printf "<cpu>"$2"</cpu>" }
+        /system type/ { printf "<chipset>"$2"</chipset>" }
+    ' /proc/cpuinfo)
+	local_time="`date +%s`"
+	load=$(awk '{ printf "<loadavg>"$3"</loadavg><processes>"$4"</processes>" }' /proc/loadavg)
+
+    err "`date`: Collecting version information"
+
+    batman_adv_version=$(cat /sys/module/batman_adv/version)
+	kernel_version=$(uname -r)
+	fastd_version=$(fastd -v | awk '{ print $2 }')
+	nodewatcher_version=$SCRIPT_VERSION
+
+    # example for /etc/openwrt_release:
+    #DISTRIB_ID="OpenWrt"
+    #DISTRIB_RELEASE="Attitude Adjustment"
+    #DISTRIB_REVISION="r35298"
+    #DISTRIB_CODENAME="attitude_adjustment"
+    #DISTRIB_TARGET="atheros/generic"
+    #DISTRIB_DESCRIPTION="OpenWrt Attitude Adjustment 12.09-rc1"
+	. /etc/openwrt_release
+    distname=$DISTRIB_ID
+    distversion=$DISTRIB_RELEASE
+
+    # example for /etc/firmware_release:
+    #FIRMWARE_VERSION="95f36685e7b6cbf423f02cf5c7f1e785fd4ccdae-dirty"
+    #RELEASE_DATE="build date: Di 29. Jan 19:33:34 CET 2013"
+    #FIRMWARE_REVISION="build date: Di 29. Jan 19:33:34 CET 2013"
+    #OPENWRT_CORE_REVISION="35298"
+    #OPENWRT_FEEDS_PACKAGES_REVISION="35298"
+	#. /etc/firmware_release
+	SYSTEM_DATA="<status>online</status><hostname>$hostname</hostname><distname>$distname</distname><distversion>$distversion</distversion>$cpu$memory$load$uptime<local_time>$local_time</local_time><batman_advanced_version>$batman_adv_version</batman_advanced_version><kernel_version>$kernel_version</kernel_version><fastd_version>$fastd_version</fastd_version><nodewatcher_version>$nodewatcher_version</nodewatcher_version><firmware_version>$FIRMWARE_VERSION</firmware_version><firmware_revision>$FIRMWARE_REVISION</firmware_revision><openwrt_core_revision>$OPENWRT_CORE_REVISION</openwrt_core_revision><openwrt_feeds_packages_revision>$OPENWRT_FEEDS_PACKAGES_REVISION</openwrt_feeds_packages_revision>"
+
+    err "`date`: Collecting information from network interfaces"
+
+	#Get interfaces
+	#IFACES=`cat /proc/net/dev | awk -F: '!/\|/ { gsub(/[[:space:]]*/, "", $1); split($2, a, " "); printf("%s=%s=%s ", $1, a[1], a[9]) }'`
+
+	interface_data=""
+	#Loop interfaces
+	#for entry in $IFACES; do
+    for filename in `grep 'up\|unknown' /sys/class/net/*/operstate`; do
+        ifpath=${filename%/operstate*}
+        iface=${ifpath#/sys/class/net/}
+		if [ "$iface" = "lo" ]; then
+            continue
+        fi
+
+        #Get interface data
+        addrs="$(ip addr show dev ${iface} | awk '
+            /ether/ { printf "<mac_addr>"$2"</mac_addr>" }
+            /inet / { split($2, a, "/"); printf "<ipv4_addr>"a[1]"</ipv4_addr>" }
+            /inet6/ && /scope global/ { printf "<ipv6_addr>"$2"</ipv6_addr>" }
+            /inet6/ && /scope link/ { printf "<ipv6_link_local_addr>"$2"</ipv6_link_local_addr>"}
+            /mtu/ { printf "<mtu>"$5"</mtu>" }
+        ')"
+        #mac_addr="`cat $ifpath/address`"
+        #ipv4_addr="`ip addr show dev ${iface} | awk '/inet / { split($2, a, "/"); print a[1] }'`"
+        #ipv6_addr="`ip addr show dev ${iface} scope global | awk '/inet6/ { print $2 }'`"
+        #ipv6_link_local_addr="`ip addr show dev ${iface} scope link | awk '/inet6/ { print $2 }'`"
+        #mtu=`cat $ifpath/mtu`
+        traffic_rx=`cat $ifpath/statistics/rx_bytes`
+        traffic_tx=`cat $ifpath/statistics/tx_bytes`
+
+        #interface_data=$interface_data"<$iface><name>$iface</name><mac_addr>$mac_addr</mac_addr><ipv4_addr>$ipv4_addr</ipv4_addr><ipv6_addr>$ipv6_addr</ipv6_addr><ipv6_link_local_addr>$ipv6_link_local_addr</ipv6_link_local_addr><traffic_rx>$traffic_rx</traffic_rx><traffic_tx>$traffic_tx</traffic_tx><mtu>$mtu</mtu>"
+        interface_data=$interface_data"<$iface><name>$iface</name>$addrs<traffic_rx>$traffic_rx</traffic_rx><traffic_tx>$traffic_tx</traffic_tx>"
+
+
+        interface_data=$interface_data$(iwconfig ${iface} 2>/dev/null | awk -F':' '
+            /Mode/{ split($2, m, " "); printf "<wlan_mode>"m[1]"</wlan_mode>" }
+            /Cell/{ split($0, c, " "); printf "<wlan_bssid>"c[5]"</wlan_bssid>" }
+            /ESSID/ { split($0, e, "\""); printf "<wlan_essid>"e[2]"</wlan_essid>" }
+            /Freq/{ split($3, f, " "); printf "<wlan_frequency>"f[1]f[2]"</wlan_frequency>" }
+            /Tx-Power/{ split($0, p, "="); sub(/[[:space:]]*$/, "", p[2]); printf "<wlan_tx_power>"p[2]"</wlan_tx_power>" }
+        ')"</$iface>"
+
+        #if [ "`iwconfig ${iface} 2>/dev/null | grep IEEE`" != "" ]; then
+        #    wlan_mode="`iwconfig $iface | awk -F':' '/Mode/{ split($2, m, " "); print m[1] }'`"
+        #
+        #    if [ $wlan_mode = "Master" ]; then
+        #        wlan_bssid="`iw $iface info | awk '/addr/{ print $2 }'`"
+        #    elif [ $wlan_mode = "Ad-Hoc" ]; then
+        #        wlan_bssid="`iwconfig $iface | awk '/Cell/{ print $5 }'`"
+        #    fi
+        #
+        #    wlan_essid="`iwconfig ${iface} | awk -F'"' '/ESSID/ { print $2 }'`"
+        #    wlan_frequency="`iwconfig $iface | awk -F':' '/Freq/{ split($3, f, " "); print f[1] }'`"
+        #    wlan_tx_power="`iwconfig $iface | awk -F'=' '/Tx-Power/{ print $2 }'`"
+        #
+        #    interface_data=$interface_data"<wlan_mode>$wlan_mode</wlan_mode><wlan_frequency>$wlan_frequency</wlan_frequency><wlan_essid>$wlan_essid</wlan_essid><wlan_bssid>$wlan_bssid</wlan_bssid><wlan_tx_power>$wlan_tx_power</wlan_tx_power>"
+        #fi
+        #interface_data=$interface_data"</$iface>"
+	done
+
+    err "`date`: Collecting information from batman advanced and it´s interfaces"
+	#B.A.T.M.A.N. advanced
+    if [ -f /sys/module/batman_adv/version ]; then
+        for iface in $(grep active /sys/class/net/*/batman_adv/iface_status); do
+            status=${iface#*:}
+            iface=${iface%/batman_adv/iface_status:active}
+            iface=${iface#/sys/class/net/}
+            BATMAN_ADV_INTERFACES=$BATMAN_ADV_INTERFACES"<$iface><name>$iface</name><status>$status</status></$iface>"
+        done
+
+        batman_adv_originators=$(awk \
+            'BEGIN { FS=" "; i=0 }
+            /O/ { next }
+            /B/ { next }
+            {   sub("\\(", "", $0)
+                sub("\\)", "", $0)
+                sub("\\[", "", $0)
+                sub("\\]:", "", $0)
+                sub("  ", " ", $0)
+                printf "<originator_"i"><originator>"$1"</originator><link_quality>"$3"</link_quality><nexthop>"$4"</nexthop><last_seen>"$2"</last_seen><outgoing_interface>"$5"</outgoing_interface></originator_"i">"
+                i++
+            }' /sys/kernel/debug/batman_adv/bat0/originators)
+
+		batman_adv_gateway_mode=$(batctl gw)
+
+		batman_adv_gateway_list=$(awk \
+			'BEGIN { FS=" "; i=0 }
+			/Gateway/ { next }
+			/No gateways/ { next }
+			{	sub("=>", "true", $0)
+				sub("  ", "false", $0)
+				sub("\\(", "", $0)
+				sub("\\)", "", $0)
+				sub("\\[", "", $0)
+				sub("\\]:", "", $0)
+				sub("  ", " ", $0)
+				printf "<gateway_"i"><selected>"$1"</selected><gateway>"$2"</gateway><link_quality>"$3"</link_quality><nexthop>"$4"</nexthop><outgoing_interface>"$5"</outgoing_interface><gw_class>"$6" "$7" "$8"</gw_class></gateway_"i">"
+				i++
+			}' /sys/kernel/debug/batman_adv/bat0/gateways)
+    fi
+    err "`date`: Collecting information about conected clients"
+	#CLIENTS
+
+    client_count=$(batctl tl | tail -n+3 | grep -v -e "^[ ]*\*" | wc -l)
+
+    err "`date`: Putting all information into a XML-File and save it at "$SCRIPT_DATA_FILE
+
+	DATA="<?xml version='1.0' standalone='yes'?><data><system_data>$SYSTEM_DATA</system_data><interface_data>$interface_data</interface_data><batman_adv_interfaces>$BATMAN_ADV_INTERFACES</batman_adv_interfaces><batman_adv_originators>$batman_adv_originators</batman_adv_originators><batman_adv_gateway_mode>$batman_adv_gateway_mode</batman_adv_gateway_mode><batman_adv_gateway_list>$batman_adv_gateway_list</batman_adv_gateway_list><client_count>$client_count</client_count></data>"
+
+	#write data to hxml file that provides the data on httpd
+	echo $DATA | gzip > $SCRIPT_DATA_FILE
+}
+
+LANG=C
+
+#Prüft ob das logfile zu groß geworden ist
+err "`date`: Check logfile"
+delete_log
+
+#Erzeugt die statusdaten
+err "`date`: Generate actual status data"
+crawl
+
+exit 0
-- 
2.4.5




Mehr Informationen über die Mailingliste franken-dev