X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fsys%2Fluasrc%2Fsys.lua;h=18622da77c24b359516e60b65da27597c92c3d1f;hp=f6f95625d6a6c61a7465be69b5932c83df4d7f47;hb=a52a6a4f22861bbb1b7676b91b1f873e09bdbdfd;hpb=df8601c86415bd048b00ce992b2bf2a81e9c4b38 diff --git a/libs/sys/luasrc/sys.lua b/libs/sys/luasrc/sys.lua index f6f95625d..18622da77 100644 --- a/libs/sys/luasrc/sys.lua +++ b/libs/sys/luasrc/sys.lua @@ -230,11 +230,39 @@ net = {} -- The following fields are defined for arp entry objects: -- { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" } function net.arptable(callback) - return _parse_delimited_table(io.lines("/proc/net/arp"), "%s%s+", callback) + local arp, e, r, v + if fs.access("/proc/net/arp") then + for e in io.lines("/proc/net/arp") do + local r = { }, v + for v in e:gmatch("%S+") do + r[#r+1] = v + end + + if r[1] ~= "IP" then + local x = { + ["IP address"] = r[1], + ["HW type"] = r[2], + ["Flags"] = r[3], + ["HW address"] = r[4], + ["Mask"] = r[5], + ["Device"] = r[6] + } + + if callback then + callback(x) + else + arp = arp or { } + arp[#arp+1] = x + end + end + end + end + return arp end local function _nethints(what, callback) local _, k, e, mac, ip, name + local cur = uci.cursor() local ifn = { } local hosts = { } @@ -276,6 +304,13 @@ local function _nethints(what, callback) end end + cur:foreach("dhcp", "host", + function(s) + for mac in luci.util.imatch(s.mac) do + _add(what, mac:upper(), s.ip, nil, s.name) + end + end) + for _, e in ipairs(nixio.getifaddrs()) do if e.name ~= "lo" then ifn[e.name] = ifn[e.name] or { } @@ -307,17 +342,17 @@ end function net.mac_hints(callback) if callback then _nethints(1, function(mac, v4, v6, name) - name = name or nixio.getnameinfo(v4 or v6) or v4 + name = name or nixio.getnameinfo(v4 or v6, nil, 100) or v4 if name and name ~= mac then - callback(mac, name or nixio.getnameinfo(v4 or v6) or v4) + callback(mac, name or nixio.getnameinfo(v4 or v6, nil, 100) or v4) end end) else local rv = { } _nethints(1, function(mac, v4, v6, name) - name = name or nixio.getnameinfo(v4 or v6) or v4 + name = name or nixio.getnameinfo(v4 or v6, nil, 100) or v4 if name and name ~= mac then - rv[#rv+1] = { mac, name or nixio.getnameinfo(v4 or v6) or v4 } + rv[#rv+1] = { mac, name or nixio.getnameinfo(v4 or v6, nil, 100) or v4 } end end) return rv @@ -331,7 +366,7 @@ end function net.ipv4_hints(callback) if callback then _nethints(2, function(mac, v4, v6, name) - name = name or nixio.getnameinfo(v4) or mac + name = name or nixio.getnameinfo(v4, nil, 100) or mac if name and name ~= v4 then callback(v4, name) end @@ -339,7 +374,7 @@ function net.ipv4_hints(callback) else local rv = { } _nethints(2, function(mac, v4, v6, name) - name = name or nixio.getnameinfo(v4) or mac + name = name or nixio.getnameinfo(v4, nil, 100) or mac if name and name ~= v4 then rv[#rv+1] = { v4, name } end @@ -355,7 +390,7 @@ end function net.ipv6_hints(callback) if callback then _nethints(3, function(mac, v4, v6, name) - name = name or nixio.getnameinfo(v6) or mac + name = name or nixio.getnameinfo(v6, nil, 100) or mac if name and name ~= v6 then callback(v6, name) end @@ -363,7 +398,7 @@ function net.ipv6_hints(callback) else local rv = { } _nethints(3, function(mac, v4, v6, name) - name = name or nixio.getnameinfo(v6) or mac + name = name or nixio.getnameinfo(v6, nil, 100) or mac if name and name ~= v6 then rv[#rv+1] = { v6, name } end @@ -660,38 +695,29 @@ end function process.list() local data = {} local k - local ps = luci.util.execi("top -bn1") + local ps = luci.util.execi("/bin/busybox top -bn1") if not ps then return end - while true do - local line = ps() - if not line then - return - end - - k = luci.util.split(luci.util.trim(line), "%s+", nil, true) - if k[6] == "%VSZ" then - k[6] = "%MEM" - end - if k[1] == "PID" then - break - end - end - for line in ps do - local row = {} - - line = luci.util.trim(line) - for i, value in ipairs(luci.util.split(line, "%s+", #k-1, true)) do - row[k[i]] = value - end + local pid, ppid, user, stat, vsz, mem, cpu, cmd = line:match( + "^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][W ][/dev/null") - local iwc = {} - - for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n\n")) do - local k = l:match("^(.-) ") - l = l:gsub("^(.-) +", "", 1) - if k then - local entry, flags = _parse_mixed_record(l) - if entry then - entry.flags = flags - end - iwc[k] = entry - end - end - - return iwc -end - ---- Get iwlist scan output from all wireless devices. --- @return Table of tables contaiing all scan results -function wifi.iwscan(iface) - local siface = iface or "" - local cnt = luci.util.exec("iwlist "..siface.." scan 2>/dev/null") - local iws = {} - - for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n\n")) do - local k = l:match("^(.-) ") - l = l:gsub("^[^\n]+", "", 1) - l = luci.util.trim(l) - if k then - iws[k] = {} - for j, c in pairs(luci.util.split(l, "\n Cell")) do - c = c:gsub("^(.-)- ", "", 1) - c = luci.util.split(c, "\n", 7) - c = table.concat(c, "\n", 1) - local entry, flags = _parse_mixed_record(c) - if entry then - entry.flags = flags - end - table.insert(iws[k], entry) - end - end - end - - return iface and (iws[iface] or {}) or iws -end - ---- Get available channels from given wireless iface. --- @param iface Wireless interface (optional) --- @return Table of available channels -function wifi.channels(iface) - local stat, iwinfo = pcall(require, "iwinfo") - local cns - - if stat then - local t = iwinfo.type(iface or "") - if iface and t and iwinfo[t] then - cns = iwinfo[t].freqlist(iface) - end - end - - if not cns or #cns == 0 then - cns = { - {channel = 1, mhz = 2412}, - {channel = 2, mhz = 2417}, - {channel = 3, mhz = 2422}, - {channel = 4, mhz = 2427}, - {channel = 5, mhz = 2432}, - {channel = 6, mhz = 2437}, - {channel = 7, mhz = 2442}, - {channel = 8, mhz = 2447}, - {channel = 9, mhz = 2452}, - {channel = 10, mhz = 2457}, - {channel = 11, mhz = 2462} - } - end - - return cns -end - --- LuCI system utilities / init related functions. -- @class module @@ -990,39 +934,6 @@ end -- Internal functions -function _parse_delimited_table(iter, delimiter, callback) - delimiter = delimiter or "%s+" - - local data = {} - local trim = luci.util.trim - local split = luci.util.split - - local keys = split(trim(iter()), delimiter, nil, true) - for i, j in pairs(keys) do - keys[i] = trim(keys[i]) - end - - for line in iter do - local row = {} - line = trim(line) - if #line > 0 then - for i, j in pairs(split(line, delimiter, nil, true)) do - if keys[i] then - row[keys[i]] = j - end - end - end - - if callback then - callback(row) - else - data[#data+1] = row - end - end - - return data -end - function _parse_mixed_record(cnt, delimiter) delimiter = delimiter or " " local data = {}