From 1ecdcf622920781a95e3d2040a2aad9ac2e31260 Mon Sep 17 00:00:00 2001 From: Jan Zeleny Date: Aug 01 2012 14:19:41 +0000 Subject: Primary server support: IPA adaptation This patch adds support for the primary server functionality into IPA provider. No backup servers are added at the moment, just the basic support is in place. --- diff --git a/src/providers/ipa/ipa_common.c b/src/providers/ipa/ipa_common.c index 98a7c58..b5f6337 100644 --- a/src/providers/ipa/ipa_common.c +++ b/src/providers/ipa/ipa_common.c @@ -797,20 +797,74 @@ static void ipa_resolve_callback(void *private_data, struct fo_server *server) talloc_free(tmp_ctx); } +errno_t ipa_servers_init(struct be_ctx *ctx, + struct ipa_service *service, + struct ipa_options *options, + const char *servers, + bool primary) +{ + TALLOC_CTX *tmp_ctx; + char **list = NULL; + char *ipa_domain; + int ret; + int i; + + tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) { + return ENOMEM; + } + + /* split server parm into a list */ + ret = split_on_separator(tmp_ctx, servers, ',', true, &list, NULL); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to parse server list!\n")); + goto done; + } + + /* now for each one add a new server to the failover service */ + for (i = 0; list[i]; i++) { + + talloc_steal(service, list[i]); + + if (be_fo_is_srv_identifier(list[i])) { + ipa_domain = dp_opt_get_string(options->basic, IPA_DOMAIN); + ret = be_fo_add_srv_server(ctx, "IPA", "ldap", ipa_domain, + BE_FO_PROTO_TCP, false, NULL); + if (ret) { + DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add server\n")); + goto done; + } + + DEBUG(SSSDBG_TRACE_FUNC, ("Added service lookup for service IPA\n")); + continue; + } + + ret = be_fo_add_server(ctx, "IPA", list[i], 0, NULL, primary); + if (ret && ret != EEXIST) { + DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add server\n")); + goto done; + } + + DEBUG(SSSDBG_TRACE_FUNC, ("Added Server %s\n", list[i])); + } + +done: + talloc_free(tmp_ctx); + return ret; +} + int ipa_service_init(TALLOC_CTX *memctx, struct be_ctx *ctx, - const char *servers, + const char *primary_servers, + const char *backup_servers, struct ipa_options *options, struct ipa_service **_service) { TALLOC_CTX *tmp_ctx; struct ipa_service *service; - char **list = NULL; char *realm; - char *ipa_domain; int ret; - int i; - tmp_ctx = talloc_new(memctx); + tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } @@ -863,42 +917,29 @@ int ipa_service_init(TALLOC_CTX *memctx, struct be_ctx *ctx, goto done; } - if (!servers) { - servers = BE_SRV_IDENTIFIER; + if (!primary_servers) { + if (backup_servers) { + DEBUG(SSSDBG_CONF_SETTINGS, ("Missing primary IPA server but " + "backup server given - using it as primary!\n")); + primary_servers = backup_servers; + backup_servers = NULL; + } else { + DEBUG(SSSDBG_CONF_SETTINGS, ("Missing primary and backup IPA " + "servers - using service discovery!\n")); + primary_servers = BE_SRV_IDENTIFIER; + } } - /* split server parm into a list */ - ret = split_on_separator(tmp_ctx, servers, ',', true, &list, NULL); + ret = ipa_servers_init(ctx, service, options, primary_servers, true); if (ret != EOK) { - DEBUG(1, ("Failed to parse server list!\n")); goto done; } - /* now for each one add a new server to the failover service */ - for (i = 0; list[i]; i++) { - - talloc_steal(service, list[i]); - - if (be_fo_is_srv_identifier(list[i])) { - ipa_domain = dp_opt_get_string(options->basic, IPA_DOMAIN); - ret = be_fo_add_srv_server(ctx, "IPA", "ldap", ipa_domain, - BE_FO_PROTO_TCP, false, NULL); - if (ret) { - DEBUG(0, ("Failed to add server\n")); - goto done; - } - - DEBUG(6, ("Added service lookup for service IPA\n")); - continue; - } - - ret = be_fo_add_server(ctx, "IPA", list[i], 0, NULL, true); - if (ret && ret != EEXIST) { - DEBUG(0, ("Failed to add server\n")); + if (backup_servers) { + ret = ipa_servers_init(ctx, service, options, backup_servers, false); + if (ret != EOK) { goto done; } - - DEBUG(6, ("Added Server %s\n", list[i])); } ret = be_fo_service_add_callback(memctx, ctx, "IPA", diff --git a/src/providers/ipa/ipa_common.h b/src/providers/ipa/ipa_common.h index 3e2ef28..b094459 100644 --- a/src/providers/ipa/ipa_common.h +++ b/src/providers/ipa/ipa_common.h @@ -171,7 +171,8 @@ int ipa_autofs_init(struct be_ctx *be_ctx, void **pvt_data); int ipa_service_init(TALLOC_CTX *memctx, struct be_ctx *ctx, - const char *servers, + const char *primary_servers, + const char *backup_servers, struct ipa_options *options, struct ipa_service **_service); diff --git a/src/providers/ipa/ipa_init.c b/src/providers/ipa/ipa_init.c index 670e00f..65c7766 100644 --- a/src/providers/ipa/ipa_init.c +++ b/src/providers/ipa/ipa_init.c @@ -98,7 +98,7 @@ int common_ipa_init(struct be_ctx *bectx) DEBUG(1, ("Missing ipa_server option - using service discovery!\n")); } - ret = ipa_service_init(ipa_options, bectx, ipa_servers, ipa_options, + ret = ipa_service_init(ipa_options, bectx, ipa_servers, NULL, ipa_options, &ipa_options->service); if (ret != EOK) { DEBUG(0, ("Failed to init IPA failover service!\n"));