mqttagent

MQTT Lua Agent
git clone https://git.instinctive.eu/mqttagent.git
Log | Files | Refs | README | LICENSE

commit 0e124a7a07ccef32b7c2f8e5694c3839c5727c16
parent d5bad368c580097dc1816146da1e8d704c29e733
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Tue, 25 Feb 2025 20:11:36 +0000

Basic reload by rebuilding the whole state
Diffstat:
Mmqttagent.go | 40++++++++++++++++++++++++++++++++++++++--
1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/mqttagent.go b/mqttagent.go @@ -218,8 +218,27 @@ func mqttRead(client *mqtt.Client, toLua chan<- MqttMessage, id int) { } func reload(oldL *lua.LState, agent MqttAgent, main_script string) *lua.LState { - log.Println("Reload is not implemented yet") - return oldL + log.Println("Reloading", main_script) + newL := lua.NewState() + agent.Setup(newL) + registerMqttClientType(newL) + registerTimerType(newL) + + stateReloadBegin(oldL, newL) + + if err := newL.DoFile(main_script); err != nil { + log.Println("Reload failed:", err) + cleanupClients(newL) + agent.Teardown(newL) + newL.Close() + return oldL + } else { + cleanupClients(oldL) + agent.Teardown(oldL) + oldL.Close() + log.Println("Reload successful") + return newL + } } func dup(src []byte) []byte { @@ -257,6 +276,23 @@ func registerState(L *lua.LState, clientPrefix string, toLua chan<- MqttMessage) L.SetGlobal("reload", L.NewFunction(requestReload)) } +func stateReloadBegin(oldL, newL *lua.LState) { + oldSt := oldL.GetGlobal(luaStateName).(*lua.LTable) + toLua := oldL.RawGetInt(oldSt, keyChanToLua).(*lua.LUserData).Value.(chan<- MqttMessage) + clientPrefix := oldL.RawGetInt(oldSt, keyClientPrefix) + nextId := oldL.RawGetInt(oldSt, keyClientNextId) + + st := newL.NewTable() + newL.RawSetInt(st, keyChanToLua, newUserData(newL, toLua)) + newL.RawSetInt(st, keyClientPrefix, clientPrefix) + newL.RawSetInt(st, keyClientNextId, nextId) + newL.RawSetInt(st, keyCfgMap, newUserData(newL, make(mqttConfigMap))) + newL.RawSetInt(st, keyCnxTable, newL.NewTable()) + newL.RawSetInt(st, keyTimerTable, newL.NewTable()) + newL.SetGlobal(luaStateName, st) + newL.SetGlobal("reload", newL.NewFunction(requestReload)) +} + func stateValue(L *lua.LState, key int) lua.LValue { st := L.GetGlobal(luaStateName) return L.RawGetInt(st.(*lua.LTable), key)