local api = require "luci.passwall.api"
local http = require "luci.http"
local appname = "passwall"
local fs = api.fs
local sys = api.sys
f = SimpleForm(appname)
f.reset = false
f.submit = false
f:append(Template(appname .. "/log/log"))
fb = SimpleForm('backup-restore')
fb.reset = false
fb.submit = false
s = fb:section(SimpleSection, translate("Backup and Restore"), translate("Backup or Restore Client and Server Configurations.") ..
"
" ..
translate("Note: Restoring configurations across different versions may cause compatibility issues.") ..
"")
o = s:option(DummyValue, '', nil)
o.template = appname .. "/log/backup_restore"
local backup_files = {
"/etc/config/passwall",
"/etc/config/passwall_server",
"/usr/share/passwall/rules/block_host",
"/usr/share/passwall/rules/block_ip",
"/usr/share/passwall/rules/direct_host",
"/usr/share/passwall/rules/direct_ip",
"/usr/share/passwall/rules/proxy_host",
"/usr/share/passwall/rules/proxy_ip"
}
local file_path = '/tmp/passwall_upload.tar.gz'
local temp_dir = '/tmp/passwall_bak'
local fd
http.setfilehandler(function(meta, chunk, eof)
if not fd and meta and meta.name == "ulfile" and chunk then
sys.call("rm -rf " .. temp_dir)
fs.remove(file_path)
fd = nixio.open(file_path, "w")
sys.call("echo '' > /tmp/log/passwall.log")
end
if fd and chunk then
fd:write(chunk)
end
if eof and fd then
fd:close()
fd = nil
if fs.access(file_path) then
api.log(" * PassWall 配置文件上传成功…")
sys.call("mkdir -p " .. temp_dir)
if sys.call("tar -xzf " .. file_path .. " -C " .. temp_dir) == 0 then
for _, backup_file in ipairs(backup_files) do
local temp_file = temp_dir .. backup_file
if fs.access(temp_file) then
sys.call("cp -f " .. temp_file .. " " .. backup_file)
end
end
api.log(" * PassWall 配置还原成功…")
api.log(" * 重启 PassWall 服务中…\n")
sys.call('/etc/init.d/passwall restart > /dev/null 2>&1 &')
sys.call('/etc/init.d/passwall_server restart > /dev/null 2>&1 &')
else
api.log(" * PassWall 配置文件解压失败,请重试!")
end
else
api.log(" * PassWall 配置文件上传失败,请重试!")
end
sys.call("rm -rf " .. temp_dir)
fs.remove(file_path)
end
end)
return f, fb