]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Backend configuration
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 14 Mar 2017 10:42:13 +0000 (10:42 +0000)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:15:40 +0000 (17:15 +0000)
servers/lloadd/config.c
servers/lloadd/slap.h

index 0c64b3f31a5d97c95f55ca3ab21088f59d8ec5b5..d464ffba523d17ec34837a559bcc4d6d256bdf67 100644 (file)
@@ -95,6 +95,7 @@ static ConfigFile *cfn;
 
 static ConfigDriver config_fname;
 static ConfigDriver config_generic;
+static ConfigDriver config_backend;
 #ifdef LDAP_TCP_BUFFER
 static ConfigDriver config_tcp_buffer;
 #endif /* LDAP_TCP_BUFFER */
@@ -106,6 +107,8 @@ static ConfigDriver config_tls_option;
 static ConfigDriver config_tls_config;
 #endif
 
+slap_b_head backend = LDAP_STAILQ_HEAD_INITIALIZER(backend);
+
 enum {
     CFG_ACL = 1,
     CFG_BACKEND,
@@ -151,9 +154,9 @@ static ConfigTable config_back_cf_table[] = {
         ARG_INT|ARG_MAGIC|CFG_CONCUR,
         &config_generic,
     },
-    { "database", "type", 2, 2, 0,
+    { "backend", "type", 2, 2, 0,
         ARG_MAGIC|CFG_DATABASE,
-        &config_generic,
+        &config_backend,
     },
     { "gentlehup", "on|off", 2, 2, 0,
 #ifdef SIGHUP
@@ -426,6 +429,109 @@ config_generic( ConfigArgs *c )
     return 0;
 }
 
+static int
+config_backend( ConfigArgs *c )
+{
+    int i, tmp, rc = -1;
+    LDAPURLDesc *lud = NULL;
+    Backend *b;
+
+    b = ch_calloc( 1, sizeof(Backend) );
+
+    for ( i = 1; i < c->argc; i++ ) {
+        if ( bindconf_parse( c->argv[i], &b->b_bindconf ) ) {
+            Debug( LDAP_DEBUG_ANY, "config_backend: "
+                    "error parsing backend configuration item '%s'\n",
+                    c->argv[i] );
+            rc = -1;
+            goto done;
+        }
+    }
+
+    if ( BER_BVISNULL( &b->b_bindconf.sb_uri ) ) {
+        Debug( LDAP_DEBUG_ANY, "config_backend: "
+                "backend address not specified\n" );
+        rc = -1;
+        goto done;
+    }
+
+    rc = ldap_url_parse( b->b_bindconf.sb_uri.bv_val, &lud );
+    if ( rc != LDAP_URL_SUCCESS ) {
+        Debug( LDAP_DEBUG_ANY, "config_backend: "
+                "listen URL \"%s\" parse error=%d\n",
+                b->b_bindconf.sb_uri.bv_val, rc );
+        rc = -1;
+        goto done;
+    }
+
+#ifndef HAVE_TLS
+    if ( ldap_pvt_url_scheme2tls( lud->lud_scheme ) ) {
+        Debug( LDAP_DEBUG_ANY, "config_backend: "
+                "TLS not supported (%s)\n",
+                b->b_bindconf.sb_uri.bv_val );
+        rc = -1;
+        goto done;
+    }
+
+    if ( !lud->lud_port ) {
+        b->b_port = LDAP_PORT;
+    } else {
+        b->b_port = lud->lud_port;
+    }
+
+#else /* HAVE_TLS */
+    tmp = ldap_pvt_url_scheme2tls( lud->lud_scheme );
+    if ( tmp ) {
+        b->b_tls = LLOAD_LDAPS;
+    }
+
+    if ( !lud->lud_port ) {
+        b->b_port = b->b_tls ? LDAPS_PORT : LDAP_PORT;
+    } else {
+        b->b_port = lud->lud_port;
+    }
+#endif /* HAVE_TLS */
+
+    b->b_proto = tmp = ldap_pvt_url_scheme2proto( lud->lud_scheme );
+    if ( tmp == LDAP_PROTO_IPC ) {
+#ifdef LDAP_PF_LOCAL
+        if ( lud->lud_host == NULL || lud->lud_host[0] == '\0' ) {
+            b->b_host = ch_strdup( LDAPI_SOCK );
+        }
+#else /* ! LDAP_PF_LOCAL */
+
+        Debug( LDAP_DEBUG_ANY, "config_backend: "
+                "URL scheme not supported: %s",
+                url );
+        rc = -1;
+        goto done;
+#endif /* ! LDAP_PF_LOCAL */
+    } else {
+        if ( lud->lud_host == NULL || lud->lud_host[0] == '\0' ) {
+            Debug( LDAP_DEBUG_ANY, "config_backend: "
+                    "backend url missing hostname: '%s'\n",
+                    b->b_bindconf.sb_uri.bv_val );
+            rc = -1;
+            goto done;
+        }
+    }
+    if ( !b->b_host ) {
+        b->b_host = ch_strdup( lud->lud_host );
+    }
+
+    ldap_pvt_thread_mutex_init( &b->b_lock );
+
+done:
+    ldap_free_urldesc( lud );
+    if ( rc ) {
+        ch_free( b );
+    } else {
+        LDAP_STAILQ_INSERT_TAIL( &backend, b, b_next );
+    }
+
+    return rc;
+}
+
 static int
 config_fname( ConfigArgs *c )
 {
index d89c7e21baf14f729bb450789eca231e9785e3db..c79fae79e231b34d257756d7ebfd0e5bb628ca70 100644 (file)
@@ -96,6 +96,7 @@ LDAP_SLAPD_V (int) slap_debug;
 
 typedef unsigned long slap_mask_t;
 
+typedef struct Backend Backend;
 typedef struct Connection Connection;
 /* end of forward declarations */
 
@@ -115,6 +116,10 @@ typedef union Sockaddr {
 extern int slap_inet4or6;
 #endif
 
+typedef LDAP_STAILQ_HEAD(BeSt, Backend) slap_b_head;
+
+LDAP_SLAPD_V (slap_b_head) backend;
+
 LDAP_SLAPD_V (int) slapMode;
 #define SLAP_UNDEFINED_MODE 0x0000
 #define SLAP_SERVER_MODE 0x0001
@@ -217,6 +222,26 @@ typedef struct config_reply_s ConfigReply; /* config.h */
 
 typedef struct Listener Listener;
 
+enum lload_tls_type {
+    LLOAD_CLEARTEXT = 0,
+    LLOAD_LDAPS,
+    LLOAD_STARTTLS,
+};
+
+struct Backend {
+    struct slap_bindconf b_bindconf;
+    ldap_pvt_thread_mutex_t b_lock;
+
+    int b_proto, b_port;
+    enum lload_tls_type b_tls;
+    char *b_host;
+
+    int b_numconns, b_numbindconns;
+    Connection *b_conns, *b_bindconns;
+
+    LDAP_STAILQ_ENTRY(Backend) b_next;
+};
+
 /*
  * represents a connection from an ldap client
  */
@@ -267,8 +292,8 @@ struct Connection {
 #define CONN_IS_IPC 8
 
 #ifdef HAVE_TLS
-    char c_is_tls;           /* true if this LDAP over raw TLS */
-    char c_needs_tls_accept; /* true if SSL_accept should be called */
+    enum lload_tls_type c_is_tls; /* true if this LDAP over raw TLS */
+    char c_needs_tls_accept;      /* true if SSL_accept should be called */
 #endif
 
     long c_n_ops_executing; /* num of ops currently executing */