* Added public webif pages:
[project/luci.git] / core / src / ffluci / sys.lua
index d8fbaa5..f50b014 100644 (file)
@@ -26,6 +26,8 @@ limitations under the License.
 
 module("ffluci.sys", package.seeall)
 require("posix")
+require("ffluci.bits")
+require("ffluci.util")
 
 -- Runs "command" and returns its output
 function exec(command)
@@ -56,9 +58,9 @@ end
 function flash(image, kpattern)
        local cmd = "ffluci-flash "
        if kpattern then
-               cmd = cmd .. "-k '" .. kapttern:gsub("'", "") .. "' "
+               cmd = cmd .. "-k '" .. kpattern:gsub("'", "") .. "' "
        end
-       cmd = cmd .. "'" .. image:gsub("'", "") .. "'"
+       cmd = cmd .. "'" .. image:gsub("'", "") .. "' >/dev/null 2>&1"
        
        return os.execute(cmd)
 end
@@ -68,6 +70,11 @@ function hostname()
        return io.lines("/proc/sys/kernel/hostname")()
 end
 
+-- Returns the contents of a documented referred by an URL
+function httpget(url)
+       return exec("wget -qO- '"..url:gsub("'", "").."'")
+end
+
 -- Returns the load average
 function loadavg()
        local loadavg = io.lines("/proc/loadavg")()
@@ -79,11 +86,49 @@ function reboot()
        return os.execute("reboot >/dev/null 2>&1")
 end
 
+-- Returns the system type, cpu name, and installed physical memory
+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|cut -d: -f2 2>/dev/null"
+       
+       local s = ffluci.util.trim(exec(c1))
+       local m = ""
+       local r = ""
+       
+       if s == "" then
+               s = ffluci.util.trim(exec(c2))
+               m = ffluci.util.trim(exec(c3))
+       else
+               m = ffluci.util.trim(exec(c4))
+       end
+       
+       r = ffluci.util.trim(exec(c5))
+       
+       return s, m, r
+end
+
 
 group = {}
 group.getgroup = posix.getgroup
 
 net = {}
+-- Returns whether an IP-Adress belongs to a certain net
+function net.belongs(ip, net)
+       local netparts = ffluci.util.split(net, "/")
+       
+       if #netparts ~= 2 then
+               return nil
+       end
+       
+       local binadr = net.ip4bin(ip)
+       local binnet = net.ip4bin(netparts[1])
+       
+       return (binadr:sub(1, netparts[2]) == binnet:sub(1, netparts[2]))
+end
+
 -- Returns all available network interfaces
 function net.devices()
        local devices = {}
@@ -93,6 +138,52 @@ function net.devices()
        return devices
 end
 
+-- Returns the kernel routing table
+function net.routes()
+       return _parse_delimited_table(io.lines("/proc/net/route"))
+end
+
+-- Returns the numeric IP to a given hexstring
+function net.hexip4(hex)
+       if #hex ~= 8 then
+               return nil
+       end
+       
+       local hexdec = ffluci.bits.Hex2Dec
+       
+       local ip = ""
+       ip = ip .. tostring(hexdec(hex:sub(7,8))) .. "."
+       ip = ip .. tostring(hexdec(hex:sub(5,6))) .. "."
+       ip = ip .. tostring(hexdec(hex:sub(3,4))) .. "."
+       ip = ip .. tostring(hexdec(hex:sub(1,2)))
+       
+       return ip
+end
+
+-- Returns the binary IP to a given IP
+function net.ip4bin(ip)
+       local parts = ffluci.util.split(ip, '%.')
+       if #parts ~= 4 then
+               return nil
+       end
+       
+       local decbin = ffluci.bits.Dec2Bin
+       
+       local bin = ""
+       bin = bin .. decbin(parts[1], 8)
+       bin = bin .. decbin(parts[2], 8)
+       bin = bin .. decbin(parts[3], 8)
+       bin = bin .. decbin(parts[4], 8)
+       
+       return bin
+end
+
+-- Tests whether a host is pingable
+function net.pingtest(host)
+       return os.execute("ping -c1 '"..host:gsub("'", '').."' >/dev/null 2>&1")
+end
+
+
 process = {}
 process.info = posix.getpid 
 
@@ -123,4 +214,94 @@ function user.setpasswd(user, pwd)
        local cmd = "(echo '"..pwd.."';sleep 1;echo '"..pwd.."')|"
        cmd = cmd .. "passwd '"..user.."' >/dev/null 2>&1"
        return os.execute(cmd)
+end
+
+
+wifi = {}
+
+function wifi.getiwconfig()
+       local cnt = exec("/usr/sbin/iwconfig 2>/dev/null")
+       local iwc = {}
+       
+       for i, l in pairs(ffluci.util.split(ffluci.util.trim(cnt), "\n\n")) do
+               local k = l:match("^(.-) ")
+               l = l:gsub("^(.-) +", "", 1)
+               if k then
+                       iwc[k] = _parse_mixed_record(l)
+               end
+       end
+       
+       return iwc      
+end
+
+function wifi.iwscan()
+       local cnt = exec("iwlist scan 2>/dev/null")
+       local iws = {}
+       
+       for i, l in pairs(ffluci.util.split(ffluci.util.trim(cnt), "\n\n")) do
+               local k = l:match("^(.-) ")
+               l = l:gsub("^[^\n]+", "", 1)
+               if k then
+                       iws[k] = {}
+                       for j, c in pairs(ffluci.util.split(l, "\n          Cell")) do
+                               c = c:gsub("^(.-)- ", "", 1)
+                               c = ffluci.util.split(c, "\n", 7)
+                               c = table.concat(c, "\n", 1, 7)
+                               table.insert(iws[k], _parse_mixed_record(c))
+                       end
+               end
+       end
+       
+       return iws      
+end
+
+
+-- Internal functions
+
+function _parse_delimited_table(iter, delimiter)
+       delimiter = delimiter or "\t+"
+       
+       local data  = {}
+       local trim  = ffluci.util.trim
+       local split = ffluci.util.split
+       
+       local keys = split(trim(iter()), delimiter)
+       for i, j in pairs(keys) do
+               keys[i] = trim(keys[i])
+       end
+       
+       for line in iter do
+               local row = {}
+               line = trim(line)
+               if #line > 0 then
+                       for i, j in pairs(split(line, delimiter)) do
+                               if keys[i] then
+                                       row[keys[i]] = j
+                               end
+                       end
+               end
+               table.insert(data, row)
+       end
+       
+       return data
+end
+
+function _parse_mixed_record(cnt)
+       local data = {}
+       
+       for i, l in pairs(ffluci.util.split(ffluci.util.trim(cnt), "\n")) do
+       for j, f in pairs(ffluci.util.split(ffluci.util.trim(l), "  ")) do
+               local k, x, v = f:match('([^%s][^:=]+) *([:=]*) *"*([^\n"]*)"*')
+
+            if k then
+                               if x == "" then
+                                       table.insert(data, k)                           
+                               else
+                       data[k] = v
+                               end
+            end
+       end
+       end
+               
+    return data
 end
\ No newline at end of file