diff options
Diffstat (limited to 'modules')
12 files changed, 229 insertions, 206 deletions
diff --git a/modules/luci-base/Makefile b/modules/luci-base/Makefile index 54506b023a..26cbe0820e 100644 --- a/modules/luci-base/Makefile +++ b/modules/luci-base/Makefile @@ -12,7 +12,7 @@ LUCI_TYPE:=mod LUCI_BASENAME:=base LUCI_TITLE:=LuCI core libraries -LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2 PKG_SOURCE_URL:=https://luasrcdiet.googlecode.com/files diff --git a/modules/luci-base/luasrc/http.lua b/modules/luci-base/luasrc/http.lua index a92d8affb6..4b35731727 100644 --- a/modules/luci-base/luasrc/http.lua +++ b/modules/luci-base/luasrc/http.lua @@ -208,6 +208,7 @@ function splice(fd, size) end function redirect(url) + if url == "" then url = "/" end status(302, "Found") header("Location", url) close() diff --git a/modules/luci-base/luasrc/model/network.lua b/modules/luci-base/luasrc/model/network.lua index 20e1032760..81fc416fed 100644 --- a/modules/luci-base/luasrc/model/network.lua +++ b/modules/luci-base/luasrc/model/network.lua @@ -1,8 +1,8 @@ -- Copyright 2009-2015 Jo-Philipp Wich <jow@openwrt.org> -- Licensed to the public under the Apache License 2.0. -local type, next, pairs, ipairs, loadfile, table - = type, next, pairs, ipairs, loadfile, table +local type, next, pairs, ipairs, loadfile, table, select + = type, next, pairs, ipairs, loadfile, table, select local tonumber, tostring, math = tonumber, tostring, math @@ -16,6 +16,7 @@ local utl = require "luci.util" local dsp = require "luci.dispatcher" local uci = require "luci.model.uci" local lng = require "luci.i18n" +local jsc = require "luci.jsonc" module "luci.model.network" @@ -31,10 +32,10 @@ local _protocols = { } local _interfaces, _bridge, _switch, _tunnel local _ubusnetcache, _ubusdevcache, _ubuswificache -local _uci_real, _uci_state +local _uci function _filter(c, s, o, r) - local val = _uci_real:get(c, s, o) + local val = _uci:get(c, s, o) if val then local l = { } if type(val) == "string" then @@ -44,9 +45,9 @@ function _filter(c, s, o, r) end end if #l > 0 then - _uci_real:set(c, s, o, table.concat(l, " ")) + _uci:set(c, s, o, table.concat(l, " ")) else - _uci_real:delete(c, s, o) + _uci:delete(c, s, o) end elseif type(val) == "table" then for _, val in ipairs(val) do @@ -55,16 +56,16 @@ function _filter(c, s, o, r) end end if #l > 0 then - _uci_real:set(c, s, o, l) + _uci:set(c, s, o, l) else - _uci_real:delete(c, s, o) + _uci:delete(c, s, o) end end end end function _append(c, s, o, a) - local val = _uci_real:get(c, s, o) or "" + local val = _uci:get(c, s, o) or "" if type(val) == "string" then local l = { } for val in val:gmatch("%S+") do @@ -73,7 +74,7 @@ function _append(c, s, o, a) end end l[#l+1] = a - _uci_real:set(c, s, o, table.concat(l, " ")) + _uci:set(c, s, o, table.concat(l, " ")) elseif type(val) == "table" then local l = { } for _, val in ipairs(val) do @@ -82,7 +83,7 @@ function _append(c, s, o, a) end end l[#l+1] = a - _uci_real:set(c, s, o, l) + _uci:set(c, s, o, l) end end @@ -95,15 +96,15 @@ function _stror(s1, s2) end function _get(c, s, o) - return _uci_real:get(c, s, o) + return _uci:get(c, s, o) end function _set(c, s, o, v) if v ~= nil then if type(v) == "boolean" then v = v and "1" or "0" end - return _uci_real:set(c, s, o, v) + return _uci:set(c, s, o, v) else - return _uci_real:delete(c, s, o) + return _uci:delete(c, s, o) end end @@ -127,7 +128,7 @@ function _wifi_state(key, val, field) for radio, radiostate in pairs(_ubuswificache) do for ifc, ifcstate in pairs(radiostate.interfaces) do if ifcstate.section and ifcstate.section:sub(1, 1) == '@' then - local s = _uci_real:get_all('wireless.%s' % ifcstate.section) + local s = _uci:get_all('wireless.%s' % ifcstate.section) if s then ifcstate.section = s['.name'] end @@ -153,7 +154,7 @@ function _wifi_lookup(ifn) local num = 0 ifnidx = tonumber(ifnidx) - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) if s.device == radio then num = num + 1 @@ -166,20 +167,9 @@ function _wifi_lookup(ifn) return sid - -- looks like wifi, try to locate the section via state vars + -- looks like wifi, try to locate the section via ubus state elseif _wifi_iface(ifn) then - local sid = _wifi_state("ifname", ifn, "section") - if not sid then - _uci_state:foreach("wireless", "wifi-iface", - function(s) - if s.ifname == ifn then - sid = s['.name'] - return false - end - end) - end - - return sid + return _wifi_state("ifname", ifn, "section") end end @@ -205,8 +195,7 @@ end function init(cursor) - _uci_real = cursor or _uci_real or uci.cursor() - _uci_state = _uci_real:substate() + _uci = cursor or _uci or uci.cursor() _interfaces = { } _bridge = { } @@ -281,13 +270,13 @@ function init(cursor) end function save(self, ...) - _uci_real:save(...) - _uci_real:load(...) + _uci:save(...) + _uci:load(...) end function commit(self, ...) - _uci_real:commit(...) - _uci_real:load(...) + _uci:commit(...) + _uci:load(...) end function ifnameof(self, x) @@ -345,7 +334,7 @@ end function add_network(self, n, options) local oldnet = self:get_network(n) if n and #n > 0 and n:match("^[a-zA-Z0-9_]+$") and not oldnet then - if _uci_real:section("network", "interface", n, options) then + if _uci:section("network", "interface", n, options) then return network(n) end elseif oldnet and oldnet:is_empty() then @@ -360,7 +349,7 @@ function add_network(self, n, options) end function get_network(self, n) - if n and _uci_real:get("network", n) == "interface" then + if n and _uci:get("network", n) == "interface" then return network(n) end end @@ -369,7 +358,7 @@ function get_networks(self) local nets = { } local nls = { } - _uci_real:foreach("network", "interface", + _uci:foreach("network", "interface", function(s) nls[s['.name']] = network(s['.name']) end) @@ -383,18 +372,18 @@ function get_networks(self) end function del_network(self, n) - local r = _uci_real:delete("network", n) + local r = _uci:delete("network", n) if r then - _uci_real:delete_all("network", "alias", + _uci:delete_all("network", "alias", function(s) return (s.interface == n) end) - _uci_real:delete_all("network", "route", + _uci:delete_all("network", "route", function(s) return (s.interface == n) end) - _uci_real:delete_all("network", "route6", + _uci:delete_all("network", "route6", function(s) return (s.interface == n) end) - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) local net local rest = { } @@ -404,10 +393,10 @@ function del_network(self, n) end end if #rest > 0 then - _uci_real:set("wireless", s['.name'], "network", + _uci:set("wireless", s['.name'], "network", table.concat(rest, " ")) else - _uci_real:delete("wireless", s['.name'], "network") + _uci:delete("wireless", s['.name'], "network") end end) end @@ -417,31 +406,31 @@ end function rename_network(self, old, new) local r if new and #new > 0 and new:match("^[a-zA-Z0-9_]+$") and not self:get_network(new) then - r = _uci_real:section("network", "interface", new, _uci_real:get_all("network", old)) + r = _uci:section("network", "interface", new, _uci:get_all("network", old)) if r then - _uci_real:foreach("network", "alias", + _uci:foreach("network", "alias", function(s) if s.interface == old then - _uci_real:set("network", s['.name'], "interface", new) + _uci:set("network", s['.name'], "interface", new) end end) - _uci_real:foreach("network", "route", + _uci:foreach("network", "route", function(s) if s.interface == old then - _uci_real:set("network", s['.name'], "interface", new) + _uci:set("network", s['.name'], "interface", new) end end) - _uci_real:foreach("network", "route6", + _uci:foreach("network", "route6", function(s) if s.interface == old then - _uci_real:set("network", s['.name'], "interface", new) + _uci:set("network", s['.name'], "interface", new) end end) - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) local net local list = { } @@ -453,12 +442,12 @@ function rename_network(self, old, new) end end if #list > 0 then - _uci_real:set("wireless", s['.name'], "network", + _uci:set("wireless", s['.name'], "network", table.concat(list, " ")) end end) - _uci_real:delete("network", old) + _uci:delete("network", old) end end return r or false @@ -470,7 +459,7 @@ function get_interface(self, i) else local ifc local num = { } - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) if s.device then num[s.device] = num[s.device] and num[s.device] + 1 or 1 @@ -485,6 +474,21 @@ function get_interface(self, i) end end +local function swdev_from_board_json() + local boardinfo = jsc.parse(nfs.readfile("/etc/board.json") or "") + if type(boardinfo) == "table" and type(boardinfo.network) == "table" then + local net, val + for net, val in pairs(boardinfo.network) do + if type(val) == "table" and type(val.ifname) == "string" and + val.create_vlan == true + then + return val.ifname + end + end + end + return nil +end + function get_interfaces(self) local iface local ifaces = { } @@ -493,7 +497,7 @@ function get_interfaces(self) local baseof = { } -- find normal interfaces - _uci_real:foreach("network", "interface", + _uci:foreach("network", "interface", function(s) for iface in utl.imatch(s.ifname) do if not _iface_ignore(iface) and not _wifi_iface(iface) then @@ -510,7 +514,7 @@ function get_interfaces(self) end -- find vlan interfaces - _uci_real:foreach("network", "switch_vlan", + _uci:foreach("network", "switch_vlan", function(s) if not s.device then return @@ -526,7 +530,7 @@ function get_interfaces(self) end end if not base or not base:match("^eth%d") then - base = "eth0" + base = swdev_from_board_json() or "eth0" end else base = s.device @@ -551,7 +555,7 @@ function get_interfaces(self) -- find wifi interfaces local num = { } local wfs = { } - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) if s.device then num[s.device] = num[s.device] and num[s.device] + 1 or 1 @@ -572,7 +576,7 @@ function ignore_interface(self, x) end function get_wifidev(self, dev) - if _uci_real:get("wireless", dev) == "wifi-device" then + if _uci:get("wireless", dev) == "wifi-device" then return wifidev(dev) end end @@ -581,7 +585,7 @@ function get_wifidevs(self) local devs = { } local wfd = { } - _uci_real:foreach("wireless", "wifi-device", + _uci:foreach("wireless", "wifi-device", function(s) wfd[#wfd+1] = s['.name'] end) local dev @@ -601,9 +605,9 @@ end function add_wifinet(self, net, options) if type(options) == "table" and options.device and - _uci_real:get("wireless", options.device) == "wifi-device" + _uci:get("wireless", options.device) == "wifi-device" then - local wnet = _uci_real:section("wireless", "wifi-iface", nil, options) + local wnet = _uci:section("wireless", "wifi-iface", nil, options) return wifinet(wnet) end end @@ -611,7 +615,7 @@ end function del_wifinet(self, net) local wnet = _wifi_lookup(net) if wnet then - _uci_real:delete("wireless", wnet) + _uci:delete("wireless", wnet) return true end return false @@ -684,7 +688,7 @@ end function network(name, proto) if name then - local p = proto or _uci_real:get("network", name, "proto") + local p = proto or _uci:get("network", name, "proto") local c = p and _protocols[p] or protocol return c(name) end @@ -695,7 +699,7 @@ function protocol.__init__(self, name) end function protocol._get(self, opt) - local v = _uci_real:get("network", self.sid, opt) + local v = _uci:get("network", self.sid, opt) if type(v) == "table" then return table.concat(v, " ") end @@ -730,7 +734,7 @@ function protocol.ifname(self) end if not ifname then local num = { } - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) if s.device then num[s.device] = num[s.device] @@ -779,17 +783,21 @@ function protocol.uptime(self) end function protocol.expires(self) - local a = tonumber(_uci_state:get("network", self.sid, "lease_acquired")) - local l = tonumber(_uci_state:get("network", self.sid, "lease_lifetime")) - if a and l then - l = l - (nxo.sysinfo().uptime - a) - return l > 0 and l or 0 + local u = self:_ubus("uptime") + local d = self:_ubus("data") + + if type(u) == "number" and type(d) == "table" and + type(d.leasetime) == "number" + then + local r = (d.leasetime - (u % d.leasetime)) + return r > 0 and r or 0 end + return -1 end function protocol.metric(self) - return tonumber(_uci_state:get("network", self.sid, "metric")) or 0 + return self:_ubus("metric") or 0 end function protocol.ipaddr(self) @@ -797,6 +805,20 @@ function protocol.ipaddr(self) return addrs and #addrs > 0 and addrs[1].address end +function protocol.ipaddrs(self) + local addrs = self:_ubus("ipv4-address") + local rv = { } + + if type(addrs) == "table" then + local n, addr + for n, addr in ipairs(addrs) do + rv[#rv+1] = "%s/%d" %{ addr.address, addr.mask } + end + end + + return rv +end + function protocol.netmask(self) local addrs = self:_ubus("ipv4-address") return addrs and #addrs > 0 and @@ -835,6 +857,28 @@ function protocol.ip6addr(self) end end +function protocol.ip6addrs(self) + local addrs = self:_ubus("ipv6-address") + local rv = { } + local n, addr + + if type(addrs) == "table" then + for n, addr in ipairs(addrs) do + rv[#rv+1] = "%s/%d" %{ addr.address, addr.mask } + end + end + + addrs = self:_ubus("ipv6-prefix-assignment") + + if type(addrs) == "table" then + for n, addr in ipairs(addrs) do + rv[#rv+1] = "%s1/%d" %{ addr.address, addr.mask } + end + end + + return rv +end + function protocol.gw6addr(self) local _, route for _, route in ipairs(self:_ubus("route") or { }) do @@ -885,7 +929,7 @@ function protocol.is_empty(self) rv = false end - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) local n for n in utl.imatch(s.network) do @@ -937,12 +981,12 @@ function protocol.get_interface(self) else local ifn = nil local num = { } - for ifn in utl.imatch(_uci_real:get("network", self.sid, "ifname")) do + for ifn in utl.imatch(_uci:get("network", self.sid, "ifname")) do ifn = ifn:match("^[^:/]+") return ifn and interface(ifn, self) end ifn = nil - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) if s.device then num[s.device] = num[s.device] and num[s.device] + 1 or 1 @@ -977,7 +1021,7 @@ function protocol.get_interfaces(self) local num = { } local wfs = { } - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) if s.device then num[s.device] = num[s.device] and num[s.device] + 1 or 1 @@ -1020,7 +1064,7 @@ function protocol.contains_interface(self, ifname) local wif = _wifi_lookup(ifname) if wif then local n - for n in utl.imatch(_uci_real:get("wireless", wif, "network")) do + for n in utl.imatch(_uci:get("wireless", wif, "network")) do if n == self.sid then return true end @@ -1066,7 +1110,8 @@ function interface.name(self) end function interface.mac(self) - return (self:_ubus("macaddr") or "00:00:00:00:00:00"):upper() + local mac = self:_ubus("macaddr") + return mac and mac:upper() end function interface.ipaddrs(self) @@ -1278,22 +1323,11 @@ function wifidev.is_up(self) return (_ubuswificache[self.sid].up == true) end - local up = false - _uci_state:foreach("wireless", "wifi-iface", - function(s) - if s.device == self.sid then - if s.up == "1" then - up = true - return false - end - end - end) - - return up + return false end function wifidev.get_wifinet(self, net) - if _uci_real:get("wireless", net) == "wifi-iface" then + if _uci:get("wireless", net) == "wifi-iface" then return wifinet(net) else local wnet = _wifi_lookup(net) @@ -1306,7 +1340,7 @@ end function wifidev.get_wifinets(self) local nets = { } - _uci_real:foreach("wireless", "wifi-iface", + _uci:foreach("wireless", "wifi-iface", function(s) if s.device == self.sid then nets[#nets+1] = wifinet(s['.name']) @@ -1320,7 +1354,7 @@ function wifidev.add_wifinet(self, options) options = options or { } options.device = self.sid - local wnet = _uci_real:section("wireless", "wifi-iface", nil, options) + local wnet = _uci:section("wireless", "wifi-iface", nil, options) if wnet then return wifinet(wnet, options) end @@ -1329,12 +1363,12 @@ end function wifidev.del_wifinet(self, net) if utl.instanceof(net, wifinet) then net = net.sid - elseif _uci_real:get("wireless", net) ~= "wifi-iface" then + elseif _uci:get("wireless", net) ~= "wifi-iface" then net = _wifi_lookup(net) end - if net and _uci_real:get("wireless", net, "device") == self.sid then - _uci_real:delete("wireless", net) + if net and _uci:get("wireless", net, "device") == self.sid then + _uci:delete("wireless", net) return true end @@ -1347,26 +1381,58 @@ wifinet = utl.class() function wifinet.__init__(self, net, data) self.sid = net + local n = 0 local num = { } - local netid - _uci_real:foreach("wireless", "wifi-iface", + local netid, sid + _uci:foreach("wireless", "wifi-iface", function(s) + n = n + 1 if s.device then num[s.device] = num[s.device] and num[s.device] + 1 or 1 if s['.name'] == self.sid then + sid = "@wifi-iface[%d]" % n netid = "%s.network%d" %{ s.device, num[s.device] } return false end end end) + if sid then + local _, k, r, i + for k, r in pairs(_ubuswificache) do + if type(r) == "table" and + type(r.interfaces) == "table" + then + for _, i in ipairs(r.interfaces) do + if type(i) == "table" and i.section == sid then + self._ubusdata = { + radio = k, + dev = r, + net = i + } + end + end + end + end + end + local dev = _wifi_state("section", self.sid, "ifname") or netid self.netid = netid self.wdev = dev self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { } - self.iwdata = data or _uci_state:get_all("wireless", self.sid) or - _uci_real:get_all("wireless", self.sid) or { } +end + +function wifinet.ubus(self, ...) + local n, v = self._ubusdata + for n = 1, select('#', ...) do + if type(v) == "table" then + v = v[select(n, ...)] + else + return nil + end + end + return v end function wifinet.get(self, opt) @@ -1378,19 +1444,23 @@ function wifinet.set(self, opt, val) end function wifinet.mode(self) - return _uci_state:get("wireless", self.sid, "mode") or "ap" + return self:ubus("net", "config", "mode") or self:get("mode") or "ap" end function wifinet.ssid(self) - return _uci_state:get("wireless", self.sid, "ssid") + return self:ubus("net", "config", "ssid") or self:get("ssid") end function wifinet.bssid(self) - return _uci_state:get("wireless", self.sid, "bssid") + return self:ubus("net", "config", "bssid") or self:get("bssid") end function wifinet.network(self) - return _uci_state:get("wifinet", self.sid, "network") + local net, networks = nil, { } + for net in utl.imatch(self:ubus("net", "config", "network") or self:get("network")) do + networks[#networks+1] = net + end + return networks end function wifinet.id(self) @@ -1402,7 +1472,7 @@ function wifinet.name(self) end function wifinet.ifname(self) - local ifname = self.iwinfo.ifname + local ifname = self:ubus("net", "ifname") or self.iwinfo.ifname if not ifname or ifname:match("^wifi%d") or ifname:match("^radio%d") then ifname = self.wdev end @@ -1410,9 +1480,8 @@ function wifinet.ifname(self) end function wifinet.get_device(self) - if self.iwdata.device then - return wifidev(self.iwdata.device) - end + local dev = self:ubus("radio") or self:get("device") + return dev and wifidev(dev) or nil end function wifinet.is_up(self) @@ -1421,7 +1490,7 @@ function wifinet.is_up(self) end function wifinet.active_mode(self) - local m = _stror(self.iwdata.mode, self.iwinfo.mode) or "ap" + local m = self.iwinfo.mode or self:ubus("net", "config", "mode") or self:get("mode") or "ap" if m == "ap" then m = "Master" elseif m == "sta" then m = "Client" @@ -1438,11 +1507,11 @@ function wifinet.active_mode_i18n(self) end function wifinet.active_ssid(self) - return _stror(self.iwdata.ssid, self.iwinfo.ssid) + return self.iwinfo.ssid or self:ubus("net", "config", "ssid") or self:get("ssid") end function wifinet.active_bssid(self) - return _stror(self.iwdata.bssid, self.iwinfo.bssid) or "00:00:00:00:00:00" + return self.iwinfo.bssid or self:ubus("net", "config", "bssid") or self:get("bssid") end function wifinet.active_encryption(self) @@ -1469,8 +1538,8 @@ function wifinet.bitrate(self) end function wifinet.channel(self) - return self.iwinfo.channel or - tonumber(_uci_state:get("wireless", self.iwdata.device, "channel")) + return self.iwinfo.channel or self:ubus("dev", "config", "channel") or + tonumber(self:get("channel")) end function wifinet.signal(self) @@ -1482,7 +1551,7 @@ function wifinet.noise(self) end function wifinet.country(self) - return self.iwinfo.country or "00" + return self.iwinfo.country or self:ubus("dev", "config", "country") or "00" end function wifinet.txpower(self) @@ -1548,8 +1617,8 @@ end function wifinet.get_networks(self) local nets = { } local net - for net in utl.imatch(tostring(self.iwdata.network)) do - if _uci_real:get("network", net) == "interface" then + for net in utl.imatch(self:ubus("net", "config", "network") or self:get("network")) do + if _uci:get("network", net) == "interface" then nets[#nets+1] = network(net) end end diff --git a/modules/luci-base/luasrc/model/uci.luadoc b/modules/luci-base/luasrc/model/uci.luadoc index 80464f7cec..7591b68b02 100644 --- a/modules/luci-base/luasrc/model/uci.luadoc +++ b/modules/luci-base/luasrc/model/uci.luadoc @@ -235,12 +235,18 @@ Saves changes made to a config to make them committable. ---[[ Set a value or create a named section. +When invoked with three arguments `config`, `sectionname`, `sectiontype`, +then a named section of the given type is created. + +When invoked with four arguments `config`, `sectionname`, `optionname` and +`optionvalue` then the value of the specified option is set to the given value. + @class function @name Cursor.set @param config UCI config @param section UCI section name @param option UCI option or UCI section type -@param value UCI value or nil if you want to create a section +@param value UCI value or nothing if you want to create a section @return Boolean whether operation succeeded ]] diff --git a/modules/luci-base/luasrc/util.lua b/modules/luci-base/luasrc/util.lua index dcf8230b3e..787bc66f90 100644 --- a/modules/luci-base/luasrc/util.lua +++ b/modules/luci-base/luasrc/util.lua @@ -9,6 +9,7 @@ local ldebug = require "luci.debug" local string = require "string" local coroutine = require "coroutine" local tparser = require "luci.template.parser" +local json = require "luci.jsonc" local _ubus = require "ubus" local _ubus_connection = nil @@ -600,55 +601,11 @@ function ubus(object, method, data) end function serialize_json(x, cb) - local rv, push = nil, cb - if not push then - rv = { } - push = function(tok) rv[#rv+1] = tok end - end - - if x == nil then - push("null") - elseif type(x) == "table" then - -- test if table is array like - local k, v - local n1, n2 = 0, 0 - for k in pairs(x) do n1 = n1 + 1 end - for k in ipairs(x) do n2 = n2 + 1 end - - if n1 == n2 and n1 > 0 then - push("[") - for k = 1, n2 do - if k > 1 then - push(",") - end - serialize_json(x[k], push) - end - push("]") - else - push("{") - for k, v in pairs(x) do - push("%q:" % tostring(k)) - serialize_json(v, push) - if next(x, k) then - push(",") - end - end - push("}") - end - elseif type(x) == "number" or type(x) == "boolean" then - if (x ~= x) then - -- NaN is the only value that doesn't equal to itself. - push("Number.NaN") - else - push(tostring(x)) - end + local js = json.stringify(x) + if type(cb) == "function" then + cb(js) else - push('"%s"' % tostring(x):gsub('["%z\1-\31\\]', - function(c) return '\\u%04x' % c:byte(1) end)) - end - - if not cb then - return table.concat(rv, "") + return js end end diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua index 879e54b249..aa533cb70b 100644 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua +++ b/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua @@ -235,6 +235,8 @@ function iface_status(ifaces) proto = net:proto(), uptime = net:uptime(), gwaddr = net:gwaddr(), + ipaddrs = net:ipaddrs(), + ip6addrs = net:ip6addrs(), dnsaddrs = net:dnsaddrs(), name = device:shortname(), type = device:type(), @@ -246,29 +248,9 @@ function iface_status(ifaces) rx_packets = device:rx_packets(), tx_packets = device:tx_packets(), - ipaddrs = { }, - ip6addrs = { }, subdevices = { } } - local _, a - for _, a in ipairs(device:ipaddrs()) do - data.ipaddrs[#data.ipaddrs+1] = { - addr = a:host():string(), - netmask = a:mask():string(), - prefix = a:prefix() - } - end - for _, a in ipairs(device:ip6addrs()) do - if not a:is6linklocal() then - data.ip6addrs[#data.ip6addrs+1] = { - addr = a:host():string(), - netmask = a:mask():string(), - prefix = a:prefix() - } - end - end - for _, device in ipairs(net:get_interfaces() or {}) do data.subdevices[#data.subdevices+1] = { name = device:shortname(), diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua index da1e140de0..e48e3b4bdf 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua @@ -17,7 +17,12 @@ newnet = m:field(Value, "_netname", translate("Name of the new interface"), newnet:depends("_attach", "") newnet.default = arg[1] and "net_" .. arg[1]:gsub("[^%w_]+", "_") -newnet.datatype = "uciname" +newnet.datatype = "and(uciname,maxlength(15))" + +advice = m:field(DummyValue, "d1", translate("Note: interface name length"), + translate("Maximum length of the name is 15 characters including " .. + "the automatic protocol/bridge prefix (br-, 6in4-, pppoe- etc.)" + )) newproto = m:field(ListValue, "_netproto", translate("Protocol of the new interface")) diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua index 40f8014f1a..ce3c3ef325 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua @@ -107,6 +107,12 @@ m.uci:foreach("network", "switch", local sp = s:option(ListValue, "mirror_source_port", translate("Mirror source port")) local mp = s:option(ListValue, "mirror_monitor_port", translate("Mirror monitor port")) + sp:depends("enable_mirror_tx", "1") + sp:depends("enable_mirror_rx", "1") + + mp:depends("enable_mirror_tx", "1") + mp:depends("enable_mirror_rx", "1") + local pt for pt = 0, num_ports - 1 do local name diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua index 9a2bd5d201..b91c29b088 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua @@ -361,7 +361,8 @@ s:tab("encryption", translate("Wireless Security")) s:tab("macfilter", translate("MAC-Filter")) s:tab("advanced", translate("Advanced Settings")) -s:taboption("general", Value, "ssid", translate("<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>")) +ssid = s:taboption("general", Value, "ssid", translate("<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>")) +ssid.datatype = "maxlength(32)" mode = s:taboption("general", ListValue, "mode", translate("Mode")) mode.override_values = true diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua index 2652e00f25..f5751673fd 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua @@ -112,7 +112,7 @@ o.default = [[ mkdir -p /tmp/extroot mount --bind / /tmp/introot mount /dev/sda1 /tmp/extroot -tar -C /tmp/intproot -cvf - . | tar -C /tmp/extroot -xf - +tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf - umount /tmp/introot umount /tmp/extroot</pre> ]] %{ diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm index 9a77f89106..b222cbca18 100644 --- a/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm +++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm @@ -135,7 +135,7 @@ html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime); } - if (ifc.type != 'tunnel') + if (ifc.macaddr) { html += String.format('<strong><%:MAC-Address%>:</strong> %s<br />', ifc.macaddr); } @@ -153,10 +153,9 @@ for (var i = 0; i < ifc.ipaddrs.length; i++) html += String.format( - '%s%s/%d', + '%s%s', i ? ', ' : '', - ifc.ipaddrs[i].addr, - ifc.ipaddrs[i].prefix + ifc.ipaddrs[i] ); html += '<br />'; @@ -168,10 +167,9 @@ for (var i = 0; i < ifc.ip6addrs.length; i++) html += String.format( - '%s%s/%d', + '%s%s', i ? ', ' : '', - ifc.ip6addrs[i].addr.toUpperCase(), - ifc.ip6addrs[i].prefix + ifc.ip6addrs[i].toUpperCase() ); html += '<br />'; @@ -250,7 +248,7 @@ <input type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', true)" title="<%:Reconnect this interface%>" value="<%:Connect%>" /> <input type="button" class="cbi-button cbi-button-reset" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', false)" title="<%:Shutdown this interface%>" value="<%:Stop%>" /> <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" /> - <input type="submit" class="cbi-button cbi-button-remove" style="width:100px" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" /> + <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" /> </td> </tr> <% end %> diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm index 1ebdbfcfb4..94d9e88117 100644 --- a/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm +++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm @@ -25,7 +25,7 @@ html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime); } - if (ifc.type != 'tunnel') + if (ifc.macaddr) { html += String.format('<strong><%:MAC-Address%>:</strong> %s<br />', ifc.macaddr); } @@ -43,10 +43,9 @@ for (var i = 0; i < ifc.ipaddrs.length; i++) html += String.format( - '%s%s/%d', + '%s%s', i ? ', ' : '', - ifc.ipaddrs[i].addr, - ifc.ipaddrs[i].prefix + ifc.ipaddrs[i] ); html += '<br />'; @@ -58,10 +57,9 @@ for (var i = 0; i < ifc.ip6addrs.length; i++) html += String.format( - '%s%s/%d', + '%s%s', i ? ', ' : '', - ifc.ip6addrs[i].addr.toUpperCase(), - ifc.ip6addrs[i].prefix + ifc.ip6addrs[i].toUpperCase() ); html += '<br />'; |