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:
parent
71c498edd2
commit
2e0e24a992
@ -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
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
return require('gluon.util').node_id()
|
@ -11,7 +11,7 @@ define Package/gluon-mesh-batman-adv-core
|
|||||||
SECTION:=gluon
|
SECTION:=gluon
|
||||||
CATEGORY:=Gluon
|
CATEGORY:=Gluon
|
||||||
TITLE:=Support for batman-adv meshing (core)
|
TITLE:=Support for batman-adv meshing (core)
|
||||||
DEPENDS:=+gluon-core +firewall +kmod-ipt-nathelper
|
DEPENDS:=+gluon-core +firewall +kmod-ipt-nathelper +libiwinfo-lua
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
|
@ -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()
|
@ -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
|
Loading…
Reference in New Issue
Block a user