NIU: Backup system settings
authorSteven Barth <steven@midlink.org>
Mon, 2 Nov 2009 15:59:46 +0000 (15:59 +0000)
committerSteven Barth <steven@midlink.org>
Mon, 2 Nov 2009 15:59:46 +0000 (15:59 +0000)
modules/niu/luasrc/controller/niu/system.lua

index bb78edf08dc6cba87f71fe4b31483d5b7b7b7b1e..45f7cb615276559d7d5ec3305d616a20c0acfaa5 100644 (file)
@@ -12,7 +12,7 @@ You may obtain a copy of the License at
 $Id$
 ]]--
 
-local req = require
+local require, pairs, unpack = require, pairs, unpack
 module "luci.controller.niu.system"
 
 function index()
@@ -20,4 +20,48 @@ function index()
 
        entry({"niu", "system", "general"}, 
        cbi("niu/system/general", {on_success_to={"niu"}}), "General", 10)
+       
+       entry({"niu", "system", "backup"}, call("backup"), "Backup Settings", 20)
 end
+
+function backup()
+       local os = require "os"
+       local uci = require "luci.model.uci".cursor()
+       local nixio, nutl = require "nixio", require "nixio.util"
+       local fs = require "nixio.fs"
+       local http = require "luci.http"
+       
+       
+       local call = {"/bin/tar", "-cz"}
+       for k, v in pairs(uci:get_all("luci", "flash_keep")) do
+               if k:byte() ~= 46 then  -- k[1] ~= "."
+                       nutl.consume(fs.glob(v), call)
+               end
+       end
+       
+       
+       http.header(
+               'Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' % {
+                       nixio.uname().nodename, os.date("%Y-%m-%d")
+               }
+       )
+       http.prepare_content("application/x-targz")
+       
+       
+       local fdin, fdout = nixio.pipe()
+       local devnull = nixio.open("/dev/null", "r+")
+       local proc = nixio.fork()
+       
+       if proc == 0 then
+               fdin:close()
+               nixio.dup(devnull, nixio.stdin)
+               nixio.dup(devnull, nixio.stderr)
+               nixio.dup(fdout, nixio.stdout)
+               nixio.exec(unpack(call))
+               os.exit(1)
+       end
+       
+       fdout:close()
+       http.splice(fdin)
+       http.close()
+end
\ No newline at end of file