Skip to content
Snippets Groups Projects
Commit 9928aec7 authored by Bjoern Franke's avatar Bjoern Franke
Browse files

adds nodewatcher package

parent 68a55e57
No related branches found
No related tags found
No related merge requests found
#
# Copyright (C) 2006-2010 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=nodewatcher
PKG_VERSION:=2013-02-13
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=git://freifunk-ol.de/ffol/software/nodewatcher.git
PKG_SOURCE:=$(PKG_NAME).tar.gz
PKG_SOURCE_VERSION:=HEAD
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
PKG_NAME:=ffol-nodewatcher
PKG_VERSION:=30
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/nodewatcher
SECTION:=utilities
CATEGORY:=Utilities
TITLE:=Freifunk Oldenburg Nodewatcher
URL:=http://freifunk-ol.de
DEPENDS:=+libuci +ip +libiw
define Package/ffol-nodewatcher
SECTION:=daemon
CATEGORY:=Freifunk Oldenburg
TITLE:=Provides status data for netmon
endef
define Package/ffol-nodewatcher/description
Provides status data for netmon
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
endef
define Build/Configure
endef
define Build/InstallDev
$(INSTALL_DIR) $(1)/usr/bin
$(CP) $(PKG_BUILD_DIR)/nodewatcher $(1)/usr/bin/
define Build/Compile
endef
define Package/nodewatcher/install
$(INSTALL_DIR) $(1)/usr/bin
$(CP) $(PKG_BUILD_DIR)/nodewatcher $(1)/usr/bin/
define Package/ffol-nodewatcher/install
$(INSTALL_DIR) $(1)/lib/gluon/cron/
$(INSTALL_DATA) files/lib/gluon/cron/nodewatcher $(1)/lib/gluon/cron/nodewatcher
$(INSTALL_DIR) $(1)/lib/ffol/nodewatcher/
$(INSTALL_BIN) files/lib/ffol/nodewatcher/nodewatcher.sh $(1)/lib/ffol/nodewatcher/
$(INSTALL_DIR) $(1)/etc/config/
$(INSTALL_CONF) files/nodewatcher.config $(1)/etc/config/nodewatcher
endef
$(eval $(call BuildPackage,nodewatcher))
\ No newline at end of file
$(eval $(call BuildPackage,ffol-nodewatcher))
#!/bin/sh
# Netmon Nodewatcher (C) 2010-2014 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.@script[0].error_level`
SCRIPT_LOGFILE=`uci get nodewatcher.@script[0].logfile`
SCRIPT_DATA_FILE=`uci get nodewatcher.@script[0].data_file`
MESH_INTERFACE=`uci get nodewatcher.@network[0].mesh_interface`
CLIENT_INTERFACES=`uci get nodewatcher.@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"
FIRMWARE_VERSION="$(cat /lib/gluon/gluon-version)"
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
SEDDEV=$(brctl showstp $MESH_INTERFACE | awk '/\([0-9]\)/ {
sub("\\(", "", $0)
sub("\\)", "", $0)
print "s/^ "$2"/"$1"/;"
}')
client_count=$(brctl showmacs $MESH_INTERFACE | sed -e "$SEDDEV" | egrep -c "(${CLIENT_INTERFACES// /|}).*no")
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 > $SCRIPT_DATA_FILE
#symlink nodewatcher-data in gluon-statuspage-docroot
if [ -f /lib/gluon/status-page/www/node.data ]; then
ln -s $SCRIPT_DATA_FILE /lib/gluon/status-page/www/node.data
fi
}
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
*/5 * * * * sh /lib/ffol/nodewatcher/nodewatcher.sh;
config 'script'
option 'version' '30'
option 'error_level' '0'
option 'logfile' '/var/log/nodewatcher.log'
option 'data_file' '/tmp/node.data'
config 'network'
option 'mesh_interface' 'br-client'
option 'client_interfaces' 'eth0 wlan0'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment