[asterisk-commits] trunk - r8063 in /trunk: channels/ configs/ doc/

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Fri Jan 13 12:23:33 CST 2006


Author: bweschke
Date: Fri Jan 13 12:23:30 2006
New Revision: 8063

URL: http://svn.digium.com/view/asterisk?rev=8063&view=rev
Log:
 Implement the autologoffunavail option in chan_agent (#6038 with some minor mods) 


Modified:
    trunk/channels/chan_agent.c
    trunk/channels/chan_local.c
    trunk/configs/agents.conf.sample
    trunk/doc/manager.txt
    trunk/doc/queuelog.txt

Modified: trunk/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_agent.c?rev=8063&r1=8062&r2=8063&view=diff
==============================================================================
--- trunk/channels/chan_agent.c (original)
+++ trunk/channels/chan_agent.c Fri Jan 13 12:23:30 2006
@@ -158,6 +158,7 @@
 static int wrapuptime;
 static int ackcall;
 static int multiplelogin = 1;
+static int autologoffunavail = 0;
 
 static int maxlogintries = 3;
 static char agentgoodbye[AST_MAX_FILENAME_LEN] = "vm-goodbye";
@@ -255,6 +256,7 @@
 static int agent_indicate(struct ast_channel *ast, int condition);
 static int agent_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
 static struct ast_channel *agent_bridgedchannel(struct ast_channel *chan, struct ast_channel *bridge);
+static void set_agentbycallerid(const char *callerid, const char *agent);
 
 static const struct ast_channel_tech agent_tech = {
 	.type = channeltype,
@@ -464,6 +466,7 @@
 	struct ast_frame *f = NULL;
 	static struct ast_frame null_frame = { AST_FRAME_NULL, };
 	static struct ast_frame answer_frame = { AST_FRAME_CONTROL, AST_CONTROL_ANSWER };
+	const char *status;
 	ast_mutex_lock(&p->lock); 
 	CHECK_FORMATS(ast, p);
 	if (p->chan) {
@@ -484,6 +487,26 @@
 			if (!ast_strlen_zero(p->loginchan)) {
 				if (p->chan)
 					ast_log(LOG_DEBUG, "Bridge on '%s' being cleared (2)\n", p->chan->name);
+
+				status = pbx_builtin_getvar_helper(p->chan, "CHANLOCALSTATUS");
+				if (autologoffunavail && status && !strcasecmp(status, "CHANUNAVAIL")) {
+					char agent[AST_MAX_AGENT] = "";
+					long logintime = time(NULL) - p->loginstart;
+					p->loginstart = 0;
+					ast_log(LOG_NOTICE, "Agent read: '%s' is not available now, auto logoff\n", p->name);
+					manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogoff",
+						      "Agent: %s\r\n"
+						      "Loginchan: %s\r\n"
+						      "Logintime: %ld\r\n"
+						      "Reason: Chanunavail\r\n"
+						      "Uniqueid: %s\r\n",
+						      p->agent, p->loginchan, logintime, ast->uniqueid);
+					snprintf(agent, sizeof(agent), "Agent/%s", p->agent);
+					ast_queue_log("NONE", ast->uniqueid, agent, "AGENTCALLBACKLOGOFF", "%s|%ld|%s", p->loginchan, logintime, "Chanunavail");
+					set_agentbycallerid(p->logincallerid, NULL);
+					p->loginchan[0] = '\0';
+					p->logincallerid[0] = '\0';
+				}
 				ast_hangup(p->chan);
 				if (p->wrapuptime && p->acknowledged)
 					p->lastdisc = ast_tvadd(ast_tvnow(), ast_samp2tv(p->wrapuptime, 1000));
@@ -732,6 +755,7 @@
 {
 	struct agent_pvt *p = ast->tech_pvt;
 	int howlong = 0;
+	const char *status;
 	ast_mutex_lock(&p->lock);
 	p->owner = NULL;
 	ast->tech_pvt = NULL;
@@ -767,6 +791,25 @@
 			else
 				p->lastdisc = ast_tv(0,0);
 			if (p->chan) {
+				status = pbx_builtin_getvar_helper(p->chan, "CHANLOCALSTATUS");
+				if (autologoffunavail && status && !strcasecmp(status, "CHANUNAVAIL")) {
+					char agent[AST_MAX_AGENT] = "";
+					long logintime = time(NULL) - p->loginstart;
+					p->loginstart = 0;
+					ast_log(LOG_NOTICE, "Agent hangup: '%s' is not available now, auto logoff\n", p->name);
+					manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogoff",
+							"Agent: %s\r\n"
+							"Loginchan: %s\r\n"
+							"Logintime: %ld\r\n"
+							"Reason: Chanunavail\r\n"
+							"Uniqueid: %s\r\n",
+							p->agent, p->loginchan, logintime, ast->uniqueid);
+					snprintf(agent, sizeof(agent), "Agent/%s", p->agent);
+					ast_queue_log("NONE", ast->uniqueid, agent, "AGENTCALLBACKLOGOFF", "%s|%ld|%s", p->loginchan, logintime, "Chanunavail");
+					set_agentbycallerid(p->logincallerid, NULL);
+					p->loginchan[0] = '\0';
+					p->logincallerid[0] = '\0';
+				}
 				/* Recognize the hangup and pass it along immediately */
 				ast_hangup(p->chan);
 				p->chan = NULL;
@@ -1086,6 +1129,11 @@
 				updatecdr = 1;
 			else
 				updatecdr = 0;
+		} else if (!strcasecmp(v->name, "autologoffunavail")) {
+			if (ast_true(v->value))
+				autologoffunavail = 1;
+			else
+				autologoffunavail = 0;
 		} else if (!strcasecmp(v->name, "recordagentcalls")) {
 			recordagentcalls = ast_true(v->value);
 		} else if (!strcasecmp(v->name, "recordformat")) {

Modified: trunk/channels/chan_local.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_local.c?rev=8063&r1=8062&r2=8063&view=diff
==============================================================================
--- trunk/channels/chan_local.c (original)
+++ trunk/channels/chan_local.c Fri Jan 13 12:23:30 2006
@@ -390,10 +390,14 @@
 	struct local_pvt *cur, *prev=NULL;
 	struct ast_channel *ochan = NULL;
 	int glaredetect;
+	char *status;
 
 	ast_mutex_lock(&p->lock);
 	isoutbound = IS_OUTBOUND(ast, p);
 	if (isoutbound) {
+		status = pbx_builtin_getvar_helper(p->chan, "DIALSTATUS");
+		if(status)
+			pbx_builtin_setvar_helper(p->owner, "CHANLOCALSTATUS", status);
 		p->chan = NULL;
 		p->launchedpbx = 0;
 	} else

Modified: trunk/configs/agents.conf.sample
URL: http://svn.digium.com/view/asterisk/trunk/configs/agents.conf.sample?rev=8063&r1=8062&r2=8063&view=diff
==============================================================================
--- trunk/configs/agents.conf.sample (original)
+++ trunk/configs/agents.conf.sample Fri Jan 13 12:23:30 2006
@@ -21,6 +21,13 @@
 ; automatically logged off (in seconds)
 ;
 ;autologoff=15
+;
+; Define autologoffunavail to have agents automatically logged
+; out when the extension that they are at returns a CHANUNAVAIL
+; status when a call is attempted to be sent there.
+; Default is "no". 
+;
+;autologoffunavail=yes
 ;
 ; Define ackcall to require an acknowledgement by '#' when
 ; an agent logs in using agentcallbacklogin.  Default is "no".

Modified: trunk/doc/manager.txt
URL: http://svn.digium.com/view/asterisk/trunk/doc/manager.txt?rev=8063&r1=8062&r2=8063&view=diff
==============================================================================
--- trunk/doc/manager.txt (original)
+++ trunk/doc/manager.txt Fri Jan 13 12:23:30 2006
@@ -252,6 +252,7 @@
  Position: <num>		-- Position in Queue
  Queue:				-- Queue name
  Reason:			-- "Autologoff"
+ Reason:			-- "Chanunavail"
  Response: <response>		-- response code, like "200 OK"
 					"Success", "Error", "Follows"
  Restart:			-- "True", "False"

Modified: trunk/doc/queuelog.txt
URL: http://svn.digium.com/view/asterisk/trunk/doc/queuelog.txt?rev=8063&r1=8062&r2=8063&view=diff
==============================================================================
--- trunk/doc/queuelog.txt (original)
+++ trunk/doc/queuelog.txt Fri Jan 13 12:23:30 2006
@@ -32,7 +32,8 @@
 AGENTCALLBACKLOGOFF(exten at context|logintime|reason)
 The callback agent logged off.  The last login extension and context is
 recorded, along with the total time the agent was logged in, and the
-reason for the logoff if it was not a normal logoff (e.g., Autologoff)
+reason for the logoff if it was not a normal logoff 
+(e.g., Autologoff, Chanunavail)
 
 COMPLETEAGENT(holdtime|calltime|origposition)
 The caller was connected to an agent, and the call was terminated normally



More information about the asterisk-commits mailing list