Skip to content

Commit

Permalink
TOOLS: Some tools command might not need initialization to succeed
Browse files Browse the repository at this point in the history
Since we want to use the sssctl tool during upgrade, we need to amend
the tools initialization code to not error out if sysdb can't be
instantiated, but rather return errno and let the tool handle the error.

Each tool command now has a 'allowed errno' the command is able to
handle. In this patch iteration, only a single errno can be handled and
only the upgrade command is able to do so.

Reviewed-by: Sumit Bose <[email protected]>
  • Loading branch information
jhrozek committed Jul 7, 2016
1 parent 1ea5a9c commit a0b824a
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 38 deletions.
45 changes: 35 additions & 10 deletions src/tools/common/sss_tools.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@ static errno_t sss_tool_domains_init(TALLOC_CTX *mem_ctx,
}

ret = sysdb_init(mem_ctx, domains);
SYSDB_VERSION_ERROR(ret);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE,
"Could not initialize connection to the sysdb\n");
Expand Down Expand Up @@ -178,16 +177,17 @@ static errno_t sss_tool_domains_init(TALLOC_CTX *mem_ctx,
return ret;
}

struct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx,
int *argc, const char **argv)
errno_t sss_tool_init(TALLOC_CTX *mem_ctx,
int *argc, const char **argv,
struct sss_tool_ctx **_tool_ctx)
{
struct sss_tool_ctx *tool_ctx;
errno_t ret;

tool_ctx = talloc_zero(mem_ctx, struct sss_tool_ctx);
if (tool_ctx == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero() failed\n");
return NULL;
return ENOMEM;
}

sss_tool_common_opts(tool_ctx, argc, argv);
Expand Down Expand Up @@ -221,11 +221,16 @@ struct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx,
ret = EOK;

done:
if (ret != EOK) {
talloc_zfree(tool_ctx);
switch (ret) {
case EOK:
case ERR_SYSDB_VERSION_TOO_OLD:
*_tool_ctx = tool_ctx;
break;
default:
break;
}

return tool_ctx;
return ret;
}

static bool sss_tool_is_delimiter(struct sss_route_cmd *command)
Expand All @@ -237,6 +242,16 @@ static bool sss_tool_is_delimiter(struct sss_route_cmd *command)
return false;
}

static bool sss_tools_handles_init_error(struct sss_route_cmd *command,
errno_t init_err)
{
if (init_err == EOK) {
return true;
}

return command->handles_init_err == init_err;
}

static size_t sss_tool_max_length(struct sss_route_cmd *commands)
{
size_t max = 0;
Expand Down Expand Up @@ -316,6 +331,14 @@ errno_t sss_tool_route(int argc, const char **argv,
cmdline.argc = argc - 2;
cmdline.argv = argv + 2;

if (!sss_tools_handles_init_error(&commands[i], tool_ctx->init_err)) {
DEBUG(SSSDBG_FATAL_FAILURE,
"Command %s does not handle initialization error [%d] %s\n",
cmdline.command, tool_ctx->init_err,
sss_strerror(tool_ctx->init_err));
return tool_ctx->init_err;
}

return commands[i].fn(&cmdline, tool_ctx, pvt);
}
}
Expand Down Expand Up @@ -477,15 +500,17 @@ int sss_tool_main(int argc, const char **argv,
return EXIT_FAILURE;
}

tool_ctx = sss_tool_init(NULL, &argc, argv);
if (tool_ctx == NULL) {
ret = sss_tool_init(NULL, &argc, argv, &tool_ctx);
if (ret == ERR_SYSDB_VERSION_TOO_OLD) {
tool_ctx->init_err = ret;
} else if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create tool context\n");
return EXIT_FAILURE;
}

ret = sss_tool_route(argc, argv, tool_ctx, commands, pvt);
SYSDB_VERSION_ERROR(ret);
talloc_free(tool_ctx);

if (ret != EOK) {
return EXIT_FAILURE;
}
Expand Down
11 changes: 7 additions & 4 deletions src/tools/common/sss_tools.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,14 @@
struct sss_tool_ctx {
struct confdb_ctx *confdb;

errno_t init_err;
char *default_domain;
struct sss_domain_info *domains;
};

struct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx,
int *argc, const char **argv);
errno_t sss_tool_init(TALLOC_CTX *mem_ctx,
int *argc, const char **argv,
struct sss_tool_ctx **_tool_ctx);

struct sss_cmdline;

Expand All @@ -43,12 +45,13 @@ typedef errno_t
struct sss_tool_ctx *tool_ctx,
void *pvt);

#define SSS_TOOL_COMMAND(cmd, msg, fn) {cmd, _(msg), fn}
#define SSS_TOOL_DELIMITER(message) {"", (message), NULL}
#define SSS_TOOL_COMMAND(cmd, msg, err, fn) {cmd, _(msg), err, fn}
#define SSS_TOOL_DELIMITER(message) {"", (message), 0, NULL}

struct sss_route_cmd {
const char *command;
const char *description;
errno_t handles_init_err;
sss_route_fn fn;
};

Expand Down
26 changes: 13 additions & 13 deletions src/tools/sss_override.c
Original file line number Diff line number Diff line change
Expand Up @@ -1913,19 +1913,19 @@ static int override_group_export(struct sss_cmdline *cmdline,
int main(int argc, const char **argv)
{
struct sss_route_cmd commands[] = {
{"user-add", NULL, override_user_add},
{"user-del", NULL, override_user_del},
{"user-find", NULL, override_user_find},
{"user-show", NULL, override_user_show},
{"user-import", NULL, override_user_import},
{"user-export", NULL, override_user_export},
{"group-add", NULL, override_group_add},
{"group-del", NULL, override_group_del},
{"group-find", NULL, override_group_find},
{"group-show", NULL, override_group_show},
{"group-import", NULL, override_group_import},
{"group-export", NULL, override_group_export},
{NULL, NULL, NULL}
{"user-add", NULL, 0, override_user_add},
{"user-del", NULL, 0, override_user_del},
{"user-find", NULL, 0, override_user_find},
{"user-show", NULL, 0, override_user_show},
{"user-import", NULL, 0, override_user_import},
{"user-export", NULL, 0, override_user_export},
{"group-add", NULL, 0, override_group_add},
{"group-del", NULL, 0, override_group_del},
{"group-find", NULL, 0, override_group_find},
{"group-show", NULL, 0, override_group_show},
{"group-import", NULL, 0, override_group_import},
{"group-export", NULL, 0, override_group_export},
{NULL, NULL, 0, NULL}
};

return sss_tool_main(argc, argv, commands, NULL);
Expand Down
22 changes: 11 additions & 11 deletions src/tools/sssctl/sssctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,20 +257,20 @@ int main(int argc, const char **argv)
{
struct sss_route_cmd commands[] = {
SSS_TOOL_DELIMITER("SSSD Status:"),
SSS_TOOL_COMMAND("list-domains", "List available domains", sssctl_list_domains),
SSS_TOOL_COMMAND("domain-status", "Print information about domain", sssctl_domain_status),
SSS_TOOL_COMMAND("list-domains", "List available domains", 0, sssctl_list_domains),
SSS_TOOL_COMMAND("domain-status", "Print information about domain", 0, sssctl_domain_status),
SSS_TOOL_DELIMITER("Information about cached content:"),
SSS_TOOL_COMMAND("user", "Information about cached user", sssctl_user),
SSS_TOOL_COMMAND("group", "Information about cached group", sssctl_group),
SSS_TOOL_COMMAND("netgroup", "Information about cached netgroup", sssctl_netgroup),
SSS_TOOL_COMMAND("user", "Information about cached user", 0, sssctl_user),
SSS_TOOL_COMMAND("group", "Information about cached group", 0, sssctl_group),
SSS_TOOL_COMMAND("netgroup", "Information about cached netgroup", 0, sssctl_netgroup),
SSS_TOOL_DELIMITER("Local data tools:"),
SSS_TOOL_COMMAND("backup-local-data", "Backup local data", sssctl_backup_local_data),
SSS_TOOL_COMMAND("restore-local-data", "Restore local data from backup", sssctl_restore_local_data),
SSS_TOOL_COMMAND("remove-cache", "Backup local data and remove cached content", sssctl_remove_cache),
SSS_TOOL_COMMAND("backup-local-data", "Backup local data", 0, sssctl_backup_local_data),
SSS_TOOL_COMMAND("restore-local-data", "Restore local data from backup", 0, sssctl_restore_local_data),
SSS_TOOL_COMMAND("remove-cache", "Backup local data and remove cached content", 0, sssctl_remove_cache),
SSS_TOOL_DELIMITER("Log files tools:"),
SSS_TOOL_COMMAND("remove-logs", "Remove existing SSSD log files", sssctl_remove_logs),
SSS_TOOL_COMMAND("fetch-logs", "Archive SSSD log files in tarball", sssctl_fetch_logs),
{NULL, NULL, NULL}
SSS_TOOL_COMMAND("remove-logs", "Remove existing SSSD log files", 0, sssctl_remove_logs),
SSS_TOOL_COMMAND("fetch-logs", "Archive SSSD log files in tarball", 0, sssctl_fetch_logs),
{NULL, NULL, 0, NULL}
};

return sss_tool_main(argc, argv, commands, NULL);
Expand Down

0 comments on commit a0b824a

Please sign in to comment.