[asterisk-commits] twilson: trunk r370943 - in /trunk: CHANGES main/manager.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Aug 8 16:22:13 CDT 2012


Author: twilson
Date: Wed Aug  8 16:22:08 2012
New Revision: 370943

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=370943
Log:
Add AMI_CLIENT dialplan function

Implementation of a dialplan function for checking manager accounts. Right now
it only returns the number of logged in sessions for a manager account, but
other attributes can be added later.

Patch by: Olle Johansson
Review: https://reviewboard.asterisk.org/r/421/

Modified:
    trunk/CHANGES
    trunk/main/manager.c

Modified: trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=370943&r1=370942&r2=370943
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Wed Aug  8 16:22:08 2012
@@ -224,6 +224,9 @@
    presence state information from a CustomPresence presence state provider.
    See AMI/CLI changes for related commands.
 
+ * Added the AMI_CLIENT function to make manager account attributes available
+   to the dialplan. It currently supports returning the current number of
+   active sessions for a given account.
 
 Channel Drivers
 ------------------

Modified: trunk/main/manager.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/manager.c?view=diff&rev=370943&r1=370942&r2=370943
==============================================================================
--- trunk/main/manager.c (original)
+++ trunk/main/manager.c Wed Aug  8 16:22:08 2012
@@ -876,6 +876,28 @@
 			<para>Generates an AOC-D or AOC-E message on a channel.</para>
 		</description>
 	</manager>
+	<function name="AMI_CLIENT" language="en_US">
+		<synopsis>
+			Checks attributes of manager accounts
+		</synopsis>
+		<syntax>
+			<parameter name="loginname" required="true">
+				<para>Login name, specified in manager.conf</para>
+			</parameter>
+			<parameter name="field" required="true">
+				<para>The manager account attribute to return</para>
+				<enumlist>
+					<enum name="sessions"><para>The number of sessions for this AMI account</para></enum>
+				</enumlist>
+			</parameter>
+		</syntax>
+		<description>
+			<para>
+				Currently, the only supported  parameter is "sessions" which will return the current number of
+				active sessions for this AMI account.
+			</para>
+		</description>
+	</function>
 	<manager name="Filter" language="en_US">
 		<synopsis>
 			Dynamically add filters for the current manager session.
@@ -6805,6 +6827,69 @@
 	.key = __FILE__,
 };
 
+/*! \brief Get number of logged in sessions for a login name */
+static int get_manager_sessions_cb(void *obj, void *arg, void *data, int flags)
+{
+	struct mansession_session *session = obj;
+	const char *login = (char *)arg;
+	int *no_sessions = data;
+
+	if (strcasecmp(session->username, login) == 0) {
+		(*no_sessions)++;
+	}
+
+	return 0;
+}
+
+
+/*! \brief  ${AMI_CLIENT()} Dialplan function - reads manager client data */
+static int function_amiclient(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
+{
+	struct ast_manager_user *user = NULL;
+
+	AST_DECLARE_APP_ARGS(args,
+		AST_APP_ARG(name);
+		AST_APP_ARG(param);
+	);
+
+
+	if (ast_strlen_zero(data) ) {
+		ast_log(LOG_WARNING, "AMI_CLIENT() requires two arguments: AMI_CLIENT(<name>[,<arg>])\n");
+		return -1;
+	}
+	AST_STANDARD_APP_ARGS(args, data);
+	args.name = ast_strip(args.name);
+	args.param = ast_strip(args.param);
+
+	AST_RWLIST_RDLOCK(&users);
+	if (!(user = get_manager_by_name_locked(args.name))) {
+		AST_RWLIST_UNLOCK(&users);
+		ast_log(LOG_ERROR, "There's no manager user called : \"%s\"\n", args.name);
+		return -1;
+	}
+	AST_RWLIST_UNLOCK(&users);
+
+	if (!strcasecmp(args.param, "sessions")) {
+		int no_sessions = 0;
+		ao2_callback_data(sessions, 0, get_manager_sessions_cb, /*login name*/ data, &no_sessions);
+		snprintf(buf, len, "%d", no_sessions);
+	} else {
+		ast_log(LOG_ERROR, "Invalid arguments provided to function AMI_CLIENT: %s\n", args.param);
+		return -1;
+
+	}
+
+	return 0;
+}
+
+
+/*! \brief description of AMI_CLIENT dialplan function */
+static struct ast_custom_function managerclient_function = {
+	.name = "AMI_CLIENT",
+	.read = function_amiclient,
+	.read_max = 12,
+};
+
 static int registered = 0;
 static int webregged = 0;
 
@@ -7176,6 +7261,7 @@
 		ast_manager_register_xml_core("Filter", EVENT_FLAG_SYSTEM, action_filter);
 
 		ast_cli_register_multiple(cli_manager, ARRAY_LEN(cli_manager));
+		__ast_custom_function_register(&managerclient_function, NULL);
 		ast_extension_state_add(NULL, NULL, manager_state_cb, NULL);
 		registered = 1;
 		/* Append placeholder event so master_eventq never runs dry */




More information about the asterisk-commits mailing list