src/main.lua

changeset 0
6279a7d40ae7
child 14
afcc217db356
equal deleted inserted replaced
-1:000000000000 0:6279a7d40ae7
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

mercurial