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.
-- @return String containg the return the output of the command
exec = luci.util.exec
---- Invoke the luci-flash executable to write an image to the flash memory.
--- @param image Local path or URL to image file
--- @param kpattern Pattern of files to keep over flash process
--- @return Return value of os.execute()
-function flash(image, kpattern)
- local cmd = "luci-flash "
- if kpattern then
- cmd = cmd .. "-k '" .. kpattern:gsub("'", "") .. "' "
- end
- cmd = cmd .. "'" .. image:gsub("'", "") .. "' >/dev/null 2>&1"
-
- return os.execute(cmd)
-end
-
--- Retrieve information about currently mounted file systems.
-- @return Table containing mount information
function mounts()
-- @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 =
+ 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.
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
-- @return Boolean indicating wheather the passwords are equal
function user.checkpasswd(username, pass)
local pwh = user.getpasswd(username)
- if not pwh or nixio.crypt(pass, pwh) ~= pwh then
+ if pwh and nixio.crypt(pass, pwh) ~= pwh then
return false
else
return true
-- @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
-- @param ifname String containing the interface name
-- @return A wrapped iwinfo object instance
function wifi.getiwinfo(ifname)
- local t = iwinfo.type(ifname)
- if t then
- local x = iwinfo[t]
+ local stat, iwinfo = pcall(require, "iwinfo")
+
+ if ifname then
+ local c = 0
+ local u = uci.cursor_state()
+ local d, n = ifname:match("^(%w+)%.network(%d+)")
+ if d and n then
+ n = tonumber(n)
+ u:foreach("wireless", "wifi-iface",
+ function(s)
+ if s.device == d then
+ c = c + 1
+ if c == n then
+ ifname = s.ifname or s.device
+ return false
+ end
+ end
+ end)
+ elseif u:get("wireless", ifname) == "wifi-device" then
+ u:foreach("wireless", "wifi-iface",
+ function(s)
+ if s.device == ifname and s.ifname then
+ ifname = s.ifname
+ return false
+ end
+ end)
+ end
+
+ local t = stat and iwinfo.type(ifname)
+ local x = t and iwinfo[t] or { }
return setmetatable({}, {
__index = function(t, k)
- if x[k] then return x[k](ifname) end
+ if k == "ifname" then
+ return ifname
+ elseif x[k] then
+ return x[k](ifname)
+ end
end
})
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 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