forked from freifunk-franken/firmware
Add json report generator script "report.sh"
This commit is contained in:
parent
4e98822cd6
commit
a70fdddb57
|
@ -0,0 +1,228 @@
|
|||
#!/bin/ash
|
||||
|
||||
POSTPROC="$@"
|
||||
[ -n "$POSTPROC" ] || POSTPROC="cat -"
|
||||
|
||||
# functions
|
||||
# prefixes all lines with a comma but the first one
|
||||
comma() {
|
||||
awk '{ if (NR >1) print ","$0; else print $0; }'
|
||||
}
|
||||
|
||||
# counts clients via bridge
|
||||
# hardcoded interfaces br-mesh and wlan0 as they
|
||||
# are the same on all routers
|
||||
get_clients() {
|
||||
local COUNT=0
|
||||
local DEVNUMBER=
|
||||
DEVNUMBER=$(brctl showstp br-mesh |\
|
||||
grep -e "^wlan0 " |\
|
||||
cut -d" " -f2- | tr -d "()")
|
||||
if [ -n "$DEVNUMBER" ]; then
|
||||
COUNT=$(brctl showmacs br-mesh |\
|
||||
sed 's/[ \t]\+/ /g' |\
|
||||
grep -o -E "^ $DEVNUMBER [^ ]+ no" |\
|
||||
wc -l)
|
||||
fi
|
||||
echo $COUNT
|
||||
}
|
||||
|
||||
# generate a json report compatible with libremap 1.0
|
||||
report() {
|
||||
# json
|
||||
echo "{"
|
||||
|
||||
# use lowercase MAC addr from br-mesh interface as id
|
||||
local ID=$(ifconfig br-mesh |\
|
||||
grep -o -E "HWaddr[ ]+[0-9a-fA-F:]+" |\
|
||||
tr -s " " |\
|
||||
cut -d" " -f2 |\
|
||||
tr "ABCDEF" "abcdef")
|
||||
local HOSTNAME=$(cat /proc/sys/kernel/hostname)
|
||||
echo "\"_id\":\"${ID}\""
|
||||
echo ",\"api_rev\":1.0"
|
||||
echo ",\"type\":\"router\""
|
||||
echo ",\"hostname\":\"${HOSTNAME}\""
|
||||
|
||||
# location
|
||||
# latitude and longitude are required!
|
||||
echo ",\"location\":{"
|
||||
local LATITUDE=$(uci get site.location.latitude)
|
||||
local LOGITUDE=$(uci get site.location.longitude)
|
||||
local ELEVATION=$(uci get site.location.elevation 2>/dev/null)
|
||||
echo "\"lat\":${LATITUDE}"
|
||||
echo ",\"lon\":${LOGITUDE}"
|
||||
echo ",\"ele\":${ELEVATION}"
|
||||
echo "}"
|
||||
# /location
|
||||
|
||||
# aliases
|
||||
# each mac adresses identifies the router
|
||||
echo ",\"aliases\":["
|
||||
ip -o address show |\
|
||||
grep -o -E "link/ether [0-9a-fA-F:]+" |\
|
||||
tr -s " " |\
|
||||
cut -d" " -f2 |\
|
||||
sort -u |\
|
||||
tr "ABCDEF" "abcdef" |\
|
||||
awk '{print "{\"alias\":\""$0"\",\"type\":\"mac\"}"}' |\
|
||||
comma
|
||||
echo "]"
|
||||
# /aliases
|
||||
|
||||
# links
|
||||
echo ",\"links\":["
|
||||
batctl o |\
|
||||
grep -o -E "^([0-9a-f]{2}:?)+[ ]+[0-9.]+s[ ]+\([ 0-9]+\)[ ]+([0-9a-f]{2}:?)+[ ]+\[[^]]+\]" |\
|
||||
tr -d "s()[]" |\
|
||||
tr -s " " |\
|
||||
tr "ABCDEF" "abcdef" |\
|
||||
awk '{
|
||||
if ($1 == $4) {
|
||||
type="unk"
|
||||
if ($5 ~ /wlan/) type="wlan"
|
||||
if ($5 ~ /eth/) type="eth"
|
||||
if ($5 ~ /VPN/) type="vpn"
|
||||
if ($5 ~ /vpn/) type="vpn"
|
||||
quality=sprintf("%.2f",$3/255)
|
||||
print "{\"alias\":\""$1"\",\"type\":\"mac\",\"quality\":"quality",\"attributes\":{\"type\":\""type"\"}}"
|
||||
}
|
||||
}' |\
|
||||
comma
|
||||
echo "]"
|
||||
# /links
|
||||
|
||||
# attributes
|
||||
echo ",\"attributes\":{"
|
||||
|
||||
# contact
|
||||
echo "\"contact\":{"
|
||||
local CONTACT=$(uci get site.contact.name 2>/dev/null)
|
||||
local EMAIL=$(uci get site.contact.email 2>/dev/null)
|
||||
local TELEPHONE=$(uci get site.contact.telephone 2>/dev/null)
|
||||
echo "\"name\":\"${CONTACT}\""
|
||||
echo ",\"email\":\"${EMAIL}\""
|
||||
echo ",\"telephone\":\"${TELEPHONE}\""
|
||||
echo "}"
|
||||
# /contact
|
||||
|
||||
# site
|
||||
echo ",\"site\":{"
|
||||
local DIRECTION=$(uci get site.location.direction)
|
||||
local TAGS=$(uci get site.location.tags)
|
||||
echo "\"direction\":\"${DIRECTION}\""
|
||||
echo ",\"tags\":\"${TAGS}\""
|
||||
echo "}"
|
||||
# /site
|
||||
|
||||
# system
|
||||
echo ",\"system\":{"
|
||||
local HARDWARE=$(uci get board.model.name)
|
||||
local FIRMWARE=$(cat /etc/*release |\
|
||||
grep "^FIRMWARE_VERSION=" |\
|
||||
cut -d= -f2 |\
|
||||
tr -d "'\"")
|
||||
local DISTIBUTION=$(cat /etc/*release |\
|
||||
grep "^DISTRIB_DESCRIPTION=" |\
|
||||
cut -d= -f2 |\
|
||||
tr -d "'\"")
|
||||
local LINUX=$(uname -r)
|
||||
local FASTD=$(fastd -v | cut -d" " -f2)
|
||||
local MEMORY=$(cat /proc/meminfo |\
|
||||
grep -e "MemTotal:" |\
|
||||
awk -F" " '{print $2}')
|
||||
echo "\"hardware\":\"$HARDWARE\""
|
||||
echo ",\"firmware\":\"$FIRMWARE\""
|
||||
echo ",\"distribution\":\"$DISTIBUTION\""
|
||||
echo ",\"linux\":\"$LINUX\""
|
||||
echo ",\"fastd\":\"$FASTD\""
|
||||
echo ",\"memory\":$MEMORY"
|
||||
echo "}"
|
||||
# /system
|
||||
|
||||
|
||||
# load
|
||||
echo ",\"load\":{"
|
||||
local CPU_LOAD=$(cat /proc/loadavg | cut -d" " -f2)
|
||||
local MEMORY_FREE=$(cat /proc/meminfo |\
|
||||
grep -e "MemFree:" |\
|
||||
awk -F" " '{print $2}')
|
||||
local MEMORY_BUFFERS=$(cat /proc/meminfo |\
|
||||
grep -e "Buffers:" |\
|
||||
awk -F" " '{print $2}')
|
||||
local MEMORY_LOAD=$(echo $MEMORY $MEMORY_FREE $MEMORY_BUFFERS |\
|
||||
awk '{printf "%.2f",(($1-$2-$3)/$1)}')
|
||||
local TRAFFIC_MESH=
|
||||
local TRAFFIC_WAN=
|
||||
if [ -f '/var/statistics/traffic' ]; then
|
||||
TRAFFIC_MESH=$(cat /var/statistics/traffic |\
|
||||
grep -e "^bat0 " |\
|
||||
awk '{ printf "[%.2f,%.2f]",$4/1024,$2/1024}')
|
||||
TRAFFIC_WAN=$(cat /var/statistics/traffic |\
|
||||
grep -E "^[^ ]*(VPN|vpn)[^ ]* " |\
|
||||
head -n1 |\
|
||||
awk '{ printf "[%.2f,%.2f]",$4/1024,$2/1024}')
|
||||
fi
|
||||
[ -n "$TRAFFIC_MESH" ] || TRAFFIC_MESH=[0,0]
|
||||
[ -n "$TRAFFIC_WAN" ] || TRAFFIC_WAN=[0,0]
|
||||
local CLIENTS=$(get_clients)
|
||||
echo "\"cpu\":$CPU_LOAD"
|
||||
echo ",\"memory\":$MEMORY_LOAD"
|
||||
echo ",\"clients\":$CLIENTS"
|
||||
echo ",\"traffic\":{"
|
||||
echo "\"mesh\":"$TRAFFIC_MESH
|
||||
echo ",\"wan\":"$TRAFFIC_WAN
|
||||
echo "}"
|
||||
echo "}"
|
||||
# /load
|
||||
|
||||
# internet
|
||||
# get data from selected or (if unavailable) best connected gw
|
||||
echo ",\"internet\":{"
|
||||
batctl gwl |\
|
||||
awk -F" " 'BEGIN {
|
||||
gateway_sel=""
|
||||
via_sel=""
|
||||
quality_sel=0
|
||||
}
|
||||
/Gateway/ { next }
|
||||
/No gateways/ { next }
|
||||
{
|
||||
sub("^=>", "1", $0)
|
||||
sub("^ ", "0", $0)
|
||||
sub(" *\\( *", " ", $0)
|
||||
sub(" *\\) *", " ", $0)
|
||||
sub(" *\\[ *", " ", $0)
|
||||
sub(" *\\]: *", " ", $0)
|
||||
quality=sprintf("%.2f",$3/255)
|
||||
if ($1 == 1) {
|
||||
gateway_sel=$2
|
||||
via_sel=$4
|
||||
quality_sel=quality
|
||||
exit
|
||||
} else if (quality > quality_sel) {
|
||||
gateway_sel=$2
|
||||
via_sel=$4
|
||||
quality_sel=quality
|
||||
}
|
||||
}
|
||||
END {
|
||||
print "\"alias\":\""gateway_sel"\""
|
||||
print ",\"type\":\"mac\""
|
||||
print ",\"quality\":"quality_sel
|
||||
print ",\"via\":{"
|
||||
print "\"alias\":\""via_sel"\""
|
||||
print ",\"type\":\"mac\""
|
||||
print "}"
|
||||
}'
|
||||
echo "}"
|
||||
# /gateway
|
||||
|
||||
echo "}"
|
||||
# /attributes
|
||||
|
||||
echo "}"
|
||||
# /json
|
||||
}
|
||||
|
||||
report | $POSTPROC
|
Loading…
Reference in New Issue