| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Asterisk -- An open source telephony toolkit. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 1999 - 2005, Digium, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Anthony Minessale <anthmct@yahoo.com> | 
					
						
							|  |  |  |  * Mark Spencer <markster@digium.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * See http://www.asterisk.org for more information about
 | 
					
						
							|  |  |  |  * the Asterisk project. Please do not directly contact | 
					
						
							|  |  |  |  * any of the maintainers of this project for assistance; | 
					
						
							|  |  |  |  * the project provides a web site, mailing lists and IRC | 
					
						
							|  |  |  |  * channels for your use. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software, distributed under the terms of | 
					
						
							|  |  |  |  * the GNU General Public License Version 2. See the LICENSE file | 
					
						
							|  |  |  |  * at the top of the source tree. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*! \file
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * \brief RealTime CLI | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * \author Anthony Minessale <anthmct@yahoo.com> | 
					
						
							|  |  |  |  * \author Mark Spencer <markster@digium.com> | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * \ingroup applications | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "asterisk.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "asterisk/file.h"
 | 
					
						
							|  |  |  | #include "asterisk/channel.h"
 | 
					
						
							|  |  |  | #include "asterisk/pbx.h"
 | 
					
						
							|  |  |  | #include "asterisk/config.h"
 | 
					
						
							|  |  |  | #include "asterisk/module.h"
 | 
					
						
							|  |  |  | #include "asterisk/lock.h"
 | 
					
						
							|  |  |  | #include "asterisk/cli.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | static char *cli_realtime_load(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)  | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-03-18 15:43:34 +00:00
										 |  |  | #define CRL_HEADER_FORMAT "%30s  %-30s\n"
 | 
					
						
							| 
									
										
										
										
											2008-12-17 21:29:30 +00:00
										 |  |  | 	struct ast_variable *var = NULL, *orig_var = NULL; | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 	switch (cmd) { | 
					
						
							|  |  |  | 	case CLI_INIT: | 
					
						
							|  |  |  | 		e->command = "realtime load"; | 
					
						
							|  |  |  | 		e->usage = | 
					
						
							|  |  |  | 			"Usage: realtime load <family> <colmatch> <value>\n" | 
					
						
							|  |  |  | 			"       Prints out a list of variables using the RealTime driver.\n" | 
					
						
							|  |  |  | 			"       You must supply a family name, a column to match on, and a value to match to.\n"; | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	case CLI_GENERATE: | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 	if (a->argc < 5)  | 
					
						
							|  |  |  | 		return CLI_SHOWUSAGE; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-19 20:48:33 +00:00
										 |  |  | 	var = ast_load_realtime_all(a->argv[2], a->argv[3], a->argv[4], SENTINEL); | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (var) { | 
					
						
							| 
									
										
										
										
											2008-03-18 15:43:34 +00:00
										 |  |  | 		ast_cli(a->fd, CRL_HEADER_FORMAT, "Column Name", "Column Value"); | 
					
						
							|  |  |  | 		ast_cli(a->fd, CRL_HEADER_FORMAT, "--------------------", "--------------------"); | 
					
						
							| 
									
										
										
										
											2008-12-17 21:17:20 +00:00
										 |  |  | 		orig_var = var; | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 		while (var) { | 
					
						
							| 
									
										
										
										
											2008-03-18 15:43:34 +00:00
										 |  |  | 			ast_cli(a->fd, CRL_HEADER_FORMAT, var->name, var->value); | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 			var = var->next; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 		ast_cli(a->fd, "No rows found matching search criteria.\n"); | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-17 21:17:20 +00:00
										 |  |  | 	ast_variables_destroy(orig_var); | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 	return CLI_SUCCESS; | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | static char *cli_realtime_update(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 	int res = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 	switch (cmd) { | 
					
						
							|  |  |  | 	case CLI_INIT: | 
					
						
							|  |  |  | 		e->command = "realtime update"; | 
					
						
							|  |  |  | 		e->usage = | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 			"Usage: realtime update <family> <colmatch> <valuematch> <colupdate> <newvalue>\n" | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 			"       Update a single variable using the RealTime driver.\n" | 
					
						
							|  |  |  | 			"       You must supply a family name, a column to update on, a new value, column to match, and value to match.\n" | 
					
						
							|  |  |  | 			"       Ex: realtime update sipfriends name bobsphone port 4343\n" | 
					
						
							|  |  |  | 			"       will execute SQL as UPDATE sipfriends SET port = 4343 WHERE name = bobsphone\n"; | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	case CLI_GENERATE: | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 	if (a->argc < 7)  | 
					
						
							|  |  |  | 		return CLI_SHOWUSAGE; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-19 20:48:33 +00:00
										 |  |  | 	res = ast_update_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL); | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 	if (res < 0) { | 
					
						
							|  |  |  | 		ast_cli(a->fd, "Failed to update. Check the debug log for possible SQL related entries.\n"); | 
					
						
							|  |  |  | 		return CLI_FAILURE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ast_cli(a->fd, "Updated %d RealTime record%s.\n", res, ESS(res)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return CLI_SUCCESS; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char *cli_realtime_update2(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int res = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (cmd) { | 
					
						
							|  |  |  | 	case CLI_INIT: | 
					
						
							|  |  |  | 		e->command = "realtime update2"; | 
					
						
							|  |  |  | 		e->usage = | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 			"Usage: realtime update2 <family> <colmatch> <valuematch> [... <colmatch5> <valuematch5>] NULL <colupdate> <newvalue>\n" | 
					
						
							| 
									
										
										
										
											2009-07-22 16:49:42 +00:00
										 |  |  | 			"   Update a single variable, requiring one or more fields to match using the\n" | 
					
						
							|  |  |  | 			"   RealTime driver.  You must supply a family name, a column to update, a new\n" | 
					
						
							|  |  |  | 			"   value, and at least one column and value to match.\n" | 
					
						
							|  |  |  | 			"   Ex: realtime update sipfriends name bobsphone ipaddr 127.0.0.1 NULL port 4343\n" | 
					
						
							|  |  |  | 			"   will execute SQL as\n" | 
					
						
							|  |  |  | 			"   UPDATE sipfriends SET port='4343' WHERE name='bobsphone' and ipaddr='127.0.0.1'\n"; | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	case CLI_GENERATE: | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (a->argc < 7)  | 
					
						
							|  |  |  | 		return CLI_SHOWUSAGE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (a->argc == 7) { | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 		res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], SENTINEL, a->argv[5], a->argv[6], SENTINEL); | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 	} else if (a->argc == 9) { | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 		res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL, a->argv[7], a->argv[8], SENTINEL); | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 	} else if (a->argc == 11) { | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 		res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], SENTINEL, a->argv[9], a->argv[10], SENTINEL); | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 	} else if (a->argc == 13) { | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 		res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], SENTINEL, a->argv[11], a->argv[12], SENTINEL); | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 	} else if (a->argc == 15) { | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 		res = ast_update2_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], a->argv[11], a->argv[12], SENTINEL, a->argv[13], a->argv[14], SENTINEL); | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		return CLI_SHOWUSAGE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (res < 0) { | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 		ast_cli(a->fd, "Failed to update. Check the debug log for possible SQL related entries.\n"); | 
					
						
							|  |  |  | 		return CLI_FAILURE; | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 	ast_cli(a->fd, "Updated %d RealTime record%s.\n", res, ESS(res)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return CLI_SUCCESS; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char *cli_realtime_store(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int res = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (cmd) { | 
					
						
							|  |  |  | 	case CLI_INIT: | 
					
						
							|  |  |  | 		e->command = "realtime store"; | 
					
						
							|  |  |  | 		e->usage = | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 			"Usage: realtime store <family> <colname1> <value1> [<colname2> <value2> [... <colname5> <value5>]]\n" | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 			"       Create a stored row using the RealTime driver.\n" | 
					
						
							|  |  |  | 			"       You must supply a family name and name/value pairs (up to 5).  If\n" | 
					
						
							|  |  |  | 			"       you need to store more than 5 key/value pairs, start with the first\n" | 
					
						
							|  |  |  | 			"       five, then use 'realtime update' or 'realtime update2' to add\n" | 
					
						
							|  |  |  | 			"       additional columns.\n"; | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	case CLI_GENERATE: | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (a->argc < 5) { | 
					
						
							|  |  |  | 		return CLI_SHOWUSAGE; | 
					
						
							|  |  |  | 	} else if (a->argc == 5) { | 
					
						
							|  |  |  | 		res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], SENTINEL); | 
					
						
							|  |  |  | 	} else if (a->argc == 7) { | 
					
						
							|  |  |  | 		res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL); | 
					
						
							|  |  |  | 	} else if (a->argc == 9) { | 
					
						
							|  |  |  | 		res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], SENTINEL); | 
					
						
							|  |  |  | 	} else if (a->argc == 11) { | 
					
						
							|  |  |  | 		res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], SENTINEL); | 
					
						
							|  |  |  | 	} else if (a->argc == 13) { | 
					
						
							|  |  |  | 		res = ast_store_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], a->argv[11], a->argv[12], SENTINEL); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		return CLI_SHOWUSAGE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (res < 0) { | 
					
						
							|  |  |  | 		ast_cli(a->fd, "Failed to store record. Check the debug log for possible SQL related entries.\n"); | 
					
						
							|  |  |  | 		return CLI_FAILURE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ast_cli(a->fd, "Stored RealTime record.\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return CLI_SUCCESS; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char *cli_realtime_destroy(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int res = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (cmd) { | 
					
						
							|  |  |  | 	case CLI_INIT: | 
					
						
							|  |  |  | 		e->command = "realtime destroy"; | 
					
						
							|  |  |  | 		e->usage = | 
					
						
							| 
									
										
										
										
											2008-11-10 21:12:28 +00:00
										 |  |  | 			"Usage: realtime destroy <family> <colmatch1> <valuematch1> [<colmatch2> <valuematch2> [... <colmatch5> <valuematch5>]]\n" | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 			"       Remove a stored row using the RealTime driver.\n" | 
					
						
							|  |  |  | 			"       You must supply a family name and name/value pairs (up to 5).\n"; | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	case CLI_GENERATE: | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (a->argc < 5) { | 
					
						
							|  |  |  | 		return CLI_SHOWUSAGE; | 
					
						
							|  |  |  | 	} else if (a->argc == 5) { | 
					
						
							|  |  |  | 		res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], SENTINEL); | 
					
						
							|  |  |  | 	} else if (a->argc == 7) { | 
					
						
							|  |  |  | 		res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL); | 
					
						
							|  |  |  | 	} else if (a->argc == 9) { | 
					
						
							|  |  |  | 		res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], SENTINEL); | 
					
						
							|  |  |  | 	} else if (a->argc == 11) { | 
					
						
							|  |  |  | 		res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], SENTINEL); | 
					
						
							|  |  |  | 	} else if (a->argc == 13) { | 
					
						
							|  |  |  | 		res = ast_destroy_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], a->argv[7], a->argv[8], a->argv[9], a->argv[10], a->argv[11], a->argv[12], SENTINEL); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		return CLI_SHOWUSAGE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (res < 0) { | 
					
						
							|  |  |  | 		ast_cli(a->fd, "Failed to remove record. Check the debug log for possible SQL related entries.\n"); | 
					
						
							|  |  |  | 		return CLI_FAILURE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ast_cli(a->fd, "Removed %d RealTime record%s.\n", res, ESS(res)); | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-18 22:43:45 +00:00
										 |  |  | 	return CLI_SUCCESS; | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct ast_cli_entry cli_realtime[] = { | 
					
						
							| 
									
										
										
										
											2007-10-22 20:05:18 +00:00
										 |  |  | 	AST_CLI_DEFINE(cli_realtime_load, "Used to print out RealTime variables."), | 
					
						
							|  |  |  | 	AST_CLI_DEFINE(cli_realtime_update, "Used to update RealTime variables."), | 
					
						
							| 
									
										
										
										
											2008-10-14 00:08:52 +00:00
										 |  |  | 	AST_CLI_DEFINE(cli_realtime_update2, "Used to test the RealTime update2 method"), | 
					
						
							|  |  |  | 	AST_CLI_DEFINE(cli_realtime_store, "Store a new row into a RealTime database"), | 
					
						
							|  |  |  | 	AST_CLI_DEFINE(cli_realtime_destroy, "Delete a row from a RealTime database"), | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int unload_module(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-05 10:31:25 +00:00
										 |  |  | 	ast_cli_unregister_multiple(cli_realtime, ARRAY_LEN(cli_realtime)); | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int load_module(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-05 10:31:25 +00:00
										 |  |  | 	ast_cli_register_multiple(cli_realtime, ARRAY_LEN(cli_realtime)); | 
					
						
							| 
									
										
										
										
											2007-10-26 21:37:02 +00:00
										 |  |  | 	return AST_MODULE_LOAD_SUCCESS; | 
					
						
							| 
									
										
										
										
											2006-09-21 19:35:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Realtime Data Lookup/Rewrite"); |