luci.fs = require "luci.fs"
luci.ip = require "luci.ip"
-local tonumber, ipairs, pairs = tonumber, ipairs, pairs
+local tonumber, ipairs, pairs, pcall = tonumber, ipairs, pairs, pcall
--- LuCI Linux and POSIX system utilities.
return _parse_delimited_table(io.lines("/proc/net/arp"), "%s%s+")
end
+--- Returns conntrack information
+-- @return Table with the currently tracked IP connections
+function net.conntrack()
+ local connt = {}
+ if luci.fs.access("/proc/net/nf_conntrack") then
+ for line in io.lines("/proc/net/nf_conntrack") do
+ local entry, flags = _parse_mixed_record(line, " +")
+ entry.layer3 = flags[1]
+ entry.layer4 = flags[2]
+ for i=1, #entry do
+ entry[i] = nil
+ end
+
+ connt[#connt+1] = entry
+ end
+ elseif luci.fs.access("/proc/net/ip_conntrack") then
+ for line in io.lines("/proc/net/ip_conntrack") do
+ local entry, flags = _parse_mixed_record(line, " +")
+ entry.layer3 = "ipv4"
+ entry.layer4 = flags[1]
+ for i=1, #entry do
+ entry[i] = nil
+ end
+
+ connt[#connt+1] = entry
+ end
+ else
+ return nil
+ end
+ return connt
+end
+
--- Determine the current default route.
-- @return Table with the properties of the current default route.
-- The following fields are defined:
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
+ if luci.fs.stat("/etc/shadow") then
+ if not pcall(function()
+ for l in io.lines("/etc/shadow") do
+ shadowpw = l:match("^%s:([^:]+)" % username)
+ if shadowpw then
+ pwd = shadowpw
+ break
+ end
+ end
+ end) then
+ return nil, "Unable to access shadow-file"
end
end
end
end
- return (pwd == posix.crypt(password, pwd))
+ if pwd and #pwd > 0 and password and #password > 0 then
+ return (pwd == posix.crypt(password, pwd))
+ end
end
+
+ return false
end
--- Change the password of given user.
local k = l:match("^(.-) ")
l = l:gsub("^(.-) +", "", 1)
if k then
- iwc[k] = _parse_mixed_record(l)
+ local entry, flags = _parse_mixed_record(l)
+ if entry then
+ entry.flags = flags
+ end
+ iwc[k] = entry
end
end
c = c:gsub("^(.-)- ", "", 1)
c = luci.util.split(c, "\n", 7)
c = table.concat(c, "\n", 1)
- table.insert(iws[k], _parse_mixed_record(c))
+ local entry, flags = _parse_mixed_record(c)
+ if entry then
+ entry.flags = flags
+ end
+ table.insert(iws[k], entry)
end
end
end
end
+--- LuCI system utilities / init related functions.
+-- @class module
+-- @name luci.sys.init
+init = {}
+init.dir = "/etc/init.d/"
+
+--- Get the names of all installed init scripts
+-- @return Table containing the names of all inistalled init scripts
+function init.names()
+ local names = { }
+ for _, name in ipairs(luci.fs.glob(init.dir.."*")) do
+ names[#names+1] = luci.fs.basename(name)
+ end
+ return names
+end
+
+--- Test whether the given init script is enabled
+-- @param name Name of the init script
+-- @return Boolean indicating whether init is enabled
+function init.enabled(name)
+ if luci.fs.access(init.dir..name) then
+ return ( call(init.dir..name.." enabled") == 0 )
+ end
+ return false
+end
+
+--- Get the index of he given init script
+-- @param name Name of the init script
+-- @return Numeric index value
+function init.index(name)
+ if luci.fs.access(init.dir..name) then
+ return call("source "..init.dir..name.."; exit $START")
+ end
+end
+
+--- Enable the given init script
+-- @param name Name of the init script
+-- @return Boolean indicating success
+function init.enable(name)
+ if luci.fs.access(init.dir..name) then
+ return ( call(init.dir..name.." enable") == 1 )
+ end
+end
+
+--- Disable the given init script
+-- @param name Name of the init script
+-- @return Boolean indicating success
+function init.disable(name)
+ if luci.fs.access(init.dir..name) then
+ return ( call(init.dir..name.." disable") == 0 )
+ end
+end
+
+
-- Internal functions
function _parse_delimited_table(iter, delimiter)
return data
end
-function _parse_mixed_record(cnt)
+function _parse_mixed_record(cnt, delimiter)
+ delimiter = delimiter or " "
local data = {}
+ local flags = {}
for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n")) do
- for j, f in pairs(luci.util.split(luci.util.trim(l), " ")) do
+ for j, f in pairs(luci.util.split(luci.util.trim(l), delimiter, nil, true)) do
local k, x, v = f:match('([^%s][^:=]+) *([:=]*) *"*([^\n"]*)"*')
if k then
if x == "" then
- table.insert(data, k)
+ table.insert(flags, k)
else
data[k] = v
end
end
end
- return data
+ return data, flags
end