[asterisk-commits] branch oej/res_config_ldap r27392 - /team/oej/res_config_ldap/res/

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Tue May 16 10:04:33 MST 2006


Author: oej
Date: Tue May 16 12:04:32 2006
New Revision: 27392

URL: http://svn.digium.com/view/asterisk?rev=27392&view=rev
Log:
Code cleanup during dev conf call - AstriDevCon Online!

Modified:
    team/oej/res_config_ldap/res/res_config_ldap.c

Modified: team/oej/res_config_ldap/res/res_config_ldap.c
URL: http://svn.digium.com/view/asterisk/team/oej/res_config_ldap/res/res_config_ldap.c?rev=27392&r1=27391&r2=27392&view=diff
==============================================================================
--- team/oej/res_config_ldap/res/res_config_ldap.c (original)
+++ team/oej/res_config_ldap/res/res_config_ldap.c Tue May 16 12:04:32 2006
@@ -74,6 +74,13 @@
 
 LOCAL_USER_DECL;
 
+struct category_and_metric {
+	char *name;
+	int metric;
+	char *variable_name;
+	char *variable_value;
+};
+
 static char cli_realtime_ldap_status_usage[] =
 	"Usage: realtime ldap status\n"
 	"       Shows connection information for the LDAP RealTime driver\n";
@@ -87,8 +94,9 @@
 /*! \brief Log variable */
 static void ast_variable_log(const char *log_prefix, struct ast_variable *var)
 {
-	if (option_debug > 1)
-		ast_log(LOG_DEBUG, "LOG Variable: %s\n", log_prefix);
+	if (!option_debug)
+		return;
+	ast_log(LOG_DEBUG, "LOG Variable: %s\n", log_prefix);
 	while (var) {
 		ast_log(LOG_DEBUG, "%s => %s\n", var->name, var->value);
 		var = var->next;
@@ -97,16 +105,14 @@
 		ast_log(LOG_DEBUG, "END LOG Variable: %s\n", log_prefix);
 }
 
-/*! \brief Log config */
+/*! \brief Log config (only executed if option_debug is set) */
 static void ast_config_log(const char *log_prefix, struct ast_config *config)
 {
-	if (option_debug > 1)
-		ast_log(LOG_DEBUG, "LOG Config: %s\n", log_prefix);
 	char *category_name = NULL;
+
+	ast_log(LOG_DEBUG, "LOG Config: %s\n", log_prefix);
 	while ((category_name = ast_category_browse(config, category_name))) {
-		if (option_debug > 1)
-			ast_log(LOG_DEBUG, "========= category: %s ==========\n",
-				category_name);
+		ast_log(LOG_DEBUG, "========= category: %s ==========\n", category_name);
 		struct ast_variable *var = ast_variable_browse(config, category_name);
 		if (var) {
 			while (var) {
@@ -115,16 +121,15 @@
 			}
 		}
 	}
-	if (option_debug > 1)
-		ast_log(LOG_DEBUG, "END LOG Config: %s\n", log_prefix);
+	ast_log(LOG_DEBUG, "END LOG Config: %s\n", log_prefix);
 };
 
 /*! \brief Table configuration */
 struct ldap_table_config {
-	char *table_name;			/* table name */
-	char *additional_filter;	/* additional filter        */
-	struct ast_variable *attributes;	/* attribute names conversion */
-	struct ldap_table_config *next;	/* next table */
+	char *table_name;			/*!< table name */
+	char *additional_filter;		/*!< additional filter        */
+	struct ast_variable *attributes;	/*!< attribute names conversion */
+	struct ldap_table_config *next;		/*!< next table */
 };
 
 /*! \brief Should be locked before using it */
@@ -153,42 +158,6 @@
 	return NULL;
 };
 
-#ifdef DISABLED_CODE
-
-/*! \brief add attributes to table config - Should be locked before using it */
-static void ldap_table_config_add_attributes(struct ldap_table_config* table_config,const char* attributes_string)
-{
-	if (attributes_string && *attributes_string) {      
-		char* string=strdup(attributes_string);
-		char* string_end=string+strlen(string);
-		char* start=string;
-		while(start<string_end) {
-			char* conv_sep=NULL;
-    			char* attr_sep=strchr(start,',');
-			if (!attr_sep)
-				attr_sep=string_end;
-			else
-				*attr_sep='\0';
-			conv_sep=strchr(start,'=');
-			if (conv_sep>=attr_sep)
-				conv_sep=NULL;
-			if (!conv_sep) {
-				ast_log(LOG_WARNING, "LDAP RealTime: Missing '=' in attributes conversion list: %s\n",attributes_string);
-			} else {
-				struct ast_variable* var;
-				*conv_sep='\0';
-				var=ast_variable_new(start,conv_sep+1);
-				if (table_config->attributes)
-					var->next=table_config->attributes;
-				table_config->attributes=var;
-			}
-			start=attr_sep+1;
-		};
-		free(string);
-	};
-};
-#endif
-
 /*! \brief add attribute to table config - Should be locked before using it */
 static void ldap_table_config_add_attribute(struct ldap_table_config *table_config,
 					    const char *attribute_string)
@@ -196,9 +165,11 @@
 	if (attribute_string && *attribute_string) {
 		char *string = strdup(attribute_string);
 		char *start = string;
-		ast_log(LOG_DEBUG, "LDAP RealTime: Add attribute: start: %s\n",
-				start);
 		char *p = strstr(start, "=>");
+
+		if (option_debug)
+			ast_log(LOG_DEBUG, "LDAP RealTime: Add attribute: start: %s\n", start);
+
 		if (!p) {
 			ast_log(LOG_WARNING,
 					"LDAP RealTime: Missing '=>' in attribute: %s in %s\n",
@@ -230,12 +201,13 @@
 						attribute_string, table_config->table_name);
 			} else {
 				struct ast_variable *var = ast_variable_new(start, value);
-				//ast_log(LOG_DEBUG, "LDAP RealTime: Add attribute: VAR %s => %s\n",var->name,var->value);
+				if (option_debug > 2)
+					ast_log(LOG_DEBUG, "LDAP RealTime: Add attribute: VAR %s => %s\n",var->name,var->value);
 				if (table_config->attributes)
 					var->next = table_config->attributes;
 				table_config->attributes = var;
-				ast_log(LOG_DEBUG,
-						"LDAP RealTime (%d): Added attribute in %s: %s -> %s\n",
+				if (option_debug > 2)
+					ast_log(LOG_DEBUG, "LDAP RealTime (%d): Added attribute in %s: %s -> %s\n",
 						__LINE__, table_config->table_name, start, value);
 			}
 		};
@@ -247,6 +219,7 @@
 static void table_configs_free(void)
 {
 	struct ldap_table_config *c = table_configs;
+
 	while (c) {
 		struct ldap_table_config *next = c->next;
 		if (c->table_name)
@@ -291,9 +264,11 @@
 						    const char *attribute_name)
 {
 	int i = 0;
+
 	for (i = 0; i < 2; i++) {
 		if (table_config) {
 			struct ast_variable *attribute = table_config->attributes;
+
 			while (attribute) {
 				if (strcasecmp(attribute_name, attribute->value) == 0)
 					return attribute->name;
@@ -335,8 +310,7 @@
 	while (ldap_attribute_name) {
 		const char *attribute_name =
 			convert_attribute_name_from_ldap(table_config,ldap_attribute_name);
-		int is_realmed_password_attribute =
-			strcasecmp(attribute_name, "md5secret") == 0;
+		int is_realmed_password_attribute = strcasecmp(attribute_name, "md5secret") == 0;
 		char **values = NULL;
 
 		values = ldap_get_values(ldapConn, ldap_entry, ldap_attribute_name);
@@ -348,7 +322,7 @@
 				if (option_debug > 1)
 					ast_log(LOG_DEBUG,
 						"LDAP RealTime (%d): attribute_name: %s value: %s\n",
-						__LINE__, attribute_name, value);
+							__LINE__, attribute_name, value);
 				if (is_realmed_password_attribute) {
 					if (strncasecmp(value, "{md5}", 5) == 0)
 						value += 5;
@@ -361,9 +335,8 @@
 				if (value) {
 					if (prev) {
 						prev->next = ast_variable_new(attribute_name, value);
-						if (prev->next) {
+						if (prev->next) 
 							prev = prev->next;
-						}
 					} else {
 						prev = var = ast_variable_new(attribute_name, value);
 					}
@@ -390,7 +363,7 @@
 					   const char *dn)
 {
 	if (!table_config) {
-		ast_log(LOG_ERROR, "LDAP RealTime: Not table config\n");
+		ast_log(LOG_ERROR, "LDAP RealTime: No table config\n");
 		return NULL;
 	} else {
 		struct ast_variable *var = NULL;
@@ -398,16 +371,17 @@
 		LDAPMessage *ldap_result = NULL;
 		int tries = 0;
 
-		ast_log(LOG_DEBUG, "LDAP RealTime (%d): ldap_loadentry dn=%s\n",
+		if (option_debug > 1)
+			ast_log(LOG_DEBUG, "LDAP RealTime (%d): ldap_loadentry dn=%s\n",
 				__LINE__, dn);
 
 		do {
 			result = ldap_search_s(ldapConn, dn, LDAP_SCOPE_BASE,
-								   "(objectclass=*)", NULL, 0, &ldap_result);
+					   "(objectclass=*)", NULL, 0, &ldap_result);
 			if (result < 0 && is_ldap_connect_error(result)) {
 				ast_log(LOG_WARNING,
-						"LDAP RealTime: Failed to query database. Try %d/3\n",
-						tries + 1);
+					"LDAP RealTime: Failed to query database. Try %d/3\n",
+					tries + 1);
 				tries++;
 				if (tries < 3) {
 					usleep(500000L * tries);
@@ -424,29 +398,27 @@
 		if (result < 0) {
 			ast_log(LOG_WARNING,
 					"LDAP RealTime: Failed to query database. Check debug for more info.\n");
-			ast_log(LOG_DEBUG, "LDAP RealTime: dn=%s\n", dn);
-			ast_log(LOG_DEBUG, "LDAP RealTime: Query Failed because: %s\n",
+			if (option_debug > 1) {
+				ast_log(LOG_DEBUG, "LDAP RealTime: dn=%s\n", dn);
+				ast_log(LOG_DEBUG, "LDAP RealTime: Query Failed because: %s\n",
 					ldap_err2string(result));
+			}
 			ast_mutex_unlock(&ldap_lock);
 			return NULL;
 		} else {
 			int num_entry = 0;
 			if ((num_entry = ldap_count_entries(ldapConn, ldap_result)) > 0) {
 				LDAPMessage *ldap_entry = NULL;
-				ast_log(LOG_DEBUG, "LDAP RealTime (%d): num_entry: %d\n",
+				if (option_debug)
+					ast_log(LOG_DEBUG, "LDAP RealTime (%d): num_entry: %d\n",
 						__LINE__, num_entry);
 
 				ldap_entry = ldap_first_entry(ldapConn, ldap_result);
 				var = realtime_ldap_entry_to_var(table_config, ldap_entry);
-				if (num_entry > 1) {
-					ast_log(LOG_WARNING,
-							"LDAP RealTime: More than one entry for dn=%s. Take only 1st one\n",
-							dn);
-				}
+				if (num_entry > 1)
+					ast_log(LOG_WARNING, "LDAP RealTime: More than one entry for dn=%s. Take only 1st one\n", dn);
 			} else {
-				ast_log(LOG_WARNING,
-						"LDAP RealTime: Could not find any entry dn=%s.\n",
-						dn);
+				ast_log(LOG_WARNING, "LDAP RealTime: Could not find any entry dn=%s.\n", dn);
 			}
 		}
 		ldap_msgfree(ldap_result);
@@ -461,16 +433,13 @@
 {
 #define MAXRESULT	2048
 	char *ret_string = NULL;
+
 	if (!ast_strlen_zero(string)) {
-		ret_string = malloc(MAXRESULT);
-		if (!ret_string) {
-			ast_log(LOG_WARNING, "Out of memory\n");
-		} else {
-			memset(ret_string, 0, MAXRESULT);
-			pbx_substitute_variables_helper(channel, string, ret_string, MAXRESULT - 1);
-		}
-	}
-	ast_log(LOG_DEBUG, "LDAP RealTime: substituted: string: '%s' => '%s' \n",
+		ret_string = ast_calloc(1, MAXRESULT);
+		pbx_substitute_variables_helper(channel, string, ret_string, MAXRESULT - 1);
+	}
+	if (option_debug > 1)
+		ast_log(LOG_DEBUG, "LDAP RealTime: substituted: string: '%s' => '%s' \n",
 			string, ret_string);
 	return ret_string;
 }
@@ -498,18 +467,19 @@
 			p++;
 		};
 	}
-	ast_log(LOG_DEBUG, "LDAP RealTime (%d): basedn: '%s' => '%s' \n",
+	if (option_debug > 1)
+		ast_log(LOG_DEBUG, "LDAP RealTime (%d): basedn: '%s' => '%s' \n",
 			__LINE__, basedn, cbasedn);
 	return cbasedn;
 }
 
 /*! \brief Append a string to a filter string. The filter string can grow */
-static void append_string_to_filter(char **filter_ptr, int *filter_size_ptr,
-				    const char *filter)
+static void append_string_to_filter(char **filter_ptr, int *filter_size_ptr, const char *filter)
 {
 	int current_len = 0;
 	int needed_len = 0;
 	char *r_filter = NULL;
+
 	if (strchr(filter, '$')) {
 		r_filter = substituted(NULL, filter);
 		filter = r_filter;
@@ -564,7 +534,8 @@
 	char *new_name = NULL;
 	char *new_value = NULL;
 	char *wsPos = strstr(name, " LIKE");
-	//ast_log(LOG_DEBUG, "LDAP RealTime: name='%s' value='%s'\n",name,value);
+	if (option_debug > 1)
+		ast_log(LOG_DEBUG, "LDAP RealTime: name='%s' value='%s'\n", name, value);
 	if (wsPos) {
 		new_name = strndup(name, wsPos - name);
 		name = new_name;
@@ -593,227 +564,198 @@
  table_name is the table_name (used dor attribute convertion and additional filter)
  ap contains null terminated list of pairs name/value
 */
-static struct ast_variable **realtime_ldap_base(unsigned int
-						*entries_count_ptr,
-						const char *basedn,
-						const char *table_name,
-						va_list ap)
-{
-	ast_log(LOG_DEBUG,
+static struct ast_variable **realtime_ldap_base(unsigned int *entries_count_ptr,
+	const char *basedn, const char *table_name, va_list ap)
+{
+	struct ast_variable **vars = NULL;
+	const char *newparam = NULL;
+	const char *newval = NULL;
+
+	if (option_debug > 1)
+		ast_log(LOG_DEBUG,
 			"LDAP RealTime (%d): realtime_ldap_base: basedn: %s table_name: %s\n",
 			__LINE__, basedn, table_name);
-	struct ast_variable **vars = NULL;
 	if (!table_name) {
 		ast_log(LOG_WARNING, "LDAP RealTime: No table_name specified.\n");
+		return NULL;
+	} 
+
+	/* Get the first parameter and first value in our list of passed paramater/value pairs  */
+	newparam = va_arg(ap, const char *);
+	newval = va_arg(ap, const char *);
+	if (!newparam || !newval) {
+		ast_log(LOG_WARNING,
+				"LDAP RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n");
 	} else {
-		const char *newparam = NULL;
-		const char *newval = NULL;
-
-		/* Get the first parameter and first value in our list of passed paramater/value pairs  */
-		newparam = va_arg(ap, const char *);
-		newval = va_arg(ap, const char *);
-		if (!newparam || !newval) {
-			ast_log(LOG_WARNING,
-					"LDAP RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n");
-		} else {
-			ast_mutex_lock(&ldap_lock);
-
-			/* We now have our complete statement; Lets connect to the server and execute it.  */
-			if (!ldap_reconnect()) {
+		ast_mutex_lock(&ldap_lock);
+
+		/* We now have our complete statement; Lets connect to the server and execute it.  */
+		if (ldap_reconnect()) {
+			struct ldap_table_config *table_config = NULL;
+
+			table_config = table_config_for_table_name(table_name);
+			if (!table_config) {
+				ast_log(LOG_WARNING,
+						"LDAP RealTime: No table named '%s'.\n",
+						table_name);
 			} else {
-				struct ldap_table_config *table_config = NULL;
-
-				table_config = table_config_for_table_name(table_name);
-				if (!table_config) {
-					ast_log(LOG_WARNING,
-							"LDAP RealTime: No table named '%s'.\n",
-							table_name);
-				} else {
-					char *clean_basedn = cleaned_basedn(NULL, basedn);
-					char *filter = NULL;
-					int filter_size = 0;
-					int tries = 0;
-
-					int result = 0;
-					LDAPMessage *ldap_result = NULL;
-
-					append_string_to_filter(&filter, &filter_size, "(&");
-
-					if (table_config && table_config->additional_filter) {
+				char *clean_basedn = cleaned_basedn(NULL, basedn);
+				char *filter = NULL;
+				int filter_size = 0;
+				int tries = 0;
+
+				int result = 0;
+				LDAPMessage *ldap_result = NULL;
+
+				append_string_to_filter(&filter, &filter_size, "(&");
+
+				if (table_config && table_config->additional_filter) {
+					append_string_to_filter(&filter, &filter_size,
+						table_config->additional_filter);
+				};
+				if (table_config != base_table_config && base_table_config
+					&& base_table_config->additional_filter) {
 						append_string_to_filter(&filter, &filter_size,
-									table_config->additional_filter);
-					};
-					if (table_config != base_table_config && base_table_config
-						&& base_table_config->additional_filter) {
-						append_string_to_filter(&filter, &filter_size,
-									base_table_config->additional_filter);
-					};
-
-					/* Create the first part of the query using the first parameter/value pairs we just extracted */
-					/*   If there is only 1 set, then we have our query. Otherwise, loop thru the list and concat */
-
+							base_table_config->additional_filter);
+				};
+
+				/* Create the first part of the query using the first parameter/value pairs we just extracted */
+				/*   If there is only 1 set, then we have our query. Otherwise, loop thru the list and concat */
+
+				append_var_and_value_to_filter(&filter, &filter_size,
+				       table_config, newparam, newval);
+				while ((newparam = va_arg(ap, const char *))) {
+					newval = va_arg(ap, const char *);
 					append_var_and_value_to_filter(&filter, &filter_size,
-								       table_config, newparam, newval);
-					while ((newparam = va_arg(ap, const char *))) {
-						newval = va_arg(ap, const char *);
-						append_var_and_value_to_filter(&filter, &filter_size,
-									       table_config, newparam,
-									       newval);
-					}
-					append_string_to_filter(&filter, &filter_size, ")");
-
-					ast_log(LOG_DEBUG, "LDAP RealTime (%d): filter: %s\n",
-							__LINE__, filter);
-
-
-					do {
-						result =
-							ldap_search_s(ldapConn, clean_basedn,
-										  LDAP_SCOPE_SUBTREE, filter, NULL, 0,
-										  &ldap_result);
-						if (result < 0 && is_ldap_connect_error(result)) {
-							ast_log(LOG_WARNING,
-									"LDAP RealTime: Failed to query database. Try %d/3\n",
-									tries + 1);
-							tries++;
-							if (tries < 3) {
-								usleep(500000L * tries);
-								if (ldapConn) {
-									ldap_unbind_s(ldapConn);
-									ldapConn = NULL;
-								};
-								if (!ldap_reconnect())
-									break;
-							}
-						}
-					} while (result < 0 && tries < 3 &&
-							 is_ldap_connect_error(result));
-
-					if (result < 0) {
-						ast_log(LOG_WARNING,
-								"LDAP RealTime: Failed to query database. Check debug for more info.\n");
-						ast_log(LOG_WARNING, "LDAP RealTime: Query: %s\n",
-								filter);
-						ast_log(LOG_WARNING,
-								"LDAP RealTime: Query Failed because: %s\n",
-								ldap_err2string(result));
-					} else {
-						int num_entry = 0;
-						if ((num_entry =
-							 ldap_count_entries(ldapConn, ldap_result)) > 0) {
-							LDAPMessage *ldap_entry = NULL;
-							int entry_index = 0;
-							if (entries_count_ptr)
-								*entries_count_ptr = num_entry;
-							vars =
-								malloc(sizeof(struct ast_variable *) *
-									   (num_entry + 1));
-							memset(vars, 0,
-								   sizeof(struct ast_variable *) *
-								   (num_entry + 1));
-							ast_log(LOG_DEBUG,
-									"LDAP RealTime (%d): num_entry: %d\n",
-									__LINE__, num_entry);
-
-							ldap_entry =
-								ldap_first_entry(ldapConn, ldap_result);
-
-							for (entry_index = 0; ldap_entry; entry_index++) {
-								vars[entry_index] =
-									realtime_ldap_entry_to_var(table_config,ldap_entry);
-								ast_variable_log("LDAP RealTime: Found Entry",
-												 vars[entry_index]);
-								ldap_entry =
-									ldap_next_entry(ldapConn, ldap_entry);
-								ast_log(LOG_DEBUG,
-										"LDAP RealTime (%d): next entry: %p\n",
-										__LINE__, ldap_entry);
+					       table_config, newparam, newval);
+				}
+				append_string_to_filter(&filter, &filter_size, ")");
+
+				if (option_debug)
+					ast_log(LOG_DEBUG, "LDAP RealTime (%d): filter: %s\n", __LINE__, filter);
+
+
+				do {
+					result = ldap_search_s(ldapConn, clean_basedn,
+							  LDAP_SCOPE_SUBTREE, filter, NULL, 0,
+							  &ldap_result);
+					if (result < 0 && is_ldap_connect_error(result)) {
+						ast_log(LOG_WARNING, "LDAP RealTime: Failed to query database. Try %d/3\n",
+							tries + 1);
+						tries++;
+						if (tries < 3) {
+							usleep(500000L * tries);
+							if (ldapConn) {
+								ldap_unbind_s(ldapConn);
+								ldapConn = NULL;
 							};
-						} else {
-							ast_log(LOG_WARNING,
-									"LDAP RealTime: Could not find any entry matching %s in base dn %s.\n",
-									filter, clean_basedn);
-						}
-
-						ldap_msgfree(ldap_result);
-
-						if (vars) {
-							struct ast_variable **p = vars;
-							while (*p) {
-								struct ast_variable *append_var = NULL;
-								struct ast_variable *tmp = *p;
-								while (tmp) {
-									if (strcasecmp(tmp->name, "accountBaseDN")
-										== 0) {
-										struct ast_variable *base_var =
-											ldap_loadentry(table_config,
-														   tmp->value);
-										ast_log(LOG_DEBUG,
-												"LDAP RealTime (%d): Loaded base: %s\n",
-												__LINE__, tmp->value);
-										ast_variable_log("Base Variables",
-														 base_var);
-										while (base_var) {
-											struct ast_variable *next =
-												base_var->next;
-											struct ast_variable *test_var =
-												*p;
-											int base_var_found = 0;
-											while (test_var) {
-												if (strcasecmp
-													(test_var->name,
-													 base_var->name) == 0) {
-													base_var_found = 1;
-													break;
-												} else
-													test_var = test_var->next;
-											};
-											if (base_var_found) {
-												base_var->next = NULL;
-												ast_variables_destroy
-													(base_var);
-												base_var = next;
-											} else {
-												if (append_var)
-													base_var->next =
-														append_var;
-												else
-													base_var->next = NULL;
-												append_var = base_var;
-												base_var = next;
-											};
-										}
-									}
-									if (!tmp->next && append_var) {
-										tmp->next = append_var;
-										tmp = NULL;
-									} else
-										tmp = tmp->next;
-								};
-								p++;
-							}
+							if (!ldap_reconnect())
+								break;
 						}
 					}
-					if (filter)
-						free(filter);
-					if (clean_basedn)
-						free(clean_basedn);
+				} while (result < 0 && tries < 3 && is_ldap_connect_error(result));
+
+				if (result < 0) {
+					ast_log(LOG_WARNING,
+							"LDAP RealTime: Failed to query database. Check debug for more info.\n");
+					ast_log(LOG_WARNING, "LDAP RealTime: Query: %s\n",
+							filter);
+					ast_log(LOG_WARNING,
+							"LDAP RealTime: Query Failed because: %s\n",
+								ldap_err2string(result));
+				} else {
+					int num_entry = 0;
+					if ((num_entry = ldap_count_entries(ldapConn, ldap_result)) > 0) {
+						LDAPMessage *ldap_entry = NULL;
+						int entry_index = 0;
+						if (entries_count_ptr)
+							*entries_count_ptr = num_entry;
+						vars = ast_calloc(1, sizeof(struct ast_variable *) *(num_entry + 1));
+						if (option_debug)
+							ast_log(LOG_DEBUG, "LDAP RealTime (%d): num_entry: %d\n", __LINE__, num_entry);
+
+						ldap_entry = ldap_first_entry(ldapConn, ldap_result);
+
+						for (entry_index = 0; ldap_entry; entry_index++) {
+							vars[entry_index] = realtime_ldap_entry_to_var(table_config,ldap_entry);
+							ast_variable_log("LDAP RealTime: Found Entry", vars[entry_index]);
+							ldap_entry = ldap_next_entry(ldapConn, ldap_entry);
+							if (option_debug)
+								ast_log(LOG_DEBUG, "LDAP RealTime (%d): next entry: %p\n", __LINE__, ldap_entry);
+						};
+					} else {
+						ast_log(LOG_WARNING, "LDAP RealTime: Could not find any entry matching %s in base dn %s.\n",
+							filter, clean_basedn);
+					}
+
+					ldap_msgfree(ldap_result);
+
+					if (vars) {
+						struct ast_variable **p = vars;
+						while (*p) {
+							struct ast_variable *append_var = NULL;
+							struct ast_variable *tmp = *p;
+							while (tmp) {
+								if (strcasecmp(tmp->name, "accountBaseDN") == 0) {
+									struct ast_variable *base_var = ldap_loadentry(table_config, tmp->value);
+									if (option_debug)
+										ast_log(LOG_DEBUG, "LDAP RealTime (%d): Loaded base: %s\n",
+												__LINE__, tmp->value);
+									ast_variable_log("Base Variables", base_var);
+									while (base_var) {
+										struct ast_variable *next = base_var->next;
+										struct ast_variable *test_var = *p;
+										int base_var_found = 0;
+
+										while (test_var) {
+											if (strcasecmp(test_var->name, base_var->name) == 0) {
+												base_var_found = 1;
+												break;
+											} else
+												test_var = test_var->next;
+										};
+										if (base_var_found) {
+											base_var->next = NULL;
+											ast_variables_destroy (base_var);
+											base_var = next;
+										} else {
+											if (append_var)
+												base_var->next = append_var;
+											else
+												base_var->next = NULL;
+											append_var = base_var;
+											base_var = next;
+										};
+									}
+								}
+								if (!tmp->next && append_var) {
+									tmp->next = append_var;
+									tmp = NULL;
+								} else
+									tmp = tmp->next;
+							};
+							p++;
+						}
+					}
 				}
-			}
-			ast_mutex_unlock(&ldap_lock);
+				if (filter)
+					free(filter);
+				if (clean_basedn)
+					free(clean_basedn);
+			}
 		}
+		ast_mutex_unlock(&ldap_lock);
 	}
 	return vars;
 }
 
 /*! \brief same as realtime_ldap_base_ but take variable arguments count list */
-static struct ast_variable **realtime_ldap_base_(unsigned int
-						 *entries_count_ptr,
-						 const char *basedn,
-						 const char *table_name, ...)
+static struct ast_variable **realtime_ldap_base_(unsigned int *entries_count_ptr,
+	const char *basedn, const char *table_name, ...)
 {
 	struct ast_variable **vars = NULL;
 	va_list ap;
+
 	va_start(ap, table_name);
 	vars = realtime_ldap_base(entries_count_ptr, basedn, table_name, ap);
 	va_end(ap);
@@ -824,12 +766,12 @@
 static struct ast_variable *realtime_ldap(const char *basedn,
 					  const char *table_name, va_list ap)
 {
-	ast_log(LOG_DEBUG,
-			"LDAP RealTime (%d): realtime_ldap: basedn: %s table_name: %s\n",
+	if (option_debug)
+		ast_log(LOG_DEBUG, "LDAP RealTime (%d): realtime_ldap: basedn: %s table_name: %s\n",
 			__LINE__, basedn, table_name);
-	struct ast_variable **vars =
-		realtime_ldap_base(NULL, basedn, table_name, ap);
+	struct ast_variable **vars = realtime_ldap_base(NULL, basedn, table_name, ap);
 	struct ast_variable *var = NULL;
+
 	if (vars) {
 		struct ast_variable *last_var = NULL;
 		struct ast_variable **p = vars;
@@ -852,21 +794,22 @@
 
 /*! \brief See Asterisk doc */
 static struct ast_config *realtime_multi_ldap(const char *basedn,
-					      const char *table_name,
-					      va_list ap)
-{
-	ast_log(LOG_DEBUG,
-			"LDAP RealTime (%d): realtime_multi_ldap: basedn: %s table_name: %s\n",
+      const char *table_name, va_list ap)
+{
+	if (option_debug)
+		ast_log(LOG_DEBUG, "LDAP RealTime (%d): realtime_multi_ldap: basedn: %s table_name: %s\n",
 			__LINE__, basedn, table_name);
 	struct ast_variable **vars =
 		realtime_ldap_base(NULL, basedn, table_name, ap);
 	struct ast_config *cfg = NULL;
+
 	if (vars) {
 		cfg = ast_config_new();
 		if (!cfg) {
 			ast_log(LOG_WARNING, "Out of memory!\n");
 		} else {
 			struct ast_variable **p = vars;
+
 			while (*p) {
 				struct ast_category *cat = NULL;
 				cat = ast_category_new("");
@@ -891,12 +834,7 @@
 	return cfg;
 
 }
-struct category_and_metric {
-	char *name;
-	int metric;
-	char *variable_name;
-	char *variable_value;
-};
+
 static int compare_categories(const void *a, const void *b)
 {
 	struct category_and_metric *as = (struct category_and_metric *) a;
@@ -947,14 +885,16 @@
 					variable_named(*p, "variable_name");
 				struct ast_variable *var_val =
 					variable_named(*p, "variable_value");
-				ast_log(LOG_DEBUG, "LDAP RealTime: category: %s\n",
+				if (option_debug) {
+					ast_log(LOG_DEBUG, "LDAP RealTime: category: %s\n",
 						category->value);
-				ast_log(LOG_DEBUG, "LDAP RealTime: var_name: %s\n",
+					ast_log(LOG_DEBUG, "LDAP RealTime: var_name: %s\n",
 						var_name->value);
-				ast_log(LOG_DEBUG, "LDAP RealTime: var_val: %s\n",
+					ast_log(LOG_DEBUG, "LDAP RealTime: var_val: %s\n",
 						var_val->value);
-				ast_log(LOG_DEBUG, "LDAP RealTime: cat_metric: %s\n",
+					ast_log(LOG_DEBUG, "LDAP RealTime: cat_metric: %s\n",
 						cat_metric->value);
+				}
 				if (!category) {
 					struct ast_variable *dn = variable_named(*p, "dn");
 					ast_log(LOG_ERROR,
@@ -991,14 +931,12 @@
 
 			for (i = 0; i < vars_count; i++) {
 				if (strcmp(categories[i].variable_name, "#include") == 0) {
-					if (!ast_config_internal_load
-						(categories[i].variable_value, cfg)) {
+					if (!ast_config_internal_load(categories[i].variable_value, cfg)) {
 						break;
 						return NULL;
 					}
 				} else {
-					if (!last_category ||
-						strcmp(last_category, categories[i].name) != 0 ||
+					if (!last_category || strcmp(last_category, categories[i].name) != 0 ||
 						last_category_metric != categories[i].metric) {
 						cur_cat = ast_category_new(categories[i].name);
 						if (!cur_cat) {
@@ -1009,21 +947,19 @@
 						last_category_metric = categories[i].metric;
 						ast_category_append(cfg, cur_cat);
 					}
-					new_v =
-						ast_variable_new(categories[i].variable_name,
-										 categories[i].variable_value);
+					new_v = ast_variable_new(categories[i].variable_name,
+							 categories[i].variable_value);
 					ast_variable_append(cur_cat, new_v);
 				}
 			}
 			free(vars);
 			free(categories);
 		} else {
-			ast_log(LOG_WARNING,
-					"LDAP RealTime: Could not find config '%s' in database.\n",
-					file);
+			ast_log(LOG_WARNING, "LDAP RealTime: Could not find config '%s' in database.\n", file);
 		}
 	}
-	ast_config_log("LDAP RealTime: Configuration", cfg);
+	if (option_debug)
+		ast_config_log("LDAP RealTime: Configuration", cfg);
 	return cfg;
 
 }
@@ -1042,15 +978,12 @@
 
 	ast_mutex_lock(&ldap_lock);
 
-	if (!ldap_reconnect()) {
-		ast_log(LOG_WARNING,
-				"LDAP RealTime: Couldn't establish connection. Check debug.\n");
-	}
+	if (!ldap_reconnect()) 
+		ast_log(LOG_WARNING, "LDAP RealTime: Couldn't establish connection. Check debug.\n");
 
 	ast_config_engine_register(&ldap_engine);
-	if (option_verbose) {
+	if (option_verbose) 
 		ast_verbose("LDAP RealTime driver loaded.\n");
-	}
 	ast_cli_register(&cli_realtime_ldap_status);
 
 	ast_mutex_unlock(&ldap_lock);
@@ -1071,9 +1004,8 @@
 	};
 	ast_cli_unregister(&cli_realtime_ldap_status);
 	ast_config_engine_deregister(&ldap_engine);
-	if (option_verbose) {
+	if (option_verbose)
 		ast_verbose("LDAP RealTime unloaded.\n");
-	}
 
 	STANDARD_HANGUP_LOCALUSERS;
 
@@ -1094,10 +1026,8 @@
 	};
 	parse_config();
 
-	if (!ldap_reconnect()) {
-		ast_log(LOG_WARNING,
-				"LDAP RealTime: Couldn't establish connection. Check debug.\n");
-	}
+	if (!ldap_reconnect()) 
+		ast_log(LOG_WARNING, "LDAP RealTime: Couldn't establish connection. Check debug.\n");
 
 	ast_verbose(VERBOSE_PREFIX_2 "LDAP RealTime reloaded.\n");
 
@@ -1116,53 +1046,44 @@
 
 	if (config) {
 		if (!(s = ast_variable_retrieve(config, "_general", "dbuser"))) {
-			ast_log(LOG_WARNING,
-					"LDAP RealTime: No database user found, anonymous binding as default.\n");
+			ast_log(LOG_WARNING, "LDAP RealTime: No database user found, anonymous binding as default.\n");
 			dbuser[0] = '\0';
-		} else {
+		} else 
 			strncpy(dbuser, s, sizeof(dbuser) - 1);
-		}
 
 		if (!(s = ast_variable_retrieve(config, "_general", "dbpass"))) {
-			ast_log(LOG_WARNING,
-					"LDAP RealTime: No database password found, using 'asterisk' as default.\n");
+			ast_log(LOG_WARNING, "LDAP RealTime: No database password found, using 'asterisk' as default.\n");
 			strncpy(dbpass, "asterisk", sizeof(dbpass) - 1);
-		} else {
+		} else
 			strncpy(dbpass, s, sizeof(dbpass) - 1);
-		}
 
 		if (!(s = ast_variable_retrieve(config, "_general", "dbhost"))) {
 			ast_log(LOG_ERROR, "LDAP RealTime: No directory host found.\n");
 			dbhost[0] = '\0';
-		} else {
+		} else 
 			strncpy(dbhost, s, sizeof(dbhost) - 1);
-		}
 
 		if (!(s = ast_variable_retrieve(config, "_general", "dbbasedn"))) {
-			ast_log(LOG_ERROR,
-					"LDAP RealTime: No LDAP base dn found, using 'asterisk' as default.\n");
+			ast_log(LOG_ERROR, "LDAP RealTime: No LDAP base dn found, using 'asterisk' as default.\n");
 			dbbasedn[0] = '\0';
-		} else {
+		} else 
 			strncpy(dbbasedn, s, sizeof(dbbasedn) - 1);
-		}
 
 		if (!(s = ast_variable_retrieve(config, "_general", "dbport"))) {
-			ast_log(LOG_WARNING,
-					"LDAP RealTime: No directory port found, using 389 as default.\n");
+			ast_log(LOG_WARNING, "LDAP RealTime: No directory port found, using 389 as default.\n");
 			dbport = 389;
-		} else {
+		} else 
 			dbport = atoi(s);
-		}
 
 		table_configs_free();
 
 		char *category_name = NULL;
 		while ((category_name = ast_category_browse(config, category_name))) {
 			int is_general = (strcasecmp(category_name, "_general") == 0);
-			ast_log(LOG_DEBUG, "LDAP RealTime: found: category_name=%s\n",
-					category_name);
-			struct ast_variable *var =
-				ast_variable_browse(config, category_name);
+			struct ast_variable *var = ast_variable_browse(config, category_name);
+
+			if (option_debug)
+				ast_log(LOG_DEBUG, "LDAP RealTime: found: category_name=%s\n", category_name);
 			if (var) {
 				struct ldap_table_config *table_config =
 					table_config_for_table_name(category_name);
@@ -1175,15 +1096,13 @@
 						base_table_config = table_config;
 				};
 				while (var) {
-					ast_log(LOG_DEBUG,
-							"LDAP RealTime: found: category_name=%s var->name=%s var->value=%s\n",
+					if (option_debug)
+						ast_log(LOG_DEBUG, "LDAP RealTime: found: category_name=%s var->name=%s var->value=%s\n",
 							category_name, var->name, var->value);
-					if (strcasecmp(var->name, "attribute") == 0) {
-						ldap_table_config_add_attribute(table_config,
-										var->value);
-					} else if (strcasecmp(var->name, "additionalFilter") == 0) {
+					if (strcasecmp(var->name, "attribute") == 0) 
+						ldap_table_config_add_attribute(table_config, var->value);
+					else if (strcasecmp(var->name, "additionalFilter") == 0)
 						table_config->additional_filter = strdup(var->value);
-					};
 					var = var->next;
 				};
 			}
@@ -1215,47 +1134,39 @@
 	/* mutex lock should have been locked before calling this function. */
 
 	if (!ldapConn) {
-		if (dbhost) {
-			ldapConn = ldap_init(dbhost, dbport);
-			if (ldapConn) {
+		if (!dbhost) {
+			ast_log(LOG_ERROR, "LDAP RealTime: Not enough parameters to connect to ldap database\n");
+		} else {
+			if (!(ldapConn = ldap_init(dbhost, dbport))) {
+				ast_log(LOG_ERROR, "LDAP RealTime: Failed to init ldap connection to %s. Check debug for more info.\n", dbhost);
+				return 0;
+			} else {
 				int bind_result = 0;
-				//ldap_set_option(ldapConn, LDAP_OPT_TIMELIMIT, &timeout);
-				//ldap_set_option(ldapConn, LDAP_OPT_PROTOCOL_VERSION, &version);
 				if (dbuser && *dbuser) {
-					ast_log(LOG_DEBUG, "LDAP RealTime: bind to %s as %s\n",
-							dbhost, dbuser);
-					bind_result =
-						ldap_simple_bind_s(ldapConn, dbuser, dbpass);
+					if (option_debug > 1)
+						ast_log(LOG_DEBUG, "LDAP RealTime: bind to %s as %s\n", dbhost, dbuser);
+					bind_result = ldap_simple_bind_s(ldapConn, dbuser, dbpass);
 				} else {
-					ast_log(LOG_DEBUG,
-							"LDAP RealTime: bind anonymously %s anonymously\n",
-							dbhost);
+					if (option_debug > 1)
+						ast_log(LOG_DEBUG, "LDAP RealTime: bind anonymously %s anonymously\n", dbhost);
 					bind_result = ldap_simple_bind_s(ldapConn, NULL, NULL);
 				}
 				if (bind_result == LDAP_SUCCESS) {
-					ast_log(LOG_DEBUG,
-							"LDAP RealTime: Successfully connected to database.\n");
+					if (option_debug > 1)
+						ast_log(LOG_DEBUG, "LDAP RealTime: Successfully connected to database.\n");
 					connect_time = time(NULL);
 					return 1;
 				} else {
-					ast_log(LOG_WARNING, "LDAP RealTime: bind failed: %s\n",
-							ldap_err2string(bind_result));
+					ast_log(LOG_WARNING, "LDAP RealTime: bind failed: %s\n", ldap_err2string(bind_result));
 					ldap_unbind(ldapConn);
 					ldapConn = NULL;
 					return 0;
 				}
-			} else {
-				ast_log(LOG_ERROR,
-						"LDAP RealTime: Failed to init ldap connection to %s. Check debug for more info.\n",
-						dbhost);
-				return 0;
-			}
-		} else {
-			ast_log(LOG_ERROR,
-					"LDAP RealTime: Not enough parameters to connect to ldap database\n");
+			}
 		}
 	} else {
-		ast_log(LOG_DEBUG, "LDAP RealTime: Everything seems fine.\n");
+		if (option_debug > 1)
+			ast_log(LOG_DEBUG, "LDAP RealTime: Everything seems fine.\n");
 		return 1;
 	}
 }
@@ -1265,42 +1176,35 @@
 	char status[256], status2[100] = "";
 	int ctime = time(NULL) - connect_time;
 
-	if (ldapConn) {
-		if (dbhost) {
-			snprintf(status, 255, "Connected to %s, port %d baseDN %s",
-					 dbhost, dbport, dbbasedn);
-		}
-
-		if (dbuser && *dbuser) {
-			snprintf(status2, 99, " with username %s", dbuser);
-		}
-
-		if (ctime > 31536000) {
-			ast_cli(fd,
-					"%s%s for %d years, %d days, %d hours, %d minutes, %d seconds.\n",
-					status, status2, ctime / 31536000,
-					(ctime % 31536000) / 86400, (ctime % 86400) / 3600,
-					(ctime % 3600) / 60, ctime % 60);
-		} else if (ctime > 86400) {
-			ast_cli(fd,
-					"%s%s for %d days, %d hours, %d minutes, %d seconds.\n",
-					status, status2, ctime / 86400, (ctime % 86400) / 3600,
-					(ctime % 3600) / 60, ctime % 60);
-		} else if (ctime > 3600) {
-			ast_cli(fd, "%s%s for %d hours, %d minutes, %d seconds.\n",
-					status, status2, ctime / 3600, (ctime % 3600) / 60,
-					ctime % 60);
-		} else if (ctime > 60) {
-			ast_cli(fd, "%s%s for %d minutes, %d seconds.\n", status, status2,
+	if (!ldapConn)
+		return RESULT_FAILURE;
+	if (dbhost) 
+		snprintf(status, 255, "Connected to %s, port %d baseDN %s", dbhost, dbport, dbbasedn);
+
+	if (dbuser && *dbuser)
+		snprintf(status2, 99, " with username %s", dbuser);
+
+	if (ctime > 31536000) {
+		ast_cli(fd, "%s%s for %d years, %d days, %d hours, %d minutes, %d seconds.\n",
+				status, status2, ctime / 31536000,
+				(ctime % 31536000) / 86400, (ctime % 86400) / 3600,
+				(ctime % 3600) / 60, ctime % 60);
+	} else if (ctime > 86400) {
+		ast_cli(fd, "%s%s for %d days, %d hours, %d minutes, %d seconds.\n",
+				status, status2, ctime / 86400, (ctime % 86400) / 3600,
+				(ctime % 3600) / 60, ctime % 60);
+	} else if (ctime > 3600) {
+		ast_cli(fd, "%s%s for %d hours, %d minutes, %d seconds.\n",
+				status, status2, ctime / 3600, (ctime % 3600) / 60,
+				ctime % 60);
+	} else if (ctime > 60) {
+		ast_cli(fd, "%s%s for %d minutes, %d seconds.\n", status, status2,
 					ctime / 60, ctime % 60);
-		} else {
-			ast_cli(fd, "%s%s for %d seconds.\n", status, status2, ctime);
-		}
-
-		return RESULT_SUCCESS;
 	} else {
-		return RESULT_FAILURE;
-	}
+		ast_cli(fd, "%s%s for %d seconds.\n", status, status2, ctime);
+	}
+
+	return RESULT_SUCCESS;
 }
 
 STD_MOD(MOD_1, reload, NULL, NULL);



More information about the asterisk-commits mailing list