core/configmanager.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 12452 fb7e76c1ad1c
child 12535 32bcb899526f
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1504
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2862
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2862
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
     4
--
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 750
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 750
diff changeset
     6
-- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 466
diff changeset
     7
--
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 466
diff changeset
     8
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
local _G = _G;
9880
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
    10
local setmetatable, rawget, rawset, io, os, error, dofile, type, pairs, ipairs =
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
    11
      setmetatable, rawget, rawset, io, os, error, dofile, type, pairs, ipairs;
9878
c9f5ccdcdf80 configmanager: Add support for returning warnings
Matthew Wild <mwild1@gmail.com>
parents: 9244
diff changeset
    12
local format, math_max, t_insert = string.format, math.max, table.insert;
2861
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
    13
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4530
diff changeset
    14
local envload = require"util.envload".envload;
6166
46cb87d531a7 configmanager: Delay importing LuaFileSystem until needed by an Include line
Kim Alvefur <zash@zash.se>
parents: 5811
diff changeset
    15
local deps = require"util.dependencies";
6164
ef4024f6bc40 core.configmanager: Move path utility functions into util.paths
Kim Alvefur <zash@zash.se>
parents: 5814
diff changeset
    16
local resolve_relative_path = require"util.paths".resolve_relative_path;
ef4024f6bc40 core.configmanager: Move path utility functions into util.paths
Kim Alvefur <zash@zash.se>
parents: 5814
diff changeset
    17
local glob_to_pattern = require"util.paths".glob_to_pattern;
3609
954b1159f2f3 prosody, configmanager, certmanager: Relocate prosody.resolve_relative_path() to configmanager, and update certmanager (the only user of this function)
Matthew Wild <mwild1@gmail.com>
parents: 3573
diff changeset
    18
local path_sep = package.config:sub(1,1);
9879
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
    19
local get_traceback_table = require "util.debug".get_traceback_table;
3609
954b1159f2f3 prosody, configmanager, certmanager: Relocate prosody.resolve_relative_path() to configmanager, and update certmanager (the only user of this function)
Matthew Wild <mwild1@gmail.com>
parents: 3573
diff changeset
    20
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    21
local encodings = deps.softreq"util.encodings";
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    22
local nameprep = encodings and encodings.stringprep.nameprep or function (host) return host:lower(); end
6323
5926f01e5cd2 configmanager: nameprep VirtualHost and Component names
Matthew Wild <mwild1@gmail.com>
parents: 6166
diff changeset
    23
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    24
local _M = {};
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    25
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8161
diff changeset
    26
-- luacheck: std none
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
6164
ef4024f6bc40 core.configmanager: Move path utility functions into util.paths
Kim Alvefur <zash@zash.se>
parents: 5814
diff changeset
    28
_M.resolve_relative_path = resolve_relative_path; -- COMPAT
ef4024f6bc40 core.configmanager: Move path utility functions into util.paths
Kim Alvefur <zash@zash.se>
parents: 5814
diff changeset
    29
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
    30
local parser = nil;
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
6718
03a283aa679e configmanager: Rename unused function argument [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6717
diff changeset
    32
local config_mt = { __index = function (t, _) return rawget(t, "*"); end};
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    33
local config = setmetatable({ ["*"] = { } }, config_mt);
12444
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
    34
local files = {};
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
-- When host not found, use global
5380
e119e378b1d9 configmanager: Fix so unset variables are searched for in the global section
Kim Alvefur <zash@zash.se>
parents: 5357
diff changeset
    37
local host_mt = { __index = function(_, k) return config["*"][k] end }
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    39
function _M.getconfig()
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
    40
	return config;
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
    41
end
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
    42
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    43
function _M.get(host, key, _oldkey)
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    44
	if key == "core" then
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    45
		key = _oldkey; -- COMPAT with code that still uses "core"
4530
40905e7bf680 configmanager: get(): Make section (core) optional (hurrah)
Matthew Wild <mwild1@gmail.com>
parents: 4358
diff changeset
    46
	end
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    47
	return config[host][key];
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    48
end
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    49
function _M.rawget(host, key, _oldkey)
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    50
	if key == "core" then
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    51
		key = _oldkey; -- COMPAT with code that still uses "core"
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	end
4001
2e8411f6cb14 configmanager: Added rawget().
Waqas Hussain <waqas20@gmail.com>
parents: 3929
diff changeset
    53
	local hostconfig = rawget(config, host);
2e8411f6cb14 configmanager: Added rawget().
Waqas Hussain <waqas20@gmail.com>
parents: 3929
diff changeset
    54
	if hostconfig then
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    55
		return rawget(hostconfig, key);
4001
2e8411f6cb14 configmanager: Added rawget().
Waqas Hussain <waqas20@gmail.com>
parents: 3929
diff changeset
    56
	end
2e8411f6cb14 configmanager: Added rawget().
Waqas Hussain <waqas20@gmail.com>
parents: 3929
diff changeset
    57
end
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
6715
29d5875ae38d configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6326
diff changeset
    59
local function set(config_table, host, key, value)
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    60
	if host and key then
6715
29d5875ae38d configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6326
diff changeset
    61
		local hostconfig = rawget(config_table, host);
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
		if not hostconfig then
6715
29d5875ae38d configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6326
diff changeset
    63
			hostconfig = rawset(config_table, host, setmetatable({}, host_mt))[host];
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
		end
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    65
		hostconfig[key] = value;
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
		return true;
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
	end
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
	return false;
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
end
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    71
function _M.set(host, key, value, _oldvalue)
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    72
	if key == "core" then
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    73
		key, value = value, _oldvalue; --COMPAT with code that still uses "core"
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    74
	end
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    75
	return set(config, host, key, value);
3573
f31fa6520a4b configmanager: Atomic reloads, and some other internal changes to achieve this
Matthew Wild <mwild1@gmail.com>
parents: 3515
diff changeset
    76
end
f31fa6520a4b configmanager: Atomic reloads, and some other internal changes to achieve this
Matthew Wild <mwild1@gmail.com>
parents: 3515
diff changeset
    77
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    78
function _M.load(filename, config_format)
6716
b628870b1bd6 configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6715
diff changeset
    79
	config_format = config_format or filename:match("%w+$");
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
    80
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
    81
	if config_format == "lua" then
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
    82
		local f, err = io.open(filename);
2552
8dda55217e83 configmanager: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2427
diff changeset
    83
		if f then
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
    84
			local new_config = setmetatable({ ["*"] = { } }, config_mt);
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
    85
			local ok, err = parser.load(f:read("*a"), filename, new_config);
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
			f:close();
3613
f617718d2221 configmanager: Change parser API again to pass a config table to insert settings to. Fixes Include(). (Thanks Zash/answerman)
Matthew Wild <mwild1@gmail.com>
parents: 3610
diff changeset
    87
			if ok then
3573
f31fa6520a4b configmanager: Atomic reloads, and some other internal changes to achieve this
Matthew Wild <mwild1@gmail.com>
parents: 3515
diff changeset
    88
				config = new_config;
1000
a73715a9267f core.configmanager: Fire event when (re)loading config file
Matthew Wild <mwild1@gmail.com>
parents: 913
diff changeset
    89
			end
3780
791aede977da configmanager: Switch back to returning 'ok' to signal config load success - fixes config errors not being displayed
Matthew Wild <mwild1@gmail.com>
parents: 3613
diff changeset
    90
			return ok, "parser", err;
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
		end
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
    92
		return f, "file", err;
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
	end
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
    94
6716
b628870b1bd6 configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6715
diff changeset
    95
	if not config_format then
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
    96
		return nil, "file", "no parser specified";
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
    97
	else
6716
b628870b1bd6 configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6715
diff changeset
    98
		return nil, "file", "no parser for "..(config_format);
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
    99
	end
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
end
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
12444
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   102
function _M.files()
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   103
	return files;
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   104
end
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   105
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
   106
-- Built-in Lua parser
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   107
do
6717
429068c24ea0 configmanager: Remove unnecessary function localizations [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6716
diff changeset
   108
	local pcall = _G.pcall;
9879
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   109
	local function get_line_number(config_file)
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   110
		local tb = get_traceback_table(nil, 2);
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   111
		for i = 1, #tb do
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   112
			if tb[i].info.short_src == config_file then
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   113
				return tb[i].info.currentline;
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   114
			end
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   115
		end
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   116
	end
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
   117
	parser = {};
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
   118
	function parser.load(data, config_file, config_table)
9879
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   119
		local set_options = {}; -- set_options[host.."/"..option_name] = true (when the option has been set already in this file)
9878
c9f5ccdcdf80 configmanager: Add support for returning warnings
Matthew Wild <mwild1@gmail.com>
parents: 9244
diff changeset
   120
		local warnings = {};
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
   121
		local env;
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   122
		-- The ' = true' are needed so as not to set off __newindex when we assign the functions below
2975
c1a2e210f47e configmanager: Fix very wacky indentation
Matthew Wild <mwild1@gmail.com>
parents: 2974
diff changeset
   123
		env = setmetatable({
3012
6d86e26f0923 Merge configmanager->trunk
Matthew Wild <mwild1@gmail.com>
parents: 2985 3011
diff changeset
   124
			Host = true, host = true, VirtualHost = true,
6d86e26f0923 Merge configmanager->trunk
Matthew Wild <mwild1@gmail.com>
parents: 2985 3011
diff changeset
   125
			Component = true, component = true,
3610
2084959d4096 configmanager: Update Include and RunScript directives to support paths relative to the (current!) config file
Matthew Wild <mwild1@gmail.com>
parents: 3609
diff changeset
   126
			Include = true, include = true, RunScript = true }, {
6720
4fecfc81dac1 configmanager: Rename unused function arguments [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6719
diff changeset
   127
				__index = function (_, k)
9244
2d82a926826f configmanager: Allow referencing environment variables in the config as as ENV_<name>
Matthew Wild <mwild1@gmail.com>
parents: 8695
diff changeset
   128
					if k:match("^ENV_") then
2d82a926826f configmanager: Allow referencing environment variables in the config as as ENV_<name>
Matthew Wild <mwild1@gmail.com>
parents: 8695
diff changeset
   129
						return os.getenv(k:sub(5));
2d82a926826f configmanager: Allow referencing environment variables in the config as as ENV_<name>
Matthew Wild <mwild1@gmail.com>
parents: 8695
diff changeset
   130
					end
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5124
diff changeset
   131
					return rawget(_G, k);
2975
c1a2e210f47e configmanager: Fix very wacky indentation
Matthew Wild <mwild1@gmail.com>
parents: 2974
diff changeset
   132
				end,
6720
4fecfc81dac1 configmanager: Rename unused function arguments [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6719
diff changeset
   133
				__newindex = function (_, k, v)
9879
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   134
					local host = env.__currenthost or "*";
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   135
					local option_path = host.."/"..k;
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   136
					if set_options[option_path] then
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   137
						t_insert(warnings, ("%s:%d: Duplicate option '%s'"):format(config_file, get_line_number(config_file), k));
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   138
					end
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   139
					set_options[option_path] = true;
6720
4fecfc81dac1 configmanager: Rename unused function arguments [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6719
diff changeset
   140
					set(config_table, env.__currenthost or "*", k, v);
2975
c1a2e210f47e configmanager: Fix very wacky indentation
Matthew Wild <mwild1@gmail.com>
parents: 2974
diff changeset
   141
				end
c1a2e210f47e configmanager: Fix very wacky indentation
Matthew Wild <mwild1@gmail.com>
parents: 2974
diff changeset
   142
		});
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   143
1615
0e3eacf135f2 configmanager: Default options appearing before Host "*" to global (fixes potential traceback)
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   144
		rawset(env, "__currenthost", "*") -- Default is global
3011
1189a29cd846 configmanager: Add VirtualHost as an alias for Host (re-applied in trunk due to previous bad merge with 0.7)
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
   145
		function env.VirtualHost(name)
10378
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   146
			if not name then
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   147
				error("Host must have a name", 2);
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   148
			end
10379
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   149
			local prepped_name = nameprep(name);
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   150
			if not prepped_name then
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   151
				error(format("Name of Host %q contains forbidden characters", name), 0);
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   152
			end
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   153
			name = prepped_name;
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   154
			if rawget(config_table, name) and rawget(config_table[name], "component_module") then
2861
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
   155
				error(format("Host %q clashes with previously defined %s Component %q, for services use a sub-domain like conference.%s",
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   156
					name, config_table[name].component_module:gsub("^%a+$", { component = "external", muc = "MUC"}), name, name), 0);
2861
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
   157
			end
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
   158
			rawset(env, "__currenthost", name);
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   159
			-- Needs at least one setting to logically exist :)
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   160
			set(config_table, name or "*", "defined", true);
3515
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   161
			return function (config_options)
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   162
				rawset(env, "__currenthost", "*"); -- Return to global scope
12452
fb7e76c1ad1c configmanager: Clearer errors when providing unexpected values after VirtualHost (fixes #1735, thanks arawaks)
Matthew Wild <mwild1@gmail.com>
parents: 12444
diff changeset
   163
				if type(config_options) == "string" then
fb7e76c1ad1c configmanager: Clearer errors when providing unexpected values after VirtualHost (fixes #1735, thanks arawaks)
Matthew Wild <mwild1@gmail.com>
parents: 12444
diff changeset
   164
					error(format("VirtualHost entries do not accept a module name (module '%s' provided for host '%s')", config_options, name), 2);
fb7e76c1ad1c configmanager: Clearer errors when providing unexpected values after VirtualHost (fixes #1735, thanks arawaks)
Matthew Wild <mwild1@gmail.com>
parents: 12444
diff changeset
   165
				elseif type(config_options) ~= "table" then
fb7e76c1ad1c configmanager: Clearer errors when providing unexpected values after VirtualHost (fixes #1735, thanks arawaks)
Matthew Wild <mwild1@gmail.com>
parents: 12444
diff changeset
   166
					error("Invalid syntax following VirtualHost, expected options but received a "..type(config_options), 2);
fb7e76c1ad1c configmanager: Clearer errors when providing unexpected values after VirtualHost (fixes #1735, thanks arawaks)
Matthew Wild <mwild1@gmail.com>
parents: 12444
diff changeset
   167
				end
3515
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   168
				for option_name, option_value in pairs(config_options) do
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   169
					set(config_table, name or "*", option_name, option_value);
3515
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   170
				end
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   171
			end;
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   172
		end
3011
1189a29cd846 configmanager: Add VirtualHost as an alias for Host (re-applied in trunk due to previous bad merge with 0.7)
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
   173
		env.Host, env.host = env.VirtualHost, env.VirtualHost;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   174
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   175
		function env.Component(name)
10378
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   176
			if not name then
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   177
				error("Component must have a name", 2);
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   178
			end
10379
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   179
			local prepped_name = nameprep(name);
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   180
			if not prepped_name then
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   181
				error(format("Name of Component %q contains forbidden characters", name), 0);
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   182
			end
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   183
			name = prepped_name;
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6782
diff changeset
   184
			if rawget(config_table, name) and rawget(config_table[name], "defined")
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6782
diff changeset
   185
				and not rawget(config_table[name], "component_module") then
12087
ec21e379c145 configmanager: Update error message to say 'VirtualHost' instead of 'Host'
Matthew Wild <mwild1@gmail.com>
parents: 10379
diff changeset
   186
				error(format("Component %q clashes with previously defined VirtualHost %q, for services use a sub-domain like conference.%s",
2861
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
   187
					name, name, name), 0);
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
   188
			end
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   189
			set(config_table, name, "component_module", "component");
913
3e2dac84017d core.configmanager: Make components use 'component' module by default if none specified
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
   190
			-- Don't load the global modules by default
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   191
			set(config_table, name, "load_global_modules", false);
913
3e2dac84017d core.configmanager: Make components use 'component' module by default if none specified
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
   192
			rawset(env, "__currenthost", name);
3515
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   193
			local function handle_config_options(config_options)
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   194
				rawset(env, "__currenthost", "*"); -- Return to global scope
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   195
				for option_name, option_value in pairs(config_options) do
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   196
					set(config_table, name or "*", option_name, option_value);
3515
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   197
				end
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   198
			end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   199
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   200
			return function (module)
857
49298263f241 core.configmanager: Small fix to check validity of Component definitions
Matthew Wild <mwild1@gmail.com>
parents: 795
diff changeset
   201
					if type(module) == "string" then
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   202
						set(config_table, name, "component_module", module);
3515
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   203
						return handle_config_options;
857
49298263f241 core.configmanager: Small fix to check validity of Component definitions
Matthew Wild <mwild1@gmail.com>
parents: 795
diff changeset
   204
					end
3515
bb494c3aa364 configmanager: Allow VirtualHost/Component definitions to be followed by a table of config options
Matthew Wild <mwild1@gmail.com>
parents: 3384
diff changeset
   205
					return handle_config_options(module);
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   206
				end
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   207
		end
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   208
		env.component = env.Component;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   209
5413
0bf5e90be086 configmanager: Some cleanup, remove unused variables and imports
Matthew Wild <mwild1@gmail.com>
parents: 5380
diff changeset
   210
		function env.Include(file)
6721
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   211
			-- Check whether this is a wildcard Include
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   212
			if file:match("[*?]") then
6166
46cb87d531a7 configmanager: Delay importing LuaFileSystem until needed by an Include line
Kim Alvefur <zash@zash.se>
parents: 5811
diff changeset
   213
				local lfs = deps.softreq "lfs";
46cb87d531a7 configmanager: Delay importing LuaFileSystem until needed by an Include line
Kim Alvefur <zash@zash.se>
parents: 5811
diff changeset
   214
				if not lfs then
46cb87d531a7 configmanager: Delay importing LuaFileSystem until needed by an Include line
Kim Alvefur <zash@zash.se>
parents: 5811
diff changeset
   215
					error(format("Error expanding wildcard pattern in Include %q - LuaFileSystem not available", file));
46cb87d531a7 configmanager: Delay importing LuaFileSystem until needed by an Include line
Kim Alvefur <zash@zash.se>
parents: 5811
diff changeset
   216
				end
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   217
				local path_pos, glob = file:match("()([^"..path_sep.."]+)$");
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   218
				local path = file:sub(1, math_max(path_pos-2,0));
3929
7cb03d67101b configmanager: Filenames without a path are also relative to the config file path, not the current working directory
Matthew Wild <mwild1@gmail.com>
parents: 3905
diff changeset
   219
				local config_path = config_file:gsub("[^"..path_sep.."]+$", "");
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   220
				if #path > 0 then
3929
7cb03d67101b configmanager: Filenames without a path are also relative to the config file path, not the current working directory
Matthew Wild <mwild1@gmail.com>
parents: 3905
diff changeset
   221
					path = resolve_relative_path(config_path, path);
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   222
				else
3929
7cb03d67101b configmanager: Filenames without a path are also relative to the config file path, not the current working directory
Matthew Wild <mwild1@gmail.com>
parents: 3905
diff changeset
   223
					path = config_path;
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   224
				end
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   225
				local patt = glob_to_pattern(glob);
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   226
				for f in lfs.dir(path) do
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   227
					if f:sub(1,1) ~= "." and f:match(patt) then
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   228
						env.Include(path..path_sep..f);
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   229
					end
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   230
				end
6721
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   231
				return;
794
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
   232
			end
6721
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   233
			-- Not a wildcard, so resolve (potentially) relative path and run through config parser
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   234
			file = resolve_relative_path(config_file:gsub("[^"..path_sep.."]+$", ""), file);
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   235
			local f, err = io.open(file);
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   236
			if f then
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
   237
				local ret, err = parser.load(f:read("*a"), file, config_table);
6721
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   238
				if not ret then error(err:gsub("%[string.-%]", file), 0); end
9880
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   239
				if err then
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   240
					for _, warning in ipairs(err) do
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   241
						t_insert(warnings, warning);
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   242
					end
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   243
				end
6721
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   244
			end
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   245
			if not f then error("Error loading included "..file..": "..err, 0); end
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   246
			return f, err;
794
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
   247
		end
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
   248
		env.include = env.Include;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   249
3610
2084959d4096 configmanager: Update Include and RunScript directives to support paths relative to the (current!) config file
Matthew Wild <mwild1@gmail.com>
parents: 3609
diff changeset
   250
		function env.RunScript(file)
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   251
			return dofile(resolve_relative_path(config_file:gsub("[^"..path_sep.."]+$", ""), file));
3610
2084959d4096 configmanager: Update Include and RunScript directives to support paths relative to the (current!) config file
Matthew Wild <mwild1@gmail.com>
parents: 3609
diff changeset
   252
		end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   253
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4530
diff changeset
   254
		local chunk, err = envload(data, "@"..config_file, env);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   255
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   256
		if not chunk then
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   257
			return nil, err;
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   258
		end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   259
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   260
		local ok, err = pcall(chunk);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   261
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   262
		if not ok then
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   263
			return nil, err;
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   264
		end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   265
12444
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   266
		t_insert(files, config_file);
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   267
9878
c9f5ccdcdf80 configmanager: Add support for returning warnings
Matthew Wild <mwild1@gmail.com>
parents: 9244
diff changeset
   268
		return true, warnings;
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   269
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   270
371
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   271
end
0dc5819660e8 Import initial configmanager, not sure if it works yet, but it does pass the unit tests ;)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   272
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
   273
return _M;