-- @return String containing the contents of given the URL
function httpget(url, stream, target)
if not target then
- local source = stream and io.open or luci.util.exec
+ local source = stream and io.popen or luci.util.exec
return source("wget -qO- '"..url:gsub("'", "").."'")
else
return os.execute("wget -qO '%s' '%s'" %
-- @return String containing the memory used for buffering in kB
-- @return String containing the free memory amount in kB
function sysinfo()
- local c1 = "cat /proc/cpuinfo|grep system\\ typ|cut -d: -f2 2>/dev/null"
- local c2 = "uname -m 2>/dev/null"
- local c3 = "cat /proc/cpuinfo|grep model\\ name|cut -d: -f2 2>/dev/null"
- local c4 = "cat /proc/cpuinfo|grep cpu\\ model|cut -d: -f2 2>/dev/null"
- local c5 = "cat /proc/meminfo|grep MemTotal|awk {' print $2 '} 2>/dev/null"
- local c6 = "cat /proc/meminfo|grep ^Cached|awk {' print $2 '} 2>/dev/null"
- local c7 = "cat /proc/meminfo|grep MemFree|awk {' print $2 '} 2>/dev/null"
- local c8 = "cat /proc/meminfo|grep Buffers|awk {' print $2 '} 2>/dev/null"
-
- local system = luci.util.trim(luci.util.exec(c1))
+ local cpuinfo = luci.fs.readfile("/proc/cpuinfo")
+ local meminfo = luci.fs.readfile("/proc/meminfo")
+
+ local system = cpuinfo:match("system typ.-:%s*([^\n]+)")
local model = ""
- local memtotal = tonumber(luci.util.trim(luci.util.exec(c5)))
- local memcached = tonumber(luci.util.trim(luci.util.exec(c6)))
- local memfree = tonumber(luci.util.trim(luci.util.exec(c7)))
- local membuffers = tonumber(luci.util.trim(luci.util.exec(c8)))
-
- if system == "" then
- system = luci.util.trim(luci.util.exec(c2))
- model = luci.util.trim(luci.util.exec(c3))
+ 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+)"))
+
+ if not system then
+ system = posix.uname("%m")
+ model = cpuinfo:match("model name.-:%s*([^\n]+)")
+ if not model then
+ model = cpuinfo:match("Processor.-:%s*([^\n]+)")
+ end
else
- model = luci.util.trim(luci.util.exec(c4))
+ model = cpuinfo:match("cpu model.-:%s*([^\n]+)")
end
return system, model, memtotal, memcached, membuffers, memfree
return luci.util.exec("logread")
end
+--- Retrieves the output of the "dmesg" command.
+-- @return String containing the current log buffer
+function dmesg()
+ return luci.util.exec("dmesg")
+end
+
--- Generates a random id with specified length.
-- @param bytes Number of bytes for the unique id
-- @return String containing hex encoded id
return _parse_delimited_table(io.lines("/proc/net/route"))
end
+--- Returns the current ipv6 kernel routing table entries.
+-- @return Table of tables with properties of the corresponding routes.
+-- The following fields are defined for route entry tables:
+-- { "src_ip", "src_prefix", "dst_ip", "dst_prefix", "nexthop_ip",
+-- "metric", "refcount", "usecount", "flags", "device" }
+function net.routes6()
+ local routes = { }
+
+ for line in io.lines("/proc/net/ipv6_route") do
+
+ local dst_ip, dst_prefix, src_ip, src_prefix, nexthop,
+ metric, refcnt, usecnt, flags, dev = line:match(
+ "([a-f0-9]+) ([a-f0-9]+) " ..
+ "([a-f0-9]+) ([a-f0-9]+) " ..
+ "([a-f0-9]+) ([a-f0-9]+) " ..
+ "([a-f0-9]+) ([a-f0-9]+) " ..
+ "([^%s]+) +([^%s]+)"
+ )
+
+ src_ip = luci.ip.Hex(
+ src_ip, tonumber(src_prefix, 16),
+ luci.ip.FAMILY_INET6, false
+ )
+
+ dst_ip = luci.ip.Hex(
+ dst_ip, tonumber(dst_prefix, 16),
+ luci.ip.FAMILY_INET6, false
+ )
+
+ nexthop = luci.ip.Hex( nexthop, 128, luci.ip.FAMILY_INET6, false )
+
+ routes[#routes+1] = {
+ src_ip = src_ip:host():string(),
+ src_prefix = src_ip:prefix(),
+ dst_ip = dst_ip:host():string(),
+ dst_prefix = dst_ip:prefix(),
+ nexthop_ip = nexthop:string(),
+ metric = tonumber(metric, 16),
+ refcount = tonumber(refcnt, 16),
+ usecount = tonumber(usecnt, 16),
+ flags = tonumber(flags), -- hex?
+ device = dev
+ }
+ end
+
+ return routes
+end
--- Tests whether the given host responds to ping probes.
-- @param host String containing a hostname or IPv4 address