announce neighbours using alfred/gluon-announce

This adds a new announce.d datum "neighbours" (alfred 160) containing
information about mesh neighbours. It's intended to be an replacement
for batadv-vis.

In addition to the data already provided by batadv-vis it'll also
provide information about direct wifi neighbours.

Unlike batadv-vis, no data about clients is transmitted.

Sample data:

    {
      "wifi": {
        "90:f6:52:82:06:02": {
          "neighbours": {
            "f8:d1:11:2c:a7:d2": {
              "noise": -95,
              "inactive": 0,
              "signal": 0
            },
            "96:f6:52:ff:cd:6f": {
              "noise": -95,
              "inactive": 0,
              "signal": -37
            }
          }
        }
      },
      "batadv": {
        "90:f6:52:82:06:02": {
          "neighbours": {
            "96:f6:52:ff:cd:6f": {
              "lastseen": 2.8500000000000001,
              "tq": 177
            }
          }
        },
        "90:f6:52:82:06:03": {
          "neighbours": {
            "f8:d1:11:2c:a7:d3": {
              "lastseen": 2.3500000000000001,
              "tq": 206
            }
          }
        }
      },
      "node_id": "90f652820602"
    }
This commit is contained in:
Nils Schneider 2014-09-11 15:14:20 +02:00
parent 71c498edd2
commit 2e0e24a992
5 changed files with 85 additions and 2 deletions

View File

@ -1 +1 @@
* * * * * /lib/gluon/announce/collect.lua nodeinfo | gzip | alfred -s 158; /lib/gluon/announce/collect.lua statistics | gzip | alfred -s 159
* * * * * /lib/gluon/announce/collect.lua nodeinfo | gzip | alfred -s 158; /lib/gluon/announce/collect.lua statistics | gzip | alfred -s 159; /lib/gluon/announce/collect.lua neighbours | gzip | alfred -s 160

View File

@ -0,0 +1 @@
return require('gluon.util').node_id()

View File

@ -11,7 +11,7 @@ define Package/gluon-mesh-batman-adv-core
SECTION:=gluon
CATEGORY:=Gluon
TITLE:=Support for batman-adv meshing (core)
DEPENDS:=+gluon-core +firewall +kmod-ipt-nathelper
DEPENDS:=+gluon-core +firewall +kmod-ipt-nathelper +libiwinfo-lua
endef
define Build/Prepare

View File

@ -0,0 +1,41 @@
local json = require 'luci.json'
local util = require 'luci.util'
local fs = require 'nixio.fs'
local ifname_address_cache = {}
function ifname2address(ifname)
local ifaddress
if ifname_address_cache[ifname] ~= nil then
ifaddress = ifname_address_cache[ifname]
else
ifaddress = util.trim(fs.readfile("/sys/class/net/" .. ifname .. "/address"))
ifname_address_cache[ifname] = ifaddress
end
return ifaddress
end
function batadv()
local interfaces = {}
local list = io.lines("/sys/kernel/debug/batman_adv/bat0/originators")
for line in list do
local mac1, lastseen, tq, mac2, ifname =
line:match("^([0-9a-f:]+) +(%d+%.%d+)s +%( *(%d+)%) +([0-9a-f:]+) +%[ *(.-)%]")
if mac1 ~= nil and mac1 == mac2 then
ifaddress = ifname2address(ifname)
if interfaces[ifaddress] == nil then
interfaces[ifaddress] = { neighbours = {} }
end
interfaces[ifaddress].neighbours[mac1] = { tq = tonumber(tq)
, lastseen = tonumber(lastseen)
}
end
end
return interfaces
end
return batadv()

View File

@ -0,0 +1,41 @@
local json = require 'luci.json'
local util = require 'luci.util'
local fs = require 'nixio.fs'
local iwinfo = require 'iwinfo'
function neighbours(iface)
local stations = {}
for k, v in pairs(iface.iw.assoclist(iface.ifname)) do
stations[k:lower()] = { signal = v.signal
, noise = v.noise
, inactive = v.inactive
}
end
return stations
end
function interfaces()
local interfaces = {}
for _, line in ipairs(util.split(util.exec('batctl if'))) do
ifname = line:match('^(.-): active')
if ifname ~= nil then
pcall(function()
local address = util.trim(fs.readfile('/sys/class/net/' .. ifname .. '/address'))
local wifitype = iwinfo.type(ifname)
if wifitype ~= nil then
interfaces[address] = { ifname = ifname, iw = iwinfo[wifitype] }
end
end)
end
end
return interfaces
end
local wifi = {}
for address, iface in pairs(interfaces()) do
wifi[address] = { neighbours = neighbours(iface) }
end
return wifi