luci-mod-system: reimplent system/crontab as client side view
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
8178ac15b6
commit
0e5be0d68a
4 changed files with 55 additions and 34 deletions
|
@ -23,6 +23,7 @@
|
|||
"file": {
|
||||
"/": [ "list" ],
|
||||
"/*": [ "list" ],
|
||||
"/etc/crontabs/root": [ "read" ],
|
||||
"/etc/rc.local": [ "read" ],
|
||||
"/proc/sys/kernel/hostname": [ "read" ]
|
||||
},
|
||||
|
@ -40,6 +41,7 @@
|
|||
"write": {
|
||||
"cgi-io": [ "upload", "/etc/luci-uploads/*" ],
|
||||
"file": {
|
||||
"/etc/crontabs/root": [ "write" ],
|
||||
"/etc/luci-uploads/*": [ "write" ],
|
||||
"/etc/rc.local": [ "write" ]
|
||||
},
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
'use strict';
|
||||
'require rpc';
|
||||
|
||||
return L.view.extend({
|
||||
callFileRead: rpc.declare({
|
||||
object: 'file',
|
||||
method: 'read',
|
||||
params: [ 'path' ],
|
||||
expect: { data: '' }
|
||||
}),
|
||||
|
||||
callFileWrite: rpc.declare({
|
||||
object: 'file',
|
||||
method: 'write',
|
||||
params: [ 'path', 'data' ]
|
||||
}),
|
||||
|
||||
load: function() {
|
||||
return this.callFileRead('/etc/crontabs/root');
|
||||
},
|
||||
|
||||
handleSave: function(ev) {
|
||||
var value = (document.querySelector('textarea').value || '').trim().replace(/\r\n/g, '\n') + '\n';
|
||||
|
||||
return this.callFileWrite('/etc/crontabs/root', value).then(function(rc) {
|
||||
if (rc != 0)
|
||||
throw rpc.getStatusText(rc);
|
||||
|
||||
document.querySelector('textarea').value = value;
|
||||
L.ui.addNotification(null, E('p', _('Contents have been saved.')), 'info');
|
||||
|
||||
}).catch(function(e) {
|
||||
L.ui.addNotification(null, E('p', _('Unable to save contents: %s').format(e)));
|
||||
});
|
||||
},
|
||||
|
||||
render: function(crontab) {
|
||||
return E([
|
||||
E('h2', _('Scheduled Tasks')),
|
||||
E('p', {},
|
||||
_('This is the system crontab in which scheduled tasks can be defined.') +
|
||||
_('<br/>Note: you need to manually restart the cron service if the crontab file was empty before editing.')),
|
||||
E('p', {}, E('textarea', { 'style': 'width:100%', 'rows': 10 }, crontab != null ? crontab : '')),
|
||||
E('div', { 'class': 'right' }, [
|
||||
E('button', {
|
||||
'class': 'btn cbi-button-positive important',
|
||||
'click': L.ui.createHandlerFn(this, 'handleSave')
|
||||
}, _('Save'))
|
||||
])
|
||||
]);
|
||||
}
|
||||
});
|
|
@ -22,7 +22,7 @@ function index()
|
|||
end
|
||||
|
||||
entry({"admin", "system", "startup"}, view("system/startup"), _("Startup"), 45)
|
||||
entry({"admin", "system", "crontab"}, form("admin_system/crontab"), _("Scheduled Tasks"), 46)
|
||||
entry({"admin", "system", "crontab"}, view("system/crontab"), _("Scheduled Tasks"), 46)
|
||||
|
||||
if fs.access("/sbin/block") and fs.access("/etc/config/fstab") then
|
||||
entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), _("Mount Points"), 50)
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
-- Copyright 2008 Steven Barth <steven@midlink.org>
|
||||
-- Copyright 2008-2013 Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local cronfile = "/etc/crontabs/root"
|
||||
|
||||
f = SimpleForm("crontab", translate("Scheduled Tasks"),
|
||||
translate("This is the system crontab in which scheduled tasks can be defined.") ..
|
||||
translate("<br/>Note: you need to manually restart the cron service if the " ..
|
||||
"crontab file was empty before editing."))
|
||||
|
||||
t = f:field(TextValue, "crons")
|
||||
f.forcewrite = true
|
||||
t.rmempty = true
|
||||
t.rows = 10
|
||||
function t.cfgvalue()
|
||||
return fs.readfile(cronfile) or ""
|
||||
end
|
||||
|
||||
function f.handle(self, state, data)
|
||||
if state == FORM_VALID then
|
||||
if data.crons then
|
||||
fs.writefile(cronfile, data.crons:gsub("\r\n", "\n"))
|
||||
luci.sys.call("/usr/bin/crontab %q" % cronfile)
|
||||
else
|
||||
fs.writefile(cronfile, "")
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
return f
|
Loading…
Reference in a new issue