Detect IXP4xx processors correctly
[project/luci.git] / libs / sys / luasrc / sys.lua
index e752e4f..413aa4c 100644 (file)
@@ -35,7 +35,7 @@ luci.util   = require "luci.util"
 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.
@@ -132,7 +132,7 @@ getenv = posix.getenv
 --- Determine the current hostname.
 -- @return             String containing the system hostname
 function hostname()
-       return io.lines("/proc/sys/kernel/hostname")()
+       return posix.uname("%n")
 end
 
 --- Returns the contents of a documented referred by an URL.
@@ -142,7 +142,7 @@ end
 -- @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'" %
@@ -175,27 +175,24 @@ end
 -- @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
@@ -265,9 +262,9 @@ 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 = _parse_mixed_record(line, " +")
-                       entry.layer3 = entry[1]
-                       entry.layer4 = entry[2]
+                       local entry, flags = _parse_mixed_record(line, " +")
+                       entry.layer3 = flags[1]
+                       entry.layer4 = flags[2]
                        for i=1, #entry do
                                entry[i] = nil
                        end
@@ -275,10 +272,10 @@ function net.conntrack()
                        connt[#connt+1] = entry
                end
        elseif luci.fs.access("/proc/net/ip_conntrack") then
-               for line in io.lines("/proc/net/nf_conntrack") do
-                       local entry = _parse_mixed_record(line, " +")
+               for line in io.lines("/proc/net/ip_conntrack") do
+                       local entry, flags = _parse_mixed_record(line, " +")
                        entry.layer3 = "ipv4"
-                       entry.layer4 = entry[1]
+                       entry.layer4 = flags[1]
                        for i=1, #entry do
                                entry[i] = nil
                        end
@@ -491,8 +488,12 @@ function user.checkpasswd(username, password)
                        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.
@@ -529,7 +530,11 @@ function wifi.getiwconfig()
                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
 
@@ -553,7 +558,11 @@ function wifi.iwscan(iface)
                                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
@@ -649,6 +658,7 @@ end
 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), delimiter, nil, true)) do
@@ -656,7 +666,7 @@ function _parse_mixed_record(cnt, delimiter)
 
             if k then
                                if x == "" then
-                                       table.insert(data, k)
+                                       table.insert(flags, k)
                                else
                        data[k] = v
                                end
@@ -664,5 +674,5 @@ function _parse_mixed_record(cnt, delimiter)
        end
        end
 
-    return data
+    return data, flags
 end