Mon, 22 Nov 2021 10:45:42 +0000
Fix: ensure libicu is installed at runtime
0 | 1 | local LUA_WEB_APP_FRAMEWORK = os.getenv("LUA_WEB_APP_FRAMEWORK"); |
2 | ||
3 | if LUA_WEB_APP_FRAMEWORK then | |
4 | package.path = ("%s/?.lua;%s"):format(LUA_WEB_APP_FRAMEWORK, package.path); | |
5 | package.cpath = ("%s/?.so;%s"):format(LUA_WEB_APP_FRAMEWORK, package.cpath); | |
6 | end | |
7 | ||
8 | local ssl = require "ssl"; | |
9 | local server = require "net.server_epoll"; | |
10 | local envload = require"util.envload"; | |
11 | local logger = require "util.logger"; | |
12 | ||
13 | package.loaded["net.server"] = server; -- COMPAT this module from Prosody can't be loaded outside of prosody | |
14 | ||
15 | local log = logger.init("main"); | |
16 | ||
17 | local config = { | |
18 | loglevel = "debug"; | |
19 | }; | |
20 | ||
21 | local logfile = io.stderr; | |
22 | ||
23 | local function log2file(source, level, message, ...) | |
24 | logfile:write(os.date("!%Y-%m-%dT%H:%M:%SZ"), "\t", source, "\t", level, "\t", message:format(...), "\n"); | |
25 | end | |
26 | ||
27 | local function init(config_file) | |
28 | if type(config_file) ~= "table" then | |
29 | setmetatable(config, { __index = { ENV = os.getenv } }); | |
30 | local ok, err = envload.envloadfile(config_file or "./config.lua", config); | |
31 | if ok then ok, err = pcall(ok); end | |
32 | setmetatable(config, nil); | |
33 | if not ok then log2file("config", "error", "Parse failed: %s", err or "Unknown error"); end | |
34 | else | |
35 | config = config_file; | |
36 | end | |
37 | ||
38 | local events = require"util.events".new(); | |
39 | ||
40 | -- Set up logging to stdout | |
41 | logger.reset(); | |
42 | local logsink = log2file; | |
43 | if config.logfile then | |
44 | if config.logfile == "*stdout" then | |
45 | logfile = io.stdout; | |
46 | elseif config.logfile == "*stderr" then | |
47 | logfile = io.stderr; | |
48 | else | |
49 | logfile = assert(io.open(config.logfile, "a")); | |
50 | end | |
51 | end | |
52 | if logfile then | |
53 | logfile:setvbuf("line"); | |
54 | for _, level in ipairs{"error", "warn", "info", "debug"} do | |
55 | logger.add_level_sink(level, logsink); | |
56 | if config.loglevel == level then break; end | |
57 | end | |
58 | end | |
59 | log("debug", "Logging ready"); | |
60 | ||
61 | require "http".init(config, events); | |
62 | ||
63 | -- Load optional extensions specified in the config | |
64 | for _, ext in ipairs(config.extensions or {}) do | |
65 | require("extensions."..ext).init(config, events); | |
66 | end | |
67 | end | |
68 | ||
69 | local function run() | |
70 | server.loop(); | |
71 | end | |
72 | ||
73 | if arg then | |
74 | init(...); | |
75 | run(); | |
76 | else | |
77 | return { | |
78 | init = init, | |
79 | run = run, | |
80 | }; | |
81 | end | |
82 | ||
83 |