core/configmanager.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 13395 5c783cf58ae7
permissions -rw-r--r--
mod_posix: Move everything to util.startup This allows greater control over the order of events. Notably, the internal ordering between daemonization, initialization of libunbound and setup of signal handling is sensitive. libunbound starts a separate thread for processing DNS requests. If this thread is started before signal handling has been set up, it will not inherit the signal handlers and instead behave as it would have before signal handlers were set up, i.e. cause the whole process to immediately exit. libunbound is usually initialized on the first DNS request, usually triggered by an outgoing s2s connection attempt. If daemonization happens before signals have been set up, signals may not be processed at all.
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
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12535
diff changeset
    14
local envload = require"prosody.util.envload".envload;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12535
diff changeset
    15
local deps = require"prosody.util.dependencies";
13394
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
    16
local it = require"prosody.util.iterators";
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12535
diff changeset
    17
local resolve_relative_path = require"prosody.util.paths".resolve_relative_path;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12535
diff changeset
    18
local glob_to_pattern = require"prosody.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
    19
local path_sep = package.config:sub(1,1);
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12535
diff changeset
    20
local get_traceback_table = require "prosody.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
    21
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12535
diff changeset
    22
local encodings = deps.softreq"prosody.util.encodings";
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    23
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
    24
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    25
local _M = {};
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    26
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8161
diff changeset
    27
-- 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
    28
6164
ef4024f6bc40 core.configmanager: Move path utility functions into util.paths
Kim Alvefur <zash@zash.se>
parents: 5814
diff changeset
    29
_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
    30
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
    31
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
    32
6718
03a283aa679e configmanager: Rename unused function argument [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6717
diff changeset
    33
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
    34
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
    35
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
    36
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
    37
-- 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
    38
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
    39
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    40
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
    41
	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
    42
end
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
    43
12535
32bcb899526f core.configmanager: Remove COMPAT for old config format from 2013
Kim Alvefur <zash@zash.se>
parents: 12452
diff changeset
    44
function _M.get(host, key)
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
    45
	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
    46
end
12535
32bcb899526f core.configmanager: Remove COMPAT for old config format from 2013
Kim Alvefur <zash@zash.se>
parents: 12452
diff changeset
    47
function _M.rawget(host, key)
4001
2e8411f6cb14 configmanager: Added rawget().
Waqas Hussain <waqas20@gmail.com>
parents: 3929
diff changeset
    48
	local hostconfig = rawget(config, host);
2e8411f6cb14 configmanager: Added rawget().
Waqas Hussain <waqas20@gmail.com>
parents: 3929
diff changeset
    49
	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
    50
		return rawget(hostconfig, key);
4001
2e8411f6cb14 configmanager: Added rawget().
Waqas Hussain <waqas20@gmail.com>
parents: 3929
diff changeset
    51
	end
2e8411f6cb14 configmanager: Added rawget().
Waqas Hussain <waqas20@gmail.com>
parents: 3929
diff changeset
    52
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
    53
6715
29d5875ae38d configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6326
diff changeset
    54
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
    55
	if host and key then
6715
29d5875ae38d configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6326
diff changeset
    56
		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
    57
		if not hostconfig then
6715
29d5875ae38d configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6326
diff changeset
    58
			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
    59
		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
    60
		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
    61
		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
    62
	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
    63
	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
    64
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
    65
13392
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    66
local function rawget_option(config_table, host, key)
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    67
	if host and key then
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    68
		local hostconfig = rawget(config_table, host);
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    69
		if not hostconfig then
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    70
			return nil;
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    71
		end
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    72
		return rawget(hostconfig, key);
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    73
	end
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    74
end
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
    75
12535
32bcb899526f core.configmanager: Remove COMPAT for old config format from 2013
Kim Alvefur <zash@zash.se>
parents: 12452
diff changeset
    76
function _M.set(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
    77
	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
    78
end
f31fa6520a4b configmanager: Atomic reloads, and some other internal changes to achieve this
Matthew Wild <mwild1@gmail.com>
parents: 3515
diff changeset
    79
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6721
diff changeset
    80
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
    81
	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
    82
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
    83
	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
    84
		local f, err = io.open(filename);
2552
8dda55217e83 configmanager: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2427
diff changeset
    85
		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
    86
			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
    87
			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
    88
			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
    89
			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
    90
				config = new_config;
1000
a73715a9267f core.configmanager: Fire event when (re)loading config file
Matthew Wild <mwild1@gmail.com>
parents: 913
diff changeset
    91
			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
    92
			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
    93
		end
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
    94
		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
    95
	end
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
    96
6716
b628870b1bd6 configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6715
diff changeset
    97
	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
    98
		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
    99
	else
6716
b628870b1bd6 configmanager: Rename variable to avoid name conflict [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6715
diff changeset
   100
		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
   101
	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
   102
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
   103
12444
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   104
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
   105
	return files;
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   106
end
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   107
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
   108
-- 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
   109
do
6717
429068c24ea0 configmanager: Remove unnecessary function localizations [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6716
diff changeset
   110
	local pcall = _G.pcall;
9879
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   111
	local function get_line_number(config_file)
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   112
		local tb = get_traceback_table(nil, 2);
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   113
		for i = 1, #tb do
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   114
			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
   115
				return tb[i].info.currentline;
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   116
			end
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   117
		end
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   118
	end
13394
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   119
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   120
	local config_option_proxy_mt = {
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   121
		__index = setmetatable({
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   122
			append = function (self, value)
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   123
				local original_option = self:value();
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   124
				if original_option == nil then
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   125
					original_option = {};
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   126
				end
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   127
				if type(value) ~= "table" then
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   128
					error("'append' operation expects a list of values to append to the existing list", 2);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   129
				end
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   130
				if value[1] ~= nil then
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   131
					for _, v in ipairs(value) do
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   132
						t_insert(original_option, v);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   133
					end
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   134
				else
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   135
					for k, v in pairs(value) do
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   136
						original_option[k] = v;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   137
					end
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   138
				end
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   139
				set(self.config_table, self.host, self.option_name, original_option);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   140
				return self;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   141
			end;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   142
			value = function (self)
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   143
				return rawget_option(self.config_table, self.host, self.option_name);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   144
			end;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   145
			values = function (self)
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   146
				return it.values(self:value());
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   147
			end;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   148
		}, {
13395
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   149
			__index = function (t, k) --luacheck: ignore 212/t
13394
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   150
				error("Unknown config option operation: '"..k.."'", 2);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   151
			end;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   152
		});
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   153
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   154
		__call = function (self, v2)
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   155
			local v = self:value() or {};
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   156
			if type(v) == "table" and type(v2) == "table" then
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   157
				return self:append(v2);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   158
			end
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   159
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   160
			error("Invalid syntax - missing '=' perhaps?", 2);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   161
		end;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   162
	};
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   163
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
   164
	parser = {};
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
   165
	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
   166
		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
   167
		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
   168
		local env;
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   169
		-- 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
   170
		env = setmetatable({
3012
6d86e26f0923 Merge configmanager->trunk
Matthew Wild <mwild1@gmail.com>
parents: 2985 3011
diff changeset
   171
			Host = true, host = true, VirtualHost = true,
6d86e26f0923 Merge configmanager->trunk
Matthew Wild <mwild1@gmail.com>
parents: 2985 3011
diff changeset
   172
			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
   173
			Include = true, include = true, RunScript = true }, {
6720
4fecfc81dac1 configmanager: Rename unused function arguments [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6719
diff changeset
   174
				__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
   175
					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
   176
						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
   177
					end
13393
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   178
					if k == "Lua" then
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   179
						return _G;
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   180
					end
13392
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
   181
					local val = rawget_option(config_table, env.__currenthost or "*", k);
13393
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   182
13394
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   183
					local g_val = rawget(_G, k);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   184
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   185
					if val ~= nil or g_val == nil then
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   186
						if type(val) == "table" then
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   187
							return setmetatable({
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   188
								config_table = config_table;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   189
								host = env.__currenthost or "*";
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   190
								option_name = k;
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   191
							}, config_option_proxy_mt);
905a6009f60d configmanager: Support for appending to existing config options
Matthew Wild <mwild1@gmail.com>
parents: 13393
diff changeset
   192
						end
13392
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
   193
						return val;
de6c1a170871 configmanager: Allow referencing previously-set options in the config file
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
   194
					end
13393
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   195
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   196
					if g_val ~= nil then
13395
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   197
						t_insert(
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   198
							warnings,
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   199
							("%s:%d: direct usage of the Lua API is deprecated - replace `%s` with `Lua.%s`"):format(
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   200
								config_file,
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   201
								get_line_number(config_file),
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   202
								k,
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   203
								k
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   204
							)
5c783cf58ae7 configmanager: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13394
diff changeset
   205
						);
13393
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   206
					end
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   207
47d0d80da208 configmanager: Make _G accessible via `Lua` variable, deprecate direct access
Matthew Wild <mwild1@gmail.com>
parents: 13392
diff changeset
   208
					return g_val;
2975
c1a2e210f47e configmanager: Fix very wacky indentation
Matthew Wild <mwild1@gmail.com>
parents: 2974
diff changeset
   209
				end,
6720
4fecfc81dac1 configmanager: Rename unused function arguments [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6719
diff changeset
   210
				__newindex = function (_, k, v)
9879
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   211
					local host = env.__currenthost or "*";
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   212
					local option_path = host.."/"..k;
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   213
					if set_options[option_path] then
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   214
						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
   215
					end
99291e124449 configmanager: Emit warning for duplicated config options
Matthew Wild <mwild1@gmail.com>
parents: 9878
diff changeset
   216
					set_options[option_path] = true;
6720
4fecfc81dac1 configmanager: Rename unused function arguments [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6719
diff changeset
   217
					set(config_table, env.__currenthost or "*", k, v);
2975
c1a2e210f47e configmanager: Fix very wacky indentation
Matthew Wild <mwild1@gmail.com>
parents: 2974
diff changeset
   218
				end
c1a2e210f47e configmanager: Fix very wacky indentation
Matthew Wild <mwild1@gmail.com>
parents: 2974
diff changeset
   219
		});
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   220
1615
0e3eacf135f2 configmanager: Default options appearing before Host "*" to global (fixes potential traceback)
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   221
		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
   222
		function env.VirtualHost(name)
10378
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   223
			if not name then
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   224
				error("Host must have a name", 2);
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   225
			end
10379
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   226
			local prepped_name = nameprep(name);
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   227
			if not prepped_name then
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   228
				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
   229
			end
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   230
			name = prepped_name;
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   231
			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
   232
				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
   233
					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
   234
			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
   235
			rawset(env, "__currenthost", name);
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   236
			-- 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
   237
			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
   238
			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
   239
				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
   240
				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
   241
					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
   242
				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
   243
					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
   244
				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
   245
				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
   246
					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
   247
				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
   248
			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
   249
		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
   250
		env.Host, env.host = env.VirtualHost, env.VirtualHost;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   251
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   252
		function env.Component(name)
10378
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   253
			if not name then
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   254
				error("Component must have a name", 2);
a83233559253 core.configmanager: Ensure Hosts are given names
Kim Alvefur <zash@zash.se>
parents: 10210
diff changeset
   255
			end
10379
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   256
			local prepped_name = nameprep(name);
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   257
			if not prepped_name then
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   258
				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
   259
			end
3d0adbc74c39 core.configmanager: Handle nameprep validation errors
Kim Alvefur <zash@zash.se>
parents: 10378
diff changeset
   260
			name = prepped_name;
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6782
diff changeset
   261
			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
   262
				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
   263
				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
   264
					name, name, name), 0);
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
   265
			end
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   266
			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
   267
			-- 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
   268
			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
   269
			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
   270
			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
   271
				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
   272
				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
   273
					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
   274
				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
   275
			end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   276
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   277
			return function (module)
857
49298263f241 core.configmanager: Small fix to check validity of Component definitions
Matthew Wild <mwild1@gmail.com>
parents: 795
diff changeset
   278
					if type(module) == "string" then
6719
2b78754b0f1c configmanager: Rename variable to avoid name conflicts [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6718
diff changeset
   279
						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
   280
						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
   281
					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
   282
					return handle_config_options(module);
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   283
				end
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   284
		end
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   285
		env.component = env.Component;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   286
5413
0bf5e90be086 configmanager: Some cleanup, remove unused variables and imports
Matthew Wild <mwild1@gmail.com>
parents: 5380
diff changeset
   287
		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
   288
			-- 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
   289
			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
   290
				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
   291
				if not lfs then
46cb87d531a7 configmanager: Delay importing LuaFileSystem until needed by an Include line
Kim Alvefur <zash@zash.se>
parents: 5811
diff changeset
   292
					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
   293
				end
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   294
				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
   295
				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
   296
				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
   297
				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
   298
					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
   299
				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
   300
					path = config_path;
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   301
				end
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   302
				local patt = glob_to_pattern(glob);
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   303
				for f in lfs.dir(path) do
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   304
					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
   305
						env.Include(path..path_sep..f);
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   306
					end
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   307
				end
6721
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   308
				return;
794
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
   309
			end
6721
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   310
			-- 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
   311
			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
   312
			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
   313
			if f then
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7950
diff changeset
   314
				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
   315
				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
   316
				if err then
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   317
					for _, warning in ipairs(err) do
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   318
						t_insert(warnings, warning);
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   319
					end
d812031c8716 configmanager: Pass through warnings from included files
Matthew Wild <mwild1@gmail.com>
parents: 9879
diff changeset
   320
				end
6721
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   321
			end
be98ebe87eef configmanager: Refactor function to avoid re-declaring local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6720
diff changeset
   322
			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
   323
			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
   324
		end
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
   325
		env.include = env.Include;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   326
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
   327
		function env.RunScript(file)
3905
9222dad9e1e8 configmanager: Support for wildcards in Include directives
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   328
			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
   329
		end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   330
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4530
diff changeset
   331
		local chunk, err = envload(data, "@"..config_file, env);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   332
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
   333
		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
   334
			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
   335
		end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   336
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
   337
		local ok, err = pcall(chunk);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   338
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
   339
		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
   340
			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
   341
		end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   342
12444
1ef893715311 configmanager: Add method to report loaded config files (part of #1729 fix)
Matthew Wild <mwild1@gmail.com>
parents: 12087
diff changeset
   343
		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
   344
9878
c9f5ccdcdf80 configmanager: Add support for returning warnings
Matthew Wild <mwild1@gmail.com>
parents: 9244
diff changeset
   345
		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
   346
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5413
diff changeset
   347
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
   348
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
   349
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
   350
return _M;