s4:kdc: Ensure we don’t increase the value of entry->etypes->len
[Samba.git] / ctdb / common / conf_tool.c
blob2d0543d643e3452c350d0fca732af378848693b3
1 /*
2 Config options tool
4 Copyright (C) Amitay Isaacs 2018
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, see <http://www.gnu.org/licenses/>.
20 #include "replace.h"
22 #include <talloc.h>
24 #include "lib/util/debug.h"
26 #include "common/logging.h"
27 #include "common/cmdline.h"
28 #include "common/conf.h"
29 #include "common/path.h"
31 #include "common/logging_conf.h"
32 #include "cluster/cluster_conf.h"
33 #include "database/database_conf.h"
34 #include "event/event_conf.h"
35 #include "failover/failover_conf.h"
36 #include "server/legacy_conf.h"
38 #include "common/conf_tool.h"
40 struct conf_tool_context {
41 struct cmdline_context *cmdline;
42 const char *conf_file;
43 struct conf_context *conf;
46 static int conf_tool_dump(TALLOC_CTX *mem_ctx,
47 int argc,
48 const char **argv,
49 void *private_data)
51 struct conf_tool_context *ctx = talloc_get_type_abort(
52 private_data, struct conf_tool_context);
53 int ret;
55 if (argc != 0) {
56 cmdline_usage(ctx->cmdline, "dump");
57 return EINVAL;
60 ret = conf_load(ctx->conf, ctx->conf_file, true);
61 if (ret != 0 && ret != ENOENT) {
62 D_ERR("Failed to load config file %s\n", ctx->conf_file);
63 return ret;
66 conf_dump(ctx->conf, stdout);
67 return 0;
70 static int conf_tool_get(TALLOC_CTX *mem_ctx,
71 int argc,
72 const char **argv,
73 void *private_data)
75 struct conf_tool_context *ctx = talloc_get_type_abort(
76 private_data, struct conf_tool_context);
77 const char *section, *option;
78 enum conf_type type;
79 int ret;
80 bool ok;
81 const char *s_val = NULL;
82 int i_val;
83 bool b_val;
85 if (argc != 2) {
86 cmdline_usage(ctx->cmdline, "get");
87 return EINVAL;
90 section = argv[0];
91 option = argv[1];
93 ok = conf_query(ctx->conf, section, option, &type);
94 if (!ok) {
95 D_ERR("Configuration option [%s] -> \"%s\" not defined\n",
96 section, option);
97 return ENOENT;
100 ret = conf_load(ctx->conf, ctx->conf_file, true);
101 if (ret != 0 && ret != ENOENT) {
102 D_ERR("Failed to load config file %s\n", ctx->conf_file);
103 return ret;
106 switch (type) {
107 case CONF_STRING:
108 ret = conf_get_string(ctx->conf,
109 section,
110 option,
111 &s_val,
112 NULL);
113 break;
115 case CONF_INTEGER:
116 ret = conf_get_integer(ctx->conf,
117 section,
118 option,
119 &i_val,
120 NULL);
121 break;
123 case CONF_BOOLEAN:
124 ret = conf_get_boolean(ctx->conf,
125 section,
126 option,
127 &b_val,
128 NULL);
129 break;
131 default:
132 D_ERR("Unknown configuration option type\n");
133 return EINVAL;
136 if (ret != 0) {
137 D_ERR("Failed to get configuration option value\n");
138 return ret;
141 switch (type) {
142 case CONF_STRING:
143 printf("%s\n", s_val == NULL ? "" : s_val);
144 break;
146 case CONF_INTEGER:
147 printf("%d\n", i_val);
148 break;
150 case CONF_BOOLEAN:
151 printf("%s\n", b_val ? "true" : "false");
152 break;
155 return 0;
158 static int conf_tool_validate(TALLOC_CTX *mem_ctx,
159 int argc,
160 const char **argv,
161 void *private_data)
163 struct conf_tool_context *ctx = talloc_get_type_abort(
164 private_data, struct conf_tool_context);
165 int ret;
167 if (argc != 0) {
168 cmdline_usage(ctx->cmdline, "validate");
169 return EINVAL;
172 ret = conf_load(ctx->conf, ctx->conf_file, false);
173 if (ret != 0) {
174 D_ERR("Failed to load config file %s\n", ctx->conf_file);
175 return ret;
178 return 0;
181 struct cmdline_command conf_commands[] = {
182 { "dump", conf_tool_dump,
183 "Dump configuration", NULL },
184 { "get", conf_tool_get,
185 "Get a config value", "<section> <key>" },
186 { "validate", conf_tool_validate,
187 "Validate configuration file", NULL },
188 CMDLINE_TABLEEND
191 int conf_tool_init(TALLOC_CTX *mem_ctx,
192 const char *prog,
193 struct poptOption *options,
194 int argc,
195 const char **argv,
196 bool parse_options,
197 struct conf_tool_context **result)
199 struct conf_tool_context *ctx;
200 int ret;
202 ctx = talloc_zero(mem_ctx, struct conf_tool_context);
203 if (ctx == NULL) {
204 D_ERR("Memory allocation error\n");
205 return ENOMEM;
208 ret = cmdline_init(ctx,
209 prog,
210 options,
211 NULL,
212 conf_commands,
213 &ctx->cmdline);
214 if (ret != 0) {
215 D_ERR("Failed to initialize cmdline, ret=%d\n", ret);
216 talloc_free(ctx);
217 return ret;
220 ret = cmdline_parse(ctx->cmdline, argc, argv, parse_options);
221 if (ret != 0) {
222 cmdline_usage(ctx->cmdline, NULL);
223 talloc_free(ctx);
224 return ret;
227 *result = ctx;
228 return 0;
231 int conf_tool_run(struct conf_tool_context *ctx, int *result)
233 int ret;
235 ctx->conf_file = path_config(ctx);
236 if (ctx->conf_file == NULL) {
237 D_ERR("Memory allocation error\n");
238 return ENOMEM;
241 ret = conf_init(ctx, &ctx->conf);
242 if (ret != 0) {
243 D_ERR("Failed to initialize config\n");
244 return ret;
247 /* Call functions to initialize config sections/variables */
248 logging_conf_init(ctx->conf, NULL);
249 cluster_conf_init(ctx->conf);
250 database_conf_init(ctx->conf);
251 event_conf_init(ctx->conf);
252 failover_conf_init(ctx->conf);
253 legacy_conf_init(ctx->conf);
255 if (! conf_valid(ctx->conf)) {
256 D_ERR("Failed to define configuration options\n");
257 return EINVAL;
260 ret = cmdline_run(ctx->cmdline, ctx, result);
261 return ret;
264 #ifdef CTDB_CONF_TOOL
266 static struct {
267 const char *debug;
268 } conf_data = {
269 .debug = "ERROR",
272 struct poptOption conf_options[] = {
273 POPT_AUTOHELP
274 { "debug", 'd', POPT_ARG_STRING, &conf_data.debug, 0,
275 "debug level", "ERROR|WARNING|NOTICE|INFO|DEBUG" },
276 POPT_TABLEEND
279 int main(int argc, const char **argv)
281 TALLOC_CTX *mem_ctx;
282 struct conf_tool_context *ctx;
283 int ret, result;
284 int level;
285 bool ok;
287 mem_ctx = talloc_new(NULL);
288 if (mem_ctx == NULL) {
289 fprintf(stderr, "Memory allocation error\n");
290 exit(1);
293 ret = conf_tool_init(mem_ctx,
294 "ctdb-config",
295 conf_options,
296 argc,
297 argv,
298 true,
299 &ctx);
300 if (ret != 0) {
301 talloc_free(mem_ctx);
302 exit(1);
305 setup_logging("ctdb-config", DEBUG_STDERR);
306 ok = debug_level_parse(conf_data.debug, &level);
307 if (!ok) {
308 level = DEBUG_ERR;
310 debuglevel_set(level);
312 ret = conf_tool_run(ctx, &result);
313 if (ret != 0) {
314 result = 1;
317 talloc_free(mem_ctx);
318 exit(result);
321 #endif /* CTDB_CONF_TOOL */