sss_tools.c revision bda8039465a0084fb380e878c8f9ea3e900505ea
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina Pavel Březina <pbrezina@redhat.com>
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina Copyright (C) 2015 Red Hat
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina This program is free software; you can redistribute it and/or modify
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina it under the terms of the GNU General Public License as published by
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina the Free Software Foundation; either version 3 of the License, or
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina (at your option) any later version.
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina This program is distributed in the hope that it will be useful,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina GNU General Public License for more details.
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina You should have received a copy of the GNU General Public License
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char **argv;
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina _("Enable debug at level"));
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březinastatic struct poptOption *sss_tool_common_opts_table(void)
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina common_opts[0].descrip = _("The debug level to run with");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastatic void sss_tool_common_opts(struct sss_tool_ctx *tool_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina {"debug", '\0', POPT_ARG_INT | POPT_ARGFLAG_STRIP, &debug,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina pc = poptGetContext(argv[0], orig_argc, argv, options, 0);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* do nothing */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Strip common options from arguments. We will discard_const here,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina * since it is not worth the trouble to convert it back and forth. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina *argc = poptStrippedArgv(pc, orig_argc, discard_const_p(char *, argv));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastatic errno_t sss_tool_confdb_init(TALLOC_CTX *mem_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina path = talloc_asprintf(mem_ctx, "%s/%s", DB_PATH, CONFDB_FILE);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina "Could not initialize connection to the confdb\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastatic errno_t sss_tool_domains_init(TALLOC_CTX *mem_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to setup domains [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina "Could not initialize connection to the sysdb\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina for (dom = domains; dom != NULL; dom = get_next_domain(dom, true)) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Update list of subdomains for this domain */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina "Failed to update subdomains for domain %s.\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina for (dom = domains; dom != NULL; dom = get_next_domain(dom, true)) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_names_init(mem_ctx, confdb, dom->name, &dom->names);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sss_names_init() failed\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastruct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina tool_ctx = talloc_zero(mem_ctx, struct sss_tool_ctx);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero() failed\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Connect to confdb. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_tool_confdb_init(tool_ctx, &tool_ctx->confdb);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to open confdb [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Setup domains. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_tool_domains_init(tool_ctx, tool_ctx->confdb, &tool_ctx->domains);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to setup domains [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = confdb_get_string(tool_ctx->confdb, tool_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_OP_FAILURE, "Cannot get the default domain [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Usage:\n%s COMMAND COMMAND-ARGS\n\n"), tool_name);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina for (i = 0; commands[i].command != NULL; i++) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, "* %s\n", commands[i].command);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinaint sss_tool_route(int argc, const char **argv,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char *cmd;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Bug: commands can't be NULL!\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina for (i = 0; commands[i].command != NULL; i++) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return commands[i].fn(&cmdline, tool_ctx, pvt);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinaint sss_tool_popt_ex(struct sss_cmdline *cmdline,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char **_fopt)
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina {NULL, '\0', POPT_ARG_INCLUDE_TABLE, options, \
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina {NULL, '\0', POPT_ARG_INCLUDE_TABLE, sss_tool_common_opts_table(), \
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Create help option string. We always need to append command name since
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina * we use POPT_CONTEXT_KEEP_FIRST. */
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina help = talloc_asprintf(NULL, "%s %s %s", cmdline->exec,
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina help = talloc_asprintf(NULL, "%s %s %s %s", cmdline->exec,
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina cmdline->command, fopt_name, _("[OPTIONS...]"));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Create popt context. This function is supposed to be called on
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina * command argv which does not contain executable (argv[0]), therefore
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina * we need to use KEEP_FIRST that ensures argv[0] is also processed. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina pc = poptGetContext(cmdline->exec, cmdline->argc, cmdline->argv,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Parse options. Invoke custom function if provided. If no parsing
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina * function is provided, print error on unknown option. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Invalid option %s: %s\n\n"),
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Parse free option which is always required if requested. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Missing option: %s\n\n"), fopt_help);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* No more arguments expected. If something follows it is an error. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Only one free argument is expected!\n\n"));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* If at least one option is required and not provided, print error. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina && ((_fopt != NULL && cmdline->argc < 2) || cmdline->argc < 1)) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("At least one option is required!\n\n"));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return sss_tool_popt_ex(cmdline, options, require_option,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Running under %d, must be root\n", uid);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create tool context\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_tool_route(argc, argv, tool_ctx, commands, pvt);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_parse_name_for_domains(mem_ctx, tool_ctx->domains,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to find domain. The domain name may "
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina "be a subdomain that was not yet found.\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse name [%d]: %s\n",