--- 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 boolean indicating status
--- @return error message if any
+-- @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("'", "") .. "' 2>/dev/null &"
-
- local fp = io.popen(cmd)
- fp:setvbuf("no")
-
- local line = fp:read()
-
- if line == "Invalid image type" then
- fp:close()
- return false, line
- else
- fp:close()
- return true
- end
+ cmd = cmd .. "'" .. image:gsub("'", "") .. "' >/dev/null 2>&1"
+
+ return os.execute(cmd)
end
--- Retrieve information about currently mounted file systems.
local data = {}
local k = {"fs", "blocks", "used", "available", "percent", "mountpoint"}
local ps = luci.util.execi("df")
-
+
if not ps then
return
else
ps()
end
-
+
for line in ps do
local row = {}
-
+
local j = 1
for value in line:gmatch("[^%s]+") do
row[k[j]] = value
j = j + 1
end
-
+
if row[k[1]] then
+
+ -- this is a rather ugly workaround to cope with wrapped lines in
+ -- the df output:
+ --
+ -- /dev/scsi/host0/bus0/target0/lun0/part3
+ -- 114382024 93566472 15005244 86% /mnt/usb
+ --
+
+ if not row[k[2]] then
+ j = 2
+ line = ps()
+ for value in line:gmatch("[^%s]+") do
+ row[k[j]] = value
+ j = j + 1
+ end
+ end
+
table.insert(data, row)
end
end
-
+
return data
end
local data = {}
local k
local ps = luci.util.execi("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[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 = tonumber(row[k[1]])
if pid then
data[pid] = row
end
end
-
+
return data
end
local account = user.getuser(username)
if account then
- if account.passwd == "!" then
+ local pwd = account.passwd
+ if pwd == "!" then
return true
- else
- return (account.passwd == posix.crypt(password, account.passwd))
+ elseif pwd == "x" then
+ pwd = nil
+ for l in io.lines("/etc/shadow") do
+ pwd = l:match("^%s:([^:]+)" % username)
+ if pwd then
+ break
+ end
+ end
+ if not pwd then
+ return nil, "No shadow password for " .. username
+ end
end
+
+ return (pwd == posix.crypt(password, pwd))
end
end