From 638f5ce071f229fb0c11456a0b59d425179ab288 Mon Sep 17 00:00:00 2001 From: Florian Eckert Date: Thu, 20 Feb 2020 12:04:12 +0100 Subject: luci-mod-system: add led plugin infrastructure This commit creates the possibility that not only kernel-led-triggers can be selected but also application-led-triggers from user space. This is done via a plugin mechanism. The application-led-triggers are scripts that set kernel-led-triggers on system events or services. Until now this has not been possible. The package rssileds is a kind of application-led-trigger. The following new packages are added: * luci-app-ledtrig-rssi (application-led-trigger) * luci-app-ledtrig-switch (kernel-led-trigger) not needed on every most devices * luci-app-ledtrig-usport (kernel-led-trigger) optional trigger Since we have now a plugin mechanism I have added the following triggers as a dependency. So this triggers are now installed per default on LuCI installation. * kmod-ledtrig-default-on * kmod-ledtrig-heartbeat * kmod-ledtrig-netdev * kmod-ledtrig-timer The kernel trigger kmod-ledtrig-usbdev was removed with the commit https://github.com/openwrt/openwrt/commit/d0b50c2770a0e2d54b37153f2801e2e7dc865fa6 So I have not ported the relevant code anymore. Signed-off-by: Florian Eckert --- .../view/system/led-trigger/default-on.js | 20 +++ .../resources/view/system/led-trigger/heartbeat.js | 9 ++ .../resources/view/system/led-trigger/netdev.js | 26 +++ .../resources/view/system/led-trigger/none.js | 9 ++ .../resources/view/system/led-trigger/timer.js | 18 +++ .../luci-static/resources/view/system/leds.js | 178 ++++++--------------- 6 files changed, 135 insertions(+), 125 deletions(-) create mode 100644 modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js create mode 100644 modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js create mode 100644 modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js create mode 100644 modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js create mode 100644 modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js (limited to 'modules/luci-mod-system/htdocs') diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js new file mode 100644 index 0000000000..6ccc70ac27 --- /dev/null +++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js @@ -0,0 +1,20 @@ +'use strict'; +'require form'; + +return L.Class.extend({ + trigger: _('default-on (kernel)'), + kernel: true, + addFormOptions(s){ + var o; + + o = s.option(form.Flag, 'default', _('Default state')); + o.rmempty = false; + o.depends('trigger', 'default-on'); + o.textvalue = function(section_id) { + var cval = this.cfgvalue(section_id); + if (cval == null) + cval = this.default; + return (cval == this.enabled) ? _('On') : _('Off'); + }; + } +}); diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js new file mode 100644 index 0000000000..7495843baa --- /dev/null +++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js @@ -0,0 +1,9 @@ +'use strict'; + +return L.Class.extend({ + trigger: _('heartbeat (kernel)'), + kernel: true, + addFormOptions(s){ + var o; + } +}); diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js new file mode 100644 index 0000000000..dad631b533 --- /dev/null +++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js @@ -0,0 +1,26 @@ +'use strict'; +'require form'; +'require tools.widgets as widgets'; + +return L.Class.extend({ + trigger: _("netdev (kernel)"), + kernel: true, + addFormOptions(s){ + var o; + + o = s.option(widgets.DeviceSelect, '_net_dev', _('Device')); + o.rmempty = true; + o.ucioption = 'dev'; + o.modalonly = true; + o.noaliases = true; + o.depends('trigger', 'netdev'); + + o = s.option(form.MultiValue, 'mode', _('Trigger Mode')); + o.rmempty = true; + o.modalonly = true; + o.depends('trigger', 'netdev'); + o.value('link', _('Link On')); + o.value('tx', _('Transmit')); + o.value('rx', _('Receive')); + } +}); diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js new file mode 100644 index 0000000000..31fed55458 --- /dev/null +++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js @@ -0,0 +1,9 @@ +'use strict'; + +return L.Class.extend({ + trigger: _('none (kernel)'), + kernel: true, + addFormOptions(s){ + var o; + } +}); diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js new file mode 100644 index 0000000000..23ddd6d906 --- /dev/null +++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js @@ -0,0 +1,18 @@ +'use strict'; +'require form'; + +return L.Class.extend({ + trigger: _('timer (kernel)'), + kernel: true, + addFormOptions(s){ + var o; + + o = s.option(form.Value, 'delayon', _('On-State Delay')); + o.modalonly = true; + o.depends('trigger', 'timer'); + + o = s.option(form.Value, 'delayoff', _('Off-State Delay')); + o.modalonly = true; + o.depends('trigger', 'timer'); + } +}); diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js index edd4a24e06..849ead9528 100644 --- a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js +++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js @@ -2,39 +2,56 @@ 'require uci'; 'require rpc'; 'require form'; -'require tools.widgets as widgets'; +'require fs'; -var callLeds, callUSB; - -callLeds = rpc.declare({ +var callLeds = rpc.declare({ object: 'luci', method: 'getLEDs', expect: { '': {} } }); -callUSB = rpc.declare({ - object: 'luci', - method: 'getUSBDevices', - expect: { '': {} } -}); - return L.view.extend({ load: function() { return Promise.all([ callLeds(), - callUSB() - ]); + L.resolveDefault(fs.list('/www' + L.resource('view/system/led-trigger')), []) + ]).then(function(data) { + var plugins = data[1]; + var tasks = []; + + for (var i = 0; i < plugins.length; i++) { + var m = plugins[i].name.match(/^(.+)\.js$/); + + if (plugins[i].type != 'file' || m == null) + continue; + + tasks.push(L.require('view.system.led-trigger.' + m[1]).then(L.bind(function(name){ + return L.resolveDefault(L.require('view.system.led-trigger.' + name)).then(function(form) { + return { + name: name, + form: form, + }; + }); + }, this, m[1]))); + } + + return Promise.all(tasks).then(function(plugins) { + var value = {}; + value[0] = data[0]; + value[1] = plugins; + return value; + }); + }); }, - render: function(results) { - var leds = results[0], - usb = results[1], - triggers = {}, - m, s, o; + render: function(data) { + var m, s, o, triggers = []; + var leds = data[0]; + var plugins = data[1]; for (var k in leds) for (var i = 0; i < leds[k].triggers.length; i++) - triggers[leds[k].triggers[i]] = true; + triggers[i] = leds[k].triggers[i]; m = new form.Map('system', _('LED Configuration'), @@ -49,117 +66,28 @@ return L.view.extend({ s.option(form.Value, 'name', _('Name')); o = s.option(form.ListValue, 'sysfs', _('LED Name')); - Object.keys(leds).sort().forEach(function(name) { o.value(name) }); - - o = s.option(form.Flag, 'default', _('Default state')); - o.rmempty = false; - o.textvalue = function(section_id) { - var cval = this.cfgvalue(section_id); - - if (cval == null) - cval = this.default; - - return (cval == this.enabled) ? _('On') : _('Off'); - }; + Object.keys(leds).sort().forEach(function(name) { + o.value(name) + }); o = s.option(form.ListValue, 'trigger', _('Trigger')); - if (usb.devices && usb.devices.length) - triggers['usbdev'] = true; - if (usb.ports && usb.ports.length) - triggers['usbport'] = true; - Object.keys(triggers).sort().forEach(function(t) { o.value(t, t.replace(/-/g, '')) }); - - o = s.option(form.Value, 'delayon', _('On-State Delay')); - o.modalonly = true; - o.depends('trigger', 'timer'); - - o = s.option(form.Value, 'delayoff', _('Off-State Delay')); - o.modalonly = true; - o.depends('trigger', 'timer'); - - o = s.option(widgets.DeviceSelect, '_net_dev', _('Device')); - o.rmempty = true; - o.ucioption = 'dev'; - o.modalonly = true; - o.noaliases = true; - o.depends('trigger', 'netdev'); - o.remove = function(section_id) { - var topt = this.map.lookupOption('trigger', section_id), - tval = topt ? topt[0].formvalue(section_id) : null; - - if (tval != 'netdev' && tval != 'usbdev') - uci.unset('system', section_id, 'dev'); - }; - - o = s.option(form.MultiValue, 'mode', _('Trigger Mode')); - o.rmempty = true; - o.modalonly = true; - o.depends('trigger', 'netdev'); - o.value('link', _('Link On')); - o.value('tx', _('Transmit')); - o.value('rx', _('Receive')); - - if (usb.devices && usb.devices.length) { - o = s.option(form.ListValue, '_usb_dev', _('USB Device')); - o.depends('trigger', 'usbdev'); - o.rmempty = true; - o.ucioption = 'dev'; - o.modalonly = true; - o.remove = function(section_id) { - var topt = this.map.lookupOption('trigger', section_id), - tval = topt ? topt[0].formvalue(section_id) : null; - - if (tval != 'netdev' && tval != 'usbdev') - uci.unset('system', section_id, 'dev'); - } - o.value(''); - usb.devices.forEach(function(usbdev) { - o.value(usbdev.id, '%s (%s - %s)'.format(usbdev.id, usbdev.vendor || '?', usbdev.product || '?')); - }); - } - - if (usb.ports && usb.ports.length) { - o = s.option(form.MultiValue, 'port', _('USB Ports')); - o.depends('trigger', 'usbport'); - o.rmempty = true; - o.modalonly = true; - o.cfgvalue = function(section_id) { - var ports = [], - value = uci.get('system', section_id, 'port'); - - if (!Array.isArray(value)) - value = String(value || '').split(/\s+/); - - for (var i = 0; i < value.length; i++) - if (value[i].match(/^(\d+)-(\d+)$/)) - ports.push('usb%d-port%d'.format(Regexp.$1, Regexp.$2)); - else - ports.push(value[i]); - - return ports; - }; - usb.ports.forEach(function(usbport) { - var dev = (usbport.device && Array.isArray(usb.devices)) - ? usb.devices.filter(function(d) { return d.id == usbport.device })[0] : null; - - var label = _('Port %s').format(usbport.port); - - if (dev) - label += ' (%s - %s)'.format(dev.vendor || '?', dev.product || '?'); - - o.value(usbport.port, label); - }); + for (var i = 0; i < plugins.length; i++) { + var plugin = plugins[i]; + + if ( plugin.form.kernel == false ) + o.value(plugin.name, plugin.form.trigger); + else + for (var k = 0; k < triggers.length; k++) + if ( plugin.name == triggers[k] ) + o.value(plugin.name, plugin.form.trigger); } - o = s.option(form.Value, 'port_mask', _('Switch Port Mask')); - o.modalonly = true; - o.depends('trigger', 'switch0'); - o.depends('trigger', 'switch1'); - - o = s.option(form.Value, 'speed_mask', _('Switch Speed Mask')); - o.modalonly = true; - o.depends('trigger', 'switch0'); - o.depends('trigger', 'switch1'); + s.addModalOptions = function(s) { + for (var i = 0; i < plugins.length; i++) { + var plugin = plugins[i]; + plugin.form.addFormOptions(s); + } + }; return m.render(); } -- cgit v1.2.3