luci-mod-admin-full: fixes for usbport LED triggers
authorJo-Philipp Wich <jo@mein.io>
Mon, 30 Jan 2017 14:50:08 +0000 (15:50 +0100)
committerJo-Philipp Wich <jo@mein.io>
Wed, 1 Feb 2017 23:40:43 +0000 (00:40 +0100)
The previous commit erroneously used "ports" instead of "port" as name for the
option widget, causing wrong uci values to be written.

Also work around some cbi idiosyncrasies regarding MultiValue widgets which
prevented rendering the correct initial selection state.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/leds.lua

index 4b6f397..74e2f1a 100644 (file)
@@ -7,10 +7,11 @@ local sysfs_path = "/sys/class/leds/"
 local leds = {}
 
 local fs   = require "nixio.fs"
 local leds = {}
 
 local fs   = require "nixio.fs"
-local util = require "nixio.util"
+local nu   = require "nixio.util"
+local util = require "luci.util"
 
 if fs.access(sysfs_path) then
 
 if fs.access(sysfs_path) then
-       leds = util.consume((fs.dir(sysfs_path)))
+       leds = nu.consume((fs.dir(sysfs_path)))
 end
 
 if #leds == 0 then
 end
 
 if #leds == 0 then
@@ -110,12 +111,32 @@ function usbdev.remove(self, section)
 end
 
 
 end
 
 
-usbport = s:option(MultiValue, "ports", translate("USB Ports"))
+usbport = s:option(MultiValue, "port", translate("USB Ports"))
 usbport:depends("trigger", "usbport")
 usbport.rmempty = true
 usbport.widget = "checkbox"
 usbport:depends("trigger", "usbport")
 usbport.rmempty = true
 usbport.widget = "checkbox"
+usbport.cast = "table"
 usbport.size = 1
 
 usbport.size = 1
 
+function usbport.valuelist(self, section)
+       local port, ports = nil, {}
+       for port in util.imatch(m.uci:get("system", section, "port")) do
+               local b, n = port:match("^usb(%d+)-port(%d+)$")
+               if not (b and n) then
+                       b, n = port:match("^(%d+)-(%d+)$")
+               end
+               if b and n then
+                       ports[#ports+1] = "usb%u-port%u" %{ tonumber(b), tonumber(n) }
+               end
+       end
+       return ports
+end
+
+function usbport.validate(self, value)
+       return type(value) == "string" and { value } or value
+end
+
+
 for p in nixio.fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer") do
        local id = p:match("%d+-%d+")
        local mf = nixio.fs.readfile("/sys/bus/usb/devices/" .. id .. "/manufacturer") or "?"
 for p in nixio.fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer") do
        local id = p:match("%d+-%d+")
        local mf = nixio.fs.readfile("/sys/bus/usb/devices/" .. id .. "/manufacturer") or "?"
@@ -123,8 +144,8 @@ for p in nixio.fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer") do
        usbdev:value(id, "%s (%s - %s)" %{ id, mf, pr })
 end
 
        usbdev:value(id, "%s (%s - %s)" %{ id, mf, pr })
 end
 
-for p in nixio.fs.glob("/sys/bus/usb/devices/[0-9]*") do
-       local bus, port = p:match("(%d+)-(%d+)")
+for p in nixio.fs.glob("/sys/bus/usb/devices/*/usb[0-9]*-port[0-9]*") do
+       local bus, port = p:match("usb(%d+)-port(%d+)")
        if bus and port then
                usbport:value("usb%u-port%u" %{ tonumber(bus), tonumber(port) },
                              "Hub %u, Port %u" %{ tonumber(bus), tonumber(port) })
        if bus and port then
                usbport:value("usb%u-port%u" %{ tonumber(bus), tonumber(port) },
                              "Hub %u, Port %u" %{ tonumber(bus), tonumber(port) })