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": {
|
"file": {
|
||||||
"/": [ "list" ],
|
"/": [ "list" ],
|
||||||
"/*": [ "list" ],
|
"/*": [ "list" ],
|
||||||
|
"/etc/crontabs/root": [ "read" ],
|
||||||
"/etc/rc.local": [ "read" ],
|
"/etc/rc.local": [ "read" ],
|
||||||
"/proc/sys/kernel/hostname": [ "read" ]
|
"/proc/sys/kernel/hostname": [ "read" ]
|
||||||
},
|
},
|
||||||
|
@ -40,6 +41,7 @@
|
||||||
"write": {
|
"write": {
|
||||||
"cgi-io": [ "upload", "/etc/luci-uploads/*" ],
|
"cgi-io": [ "upload", "/etc/luci-uploads/*" ],
|
||||||
"file": {
|
"file": {
|
||||||
|
"/etc/crontabs/root": [ "write" ],
|
||||||
"/etc/luci-uploads/*": [ "write" ],
|
"/etc/luci-uploads/*": [ "write" ],
|
||||||
"/etc/rc.local": [ "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
|
end
|
||||||
|
|
||||||
entry({"admin", "system", "startup"}, view("system/startup"), _("Startup"), 45)
|
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
|
if fs.access("/sbin/block") and fs.access("/etc/config/fstab") then
|
||||||
entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), _("Mount Points"), 50)
|
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