--- /dev/null
+'use strict';
+'require rpc';
+
+return L.view.extend({
+ callInitList: rpc.declare({
+ object: 'luci',
+ method: 'getInitList',
+ expect: { '': {} }
+ }),
+
+ callInitAction: rpc.declare({
+ object: 'luci',
+ method: 'setInitAction',
+ params: [ 'name', 'action' ],
+ expect: { result: false }
+ }),
+
+ load: function() {
+ return this.callInitList();
+ },
+
+ handleAction: function(name, action, ev) {
+ return this.callInitAction(name, action).then(function(success) {
+ if (success != true) {
+ L.ui.addNotification(null, E('p', _('Failed to execute "/etc/init.d/%s %s" action').format(name, action)));
+ return Promise.reject(false);
+ }
+
+ return true;
+ }).catch(function() {
+ L.ui.addNotification(null, E('p', _('Connection failure while executing "/etc/init.d/%s %s" action').format(name, action)));
+ return Promise.reject(false);
+ });
+ },
+
+ handleEnableDisable: function(name, isEnabled, ev) {
+ return this.handleAction(name, isEnabled ? 'disable' : 'enable', ev).then(L.bind(function(name, isEnabled, cell) {
+ L.dom.content(cell, this.renderEnableDisable({
+ name: name,
+ enabled: isEnabled
+ }));
+ }, this, name, !isEnabled, ev.currentTarget.parentNode));
+ },
+
+ renderEnableDisable: function(init) {
+ return E('button', {
+ class: 'btn cbi-button-%s'.format(init.enabled ? 'positive' : 'negative'),
+ click: L.ui.createHandlerFn(this, 'handleEnableDisable', init.name, init.enabled)
+ }, init.enabled ? _('Enabled') : _('Disabled'));
+ },
+
+ render: function(initList) {
+ var table = E('div', { 'class': 'table' }, [
+ E('div', { 'class': 'tr table-titles' }, [
+ E('div', { 'class': 'th' }, _('Start priority')),
+ E('div', { 'class': 'th' }, _('Initscript')),
+ E('div', { 'class': 'th' }, _('Enable/Disable')),
+ E('div', { 'class': 'th' }, _('Start')),
+ E('div', { 'class': 'th' }, _('Restart')),
+ E('div', { 'class': 'th' }, _('Stop'))
+ ])
+ ]);
+
+ var rows = [], list = [];
+
+ for (var init in initList)
+ if (initList[init].index < 100)
+ list.push(Object.assign({ name: init }, initList[init]));
+
+ list.sort(function(a, b) {
+ if (a.index != b.index)
+ return a.index - b.index
+
+ return a.name > b.name;
+ });
+
+ for (var i = 0; i < list.length; i++) {
+ rows.push([
+ '%02d'.format(list[i].index),
+ list[i].name,
+ this.renderEnableDisable(list[i]),
+ E('button', { 'class': 'btn cbi-button-action', 'click': L.ui.createHandlerFn(this, 'handleAction', list[i].name, 'start') }, _('Start')),
+ E('button', { 'class': 'btn cbi-button-action', 'click': L.ui.createHandlerFn(this, 'handleAction', list[i].name, 'restart') }, _('Restart')),
+ E('button', { 'class': 'btn cbi-button-action', 'click': L.ui.createHandlerFn(this, 'handleAction', list[i].name, 'stop') }, _('Stop'))
+ ]);
+ }
+
+ cbi_update_table(table, rows);
+
+ return table;
+ }
+});
+++ /dev/null
--- 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 = { }
-local handled = false
-
-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
- handled = true
- inits[section].enabled = false
- return sys.init.disable(inits[section].name)
- else
- handled = true
- 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)
- handled = true
- 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 not handled and 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