Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • ffnw-firmware/packages
  • pic/packages
  • PowerPan/packages
  • floh1111/packages
4 results
Show changes
Showing with 41 additions and 852 deletions
STRIP=strip
CFLAGS = -Wall -O2 -g0 -DNDEBUG -DENV_LINUX -D_REENTRANT -I$(STAGING_DIR)/usr/include/
LDFLAGS = -L$(STAGING_DIR)/usr/lib -lwlocate -lm
PNAME=lwtrace
OBJ = trace.o
SRC = trace.c
all: $(OBJ)
$(CC) $(CFLAGS) -o $(PNAME) $(OBJ) $(LDFLAGS)
$(STRIP) $(PNAME)
clean:
rm -f *.o
rm -f $(PNAME)
/**
* test for libwlocate - WLAN-based location service
* Copyright (C) 2010-2015 Oxygenic/VWP virtual_worlds(at)gmx.de
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "libwlocate.h"
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <stdio.h>
#include <stddef.h>
#ifdef ENV_LINUX
#include <unistd.h>
#endif
#ifdef ENV_WINDOWS
#include <windows.h>
#endif
char notEqual(struct wloc_req *data1,struct wloc_req *data2,int num)
{
int i,j;
for (i=0; i<num; i++)
{
for (j=0; j<6; j++)
{
if (data1->bssids[i][j]!=data2->bssids[i][j]) return 1;
}
}
return 0;
}
int main(int argc,char *argv[])
{
int ret,i,cnt=0,prevCnt=0;
double lat,lon;
char quality;
short ccode;
FILE *FHandle;
struct wloc_req request,prevRequest;
unsigned char empty_bssid[6]={0,0,0,0,0,0};
unsigned char empty_signal=0;
#ifdef ENV_WINDOWS
WSADATA wsaData;
WSAStartup((MAKEWORD(1, 1)), &wsaData);
#endif
if ((argc>1) && (strncmp(argv[1],"-h",2)==0)) // test WLAN geolocation instead of writing the WLAN data into a trace file
{
printf("lwtrace\n\tscan available WLAN networks, and write them into a file libwlocate.trace for later geolocation\n");
printf("lwtrace -t\n\ttest geolocation functionality and evaluate the current position out of available WLAN data immediately\n");
}
else if ((argc>1) && (strncmp(argv[1],"-t",2)==0)) // test WLAN geolocation instead of writing the WLAN data into a trace file
{
ret=wloc_get_location_from("openwifi.su",&lat,&lon,&quality,&ccode); // call the library function to get the position...
//...check the return value afterwards...
if (ret==WLOC_CONNECTION_ERROR) printf("Error: could not communicate with server!\n");
else if (ret==WLOC_LOCATION_ERROR) printf("Error: could not calculate your location, the given WLAN networks are unknown!\n");
//...and print the position only in case the call was successful
else if (ret==WLOC_OK)
{
printf("Your location: %f (lat) %f (lon)\nQuality: %d %%\n",lat,lon,quality);
}
else printf("Error: failed due to an unknown error %d!\n",ret);
}
else
{
FHandle=fopen("libwlocate.trace","ab");
if (FHandle)
{
memset(&prevRequest,0,sizeof(struct wloc_req));
while (true)
{
if (cnt>0)
{
if ((cnt==prevCnt) && (!notEqual(&request,&prevRequest,cnt)))
{
for (i=0; i<cnt; i++)
{
fwrite(&request.bssids[i],1,sizeof(request.bssids[i]),FHandle);
fwrite(&empty_signal,1,1,FHandle);
}
for (i=cnt; i<WLOC_MAX_NETWORKS; i++)
{
fwrite(&empty_bssid,1,sizeof(request.bssids[i]),FHandle);
fwrite(&empty_signal,1,1,FHandle);
}
fflush(FHandle);
prevCnt=cnt;
prevRequest=request;
}
}
#ifdef ENV_WINDOWS
Sleep(1000);
#else
sleep(1);
#endif
}
fclose(FHandle);
}
else printf("Error: could not open/append trace file libwlocate.trace!\n");
}
#ifdef ENV_WINDOWS
WSACleanup();
#endif
return 0;
}
include $(TOPDIR)/rules.mk
PKG_NAME:=ffnw-sensors
PKG_NAME:=ffnw-netdevice-watchdoog
PKG_VERSION:=1
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
include $(TOPDIR)/../package/gluon.mk
define Package/ffnw-sensors
SECTION:=sensors
define Package/ffnw-netdevice-watchdoog
SECTION:=network
CATEGORY:=Freifunk Nordwest
TITLE:=Provides sensor data for alfred
endef
define Package/ffnw-sensors/description
Provides sensor data for alfred
TITLE:=Reboot on unregister netdevice messages
endef
define Build/Prepare
......@@ -26,10 +22,12 @@ define Build/Configure
endef
define Build/Compile
$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
endef
define Package/ffnw-sensors/install
define Package/ffnw-netdevice-watchdoog/install
$(CP) ./files/* $(1)/
$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
endef
$(eval $(call BuildPackage,ffnw-sensors))
$(eval $(call BuildPackage,ffnw-netdevice-watchdoog))
*/2 * * * * /usr/sbin/netdevice-watchdog
#!/usr/bin/lua
local logread = io.popen("logread", 'r')
for line in logread:lines() do
if line:match("unregister_netdevice: waiting for .* to become free.") then
os.execute("echo c > /proc/sysrq-trigger")
end
end
include $(TOPDIR)/rules.mk
PKG_NAME:=ffnw-nodewatcher
PKG_VERSION:=30
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/ffnw-nodewatcher
SECTION:=daemon
CATEGORY:=Freifunk Nordwest
TITLE:=Provides status data for netmon
endef
define Package/ffnw-nodewatcher/description
Provides status data for netmon
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/ffnw-nodewatcher/install
$(CP) ./files/* $(1)/
endef
$(eval $(call BuildPackage,ffnw-nodewatcher))
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'
#!/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)
if [ $(uci get gluon-node-info.@location[0].share_location) = "1" ]
then
position="<position><lon>$(uci get gluon-node-info.@location[0].longitude)</lon><lat>$(uci get gluon-node-info.@location[0].latitude)</lat></position>"
fi
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
distname="gluon"
distversion="$(cat /lib/gluon/gluon-version)"
FIRMWARE_VERSION="$(cat /lib/gluon/release)"
SYSTEM_DATA="<status>online</status><hostname>$hostname</hostname>$position<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)
if (( $1 == $4 ))
{
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|wc -l) - 3))
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
*/5 * * * * sh /lib/ffnw/nodewatcher/nodewatcher.sh;
include $(TOPDIR)/rules.mk
PKG_NAME:=ffnw-nodewatcher2
PKG_VERSION:=1
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/ffnw-nodewatcher2
SECTION:=daemon
CATEGORY:=Freifunk Nordwest
DEPENDS:=+lua-dkjson
TITLE:=Provides status data for netmon
endef
define Package/ffnw-nodewatcher2/description
Provides various export-formats (json, xml, ...) the most important
informations about the router. Nodewatcher2 is meant to
be more expandable for other export-formats in the future
by internally seperating retrieving and outputting the router-data
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/ffnw-nodewatcher2/install
$(CP) ./files/* $(1)/
endef
$(eval $(call BuildPackage,ffnw-nodewatcher2))
config 'prefs' 'prefs'
option 'generate_xml' '1'
option 'generate_json' '1'
option 'enable_gzip' '1'
option 'destination_folder' '/tmp/nodedata'
option 'generate_nodewatcher_compat' '1'
#!/usr/bin/env lua
local json = require ("dkjson")
--require("uci")
local uci = require("uci").cursor()
data ={}
function file_exists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return true else return false end
end
local function isArray(t)
local i = 0
if type(t) ~= "table" then return false end
for _ in pairs(t) do
i = i + 1
if t[i] == nil then return false end
end
return true
end
function xmlEncode(tbl,name,layer)
local out=""
if layer==1 then out=out.."<?xml version='1.0' ?>\n" end
if isArray(tbl) then
for k,v in pairs(tbl) do
out=out..(xmlEncode(v,name,layer))
end
else
for i=1,layer do out=out..'\t' end
out=out.."<"..name..">"
if type(tbl)=="table" then
out=out..'\n'
for k,v in pairs(tbl) do
out=out..(xmlEncode(v,k,layer+1))
end
for i=1,layer do out=out..'\t' end
else
out=out..(tostring(tbl))
end
out=out.."</"..name..">\n"
end
return out
end
function writeToFile(string,filename)
local path=uci:get("nodewatcher2","prefs","destination_folder")
if path == nil then
return
end
os.execute('if [[ ! -d "'..path..'" ]] ; then mkdir -p "'..path..'" ; fi')
os.execute('if [[ ! -h /lib/gluon/status-page/www/nodedata ]] ; then ln -s '..path..' /lib/gluon/status-page/www/nodedata ; fi')
path=path.."/"..filename
local file = io.open(path, "w")
file:write(string)
file:close()
if uci:get("nodewatcher2","prefs","enable_gzip") == "1" then
os.execute("echo '"..string.."' |gzip > "..path..".gz")
end
end
function removeFile(filename)
local path=uci:get("nodewatcher2","prefs","destination_folder")
if path == nil then
return
end
path=path.."/"..filename
os.remove(path)
if uci:get("nodewatcher2","prefs","enable_gzip") == "1" then
os.remove(path..".gz")
end
end
function generateXml()
local path="nodedata.xml"
if uci:get("nodewatcher2","prefs","generate_xml") == "1" then
local string=xmlEncode(data,"data",1)
writeToFile(string,path)
else
removeFile(path)
end
end
function generateJson()
local path="nodedata.json"
if uci:get("nodewatcher2","prefs","generate_json") == "1" then
local string=json.encode (data, { indent = true })
writeToFile(string,path)
else
removeFile(path)
end
end
-- deprecated only for keeping netmon compat
function generateNodewatcherCompat()
local comTbl={};
local path="nodedataCompat.xml"
if uci:get("nodewatcher2","prefs","generate_nodewatcher_compat") == "1" then
comTbl.system_data={}
comTbl.system_data.status="online"
comTbl.client_count=data.clientcount
comTbl.system_data.hostname=data.hostname
comTbl.system_data.position=data.position
comTbl.system_data.distname="gluon"
comTbl.system_data.distversion=data.software.firmware
comTbl.system_data.cpu="-"
comTbl.system_data.chipset=data.model
comTbl.system_data.memory_free=data.memory.free
comTbl.system_data.memory_total=data.memory.total
comTbl.system_data.memory_caching=data.memory.cache
comTbl.system_data.memory_buffering=data.memory.buffer
comTbl.system_data.firmware_version=data.software.firmware
comTbl.system_data.fastd_version=data.software.vpn
comTbl.system_data.batman_advanced_version=data.software.mesh
comTbl.system_data.kernel_version=data.software.kernel
comTbl.system_data.uptime=data.times.up
comTbl.system_data.idletime=data.times.idle
comTbl.system_data.processes=data.processes.runnable.."/"..data.processes.total
comTbl.system_data.loadavg=data.processes.loadavg
if data.interfaces~=nil then
comTbl.interface_data={}
for k,v in pairs(data.interfaces) do
local i={}
i.name=v.name
i.mtu=v.mtu
i.mac_addr=v.mac
i.traffic_rx=v.traffic.rx
i.traffic_tx=v.traffic.tx
i.ipv4_addr=v.ipv4
if v.ipv6~=nil and next(v.ipv6)~=nil then
i.ipv6_addr={}
for k1,v1 in pairs(v.ipv6) do
if v1:sub(1,4) == "fe80" then
i.ipv6_link_local_addr=v1
else
table.insert(i.ipv6_addr,v1)
end
end
end
comTbl.interface_data[v.name]=i
end
end
if data.originators~=nil then
comTbl.batman_adv_originators={}
for k,v in ipairs(data.originators) do
local o={}
o.originator=v.mac
o.nexthop=v.nexthop
o.last_seen=v.lastseen
o.outgoing_interface=v.interface
comTbl.batman_adv_originators["originator_"..(k-1)]=o
end
end
if data.gateways~=nil then
comTbl.batman_adv_gateway_list={}
for k,v in ipairs(data.gateways) do
local g={}
g.selected=v.active
g.gateway=v.mac
g.link_quality=v.linkquality
g.outgoing_interface=v.interface
g.gw_class=v.class
g.nexthop="666"
comTbl.batman_adv_gateway_list["gateway_"..(k-1)]=g
end
end
local string=xmlEncode (comTbl, "data", 1)
writeToFile(string,path)
--recreate symlink to old location
local fp=uci:get("nodewatcher2","prefs","destination_folder").."/"..path
os.execute("if [ ! -h /lib/gluon/status-page/www/node.data ]; then ln -s "..fp.." /lib/gluon/status-page/www/node.data ; fi")
else
removeFile(path)
end
end
function linesToTable(lines)
if lines==nil then
return {}
end
local tab = {}
for line in lines:lines() do
table.insert (tab, line);
end
return tab
end
function readFile(filepath)
local file = io.open(filepath, "r");
return linesToTable(file)
end
function readOutput(command)
local file = io.popen(command)
return linesToTable(file)
end
function readFirstRow(tbl)
if next(tbl)~=nil then --and table.getn(tbl)>0 then
return tbl[1]
else
return nil
end
end
function fetchMemory()
local tmp=readOutput("cat /proc/meminfo | grep -E '^(MemFree|MemTotal|Cached|Buffers)'")
local memLookup={MemT="total",MemF="free",Buff="buffer",Cach="cache"}
data.memory={}
for k,v in pairs(tmp) do
local t={string.match(v,"(.*) (%d+) .*")}
--print(t[1])
key=memLookup[string.sub(v,1,4)]
if key~=nil then
data.memory[key]=tonumber(t[2])
end
end
end
function fetchTimes()
data.times={}
data.times.up,data.times.idle=string.match(readFile("/proc/uptime")[1],"(.+) (.+)")
for k,v in pairs(data.times) do
data.times[k]=math.floor(tonumber(v)*1000)
end
if next(data.times)==nil then data.times=nil end
end
function fetchPositions()
data.position={}
data.position.lon=readFirstRow(readOutput("uci get gluon-node-info.@location[0].longitude 2>/dev/null"))
data.position.lat=readFirstRow(readOutput("uci get gluon-node-info.@location[0].latitude 2>/dev/null"))
if next(data.position)==nil then data.position=nil end
end
function fetchSoftware()
data.software={}
data.software.firmware=readFile("/lib/gluon/release")[1]
data.software.kernel=readOutput("uname -r")[1]
data.software.mesh="B.A.T.M.A.N. "..(readFile("/sys/module/batman_adv/version")[1])
data.software.vpn=readFirstRow(readOutput("fastd -v"))
if readFirstRow(readOutput("uci get autoupdater.settings.enabled 2>/dev/null")) == "1" then
data.software.autoupdate=readFirstRow(readOutput("uci get autoupdater.settings.branch 2>/dev/null"))
else
data.software.autoupdate="none"
end
if next(data.software)==nil then data.software=nil end
end
function fetchOriginators()
data.originators={}
local tmp=readOutput("batctl o|sed -r 's/([0-9a-f:]+)[[:space:]]+([0-9.]+)s[[:space:]]+\\([[:space:]]*([0-9]{1,3})\\)[[:space:]]+([0-9a-f:]+)[[:space:]]+\\[[[:space:]]*(.+)\\]:.*/\\1 \\2 \\3 \\4 \\5/;tx;d;:x'")
for k,v in pairs(tmp) do
local o={}
local m={}
for v1 in string.gmatch(v,"[^ ]+") do
table.insert(m,v1)
end
o.mac=m[1]
o.nexthop=m[4]
o.linkquality=tonumber(m[3])
o.interface=m[5]
o.lastseen=math.floor(tonumber(m[2])*1000)
if o.mac==o.nexthop then --todo: filter vpn servers
table.insert(data.originators,o);
end
end
if next(data.originators)==nil then data.originators=nil end
end
function fetchInterfaces()
data.interfaces={}
for _,iface in pairs(readOutput("grep -E 'up|unknown' /sys/class/net/*/operstate")) do
i={}
ipath,i.name=string.match(iface,"(.+/(.-))/operstate.*")
if i.name~="lo" then
i.ipv6={}
i.traffic={}
i.traffic.rx=tonumber(readFirstRow(readFile(ipath.."/statistics/rx_bytes")))
i.traffic.tx=tonumber(readFirstRow(readFile(ipath.."/statistics/tx_bytes")))
-- general interface info
for _,ipl in pairs(readOutput("ip addr show "..i.name)) do
local match=ipl:match("%s*inet6 ([0-9a-f:]+)(/%d+) .*")
--ugly cascading if-else-if-... because of lua missing continue-command
if match~=nil then
table.insert(i.ipv6,match)
--i.mac=match
else
match=ipl:match("%s*link/ether (.-) .*")
if match ~=nil then
i.mac=match
else
match=ipl:match("%s*inet ([0-9.]+)(/%d+) .*")
if match~=nil then
i.ipv4=match
else
match=ipl:match(".* mtu (%d+) .*")
if match~=nil then
i.mtu=tonumber(match)
end
end
end
end
end
if next(i.ipv6)==nil then i.ipv6=nil end
-- wifi info
i.radio={}
for _,ipl in pairs(readOutput("iwinfo "..i.name.." info 2>/dev/null")) do
local match=ipl:match('ESSID:%s+"(.*)".*')
if match~=nil then
i.radio.essid=match
else
match=ipl:match('Access Point:%s+([A-Za-z0-9:]+).*')
if match~=nil then
i.radio.bssid=match:lower()
else
match={ipl:match('Tx%-Power: ([0-9]+) dBm Link Quality: ([a-z0-9]+/[0-9]+)')}
if next(match)~=nil then
i.radio.txpower=tonumber(match[1])
i.radio.linkquality=match[2]
end
end
end
end
if next(i.radio)==nil then i.radio=nil end
--batman?
if i.name~="bat0" then
local bat=readFirstRow(readFile("/sys/class/net/"..i.name.."/batman_adv/iface_status"))
i.meshstatus=(bat~=nil and bat~="not in use")
else
i.meshstatus=false
end
table.insert(data.interfaces,i)
end
end
if next(data.interfaces)==nil then data.interfaces=nil end
end
function fetchGateways()
data.gateways={}
for _,v in pairs(readOutput("batctl gwl|sed -r 's/^[[:space:]]+([a-f0-9:].*)/false \\1/ ; s/^=>(.*)/true \\1/ ; s/(true|false)[[:space:]]+([0-9a-f:]+)[[:space:]]+\\([[:space:]]*([0-9]+)\\)[[:space:]]+[a-f0-9:]+[[:space:]]+\\[[[:space:]]*(.+)\\]:[[:space:]]+([0-9.\\/]+).*$/\\1 \\2 \\3 \\4 \\5/;tx;d;:x'")) do
local g={}
local m={}
for v1 in string.gmatch(v,"[^ ]+") do
table.insert(m,v1)
end
g.active=(m[1] == "true")
g.mac=m[2]
g.linkquality=tonumber(m[3])
g.interface=m[4]
g.class=m[5]
table.insert(data.gateways,g)
end
if next(data.gateways)==nil then data.gateways=nil end
end
function fetchProcesses()
data.processes={}
local r=readFirstRow(readOutput("sed -r 's/[0-9.]+ [0-9.]+ ([0-9.]+) ([0-9]+)\\/([0-9]+) [0-9]+/\\1 \\2 \\3/' /proc/loadavg"))
if r~=nil then
local t={r:match("(.+) (.+) (.+)")}
for k,v in pairs(t) do t[k]=tonumber(v) end
data.processes.loadavg, data.processes.runnable, data.processes.total=t[1],t[2],t[3]
end
end
-- do the fetching
data.owner=readFirstRow(readOutput("uci get gluon-node-info.@owner[0].contact"))
data.hostname=readFirstRow(readFile("/proc/sys/kernel/hostname"))
data.clientcount=tonumber(readFirstRow(readOutput("batctl tl|wc -l")))-3
data.model=readFirstRow(readOutput("grep -E '^machine' /proc/cpuinfo|sed -r 's/machine[[:space:]]*:[[:space:]]*(.*)/\\1/'"))
fetchProcesses()
fetchTimes()
fetchMemory()
fetchPositions()
fetchSoftware()
fetchOriginators()
fetchInterfaces()
fetchGateways()
-- do the output
generateXml()
generateJson()
generateNodewatcherCompat()
*/5 * * * * sh /lib/ffnw/nodewatcher2/nodewatcher.lua;