summaryrefslogtreecommitdiff
path: root/src/providers/ipa
diff options
context:
space:
mode:
authorJan Zeleny <jzeleny@redhat.com>2012-06-05 08:41:29 -0400
committerJakub Hrozek <jhrozek@redhat.com>2012-08-01 16:19:41 +0200
commit1ecdcf622920781a95e3d2040a2aad9ac2e31260 (patch)
treea76f86f587b09828960a6a8621d59ed5e29f2614 /src/providers/ipa
parent10922e0293f3ebf056708acacce35e93fe07747e (diff)
downloadsssd-1ecdcf622920781a95e3d2040a2aad9ac2e31260.tar.gz
sssd-1ecdcf622920781a95e3d2040a2aad9ac2e31260.tar.bz2
sssd-1ecdcf622920781a95e3d2040a2aad9ac2e31260.zip
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.
Diffstat (limited to 'src/providers/ipa')
-rw-r--r--src/providers/ipa/ipa_common.c107
-rw-r--r--src/providers/ipa/ipa_common.h3
-rw-r--r--src/providers/ipa/ipa_init.c2
3 files changed, 77 insertions, 35 deletions
diff --git a/src/providers/ipa/ipa_common.c b/src/providers/ipa/ipa_common.c
index 98a7c58f..b5f6337d 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 3e2ef284..b0944595 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 670e00fa..65c77664 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"));