When a value identical to the stored one is submitted, the CBI framework will not emit an option write event and therfore not store the value in the form data dictionary passed to SimpleForm.handle(). This usage pattern usally works be accident for file editor views such as admin_system/crontab because \r\n windows style line endings are substituted with unix \n ones before writing the data, defeating the equality check in CBI. When a single line without trailing newline is submitted however, the CBI will not see a difference to the data stored in the file and clear out the value on subsequent saves. This commit alignes the logic used by various SimpleForm views to behave identically and predictable: - File data is handled in the SimpleForm.handle() callback - The forcewrite property is used to disable equality checks - Submission of an empty string empties the backing file Fixes: #2737 Signed-off-by: Jo-Philipp Wich <jo@mein.io>
100 lines
2.6 KiB
Lua
100 lines
2.6 KiB
Lua
-- Copyright 2008 Steven Barth <steven@midlink.org>
|
|
-- Copyright 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
|
|
-- Copyright 2010 Manuel Munz <freifunk at somakoma dot de>
|
|
-- Licensed to the public under the Apache License 2.0.
|
|
|
|
local fs = require "nixio.fs"
|
|
local sys = require "luci.sys"
|
|
|
|
local inits = { }
|
|
|
|
for _, name in ipairs(sys.init.names()) do
|
|
local index = sys.init.index(name)
|
|
local enabled = sys.init.enabled(name)
|
|
|
|
if index < 255 then
|
|
inits["%02i.%s" % { index, name }] = {
|
|
name = name,
|
|
index = tostring(index),
|
|
enabled = enabled
|
|
}
|
|
end
|
|
end
|
|
|
|
|
|
m = SimpleForm("initmgr", translate("Initscripts"), translate("You can enable or disable installed init scripts here. Changes will applied after a device reboot.<br /><strong>Warning: If you disable essential init scripts like \"network\", your device might become inaccessible!</strong>"))
|
|
m.reset = false
|
|
m.submit = false
|
|
|
|
|
|
s = m:section(Table, inits)
|
|
|
|
i = s:option(DummyValue, "index", translate("Start priority"))
|
|
n = s:option(DummyValue, "name", translate("Initscript"))
|
|
|
|
|
|
e = s:option(Button, "endisable", translate("Enable/Disable"))
|
|
|
|
e.render = function(self, section, scope)
|
|
if inits[section].enabled then
|
|
self.title = translate("Enabled")
|
|
self.inputstyle = "save"
|
|
else
|
|
self.title = translate("Disabled")
|
|
self.inputstyle = "reset"
|
|
end
|
|
|
|
Button.render(self, section, scope)
|
|
end
|
|
|
|
e.write = function(self, section)
|
|
if inits[section].enabled then
|
|
inits[section].enabled = false
|
|
return sys.init.disable(inits[section].name)
|
|
else
|
|
inits[section].enabled = true
|
|
return sys.init.enable(inits[section].name)
|
|
end
|
|
end
|
|
|
|
|
|
start = s:option(Button, "start", translate("Start"))
|
|
start.inputstyle = "apply"
|
|
start.write = function(self, section)
|
|
sys.call("/etc/init.d/%s %s >/dev/null" %{ inits[section].name, self.option })
|
|
end
|
|
|
|
restart = s:option(Button, "restart", translate("Restart"))
|
|
restart.inputstyle = "reload"
|
|
restart.write = start.write
|
|
|
|
stop = s:option(Button, "stop", translate("Stop"))
|
|
stop.inputstyle = "remove"
|
|
stop.write = start.write
|
|
|
|
|
|
|
|
f = SimpleForm("rc", translate("Local Startup"),
|
|
translate("This is the content of /etc/rc.local. Insert your own commands here (in front of 'exit 0') to execute them at the end of the boot process."))
|
|
|
|
t = f:field(TextValue, "rcs")
|
|
t.forcewrite = true
|
|
t.rmempty = true
|
|
t.rows = 20
|
|
|
|
function t.cfgvalue()
|
|
return fs.readfile("/etc/rc.local") or ""
|
|
end
|
|
|
|
function f.handle(self, state, data)
|
|
if state == FORM_VALID then
|
|
if data.rcs then
|
|
fs.writefile("/etc/rc.local", data.rcs:gsub("\r\n", "\n"))
|
|
else
|
|
fs.writefile("/etc/rc.local", "")
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
return m, f
|