X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=modules%2Fadmin-full%2Fluasrc%2Fcontroller%2Fadmin%2Fsystem.lua;h=5d6037151e711aa6098269c61ead21a53f62ba15;hp=862a741cded4d150cb8f977d717aaa83d040fe88;hb=4538b12895af0f95bfd728de53391ceaa895dd08;hpb=97ff4a156ff1aa6a4d2ab65ab13d12b4eb2651e2 diff --git a/modules/admin-full/luasrc/controller/admin/system.lua b/modules/admin-full/luasrc/controller/admin/system.lua index 862a741cd..5d6037151 100644 --- a/modules/admin-full/luasrc/controller/admin/system.lua +++ b/modules/admin-full/luasrc/controller/admin/system.lua @@ -17,57 +17,18 @@ function index() luci.i18n.loadc("admin-core") local i18n = luci.i18n.translate - entry({"admin", "system"}, template("admin_system/index"), i18n("system", "System"), 30) - entry({"admin", "system", "packages"}, call("action_packages"), i18n("a_s_packages", "Paketverwaltung"), 10) - entry({"admin", "system", "packages", "ipkg"}, call("action_ipkg"), i18n("a_s_p_ipkg", "IPKG-Konfiguration")) - entry({"admin", "system", "passwd"}, call("action_passwd"), i18n("a_s_changepw", "Passwort ändern"), 20) - entry({"admin", "system", "sshkeys"}, call("action_sshkeys"), i18n("a_s_sshkeys", "SSH-Schlüssel"), 30) - entry({"admin", "system", "system"}, cbi("admin_system/system"), i18n("system", "System"), 40) - entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), i18n("a_s_fstab", "Einhängepunkte"), 50) - entry({"admin", "system", "upgrade"}, call("action_upgrade"), i18n("a_s_flash", "Firmwareupgrade"), 60) - entry({"admin", "system", "reboot"}, call("action_reboot"), i18n("reboot", "Neu starten"), 70) -end - -function action_editor() - local file = luci.http.formvalue("file", "") - local data = luci.http.formvalue("data") - local err = nil - local msg = nil - local stat = true - - if file and data then - stat, err = luci.fs.writefile(file, data) - end - - if not stat then - err = luci.util.split(err, " ") - table.remove(err, 1) - msg = table.concat(err, " ") - end - - local cnt, err = luci.fs.readfile(file) - if cnt then - cnt = luci.util.pcdata(cnt) - end - luci.template.render("admin_system/editor", {fn=file, cnt=cnt, msg=msg}) -end - -function action_ipkg() - local file = "/etc/ipkg.conf" - local data = luci.http.formvalue("data") - local stat = nil - local err = nil - - if data then - stat, err = luci.fs.writefile(file, data) - end - - local cnt = luci.fs.readfile(file) - if cnt then - cnt = luci.util.pcdata(cnt) - end - - luci.template.render("admin_system/ipkg", {cnt=cnt, msg=err}) + entry({"admin", "system"}, alias("admin", "system", "system"), i18n("system"), 30) + entry({"admin", "system", "system"}, cbi("admin_system/system"), i18n("system"), 1) + entry({"admin", "system", "packages"}, call("action_packages"), i18n("a_s_packages"), 10) + entry({"admin", "system", "packages", "ipkg"}, form("admin_system/ipkg"), i18n("a_s_p_ipkg")) + entry({"admin", "system", "passwd"}, form("admin_system/passwd"), i18n("a_s_changepw"), 20) + entry({"admin", "system", "sshkeys"}, form("admin_system/sshkeys"), i18n("a_s_sshkeys"), 30) + entry({"admin", "system", "processes"}, form("admin_system/processes"), i18n("process_head"), 45) + entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), i18n("a_s_fstab"), 50) + entry({"admin", "system", "leds"}, cbi("admin_system/leds"), i18n("leds", "LEDs"), 60) + entry({"admin", "system", "backup"}, call("action_backup"), i18n("a_s_backup"), 70) + entry({"admin", "system", "upgrade"}, call("action_upgrade"), i18n("a_s_flash"), 80) + entry({"admin", "system", "reboot"}, call("action_reboot"), i18n("reboot"), 90) end function action_packages() @@ -125,7 +86,7 @@ function action_packages() -- Package info - local info = luci.model.ipkg.info(query) + local info = luci.model.ipkg.info(query and "*"..query.."*") info = info or {} local pkgs = {} @@ -153,6 +114,47 @@ function action_packages() install=install, remove=remove, update=update, upgrade=upgrade}) end +function action_backup() + local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0 + local restore_cmd = "gunzip | tar -xC/ >/dev/null 2>&1" + local backup_cmd = "tar -c %s | gzip 2>/dev/null" + + local restore_fpi + luci.http.setfilehandler( + function(meta, chunk, eof) + if not restore_fpi then + restore_fpi = io.popen(restore_cmd, "w") + end + if chunk then + restore_fpi:write(chunk) + end + if eof then + restore_fpi:close() + end + end + ) + + local upload = luci.http.formvalue("archive") + local backup = luci.http.formvalue("backup") + local reset = reset_avail and luci.http.formvalue("reset") + + if upload and #upload > 0 then + luci.template.render("admin_system/applyreboot") + luci.sys.reboot() + elseif backup then + luci.util.perror(backup_cmd:format(_keep_pattern())) + local backup_fpi = io.popen(backup_cmd:format(_keep_pattern()), "r") + luci.http.header('Content-Disposition', 'attachment; filename="backup.tar.gz"') + luci.http.prepare_content("application/x-targz") + luci.ltn12.pump.all(luci.ltn12.source.file(backup_fpi), luci.http.write) + elseif reset then + luci.template.render("admin_system/applyreboot") + luci.util.exec("mtd -r erase rootfs_data") + else + luci.template.render("admin_system/backup", {reset_avail = reset_avail}) + end +end + function action_passwd() local p1 = luci.http.formvalue("pwd1") local p2 = luci.http.formvalue("pwd2") @@ -177,45 +179,52 @@ function action_reboot() end end -function action_sshkeys() - local file = "/etc/dropbear/authorized_keys" - local data = luci.http.formvalue("data") - local stat = nil - local err = nil - - if data then - stat, err = luci.fs.writefile(file, data) - end - - local cnt = luci.fs.readfile(file) - if cnt then - cnt = luci.util.pcdata(cnt) - end - - luci.template.render("admin_system/sshkeys", {cnt=cnt, msg=err}) -end - function action_upgrade() require("luci.model.uci") - local ret = nil + + local ret local plat = luci.fs.mtime("/lib/upgrade/platform.sh") - - local image = luci.http.upload("image") - local keepcfg = luci.http.formvalue("keepcfg") - - if plat and image then - local kpattern = nil - if keepcfg then - local files = luci.model.uci.get_all("luci", "flash_keep") - if files.luci and files.luci.flash_keep then - kpattern = "" - for k,v in pairs(files.luci.flash_keep) do - kpattern = kpattern .. " " .. v - end + local tmpfile = "/tmp/firmware.img" + local keep_avail = true + + local file + luci.http.setfilehandler( + function(meta, chunk, eof) + if not file then + file = io.open(tmpfile, "w") + end + if chunk then + file:write(chunk) + end + if eof then + file:close() end end - ret = luci.sys.flash(image, kpattern) + ) + + local fname = luci.http.formvalue("image") + local keepcfg = keep_avail and luci.http.formvalue("keepcfg") + + if plat and fname then + ret = function() + return luci.sys.flash(tmpfile, keepcfg and _keep_pattern()) + end end - - luci.template.render("admin_system/upgrade", {sysupgrade=plat, ret=ret}) -end \ No newline at end of file + + luci.http.prepare_content("text/html") + luci.template.render("admin_system/upgrade", {sysupgrade=plat, ret=ret, keep_avail=keep_avail}) +end + +function _keep_pattern() + local kpattern = "" + local files = luci.model.uci.cursor():get_all("luci", "flash_keep") + if files then + kpattern = "" + for k, v in pairs(files) do + if k:sub(1,1) ~= "." and luci.fs.glob(v) then + kpattern = kpattern .. " " .. v + end + end + end + return kpattern +end