From df9fa32d580b80e3ade0e5502864aa6650eafa4a Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 14 May 2021 21:08:27 +0200 Subject: [PATCH 1/4] gluon-web-model: add state tracking to sections This add support for a write() method on sections, in addition to the value and form level write(). write() is only called when the section is valid and visible. In addition, write() is empty by default, so it can be overridden more easily. --- .../usr/lib/lua/gluon/web/model/classes.lua | 59 ++++++++----------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua index 07c9ef5e..2ec0d71f 100644 --- a/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua +++ b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua @@ -53,6 +53,7 @@ function Node:__init__(name, title, description) self.name = name self.index = nil self.parent = nil + self.state = M.FORM_NODATA self.package = 'gluon-web-model' end @@ -73,17 +74,32 @@ function Node:id() end function Node:reset_node() + self.state = M.FORM_NODATA for _, child in ipairs(self.children) do child:reset_node() end end function Node:parse(http) + self.state = M.FORM_VALID for _, child in ipairs(self.children) do child:parse(http) end end +function Node:propagate_state() + if self.state == M.FORM_NODATA then + return + end + + for _, child in ipairs(self.children) do + child:propagate_state() + if child.state == M.FORM_INVALID then + self.state = M.FORM_INVALID + end + end +end + function Node:render(renderer, scope) if self.template then local env = setmetatable({ @@ -158,9 +174,16 @@ function Node:resolve_node_depends() return true end +-- will be overridden: write(value) +function Node:write() +end + function Node:handle() - for _, node in ipairs(self.children) do - node:handle() + if self.state == M.FORM_VALID then + for _, node in ipairs(self.children) do + node:handle() + end + self:write(self.data) end end @@ -187,7 +210,6 @@ function AbstractValue:__init__(...) self.template = "model/valuewrapper" self.error = false - self.state = M.FORM_NODATA end function AbstractValue:defaultvalue() @@ -250,16 +272,6 @@ function AbstractValue:validate() end -function AbstractValue:handle() - if self.state == M.FORM_VALID then - self:write(self.data) - end -end - --- will be overridden: write(value) -function AbstractValue:write() -end - local Value = class(AbstractValue) M.Value = Value @@ -438,26 +450,7 @@ function Form:parse(http) while self:resolve_depends() do end - for _, s in ipairs(self.children) do - for _, v in ipairs(s.children) do - if v.state == M.FORM_INVALID then - self.state = M.FORM_INVALID - return - end - end - end - - self.state = M.FORM_VALID -end - -function Form:handle() - if self.state == M.FORM_VALID then - Node.handle(self) - self:write() - end -end - -function Form:write() + self:propagate_state() end function Form:section(t, ...) From 16fab561db51c0042de011fe3b562ece1bc9971c Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 14 May 2021 23:30:14 +0200 Subject: [PATCH 2/4] gluon-config-mode-mesh-vpn: override Section:write() instead of Section:handle() --- .../luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package/gluon-config-mode-mesh-vpn/luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua b/package/gluon-config-mode-mesh-vpn/luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua index 84482bb8..6fca9d08 100644 --- a/package/gluon-config-mode-mesh-vpn/luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua +++ b/package/gluon-config-mode-mesh-vpn/luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua @@ -58,8 +58,7 @@ return function(form, uci) uci:set("gluon", "mesh_vpn", "limit_egress", data * 1000) end - function s:handle() - Section.handle(s) + function s:write() uci:save('gluon') os.execute('exec /lib/gluon/mesh-vpn/update-config') end From 42335a07c9e5d6068dd1448f5c4080a19b89b51a Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 14 May 2021 18:41:15 +0200 Subject: [PATCH 3/4] gluon-config-mode-core: unconditionally run gluon-reconfigure Simplify the individual form providers by always running reconfigure. This also commits all UCI packages, so we can remove all tracking of UCI sections from the wizard code. Instead of returning a list of packages to commit, the providers just save their settings directly. Explicit runs of upgrade scripts are removed, as they are now run by reconfigure. --- .../config-mode/wizard/0500-contact-info.lua | 3 +- .../model/gluon-config-mode/wizard.lua | 35 +++---------------- .../config-mode/wizard/0200-domain-select.lua | 16 ++------- .../config-mode/wizard/0400-geo-location.lua | 4 ++- .../config-mode/wizard/0100-hostname.lua | 3 +- .../config-mode/wizard/0300-mesh-vpn.lua | 3 -- .../gluon/config-mode/wizard/0250-outdoor.lua | 4 --- 7 files changed, 12 insertions(+), 56 deletions(-) diff --git a/package/gluon-config-mode-contact-info/luasrc/lib/gluon/config-mode/wizard/0500-contact-info.lua b/package/gluon-config-mode-contact-info/luasrc/lib/gluon/config-mode/wizard/0500-contact-info.lua index a47b6043..357d966e 100644 --- a/package/gluon-config-mode-contact-info/luasrc/lib/gluon/config-mode/wizard/0500-contact-info.lua +++ b/package/gluon-config-mode-contact-info/luasrc/lib/gluon/config-mode/wizard/0500-contact-info.lua @@ -21,7 +21,6 @@ return function(form, uci) o.optional = true function o:write(data) uci:set("gluon-node-info", owner, "contact", data) + uci:save("gluon-node-info") end - - return {'gluon-node-info'} end diff --git a/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/model/gluon-config-mode/wizard.lua b/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/model/gluon-config-mode/wizard.lua index d32b56ac..882b61d9 100644 --- a/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/model/gluon-config-mode/wizard.lua +++ b/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/model/gluon-config-mode/wizard.lua @@ -1,15 +1,6 @@ local util = require "gluon.util" local uci = require("simple-uci").cursor() - -local wizard = {} -for _, entry in ipairs(util.glob('/lib/gluon/config-mode/wizard/*')) do - local f = assert(loadfile(entry)) - setfenv(f, getfenv()) - local w = f() - table.insert(wizard, w) -end - local f = Form(translate("Welcome!")) f.submit = translate('Save & restart') f.reset = false @@ -18,21 +9,10 @@ local s = f:section(Section) s.template = "wizard/welcome" s.package = "gluon-config-mode-core" -local commit = {'gluon-setup-mode'} -local run = {} - -for _, w in ipairs(wizard) do - for _, c in ipairs(w(f, uci) or {}) do - if type(c) == 'string' then - if not util.contains(commit, c) then - table.insert(commit, c) - end - elseif type(c) == 'function' then - table.insert(run, c) - else - error('invalid wizard module return') - end - end +for _, entry in ipairs(util.glob('/lib/gluon/config-mode/wizard/*')) do + local section = assert(loadfile(entry)) + setfenv(section, getfenv()) + section()(f, uci) end function f:write() @@ -41,12 +21,7 @@ function f:write() uci:set("gluon-setup-mode", uci:get_first("gluon-setup-mode", "setup_mode"), "configured", true) - for _, c in ipairs(commit) do - uci:commit(c) - end - for _, r in ipairs(run) do - r() - end + os.execute('gluon-reconfigure') f.template = "wizard/reboot" f.package = "gluon-config-mode-core" diff --git a/package/gluon-config-mode-domain-select/luasrc/lib/gluon/config-mode/wizard/0200-domain-select.lua b/package/gluon-config-mode-domain-select/luasrc/lib/gluon/config-mode/wizard/0200-domain-select.lua index 14ba4c63..72c3529e 100644 --- a/package/gluon-config-mode-domain-select/luasrc/lib/gluon/config-mode/wizard/0200-domain-select.lua +++ b/package/gluon-config-mode-domain-select/luasrc/lib/gluon/config-mode/wizard/0200-domain-select.lua @@ -49,20 +49,8 @@ return function(form, uci) o:value(domain.domain_code, domain.domain_name) end - local domain_changed = false - function o:write(data) - if data ~= selected_domain then - domain_changed = true - uci:set('gluon', 'core', 'domain', data) - end + uci:set('gluon', 'core', 'domain', data) + uci:save('gluon') end - - local function reconfigure() - if domain_changed then - os.execute('gluon-reconfigure') - end - end - - return {'gluon', reconfigure} end diff --git a/package/gluon-config-mode-geo-location/luasrc/lib/gluon/config-mode/wizard/0400-geo-location.lua b/package/gluon-config-mode-geo-location/luasrc/lib/gluon/config-mode/wizard/0400-geo-location.lua index 04ebf63a..5287e4fb 100644 --- a/package/gluon-config-mode-geo-location/luasrc/lib/gluon/config-mode/wizard/0400-geo-location.lua +++ b/package/gluon-config-mode-geo-location/luasrc/lib/gluon/config-mode/wizard/0400-geo-location.lua @@ -100,5 +100,7 @@ return function(form, uci) end end - return {'gluon-node-info'} + function s:write() + uci:save("gluon-node-info") + end end diff --git a/package/gluon-config-mode-hostname/luasrc/lib/gluon/config-mode/wizard/0100-hostname.lua b/package/gluon-config-mode-hostname/luasrc/lib/gluon/config-mode/wizard/0100-hostname.lua index 1c9a0af3..5f31dd8f 100644 --- a/package/gluon-config-mode-hostname/luasrc/lib/gluon/config-mode/wizard/0100-hostname.lua +++ b/package/gluon-config-mode-hostname/luasrc/lib/gluon/config-mode/wizard/0100-hostname.lua @@ -30,7 +30,6 @@ return function(form, uci) function o:write(data) pretty_hostname.set(uci, data or default_hostname) + uci:save('system') end - - return {'system'} end diff --git a/package/gluon-config-mode-mesh-vpn/luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua b/package/gluon-config-mode-mesh-vpn/luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua index 6fca9d08..70a1307b 100644 --- a/package/gluon-config-mode-mesh-vpn/luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua +++ b/package/gluon-config-mode-mesh-vpn/luasrc/lib/gluon/config-mode/wizard/0300-mesh-vpn.lua @@ -60,8 +60,5 @@ return function(form, uci) function s:write() uci:save('gluon') - os.execute('exec /lib/gluon/mesh-vpn/update-config') end - - return {'gluon', 'fastd', 'tunneldigger', 'simple-tc'} end diff --git a/package/gluon-config-mode-outdoor/luasrc/lib/gluon/config-mode/wizard/0250-outdoor.lua b/package/gluon-config-mode-outdoor/luasrc/lib/gluon/config-mode/wizard/0250-outdoor.lua index 6a653df8..2fbc0fba 100644 --- a/package/gluon-config-mode-outdoor/luasrc/lib/gluon/config-mode/wizard/0250-outdoor.lua +++ b/package/gluon-config-mode-outdoor/luasrc/lib/gluon/config-mode/wizard/0250-outdoor.lua @@ -44,10 +44,6 @@ return function(form, uci) end uci:save('wireless') end - - os.execute('/lib/gluon/upgrade/200-wireless') end end - - return {'gluon', 'network', 'wireless'} end From 436b29d767192f654870bc9212464146b9817646 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 18 May 2021 19:16:15 +0200 Subject: [PATCH 4/4] gluon-config-mode-core: add missing uci save A missing uci save for gluon-setup-mode caused the initial setup-process to be stuck in a config-mode loop. --- .../lib/gluon/config-mode/model/gluon-config-mode/wizard.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/model/gluon-config-mode/wizard.lua b/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/model/gluon-config-mode/wizard.lua index 882b61d9..dfc4ab4c 100644 --- a/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/model/gluon-config-mode/wizard.lua +++ b/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/model/gluon-config-mode/wizard.lua @@ -20,6 +20,7 @@ function f:write() local unistd = require 'posix.unistd' uci:set("gluon-setup-mode", uci:get_first("gluon-setup-mode", "setup_mode"), "configured", true) + uci:save("gluon-setup-mode") os.execute('gluon-reconfigure')