diff --git a/bsp/default/root_file_system/etc/nodewatcher.sh b/bsp/default/root_file_system/etc/nodewatcher.sh
index 9c3e4f7..2c5bdb0 100755
--- a/bsp/default/root_file_system/etc/nodewatcher.sh
+++ b/bsp/default/root_file_system/etc/nodewatcher.sh
@@ -2,10 +2,11 @@
# 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_VERSION=`uci get nodewatcher.@script[0].version`
SCRIPT_ERROR_LEVEL=`uci get nodewatcher.@script[0].error_level`
SCRIPT_LOGFILE=`uci get nodewatcher.@script[0].logfile`
SCRIPT_DATA_FILE=`uci get nodewatcher.@script[0].data_file`
@@ -15,14 +16,22 @@ 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
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Logfile has been made smaller" >> $SCRIPT_LOGFILE
- fi
+ err "`date`: Logfile has been made smaller"
fi
fi
}
@@ -30,195 +39,146 @@ delete_log() {
#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 UCI
- if which uci >/dev/null; then
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: UCI is installed, trying to collect extra data from UCI" >> $SCRIPT_LOGFILE
- fi
- location="`uci get freifunk.contact.location`"
- latitude="`uci get system.@system[0].latitude`"
- longitude="`uci get system.@system[0].longitude`"
-
- community_essid="`uci get freifunk.community.ssid`"
- community_nickname="`uci get freifunk.contact.nickname`"
- community_email="`uci get freifunk.contact.mail`"
- community_prefix="`uci get freifunk.community.prefix`"
- description="`uci get freifunk.contact.note`"
- fi
-
- #Get system data from LUA
- if which lua >/dev/null; then
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: LUA is installed, trying to collect extra data from LUA" >> $SCRIPT_LOGFILE
- fi
- luciname=`lua -l luci.version -e 'print(luci.version.luciname)'`
- lucversion=`lua -l luci.version -e 'print(luci.version.luciversion)'`
- fi
-
#Get system data from other locations
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Collecting basic system status data" >> $SCRIPT_LOGFILE
- fi
- hostname="`cat /proc/sys/kernel/hostname`"
- uptime=`cat /proc/uptime | awk '{ print $1 }'`
- idletime=`cat /proc/uptime | awk '{ print $2 }'`
+ err "`date`: Collecting basic system status data"
+ hostname="$(cat /proc/sys/kernel/hostname)"
+ uptime=$(awk '{ printf ""$1""$2"" }' /proc/uptime)
- memory_total=`cat /proc/meminfo | grep 'MemTotal' | awk '{ print $2 }'`
- memory_caching=`cat /proc/meminfo | grep -m 1 'Cached:' | awk '{ print $2 }'`
- memory_buffering=`cat /proc/meminfo | grep 'Buffers' | awk '{ print $2 }'`
- memory_free=`cat /proc/meminfo | grep 'MemFree' | awk '{ print $2 }'`
- cpu=`grep -m 1 "cpu model" /proc/cpuinfo | cut -d ":" -f 2`
- if [ -n $cpu ]; then
- cpu=`grep -m 1 "model name" /proc/cpuinfo | cut -d ":" -f 2`
- fi
-
- chipset=`grep -m 1 "system type" /proc/cpuinfo | cut -d ":" -f 2`
+ memory=$(awk '
+ /^MemTotal/ { printf ""$2"" }
+ /^Cached:/ { printf ""$2"" }
+ /^Buffers/ { printf ""$2"" }
+ /^MemFree/ { printf ""$2"" }
+ ' /proc/meminfo)
+ cpu=$(awk -F': ' '
+ /model/ { printf ""$2"" }
+ /system type/ { printf ""$2"" }
+ ' /proc/cpuinfo)
local_time="`date +%s`"
- processes=`cat /proc/loadavg | awk '{ print $4 }'`
- loadavg=`cat /proc/loadavg | awk '{ print $1 }'`
+ load=$(awk '{ printf ""$3""$4"" }' /proc/loadavg)
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Collecting version information" >> $SCRIPT_LOGFILE
- fi
- if which batctl >/dev/null; then
- batctl_adv_version=`batctl -v | awk '{ print $2 }'`
- batman_adv_version=`batctl o -n|head -n1|awk '{ print $3 }'|sed 's/,//'`
- fi
- kernel_version=`uname -r`
+ err "`date`: Collecting version information"
+
+ batman_adv_version=$(cat /sys/module/batman_adv/version)
+ kernel_version=$(uname -r)
nodewatcher_version=$SCRIPT_VERSION
- openwrt_version_file="/etc/openwrt_release"
- if [ -f $openwrt_version_file ]; then
- . $openwrt_version_file
+ # 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
- distname=$DISTRIB_ID
- distversion=$DISTRIB_RELEASE
- fi
+ # 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="online$hostname$distname$distversion$cpu$memory$load$uptime$local_time$batman_adv_version$kernel_version$nodewatcher_version$FIRMWARE_VERSION$FIRMWARE_REVISION$OPENWRT_CORE_REVISION$OPENWRT_FEEDS_PACKAGES_REVISION"
- firmware_version_file="/etc/firmware_release"
- if [ -f $firmware_version_file ]; then
- . $firmware_version_file
- fi
+ err "`date`: Collecting information from network interfaces"
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Collecting information from network interfaces" >> $SCRIPT_LOGFILE
- fi
#Get interfaces
- IFACES=`cat /proc/net/dev | awk -F: '!/\|/ { gsub(/[[:space:]]*/, "", $1); split($2, a, " "); printf("%s=%s=%s ", $1, a[1], a[9]) }'`
+ #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
- iface=`echo $entry | cut -d '=' -f 1`
- rcv=`echo $entry | cut -d '=' -f 2`
- xmt=`echo $entry | cut -d '=' -f 3`
+ #for entry in $IFACES; do
+ for filename in `grep up /sys/class/net/*/operstate`; do
+ ifpath=${filename%/operstate*}
+ iface=${ifpath#/sys/class/net/}
+ if [ "$iface" = "lo" ]; then
+ continue
+ fi
- wlan_mode=""
- wlan_bssid=""
- wlan_essid=""
- wlan_frequency=""
- wlan_tx_power=""
-
- if [ "$iface" != "lo" ]; then
- if [ "`ifconfig ${iface} | grep UP`" != "" ]; then
- #Get interface data
- name="${iface}"
- mac_addr="`ifconfig ${iface} | grep 'HWaddr' | awk '{ print $5}'`"
- ipv4_addr="`ifconfig ${iface} | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`"
- ipv6_addr="`ifconfig ${iface} | grep 'inet6 addr:' | grep 'Scope:Global' | awk '{ print $3}'`"
- ipv6_link_local_addr="`ifconfig ${iface} | grep 'inet6 addr:' | grep 'Scope:Link' | awk '{ print $3}'`"
- mtu="`ifconfig ${iface} | grep 'MTU' | cut -d: -f2 | awk '{ print $1}'`"
- traffic_rx="$rcv"
- traffic_tx="$xmt"
-
- interface_data=$interface_data"<$name>$name$mac_addr$ipv4_addr$ipv6_addr$ipv6_link_local_addr$traffic_rx$traffic_tx$mtu"
-
- if [ "`iwconfig ${iface} 2>/dev/null | grep Frequency | awk '{ print $2 }' | cut -d ':' -f 2`" != "" ]; then
- wlan_mode="`iwconfig ${iface} 2>/dev/null | grep 'Mode' | awk '{ print $1 }' | cut -d ':' -f 2`"
-
- if [ $wlan_mode = "Master" ]; then
- wlan_bssid="`iwconfig ${iface} 2>/dev/null | grep 'Access Point' | awk '{ print $6 }'`"
- elif [ $wlan_mode = "Ad-Hoc" ]; then
- wlan_bssid="`iwconfig ${iface} 2>/dev/null | grep Cell | awk '{ print $5 }'`"
- fi
-
- wlan_essid="`iwconfig ${iface} 2>/dev/null | grep ESSID | awk '{ split($4, a, \"\\"\"); printf(\"%s\", a[2]); }'`"
- wlan_frequency="`iwconfig ${iface} 2>/dev/null | grep Frequency | awk '{ print $2 }' | cut -d ':' -f 2`"
- wlan_tx_power="`iwconfig ${iface} 2>/dev/null | grep 'Tx-Power' | awk '{ print $4 }' | cut -d ':' -f 2`"
- interface_data=$interface_data"$wlan_mode$wlan_frequency$wlan_essid$wlan_bssid$wlan_tx_power"
- fi
- interface_data=$interface_data"$name>"
- fi
- fi
+ #Get interface data
+ addrs="$(ip addr show dev ${iface} | awk '
+ /ether/ { printf ""$2"" }
+ /inet / { split($2, a, "/"); printf ""a[1]"" }
+ /inet6/ && /scope global/ { printf ""$2"" }
+ /inet6/ && /scope link/ { printf ""$2""}
+ /mtu/ { printf ""$5"" }
+ ')"
+ #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>$iface$mac_addr$ipv4_addr$ipv6_addr$ipv6_link_local_addr$traffic_rx$traffic_tx$mtu"
+ interface_data=$interface_data"<$iface>$iface$addrs$traffic_rx$traffic_tx"
+
+
+ interface_data=$interface_data$(iwconfig ${iface} 2>/dev/null | awk -F':' '
+ /Mode/{ split($2, m, " "); printf ""m[1]"" }
+ /Cell/{ split($0, c, " "); printf ""c[5]"" }
+ /ESSID/ { split($0, e, "\""); printf ""e[2]"" }
+ /Freq/{ split($3, f, " "); printf ""f[1]f[2]"" }
+ /Tx-Power/{ split($0, p, "="); sub(/[[:space:]]*$/, "", p[2]); printf ""p[2]"" }
+ ')"$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_frequency$wlan_essid$wlan_bssid$wlan_tx_power"
+ #fi
+ #interface_data=$interface_data"$iface>"
done
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Collecting information from batman advanced and it´s interfaces" >> $SCRIPT_LOGFILE
- fi
+ err "`date`: Collecting information from batman advanced and it´s interfaces"
#B.A.T.M.A.N. advanced
- if which batctl >/dev/null; then
- batman_check_running=`batctl if | grep 'Error'`
- if [ "$batman_check_running" == "" ]; then
- has_active_interface="0"
- BAT_ADV_IFACES=`batctl if | awk '{ print $1 }' | cut -d ':' -f 1`
- for device_name in $BAT_ADV_IFACES; do
- if [ "`batctl if | grep $device_name | grep active`" != "" ]; then
- status='active'
- has_active_interface="1"
- else
- status='inactive'
- fi
+ 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>$iface$status$iface>"
+ done
- BATMAN_ADV_INTERFACES=$BATMAN_ADV_INTERFACES"<$device_name>$device_name$status$device_name>"
- done
-
- if [ $has_active_interface = "1" ]; then
- BAT_ADV_ORIGINATORS=`batctl o -n | grep 'No batman nodes in range'`
- if [ "$BAT_ADV_ORIGINATORS" == "" ]; then
- OLDIFS=$IFS
- IFS="
-"
- BAT_ADV_ORIGINATORS=`batctl o -n | awk '/O/ {next} /B/ {next} {print}'`
- count=0;
- for row in $BAT_ADV_ORIGINATORS; do
- row="${row//[\(\)]/}"
- originator=`echo $row | awk '{print $1}'`
- last_seen=`echo $row | awk '{print $2}'`
- last_seen="${last_seen//s/}"
- link_quality=`echo $row | awk '{print $3}'`
- outgoing_interface=`echo $row | cut -d] -f1 | cut -d[ -f2`
- outgoing_interface="${outgoing_interface// /}"
- nexthop=`echo $row | awk '{print $4}'`
+ batman_adv_originators=$(awk \
+ 'BEGIN { FS=" "; i=0 }
+ /O/ { next }
+ /B/ { next }
+ { sub("\\(", "", $0)
+ sub("\\)", "", $0)
+ sub("\\[", "", $0)
+ sub("\\]:", "", $0)
+ sub(" ", " ", $0)
+ printf ""$1""$3""$4""$2""$5""
+ i++
+ }' /sys/kernel/debug/batman_adv/bat0/originators)
+ fi
- batman_adv_originators=$batman_adv_originators"$originator$link_quality$nexthop$last_seen$outgoing_interface"
- count=`expr $count + 1`
- done
- IFS=$OLDIFS
- fi
- fi
- fi
- fi
-
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Collecting information about conected clients" >> $SCRIPT_LOGFILE
- fi
+ err "`date`: Collecting information about conected clients"
#CLIENTS
- SEDDEV=`brctl showstp $MESH_INTERFACE | egrep '\([0-9]\)' | sed -e "s/(//;s/)//" | awk '{ print "s/^ "$2"/"$1"/;" }'`
+ SEDDEV=$(brctl showstp $MESH_INTERFACE | awk '/\([0-9]\)/ {
+ sub("\\(", "", $0)
+ sub("\\)", "", $0)
+ print "s/^ "$2"/"$1"/;"
+ }')
- for entry in $CLIENT_INTERFACES; do
- CLIENT_MACS=$CLIENT_MACS`brctl showmacs $MESH_INTERFACE | sed -e "$SEDDEV" | awk '{if ($3 != "yes" && $1 == "'"$entry"'") print $2}'`" "
- done
+ client_count=$(brctl showmacs $MESH_INTERFACE | sed -e "$SEDDEV" | egrep -c "(${CLIENT_INTERFACES// /|}).*no")
- i=0
- for client in $CLIENT_MACS; do
- i=`expr $i + 1` #Zähler um eins erhöhen
- done
- client_count=$i
-
- if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Putting all information into a XML-File and save it at "$SCRIPT_DATA_FILE >> $SCRIPT_LOGFILE
- fi
- SYSTEM_DATA="online$hostname$description$location$latitude$longitude$luciname$luciversion$distname$distversion$chipset$cpu$memory_total$memory_caching$memory_buffering$memory_free$loadavg$processes$uptime$idletime$local_time$community_essid$community_nickname$community_email$community_prefix$batman_adv_version$kernel_version$nodewatcher_version$FIRMWARE_VERSION$FIRMWARE_REVISION$OPENWRT_CORE_REVISION$OPENWRT_FEEDS_PACKAGES_REVISION"
+ err "`date`: Putting all information into a XML-File and save it at "$SCRIPT_DATA_FILE
DATA="$SYSTEM_DATA$interface_data$BATMAN_ADV_INTERFACES$batman_adv_originators$client_count"
@@ -229,15 +189,11 @@ crawl() {
LANG=C
#Prüft ob das logfile zu groß geworden ist
-if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Check logfile" >> $SCRIPT_LOGFILE
-fi
+err "`date`: Check logfile"
delete_log
#Erzeugt die statusdaten
-if [ $SCRIPT_ERROR_LEVEL -gt "1" ]; then
- echo "`date`: Generate actual status data" >> $SCRIPT_LOGFILE
-fi
+err "`date`: Generate actual status data"
crawl
exit 0