|
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 |