From 6d0a69431a87a24dac04a9d77fbda5a6e24ac0dd Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Oct 30 2015 10:49:59 +0000 Subject: sss_override: add group-find Resolves: https://fedorahosted.org/sssd/ticket/2736 Reviewed-by: Pavel Reichl --- diff --git a/src/man/sss_override.8.xml b/src/man/sss_override.8.xml index d23bc1c..36ce119 100644 --- a/src/man/sss_override.8.xml +++ b/src/man/sss_override.8.xml @@ -175,6 +175,19 @@ + + DOMAIN + + + + List all groups with set overrides. + If DOMAIN parameter is set, + only groups from the domain are listed. + + + + + FILE diff --git a/src/tools/sss_override.c b/src/tools/sss_override.c index f438f92..0f45fbe 100644 --- a/src/tools/sss_override.c +++ b/src/tools/sss_override.c @@ -1186,6 +1186,70 @@ done: return ret; } +static errno_t group_export(const char *filename, + struct sss_domain_info *dom, + bool iterate) +{ + TALLOC_CTX *tmp_ctx; + struct sss_colondb *db; + struct override_group *objs; + errno_t ret; + int i; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n"); + return ENOMEM; + } + + + db = sss_colondb_open(tmp_ctx, SSS_COLONDB_WRITE, filename); + if (db == NULL) { + fprintf(stderr, _("Unable to open %s.\n"), + filename == NULL ? "stdout" : filename); + ret = EIO; + goto done; + } + + do { + objs = list_group_overrides(tmp_ctx, dom); + if (objs == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get override objects\n"); + ret = ENOMEM; + goto done; + } + + for (i = 0; objs[i].orig_name != NULL; i++) { + /** + * Format: orig_name:name:gid + */ + struct sss_colondb_write_field table[] = { + {SSS_COLONDB_STRING, {.str = objs[i].orig_name}}, + {SSS_COLONDB_STRING, {.str = objs[i].name}}, + {SSS_COLONDB_UINT32, {.uint32 = objs[i].gid}}, + {SSS_COLONDB_SENTINEL, {0}} + }; + + ret = sss_colondb_writeline(db, table); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, "Unable to write line to db\n"); + goto done; + } + } + + /* All overrides are under the same subtree, so we don't want to + * descent into subdomains. */ + dom = get_next_domain(dom, false); + } while (dom != NULL && iterate); + + ret = EOK; + +done: + talloc_free(tmp_ctx); + + return ret; +} + static int override_user_add(struct sss_cmdline *cmdline, struct sss_tool_ctx *tool_ctx, void *pvt) @@ -1431,6 +1495,36 @@ static int override_group_del(struct sss_cmdline *cmdline, return EXIT_SUCCESS; } +static int override_group_find(struct sss_cmdline *cmdline, + struct sss_tool_ctx *tool_ctx, + void *pvt) +{ + struct sss_domain_info *dom; + bool iterate; + errno_t ret; + + ret = parse_cmdline_find(cmdline, tool_ctx, &dom); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n"); + return EXIT_FAILURE; + } + + if (dom == NULL) { + dom = tool_ctx->domains; + iterate = true; + } else { + iterate = false; + } + + ret = group_export(NULL, dom, iterate); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export groups\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + static int override_group_import(struct sss_cmdline *cmdline, struct sss_tool_ctx *tool_ctx, void *pvt) @@ -1517,65 +1611,22 @@ static int override_group_export(struct sss_cmdline *cmdline, struct sss_tool_ctx *tool_ctx, void *pvt) { - struct sss_colondb *db; const char *filename; - struct override_group *objs; - struct sss_domain_info *dom; errno_t ret; - int exit; - int i; ret = parse_cmdline_export(cmdline, &filename); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n"); - exit = EXIT_FAILURE; - goto done; + return EXIT_FAILURE; } - db = sss_colondb_open(tool_ctx, SSS_COLONDB_WRITE, filename); - if (db == NULL) { - fprintf(stderr, _("Unable to open %s.\n"), filename); - exit = EXIT_FAILURE; - goto done; + ret = group_export(filename, tool_ctx->domains, true); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export groups\n"); + return EXIT_FAILURE; } - dom = tool_ctx->domains; - do { - objs = list_group_overrides(tool_ctx, dom); - if (objs == NULL) { - DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get override objects\n"); - exit = EXIT_FAILURE; - goto done; - } - - for (i = 0; objs[i].orig_name != NULL; i++) { - /** - * Format: orig_name:name:gid - */ - struct sss_colondb_write_field table[] = { - {SSS_COLONDB_STRING, {.str = objs[i].orig_name}}, - {SSS_COLONDB_STRING, {.str = objs[i].name}}, - {SSS_COLONDB_UINT32, {.uint32 = objs[i].gid}}, - {SSS_COLONDB_SENTINEL, {0}} - }; - - ret = sss_colondb_writeline(db, table); - if (ret != EOK) { - DEBUG(SSSDBG_CRIT_FAILURE, "Unable to write line to db\n"); - exit = EXIT_FAILURE; - goto done; - } - } - - /* All overrides are under the same subtree, so we don't want to - * descent into subdomains. */ - dom = get_next_domain(dom, 0); - } while (dom != NULL); - - exit = EXIT_SUCCESS; - -done: - return exit; + return EXIT_SUCCESS; } int main(int argc, const char **argv) @@ -1588,6 +1639,7 @@ int main(int argc, const char **argv) {"user-export", override_user_export}, {"group-add", override_group_add}, {"group-del", override_group_del}, + {"group-find", override_group_find}, {"group-import", override_group_import}, {"group-export", override_group_export}, {NULL, NULL}