4

I am trying to load Lua script from HAProxy. In the Lua script, the following line is causing an error:

local http = require("socket.http")

Intially I gathered from journalctl -xe output that the library was not installed. I installed it using luarocks install luasocket. This did not solve the issue. The new error is module "socket.http" not found. Following the comment in this post I realized that I must change the settings for Lua library path in order to resolve this issue.

Now, I want to know the following:

  1. Do I have install HAProxy+Lua from source and modify the library path pre installation?
  2. If building from source is not necessary then, I believe I must change the path using syslog as suggested by the comment from post linked above. If this is the case, how do I do that and what settings do I need to change/add to syslog.conf?
  3. Are there are any other solution that I am overlooking which, would easier than any of the above?

Thanks for your help in advance.

EDIT 1

I have modified both LUA_PATH and LUA_CPATH as follows:

LUA_PATH=/usr/bin/lua;/usr/bin/lua5.3;/usr/share/lua/5.3/ltn12.lua;/usr/share/lua/5.3/mime.lua;/usr/share/lua/5.3/socket.lua;/usr/share/lua/5.3/ssl.lua;/usr/share/lua/5.3/posix/_argcheck.lua;/usr/share/lua/5.3/posix/compat.lua;/usr/share/lua/5.3/posix/deprecated.lua;/usr/share/lua/5.3/posix/init.lua;/usr/share/lua/5.3/posix/sys.lua;/usr/share/lua/5.3/posix/util.lua;/usr/share/lua/5.3/posix/version.lua;/usr/share/lua/5.3/socket/ftp.lua;/usr/share/lua/5.3/socket/headers.lua;/usr/share/lua/5.3/socket/http.lua;/usr/share/lua/5.3/socket/smtp.lua;/usr/share/lua/5.3/socket/tp.lua;/usr/share/lua/5.3/socket/url.lua;/usr/share/lua/5.3/term/colors.lua;/usr/share/lua/5.3/term/cursor.lua;/usr/share/lua/5.3/term/init.lua;/usr/share/lua/5.3/ssl/https.lua;/usr/share/lua/5.3/luarocks/add.lua;/usr/share/lua/5.3/luarocks/admin_remove.lua;/usr/share/lua/5.3/luarocks/build.lua;/usr/share/lua/5.3/luarocks/cache.lua;/usr/share/lua/5.3/luarocks/cfg.lua;/usr/share/lua/5.3/luarocks/command_line.lua;/usr/share/lua/5.3/luarocks/config_cmd.lua;/usr/share/lua/5.3/luarocks/deps.lua;/usr/share/lua/5.3/luarocks/dir.lua;/usr/share/lua/5.3/luarocks/doc.lua;/usr/share/lua/5.3/luarocks/download.lua;/usr/share/lua/5.3/luarocks/fetch.lua;/usr/share/lua/5.3/luarocks/fs.lua;/usr/share/lua/5.3/luarocks/help.lua;/usr/share/lua/5.3/luarocks/index.lua;/usr/share/lua/5.3/luarocks/install.lua;/usr/share/lua/5.3/luarocks/lint.lua;/usr/share/lua/5.3/luarocks/list.lua;/usr/share/lua/5.3/luarocks/loader.lua;/usr/share/lua/5.3/luarocks/make.lua;/usr/share/lua/5.3/luarocks/make_manifest.lua;/usr/share/lua/5.3/luarocks/manif_core.lua;/usr/share/lua/5.3/luarocks/manif.lua;/usr/share/lua/5.3/luarocks/new_version.lua;/usr/share/lua/5.3/luarocks/pack.lua;/usr/share/lua/5.3/luarocks/path_cmd.lua;/usr/share/lua/5.3/luarocks/path.lua;/usr/share/lua/5.3/luarocks/persist.lua;/usr/share/lua/5.3/luarocks/purge.lua;/usr/share/lua/5.3/luarocks/refresh_cache.lua;/usr/share/lua/5.3/luarocks/remove.lua;/usr/share/lua/5.3/luarocks/repos.lua;/usr/share/lua/5.3/luarocks/require.lua;/usr/share/lua/5.3/luarocks/search.lua;/usr/share/lua/5.3/luarocks/show.lua;/usr/share/lua/5.3/luarocks/site_config.lua;/usr/share/lua/5.3/luarocks/type_check.lua;/usr/share/lua/5.3/luarocks/unpack.lua;/usr/share/lua/5.3/luarocks/upload.lua;/usr/share/lua/5.3/luarocks/util.lua;/usr/share/lua/5.3/luarocks/validate.lua;/usr/share/lua/5.3/luarocks/write_rockspec.lua;/usr/share/lua/5.3/luarocks/build/builtin.lua;/usr/share/lua/5.3/luarocks/build/cmake.lua;/usr/share/lua/5.3/luarocks/build/command.lua;/usr/share/lua/5.3/luarocks/build/make.lua;/usr/share/lua/5.3/luarocks/fs/lua.lua;/usr/share/lua/5.3/luarocks/fs/tools.lua;/usr/share/lua/5.3/luarocks/fs/unix.lua;/usr/share/lua/5.3/luarocks/fs/win32.lua;/usr/share/lua/5.3/luarocks/fetch/cvs.lua;/usr/share/lua/5.3/luarocks/fetch/git_file.lua;/usr/share/lua/5.3/luarocks/fetch/git_http.lua;/usr/share/lua/5.3/luarocks/fetch/git_https.lua;/usr/share/lua/5.3/luarocks/fetch/git.lua;/usr/share/lua/5.3/luarocks/fetch/git_ssh.lua;/usr/share/lua/5.3/luarocks/fetch/hg_http.lua;/usr/share/lua/5.3/luarocks/fetch/hg_https.lua;/usr/share/lua/5.3/luarocks/fetch/hg.lua;/usr/share/lua/5.3/luarocks/fetch/hg_ssh.lua;/usr/share/lua/5.3/luarocks/fetch/sscm.lua;/usr/share/lua/5.3/luarocks/fetch/svn.lua;/usr/share/lua/5.3/luarocks/tools/patch.lua;/usr/share/lua/5.3/luarocks/tools/tar.lua;/usr/share/lua/5.3/luarocks/tools/zip.lua;/usr/share/lua/5.3/luarocks/upload/api.lua;/usr/share/lua/5.3/luarocks/upload/multipart.lua

LUA_CPATH=/usr/lib64/lua/5.3/posix/ctype.so;/usr/lib64/lua/5.3/posix/dirent.so;/usr/lib64/lua/5.3/posix/errno.so;/usr/lib64/lua/5.3/posix/fcntl.so;/usr/lib64/lua/5.3/posix/fnmatch.so;/usr/lib64/lua/5.3/posix/glob.so;/usr/lib64/lua/5.3/posix/grp.so;/usr/lib64/lua/5.3/posix/libgen.so;/usr/lib64/lua/5.3/posix/poll.so;/usr/lib64/lua/5.3/posix/pwd.so;/usr/lib64/lua/5.3/posix/sched.so;/usr/lib64/lua/5.3/posix/signal.so;/usr/lib64/lua/5.3/posix/stdio.so;/usr/lib64/lua/5.3/posix/stdlib.so;/usr/lib64/lua/5.3/posix/syslog.so;/usr/lib64/lua/5.3/posix/termio.so;/usr/lib64/lua/5.3/posix/time.so;/usr/lib64/lua/5.3/posix/unistd.so;/usr/lib64/lua/5.3/posix/utime.so;/usr/lib64/lua/5.3/mime/core.so;/usr/lib64/lua/5.3/socket/core.so;/usr/lib64/lua/5.3/socket/serial.so;/usr/lib64/lua/5.3/socket/unix.so;/usr/lib64/lua/5.3/term/core.so;/usr/lib64/lua/5.3/ssl.so;/usr/lib64/lua/5.3/zlib.so

I am still getting the same error as reported before.

EDIT 2

Found this post on Lua require function quite helpful. Following the discussion, I tried the following:

package.path="/usr/share/lua/5.3/?/?.lua" package.cpath="/usr/lib64/lua/5.3/?/?.so"

I added these lines at the top my lua script that's causing the error. I also modified the environment variables, LUA_PATH and LUA_CPATH with the same value. The error still persists.

I am out of all possible options at this stage and would be glad if someone can shed some light on this issue.

Abrar Hossain
  • 2,594
  • 8
  • 29
  • 54
  • Lua reads library path from [optional env variables LUA_PATH and LUA_CPATH](https://www.lua.org/manual/5.3/manual.html#pdf-package.path) when VM is starting. – Egor Skriptunoff Feb 25 '19 at 12:20
  • @EgorSkriptunoff All my Lua files are in `/usr/lib64/lua/5.3/` which, contains all the socket files, `*.so`. and `/usr/share/lua/5.3` which contains a set of scripts. I have modified `/etc/bash.bashrc.local` with `export LUA_PATH=/usr/bin/lua`. For `LUA_CPATH` do I need to individually add all socket file names? – Abrar Hossain Feb 25 '19 at 12:34
  • @EgorSkriptunoff I added `LUA_CPATH=/usr/lib64/lua/5.3` but the error still persists – Abrar Hossain Feb 25 '19 at 12:43
  • `LUA_PATH=;;/usr/lib64/lua/5.3/?.lua;/usr/lib64/lua/5.3/?/init.lua;` – Egor Skriptunoff Feb 25 '19 at 13:05
  • @EgorSkriptunoff Added `/usr/share/lua/5.3/posix/init.lua`. Not sure which other file you meant by `/usr/lib64/lua/5.3/?.lua`. – Abrar Hossain Feb 25 '19 at 13:18
  • @EgorSkriptunoff Did not solve the issue after last modification to `LUA_PATH` – Abrar Hossain Feb 25 '19 at 13:18
  • I know it is some time ago but how about `export LUA_CPATH=;;/usr/lib64/lua/5.3/?.so` for the C (`*.so`) files - `?` is the symbol that gets replaced by the package name when the package loader goes looking for C (or indeed Lua) files but you need to append the relevant extension - which can vary on different OSes. 8-) – SlySven Apr 18 '20 at 20:51
  • Actually `?` is the symbol that is *normally* used for the name of the package in the searching - but in fact it is the third value in the five held in `package.config`. The others are 1: directory separator usually `/` on most systems but can be \ (that is a SINGLE backslash character BTW) on windows, 2: path separator usually `;` but could be something else in some OSes (e.g. `:`) and two more that I can't remember but https://stackoverflow.com/q/31904392/4805858 might make it clearer... – SlySven Apr 18 '20 at 21:00
  • 1
    @SlySven I have not worked with Lua since posting this project. I think the information you posted is right and I'll check them out next time I use HAProxy and need Lua scripting. My solution was to fallback to Nodejs for the relevant logic – Abrar Hossain Apr 19 '20 at 04:31
  • Did you see you can use `lua-prepend-path`? https://cbonte.github.io/haproxy-dconv/2.2/configuration.html#3.1-lua-prepend-path You would want instead `lua-prepend-path /usr/share/lua/5.3/?.lua` and `lua-prepend-path /usr/lib64/lua/5.3/posix/?.so cpath` – ibizaman Dec 19 '22 at 06:41

0 Answers0