X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fsys%2Fluasrc%2Fsys.lua;h=9c30f55f6cf167cf58e9eb9ccc9a012449b229e9;hp=c0ee4a1d1b93a97196fbec13f12caedea3bd8130;hb=f6ee6322f9aa1152deb6f85735b18f0f85532e1f;hpb=3b5123937e901ee70cf5b602d7efcf83d23dc0ee diff --git a/libs/sys/luasrc/sys.lua b/libs/sys/luasrc/sys.lua index c0ee4a1d1..9c30f55f6 100644 --- a/libs/sys/luasrc/sys.lua +++ b/libs/sys/luasrc/sys.lua @@ -30,15 +30,14 @@ local os = require "os" local table = require "table" local nixio = require "nixio" local fs = require "nixio.fs" -local iwinfo = require "iwinfo" local uci = require "luci.model.uci" local luci = {} luci.util = require "luci.util" luci.ip = require "luci.ip" -local tonumber, ipairs, pairs, pcall, type, next, setmetatable = - tonumber, ipairs, pairs, pcall, type, next, setmetatable +local tonumber, ipairs, pairs, pcall, type, next, setmetatable, require = + tonumber, ipairs, pairs, pcall, type, next, setmetatable, require --- LuCI Linux and POSIX system utilities. @@ -167,28 +166,31 @@ end -- @return String containing the memory used for caching in kB -- @return String containing the memory used for buffering in kB -- @return String containing the free memory amount in kB +-- @return String containing the cpu bogomips (number) function sysinfo() local cpuinfo = fs.readfile("/proc/cpuinfo") local meminfo = fs.readfile("/proc/meminfo") - local system = cpuinfo:match("system typ.-:%s*([^\n]+)") - local model = "" local memtotal = tonumber(meminfo:match("MemTotal:%s*(%d+)")) local memcached = tonumber(meminfo:match("\nCached:%s*(%d+)")) local memfree = tonumber(meminfo:match("MemFree:%s*(%d+)")) local membuffers = tonumber(meminfo:match("Buffers:%s*(%d+)")) + local bogomips = tonumber(cpuinfo:match("[Bb]ogo[Mm][Ii][Pp][Ss].-: ([^\n]+)")) or 0 - if not system then - system = nixio.uname().machine - model = cpuinfo:match("model name.-:%s*([^\n]+)") - if not model then - model = cpuinfo:match("Processor.-:%s*([^\n]+)") - end - else - model = cpuinfo:match("cpu model.-:%s*([^\n]+)") - end + local system = + cpuinfo:match("system type\t+: ([^\n]+)") or + cpuinfo:match("Processor\t+: ([^\n]+)") or + cpuinfo:match("model name\t+: ([^\n]+)") + + local model = + luci.util.pcdata(fs.readfile("/tmp/sysinfo/model")) or + cpuinfo:match("machine\t+: ([^\n]+)") or + cpuinfo:match("Hardware\t+: ([^\n]+)") or + luci.util.pcdata(fs.readfile("/proc/diag/model")) or + nixio.uname().machine or + system - return system, model, memtotal, memcached, membuffers, memfree + return system, model, memtotal, memcached, membuffers, memfree, bogomips end --- Retrieves the output of the "logread" command. @@ -239,32 +241,36 @@ function net.conntrack(callback) for line in io.lines("/proc/net/nf_conntrack") do line = line:match "^(.-( [^ =]+=).-)%2" local entry, flags = _parse_mixed_record(line, " +") - entry.layer3 = flags[1] - entry.layer4 = flags[3] - for i=1, #entry do - entry[i] = nil - end + if flags[6] ~= "TIME_WAIT" then + entry.layer3 = flags[1] + entry.layer4 = flags[3] + for i=1, #entry do + entry[i] = nil + end - if callback then - callback(entry) - else - connt[#connt+1] = entry + if callback then + callback(entry) + else + connt[#connt+1] = entry + end end end elseif fs.access("/proc/net/ip_conntrack", "r") then for line in io.lines("/proc/net/ip_conntrack") do line = line:match "^(.-( [^ =]+=).-)%2" local entry, flags = _parse_mixed_record(line, " +") - entry.layer3 = "ipv4" - entry.layer4 = flags[1] - for i=1, #entry do - entry[i] = nil - end + if flags[4] ~= "TIME_WAIT" then + entry.layer3 = "ipv4" + entry.layer4 = flags[1] + for i=1, #entry do + entry[i] = nil + end - if callback then - callback(entry) - else - connt[#connt+1] = entry + if callback then + callback(entry) + else + connt[#connt+1] = entry + end end end else @@ -301,11 +307,24 @@ function net.defaultroute6() local route net.routes6(function(rt) - if rt.dest:prefix() == 0 and (not route or route.metric > rt.metric) then + if rt.dest:prefix() == 0 and rt.device ~= "lo" and + (not route or route.metric > rt.metric) + then route = rt end end) + if not route then + local global_unicast = luci.ip.IPv6("2000::/3") + net.routes6(function(rt) + if rt.dest:equal(global_unicast) and + (not route or route.metric > rt.metric) + then + route = rt + end + end) + end + return route end @@ -508,6 +527,9 @@ function process.list() 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 @@ -603,16 +625,17 @@ end -- @return Number containing 0 on success and >= 1 on error function user.setpasswd(username, password) if password then - password = password:gsub("'", "") + password = password:gsub("'", [['"'"']]) end if username then - username = username:gsub("'", "") + username = username:gsub("'", [['"'"']]) end - local cmd = "(echo '"..password.."';sleep 1;echo '"..password.."')|" - cmd = cmd .. "passwd '"..username.."' >/dev/null 2>&1" - return os.execute(cmd) + return os.execute( + "(echo '" .. password .. "'; sleep 1; echo '" .. password .. "') | " .. + "passwd '" .. username .. "' >/dev/null 2>&1" + ) end @@ -625,6 +648,8 @@ wifi = {} -- @param ifname String containing the interface name -- @return A wrapped iwinfo object instance function wifi.getiwinfo(ifname) + local stat, iwinfo = pcall(require, "iwinfo") + if ifname then local c = 0 local u = uci.cursor_state() @@ -651,19 +676,17 @@ function wifi.getiwinfo(ifname) end) end - local t = iwinfo.type(ifname) - if t then - local x = iwinfo[t] - return setmetatable({}, { - __index = function(t, k) - if k == "ifname" then - return ifname - elseif x[k] then - return x[k](ifname) - end + local t = stat and iwinfo.type(ifname) + local x = t and iwinfo[t] or { } + return setmetatable({}, { + __index = function(t, k) + if k == "ifname" then + return ifname + elseif x[k] then + return x[k](ifname) end - }) - end + end + }) end end @@ -721,10 +744,14 @@ end -- @param iface Wireless interface (optional) -- @return Table of available channels function wifi.channels(iface) - local t = iwinfo.type(iface or "") + local stat, iwinfo = pcall(require, "iwinfo") local cns - if iface and t and iwinfo[t] then - cns = iwinfo[t].freqlist(iface) + + 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 @@ -768,7 +795,7 @@ end -- @return Boolean indicating whether init is enabled function init.enabled(name) if fs.access(init.dir..name) then - return ( call(init.dir..name.." enabled") == 0 ) + return ( call(init.dir..name.." enabled >/dev/null") == 0 ) end return false end @@ -778,7 +805,7 @@ end -- @return Numeric index value function init.index(name) if fs.access(init.dir..name) then - return call("source "..init.dir..name.." enabled; exit $START") + return call("source "..init.dir..name.." enabled >/dev/null; exit $START") end end @@ -787,7 +814,7 @@ end -- @return Boolean indicating success function init.enable(name) if fs.access(init.dir..name) then - return ( call(init.dir..name.." enable") == 1 ) + return ( call(init.dir..name.." enable >/dev/null") == 1 ) end end @@ -796,7 +823,7 @@ end -- @return Boolean indicating success function init.disable(name) if fs.access(init.dir..name) then - return ( call(init.dir..name.." disable") == 0 ) + return ( call(init.dir..name.." disable >/dev/null") == 0 ) end end