aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGES1
-rw-r--r--core/configmanager.lua37
-rw-r--r--spec/scansion/admins.txt1
-rw-r--r--spec/scansion/prosody.cfg.lua2
4 files changed, 37 insertions, 4 deletions
diff --git a/CHANGES b/CHANGES
index 4b3f0b6f..e4f0d269 100644
--- a/CHANGES
+++ b/CHANGES
@@ -60,6 +60,7 @@ TRUNK
- The configuration file now supports referring and appending to options previously set
- Direct usage of the Lua API in the config file is deprecated, but can now be accessed via Lua.* instead
+- Convenience functions for reading values from files
## Changes
diff --git a/core/configmanager.lua b/core/configmanager.lua
index bd12e169..37a01a84 100644
--- a/core/configmanager.lua
+++ b/core/configmanager.lua
@@ -161,15 +161,43 @@ do
end;
};
+ -- For reading config values out of files.
+ local function filereader(basepath, defaultmode)
+ return function(filename, mode)
+ local f, err = io.open(resolve_relative_path(basepath, filename));
+ if not f then error(err, 2); end
+ local content, err = f:read(mode or defaultmode);
+ f:close();
+ if not content then error(err, 2); end
+ return content;
+ end
+ end
+
+ -- Collect lines into an array
+ local function linereader(basepath)
+ return function(filename)
+ local ret = {};
+ for line in io.lines(resolve_relative_path(basepath, filename)) do
+ t_insert(ret, line);
+ end
+ return ret;
+ end
+ end
+
parser = {};
function parser.load(data, config_file, config_table)
local set_options = {}; -- set_options[host.."/"..option_name] = true (when the option has been set already in this file)
local warnings = {};
local env;
+ local config_path = config_file:gsub("[^"..path_sep.."]+$", "");
+
-- The ' = true' are needed so as not to set off __newindex when we assign the functions below
env = setmetatable({
Host = true, host = true, VirtualHost = true,
Component = true, component = true,
+ FileContents = true,
+ FileLine = true,
+ FileLines = true,
Include = true, include = true, RunScript = true }, {
__index = function (_, k)
if k:match("^ENV_") then
@@ -293,7 +321,6 @@ do
end
local path_pos, glob = file:match("()([^"..path_sep.."]+)$");
local path = file:sub(1, math_max(path_pos-2,0));
- local config_path = config_file:gsub("[^"..path_sep.."]+$", "");
if #path > 0 then
path = resolve_relative_path(config_path, path);
else
@@ -308,7 +335,7 @@ do
return;
end
-- Not a wildcard, so resolve (potentially) relative path and run through config parser
- file = resolve_relative_path(config_file:gsub("[^"..path_sep.."]+$", ""), file);
+ file = resolve_relative_path(config_path, file);
local f, err = io.open(file);
if f then
local ret, err = parser.load(f:read("*a"), file, config_table);
@@ -325,9 +352,13 @@ do
env.include = env.Include;
function env.RunScript(file)
- return dofile(resolve_relative_path(config_file:gsub("[^"..path_sep.."]+$", ""), file));
+ return dofile(resolve_relative_path(config_path, file));
end
+ env.FileContents = filereader(config_path, "*a");
+ env.FileLine = filereader(config_path, "*l");
+ env.FileLines = linereader(config_path);
+
local chunk, err = envload(data, "@"..config_file, env);
if not chunk then
diff --git a/spec/scansion/admins.txt b/spec/scansion/admins.txt
new file mode 100644
index 00000000..db9fa85a
--- /dev/null
+++ b/spec/scansion/admins.txt
@@ -0,0 +1 @@
+admin@localhost
diff --git a/spec/scansion/prosody.cfg.lua b/spec/scansion/prosody.cfg.lua
index 58889fd7..91c86644 100644
--- a/spec/scansion/prosody.cfg.lua
+++ b/spec/scansion/prosody.cfg.lua
@@ -1,6 +1,6 @@
--luacheck: ignore
-admins = { "admin@localhost" }
+admins = FileLines("admins.txt")
network_backend = ENV_PROSODY_NETWORK_BACKEND or "epoll"
network_settings = Lua.require"prosody.util.json".decode(ENV_PROSODY_NETWORK_SETTINGS or "{}")