Annotate

core/configmanager.lua @ 3011:1189a29cd846

configmanager: Add VirtualHost as an alias for Host (re-applied in trunk due to previous bad merge with 0.7)
author Matthew Wild <mwild1@gmail.com>
date Wed, 14 Apr 2010 12:59:46 +0100
parent 2925:692b3c6c5bd2
child 3012:6d86e26f0923
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 466
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
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 466
diff changeset
9
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
10
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
11 local _G = _G;
2861
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
12 local setmetatable, loadfile, pcall, rawget, rawset, io, error, dofile, type, pairs, table, format =
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
13 setmetatable, loadfile, pcall, rawget, rawset, io, error, dofile, type, pairs, table, string.format;
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
14
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
15
1000
a73715a9267f core.configmanager: Fire event when (re)loading config file
Matthew Wild <mwild1@gmail.com>
parents: 913
diff changeset
16 local eventmanager = require "core.eventmanager";
a73715a9267f core.configmanager: Fire event when (re)loading config file
Matthew Wild <mwild1@gmail.com>
parents: 913
diff changeset
17
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
18 module "configmanager"
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
19
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
20 local parsers = {};
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
21
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
22 local config = { ["*"] = { core = {} } };
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
23
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
24 local global_config = config["*"];
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
25
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
26 -- When host not found, use global
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 setmetatable(config, { __index = function () return global_config; 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
28 local host_mt = { __index = global_config };
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
29
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
30 -- When key not found in section, check key in global's section
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 function section_mt(section_name)
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 return { __index = function (t, k)
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
33 local section = rawget(global_config, section_name);
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
34 if not section then return nil; 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
35 return section[k];
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 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
37 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
38
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
39 function getconfig()
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
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
43 function get(host, section, key)
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
44 local sec = config[host][section];
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
45 if sec 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
46 return sec[key];
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
47 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
48 return nil;
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
49 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
50
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
51 function set(host, section, key, value)
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 if host and section and key 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
53 local hostconfig = rawget(config, host);
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
54 if not hostconfig 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
55 hostconfig = rawset(config, host, setmetatable({}, host_mt))[host];
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
56 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
57 if not rawget(hostconfig, section) 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
58 hostconfig[section] = setmetatable({}, section_mt(section));
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
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
60 hostconfig[section][key] = value;
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
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 function load(filename, 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
67 format = 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
68
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
69 if parsers[format] and parsers[format].load then
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
70 local f, err = io.open(filename);
2552
8dda55217e83 configmanager: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2427
diff changeset
71 if f then
1777
de86734d3f7f configmanager: Assign a chunk name to config files loaded using the default config loader (fixes issues with some diagnostic tools).
Waqas Hussain <waqas20@gmail.com>
parents: 1615
diff changeset
72 local ok, err = parsers[format].load(f:read("*a"), filename);
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
73 f:close();
1000
a73715a9267f core.configmanager: Fire event when (re)loading config file
Matthew Wild <mwild1@gmail.com>
parents: 913
diff changeset
74 if ok then
a73715a9267f core.configmanager: Fire event when (re)loading config file
Matthew Wild <mwild1@gmail.com>
parents: 913
diff changeset
75 eventmanager.fire_event("config-reloaded", { filename = filename, format = format });
a73715a9267f core.configmanager: Fire event when (re)loading config file
Matthew Wild <mwild1@gmail.com>
parents: 913
diff changeset
76 end
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
77 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
78 end
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
79 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
80 end
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
81
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
82 if not format then
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
83 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
84 else
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
85 return nil, "file", "no parser for "..(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
86 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
87 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
88
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
89 function save(filename, format)
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
90 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
91
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
92 function addparser(format, parser)
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 if format and parser 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
94 parsers[format] = parser;
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
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
96 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
97
2427
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
98 -- _M needed to avoid name clash with local 'parsers'
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
99 function _M.parsers()
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
100 local p = {};
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
101 for format in pairs(parsers) do
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
102 table.insert(p, format);
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
103 end
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
104 return p;
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
105 end
343a9eb7540e configmanager: Add parsers() method to return an array of supported config formats
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
106
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
107 -- 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
108 do
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
109 local loadstring, pcall, setmetatable = _G.loadstring, _G.pcall, _G.setmetatable;
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
110 local setfenv, rawget, tostring = _G.setfenv, _G.rawget, _G.tostring;
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
111 parsers.lua = {};
1777
de86734d3f7f configmanager: Assign a chunk name to config files loaded using the default config loader (fixes issues with some diagnostic tools).
Waqas Hussain <waqas20@gmail.com>
parents: 1615
diff changeset
112 function parsers.lua.load(data, filename)
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
113 local env;
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
114 -- The ' = true' are needed so as not to set off __newindex when we assign the functions below
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
115 env = setmetatable({ Host = true, host = true, VirtualHost = true, Component = true, component = true,
795
e27a48e35bbb Add RunScript command to config to run a Lua script prior to starting the server
Matthew Wild <mwild1@gmail.com>
parents: 794
diff changeset
116 Include = true, include = true, RunScript = dofile }, { __index = function (t, k)
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
117 return rawget(_G, k) or
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
118 function (settings_table)
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
119 config[__currenthost or "*"][k] = settings_table;
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
120 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
121 end,
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
122 __newindex = function (t, k, v)
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
123 set(env.__currenthost or "*", "core", k, v);
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
124 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
125
1615
0e3eacf135f2 configmanager: Default options appearing before Host "*" to global (fixes potential traceback)
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
126 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
127 function env.VirtualHost(name)
2861
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
128 if rawget(config, name) and rawget(config[name].core, "component_module") then
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
129 error(format("Host %q clashes with previously defined %s Component %q, for services use a sub-domain like conference.%s",
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
130 name, config[name].core.component_module:gsub("^%a+$", { component = "external", muc = "MUC"}), name, name), 0);
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
131 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
132 rawset(env, "__currenthost", name);
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
133 -- Needs at least one setting to logically exist :)
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 371
diff changeset
134 set(name or "*", "core", "defined", true);
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
135 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
136 env.Host, env.host = env.VirtualHost, env.VirtualHost;
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
137
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
138 function env.Component(name)
2861
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
139 if rawget(config, name) and rawget(config[name].core, "defined") and not rawget(config[name].core, "component_module") then
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
140 error(format("Component %q clashes with previously defined Host %q, for services use a sub-domain like conference.%s",
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
141 name, name, name), 0);
1402615b66f8 configmanager: Error when a component and host clash hostnames
Matthew Wild <mwild1@gmail.com>
parents: 1777
diff changeset
142 end
913
3e2dac84017d core.configmanager: Make components use 'component' module by default if none specified
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
143 set(name, "core", "component_module", "component");
3e2dac84017d core.configmanager: Make components use 'component' module by default if none specified
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
144 -- Don't load the global modules by default
1504
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1000
diff changeset
145 set(name, "core", "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
146 rawset(env, "__currenthost", name);
3e2dac84017d core.configmanager: Make components use 'component' module by default if none specified
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
147
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
148 return function (module)
857
49298263f241 core.configmanager: Small fix to check validity of Component definitions
Matthew Wild <mwild1@gmail.com>
parents: 795
diff changeset
149 if type(module) == "string" then
49298263f241 core.configmanager: Small fix to check validity of Component definitions
Matthew Wild <mwild1@gmail.com>
parents: 795
diff changeset
150 set(name, "core", "component_module", module);
49298263f241 core.configmanager: Small fix to check validity of Component definitions
Matthew Wild <mwild1@gmail.com>
parents: 795
diff changeset
151 end
750
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
152 end
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
153 end
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
154 env.component = env.Component;
fbfcf8c1c830 configmanager: Add support for defining components
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
155
794
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
156 function env.Include(file)
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
157 local f, err = io.open(file);
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
158 if f then
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
159 local data = f:read("*a");
1777
de86734d3f7f configmanager: Assign a chunk name to config files loaded using the default config loader (fixes issues with some diagnostic tools).
Waqas Hussain <waqas20@gmail.com>
parents: 1615
diff changeset
160 local ok, err = parsers.lua.load(data, file);
794
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
161 if not ok then error(err:gsub("%[string.-%]", file), 0); end
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
162 end
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
163 if not f then error("Error loading included "..file..": "..err, 0); end
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
164 return f, err;
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
165 end
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
166 env.include = env.Include;
912dc389935a Add Include command to include extra configuration files from the main one
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
167
1777
de86734d3f7f configmanager: Assign a chunk name to config files loaded using the default config loader (fixes issues with some diagnostic tools).
Waqas Hussain <waqas20@gmail.com>
parents: 1615
diff changeset
168 local chunk, err = loadstring(data, "@"..filename);
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
169
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
170 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
171 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
172 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
173
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
174 setfenv(chunk, env);
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
175
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
176 local ok, err = pcall(chunk);
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
177
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
178 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
179 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
180 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
181
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
182 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
183 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
184
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
185 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
186
466
0ecfd89c2cc0 Fix for configmanager when config file can't be found
Matthew Wild <mwild1@gmail.com>
parents: 376
diff changeset
187 return _M;