sss_tools.c revision bda8039465a0084fb380e878c8f9ea3e900505ea
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina/*
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina Authors:
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina Pavel Březina <pbrezina@redhat.com>
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina Copyright (C) 2015 Red Hat
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
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
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
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*/
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include <talloc.h>
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include <stdlib.h>
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include <string.h>
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include <popt.h>
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include "config.h"
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include "util/util.h"
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include "confdb/confdb.h"
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include "db/sysdb.h"
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina#include "tools/common/sss_tools.h"
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastruct sss_cmdline {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char *exec; /* argv[0] */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char *command; /* command name */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int argc; /* rest of arguments */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char **argv;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina};
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinastatic void sss_tool_print_common_opts(void)
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina{
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina fprintf(stderr, _("Common options:\n"));
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina fprintf(stderr, " --debug=INT %s\n",
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina _("Enable debug at level"));
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina}
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březinastatic struct poptOption *sss_tool_common_opts_table(void)
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina{
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina static struct poptOption common_opts[] = {
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina {"debug", '\0', POPT_ARG_INT, NULL,
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina 0, NULL, NULL },
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina POPT_TABLEEND
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina };
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina common_opts[0].descrip = _("The debug level to run with");
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina return common_opts;
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina}
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastatic void sss_tool_common_opts(struct sss_tool_ctx *tool_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int *argc, const char **argv)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina poptContext pc;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int debug = SSSDBG_DEFAULT;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int orig_argc = *argc;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int opt;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct poptOption options[] = {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina {"debug", '\0', POPT_ARG_INT | POPT_ARGFLAG_STRIP, &debug,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina 0, _("The debug level to run with"), NULL },
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina POPT_TABLEEND
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina };
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina pc = poptGetContext(argv[0], orig_argc, argv, options, 0);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina while ((opt = poptGetNextOpt(pc)) != -1) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* do nothing */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
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řezina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG_CLI_INIT(debug);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina poptFreeContext(pc);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastatic errno_t sss_tool_confdb_init(TALLOC_CTX *mem_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct confdb_ctx **_confdb)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct confdb_ctx *confdb;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina char *path;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina errno_t ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina path = talloc_asprintf(mem_ctx, "%s/%s", DB_PATH, CONFDB_FILE);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (path == NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ENOMEM;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = confdb_init(mem_ctx, &confdb, path);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina "Could not initialize connection to the confdb\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina talloc_free(path);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (_confdb != NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina *_confdb = confdb;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return EOK;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastatic errno_t sss_tool_domains_init(TALLOC_CTX *mem_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct confdb_ctx *confdb,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_domain_info **_domains)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_domain_info *domains;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_domain_info *dom;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina errno_t ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = confdb_get_domains(confdb, &domains);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to setup domains [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret, sss_strerror(ret));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sysdb_init(mem_ctx, domains, false);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina SYSDB_VERSION_ERROR(ret);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina "Could not initialize connection to the sysdb\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina for (dom = domains; dom != NULL; dom = get_next_domain(dom, true)) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (!IS_SUBDOMAIN(dom)) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Update list of subdomains for this domain */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sysdb_update_subdomains(dom);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_MINOR_FAILURE,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina "Failed to update subdomains for domain %s.\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina dom->name);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
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 if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sss_names_init() failed\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina *_domains = domains;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinastruct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int *argc, const char **argv)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_tool_ctx *tool_ctx;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina errno_t ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina tool_ctx = talloc_zero(mem_ctx, struct sss_tool_ctx);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (tool_ctx == NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero() failed\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return NULL;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina sss_tool_common_opts(tool_ctx, argc, argv);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Connect to confdb. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_tool_confdb_init(tool_ctx, &tool_ctx->confdb);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to open confdb [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret, sss_strerror(ret));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Setup domains. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_tool_domains_init(tool_ctx, tool_ctx->confdb, &tool_ctx->domains);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to setup domains [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret, sss_strerror(ret));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = confdb_get_string(tool_ctx->confdb, tool_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina CONFDB_MONITOR_CONF_ENTRY,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina CONFDB_MONITOR_DEFAULT_DOMAIN,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina NULL, &tool_ctx->default_domain);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_OP_FAILURE, "Cannot get the default domain [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret, strerror(ret));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = EOK;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinadone:
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina talloc_zfree(tool_ctx);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return tool_ctx;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinaint sss_tool_usage(const char *tool_name,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_route_cmd *commands)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int i;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Usage:\n%s COMMAND COMMAND-ARGS\n\n"), tool_name);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Available commands:\n"));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina for (i = 0; commands[i].command != NULL; i++) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, "* %s\n", commands[i].command);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina fprintf(stderr, _("\n"));
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina sss_tool_print_common_opts();
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinaint sss_tool_route(int argc, const char **argv,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_tool_ctx *tool_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_route_cmd *commands,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina void *pvt)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_cmdline cmdline;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char *cmd;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int i;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (commands == NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Bug: commands can't be NULL!\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (argc < 2) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return sss_tool_usage(argv[0], commands);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina cmd = argv[1];
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina for (i = 0; commands[i].command != NULL; i++) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (strcmp(commands[i].command, cmd) == 0) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina cmdline.exec = argv[0];
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina cmdline.command = argv[1];
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina cmdline.argc = argc - 2;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina cmdline.argv = argv + 2;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return commands[i].fn(&cmdline, tool_ctx, pvt);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return sss_tool_usage(argv[0], commands);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinaint sss_tool_popt_ex(struct sss_cmdline *cmdline,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct poptOption *options,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina enum sss_tool_opt require_option,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina sss_popt_fn popt_fn,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina void *popt_fn_pvt,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char *fopt_name,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char *fopt_help,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char **_fopt)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina struct poptOption opts_table[] = {
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina {NULL, '\0', POPT_ARG_INCLUDE_TABLE, options, \
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina 0, _("Command options:"), NULL },
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina {NULL, '\0', POPT_ARG_INCLUDE_TABLE, sss_tool_common_opts_table(), \
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina 0, _("Common options:"), NULL },
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina POPT_AUTOHELP
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina POPT_TABLEEND
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina };
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina char *help;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina poptContext pc;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Create help option string. We always need to append command name since
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina * we use POPT_CONTEXT_KEEP_FIRST. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (fopt_name == NULL) {
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina help = talloc_asprintf(NULL, "%s %s %s", cmdline->exec,
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina cmdline->command, _("[OPTIONS...]"));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina } else {
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina help = talloc_asprintf(NULL, "%s %s %s %s", cmdline->exec,
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina cmdline->command, fopt_name, _("[OPTIONS...]"));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (help == NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
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,
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina opts_table, POPT_CONTEXT_KEEP_FIRST);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina poptSetOtherOptionHelp(pc, help);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
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 while ((ret = poptGetNextOpt(pc)) != -1) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (popt_fn != NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = popt_fn(pc, ret, popt_fn_pvt);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina } else {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Invalid option %s: %s\n\n"),
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina poptBadOption(pc, 0), poptStrerror(ret));
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina poptPrintHelp(pc, stderr, 0);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* Parse free option which is always required if requested. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (_fopt != NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina *_fopt = poptGetArg(pc);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (*_fopt == NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Missing option: %s\n\n"), fopt_help);
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina poptPrintHelp(pc, stderr, 0);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* No more arguments expected. If something follows it is an error. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (poptGetArg(pc)) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("Only one free argument is expected!\n\n"));
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina poptPrintHelp(pc, stderr, 0);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina /* If at least one option is required and not provided, print error. */
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (require_option == SSS_TOOL_OPT_REQUIRED
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina && ((_fopt != NULL && cmdline->argc < 2) || cmdline->argc < 1)) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina fprintf(stderr, _("At least one option is required!\n\n"));
bda8039465a0084fb380e878c8f9ea3e900505eaPavel Březina poptPrintHelp(pc, stderr, 0);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = EXIT_SUCCESS;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinadone:
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina poptFreeContext(pc);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina talloc_free(help);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinaint sss_tool_popt(struct sss_cmdline *cmdline,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct poptOption *options,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina enum sss_tool_opt require_option,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina sss_popt_fn popt_fn,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina void *popt_fn_pvt)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return sss_tool_popt_ex(cmdline, options, require_option,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina popt_fn, popt_fn_pvt, NULL, NULL, NULL);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinaint sss_tool_main(int argc, const char **argv,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_route_cmd *commands,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina void *pvt)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_tool_ctx *tool_ctx;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina uid_t uid;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina uid = getuid();
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (uid != 0) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Running under %d, must be root\n", uid);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ERROR("%1$s must be run as root\n", argv[0]);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina tool_ctx = sss_tool_init(NULL, &argc, argv);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (tool_ctx == NULL) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create tool context\n");
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return EXIT_FAILURE;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_tool_route(argc, argv, tool_ctx, commands, pvt);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina talloc_free(tool_ctx);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinaint sss_tool_parse_name(TALLOC_CTX *mem_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_tool_ctx *tool_ctx,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char *input,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char **_username,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_domain_info **_domain)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina char *username = NULL;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina char *domname = NULL;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina struct sss_domain_info *domain;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina int ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = sss_parse_name_for_domains(mem_ctx, tool_ctx->domains,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina tool_ctx->default_domain, input,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina &domname, &username);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret == EAGAIN) {
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 goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina } else if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse name [%d]: %s\n",
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret, sss_strerror(ret));
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina domain = find_domain_by_name(tool_ctx->domains, domname, true);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina *_username = username;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina *_domain = domain;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = EOK;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březinadone:
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina if (ret != EOK) {
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina talloc_zfree(username);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina talloc_zfree(domname);
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina return ret;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina}