luci-base: runtime.uc: avoid Lua not installed exeption from trycompile()
authorJo-Philipp Wich <jo@mein.io>
Wed, 2 Nov 2022 09:17:48 +0000 (10:17 +0100)
committerJo-Philipp Wich <jo@mein.io>
Wed, 2 Nov 2022 09:21:05 +0000 (10:21 +0100)
Make sure to request loading the Lua bridge as optional when initializing
the Lua VM context from trycompile() in order to not raise a fatal exception
in case the Lua runtime support is not present.

Ref: https://forum.openwrt.org/t/x/141426
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/ucode/runtime.uc

index d02d8dd667d4082eb39d9597ed3849f2532defd4..ed330abcc1bfce263d00bf895384734bdea43257 100644 (file)
@@ -43,13 +43,17 @@ function format_lua_exception(ex) {
 }
 
 const Class = {
-       init_lua: function() {
+       init_lua: function(optional) {
                if (!this.L) {
-                       this.L = this.env.dispatcher.load_luabridge().create();
-                       this.L.set('L', proto({ write: print }, this.env));
-                       this.L.invoke('require', 'luci.ucodebridge');
+                       let bridge = this.env.dispatcher.load_luabridge(optional);
 
-                       this.env.lua_active = true;
+                       if (bridge) {
+                               this.L = bridge.create();
+                               this.L.set('L', proto({ write: print }, this.env));
+                               this.L.invoke('require', 'luci.ucodebridge');
+
+                               this.env.lua_active = true;
+                       }
                }
 
                return this.L;
@@ -80,10 +84,12 @@ const Class = {
                }
                else {
                        try {
-                               let vm = this.init_lua();
-                               let compile = vm.get('_G', 'luci', 'ucodebridge', 'compile');
+                               let vm = this.init_lua(true);
 
-                               compile.call(path);
+                               if (vm)
+                                       vm.get('_G', 'luci', 'ucodebridge', 'compile').call(path);
+                               else
+                                       return `Unable to compile '${path}' as Lua template: Unable to load Lua runtime`;
                        }
                        catch (lua_err) {
                                return `Unable to compile '${path}' as Lua template: ${format_lua_exception(lua_err)}`;