diff --git a/files/usr/lib/lua/aredn/olsr.lua b/files/usr/lib/lua/aredn/olsr.lua index f507cae3..90fcc8e3 100755 --- a/files/usr/lib/lua/aredn/olsr.lua +++ b/files/usr/lib/lua/aredn/olsr.lua @@ -33,9 +33,12 @@ version. --]] + +require("nixio") require("aredn.http") require("aredn.utils") -local ai=require("aredn.info") +require("aredn.info") + ------------------------------------- -- Public API is attached to table ------------------------------------- @@ -124,8 +127,8 @@ function model.getCurrentNeighbors(RFinfo) if info[mainip]['linkType'] == "RF" and RFinfo then require("iwinfo") - local radio = ai.getMeshRadioDevice() - local bandwidth = tonumber(ai.getChannelBW(radio)) + local radio = aredn.info.getMeshRadioDevice() + local bandwidth = tonumber(aredn.info.getChannelBW(radio)) local RFinterface=get_ifname('wifi') local arptable=capture("/bin/cat /proc/net/arp |grep "..RFinterface) local lines=arptable:splitNewLine() @@ -159,4 +162,32 @@ function model.getCurrentNeighbors(RFinfo) return info end +function model.getHostAsLines(attempts) + if not attempts then + attempts = 1 + end + for _ = 1, attempts + do + local f = io.open("/var/run/hosts_olsr") + if f then + return f:lines() + end + nixio.nanosleep(1, 0) + end + return string.gmatch("", ".") +end + +function model.getServicesAsLines() + local f = io.open("/var/run/services_olsr") + if f then + return f:lines() + end + return string.gmatch("", ".") +end + +if not aredn then + aredn = {} +end +aredn.olsr = model; + return model diff --git a/files/www/cgi-bin/mesh b/files/www/cgi-bin/mesh index 5631057c..67a22e06 100755 --- a/files/www/cgi-bin/mesh +++ b/files/www/cgi-bin/mesh @@ -41,8 +41,8 @@ require("aredn.http") require("aredn.utils") require("aredn.html") require("uci") -aredn.info = require("aredn.info") -aredn.olsr = require("aredn.olsr") +require("aredn.info") +require("aredn.olsr") require("iwinfo") require('luci.jsonc') @@ -237,60 +237,58 @@ do end -- load the olsr hosts file -if nixio.fs.stat("/var/run/hosts_olsr.stable") then - for line in io.lines("/var/run/hosts_olsr.stable") - do - local ip, name, originator = line:match("^([%d%.]+)%s+(%S+)%s+%S+%s+(%S+)") - if ip and originator and originator ~= "myself" and (routes[ip] or routes[originator]) then - local etx = routes[ip] - if not etx then - etx = routes[originator] +for line in aredn.olsr.getHostAsLines(2) +do + local ip, name, originator = line:match("^([%d%.]+)%s+(%S+)%s+%S+%s+(%S+)") + if ip and originator and originator ~= "myself" and (routes[ip] or routes[originator]) then + local etx = routes[ip] + if not etx then + etx = routes[originator] + end + etx = etx.etx + if not name:match("%.") or name:match("^mid%.[^%.]*$") then + name = name .. ".local.mesh" + end + if ip == originator then + if not hosts[originator] then + hosts[originator] = { hosts = {} } end - etx = etx.etx - if not name:match("%.") or name:match("^mid%.[^%.]*$") then - name = name .. ".local.mesh" - end - if ip == originator then - if not hosts[originator] then - hosts[originator] = { hosts = {} } - end - local host = hosts[originator] - if host.name then - host.tactical = name - else - host.name = name - host.etx = etx - end - elseif name:match("^dtdlink%.") then - dtd[originator] = true - if links[ip] then - links[ip].dtd = true - end - elseif name:match("^xlink%d+%.") then - if not xlinkcount[originator] then - xlinkcount[originator] = 1 - else - xlinkcount[originator] = xlinkcount[originator] + 1 - end - if links[ip] then - links[ip].xlink = true - end - elseif name:match("^mid%d+%.") then - if not midcount[originator] then - midcount[originator] = 1 - else - midcount[originator] = midcount[originator] + 1 - end - if links[ip] then - links[ip].tun = true - end + local host = hosts[originator] + if host.name then + host.tactical = name else - if not hosts[originator] then - hosts[originator] = { hosts = {} } - end - local host = hosts[originator] - host.hosts[#host.hosts + 1] = name + host.name = name + host.etx = etx end + elseif name:match("^dtdlink%.") then + dtd[originator] = true + if links[ip] then + links[ip].dtd = true + end + elseif name:match("^xlink%d+%.") then + if not xlinkcount[originator] then + xlinkcount[originator] = 1 + else + xlinkcount[originator] = xlinkcount[originator] + 1 + end + if links[ip] then + links[ip].xlink = true + end + elseif name:match("^mid%d+%.") then + if not midcount[originator] then + midcount[originator] = 1 + else + midcount[originator] = midcount[originator] + 1 + end + if links[ip] then + links[ip].tun = true + end + else + if not hosts[originator] then + hosts[originator] = { hosts = {} } + end + local host = hosts[originator] + host.hosts[#host.hosts + 1] = name end end end @@ -298,28 +296,26 @@ end -- discard routes = nil -if nixio.fs.stat("/var/run/services_olsr") then - for line in io.lines("/var/run/services_olsr") - do - if line:match("^%w") then - local url, name = line:match("^(.*)|.*|(.*)$") - if name then - local protocol, host, port, path = url:match("^([%w][%w%+%-%.]+)%://(.+):(%d+)/(.*)") - if path then - local name, originator = name:match("(.*%S)%s*#(.*)") - if originator == " my own service" or (hosts[originator] and hosts[originator].name) then - if not host:match("%.local%.mesh$") then - host = host .. ".local.mesh" - end - if not services[host] then - services[host] = {} - end - if not services[host][name] then - if port ~= "0" then - services[host][name] = "" .. name .. "" - else - services[host][name] = name - end +for line in aredn.olsr.getServicesAsLines() +do + if line:match("^%w") then + local url, name = line:match("^(.*)|.*|(.*)$") + if name then + local protocol, host, port, path = url:match("^([%w][%w%+%-%.]+)%://(.+):(%d+)/(.*)") + if path then + local name, originator = name:match("(.*%S)%s*#(.*)") + if originator == " my own service" or (hosts[originator] and hosts[originator].name) then + if not host:match("%.local%.mesh$") then + host = host .. ".local.mesh" + end + if not services[host] then + services[host] = {} + end + if not services[host][name] then + if port ~= "0" then + services[host][name] = "" .. name .. "" + else + services[host][name] = name end end end @@ -329,8 +325,9 @@ if nixio.fs.stat("/var/run/services_olsr") then end -- load the node history -if nixio.fs.stat("/tmp/node.history") then - for line in io.lines("/tmp/node.history") +local f = io.open("/tmp/node.history") +if f then + for line in f:lines("/tmp/node.history") do local ip, age, host = line:match("^(%S+) (%d+) (%S+)") if ip and age and host then