Disable buffering of sysupgrade output
[project/luci.git] / libs / sys / luasrc / sys.lua
index d0dc5ac..02cea5e 100644 (file)
@@ -24,24 +24,73 @@ limitations under the License.
 
 ]]--
 
+
+local io    = require "io"
+local os    = require "os"
+local posix = require "posix"
+local table = require "table"
+
+local luci  = {}
+luci.util   = require "luci.util"
+luci.fs     = require "luci.fs"
+luci.ip     = require "luci.ip"
+
+local tonumber, ipairs, pairs = tonumber, ipairs, pairs
+
+
 --- LuCI Linux and POSIX system utilities.
-module("luci.sys", package.seeall)
-require("posix")
-require("luci.util")
-require("luci.fs")
-require("luci.ip")
+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
 -- @param kpattern     Pattern of files to keep over flash process
--- @return                     Return value of os.execute()
+-- @return                     boolean indicating status
+-- @return                     error message if any
 function flash(image, kpattern)
        local cmd = "luci-flash "
        if kpattern then
                cmd = cmd .. "-k '" .. kpattern:gsub("'", "") .. "' "
        end
-       cmd = cmd .. "'" .. image:gsub("'", "") .. "' >/dev/null 2>&1"
+       cmd = cmd .. "'" .. image:gsub("'", "") .. "' 2>/dev/null"
 
-       return os.execute(cmd)
+       local fp = io.popen(cmd)
+       fp:setvbuf("no")
+       
+       local line = fp:read()
+       
+       if line == "Invalid image type" then
+               fp:close()
+               return false, line
+       else
+               line = fp:read()
+               if line == "Performing system upgrade..." then
+                       return true
+               end
+               
+               line = fp:read()
+               if line == "Performing system upgrade..." then
+                       return true
+               end
+               
+               fp:close()
+               return false, line
+       end
 end
 
 --- Retrieve information about currently mounted file systems.
@@ -94,10 +143,16 @@ end
 --- Returns the contents of a documented referred by an URL.
 -- @param url   The URL to retrieve
 -- @param stream Return a stream instead of a buffer
+-- @param target Directly write to target file name
 -- @return             String containing the contents of given the URL
-function httpget(url, stream)
-       local source = stream and io.open or luci.util.exec
-       return source("wget -qO- '"..url:gsub("'", "").."'")
+function httpget(url, stream, target)
+       if not target then
+               local source = stream and io.open or luci.util.exec
+               return source("wget -qO- '"..url:gsub("'", "").."'")
+       else
+               return os.execute("wget -qO '%s' '%s'" %
+                       {target:gsub("'", ""), url:gsub("'", "")})
+       end
 end
 
 --- Returns the system load average values.
@@ -189,6 +244,8 @@ end
 group = {}
 
 --- Returns information about a POSIX user group.
+-- @class function
+-- @name               getgroup
 -- @param group Group ID or name of a system user group
 -- @return     Table with information about the requested group
 group.getgroup = posix.getgroup
@@ -289,6 +346,8 @@ end
 process = {}
 
 --- Get the current process id.
+-- @class function
+-- @name  process.info
 -- @return     Number containing the current pid
 process.info = posix.getpid
 
@@ -353,6 +412,8 @@ function process.setuser(pid, uid)
 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