--- LuCI Linux and POSIX system utilities.
module "luci.sys"
+--- Execute a given shell command and return the error code
+-- @class function
+-- @name call
+-- @param ... Command to call
+-- @return Error code of the command
+function call(...)
+ return os.execute(...) / 256
+end
+
+--- Execute a given shell command and capture its standard output
+-- @class function
+-- @name exec
+-- @param command Command to call
+-- @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
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
process = {}
--- Get the current process id.
+-- @class function
+-- @name process.info
-- @return Number containing the current pid
process.info = posix.getpid
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
end
--- Send a signal to a process identified by given pid.
+-- @class function
+-- @name process.signal
-- @param pid Number containing the process id
-- @param sig Signal to send (default: 15 [SIGTERM])
-- @return Boolean indicating successful operation
local account = user.getuser(username)
if account then
- if account.passwd == "!" then
- return true
- else
- return (account.passwd == posix.crypt(password, account.passwd))
+ local pwd = account.passwd
+ local shadowpw
+ if #pwd == 1 then
+ for l in io.lines("/etc/shadow") do
+ shadowpw = l:match("^%s:([^:]+)" % username)
+ if shadowpw then
+ pwd = shadowpw
+ break
+ end
+ end
+
+ if pwd == "!" then
+ return true
+ end
end
+
+ return (pwd == posix.crypt(password, pwd))
end
end