The requirements form one of client is to “auto” logout someone from an Asterisk/FreePBX queue module when he/she logout from the user/device mode.
This script uses AGI. I have tested this on;
1) Debian 5
2) FreePBX 2.8 and below
3) Asterisk 1.6 (may work for 1.4- need to probably tweak the script)
NOTE: If the codes appear truncated, simply copy the whole table and paste into a text editor
Firstly, we use the override function in FreePBX to override the macro-user-logoff directive
nano /etc/asterisk/extensions_override_freepbx.conf |
[macro-user-logoff] ; check device type ; exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)}) exten => s,n,GotoIf($["${DEVICETYPE}" = "fixed"]?s-FIXED,1) exten => s,n,Set(dev=${DB(DEVICE/${CALLERID(num)}/user}) exten => s,n,AGI(kick.sh,${dev}) exten => s,n,AGI(user_login_out.agi,logout,${CALLERID(number)}) exten => s,n(done),Playback(vm-goodbye) exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged out of) exten => s-FIXED,n,Playback(an-error-has-occured&vm-goodbye) exten => s-FIXED,n,Hangup |
Now, create the AGI / bash script that will do the trick
nano /var/lib/asterisk/agi-bin/kick.sh |
#!/bin/bash # script by Sanjay Willie # v0.1-beta # tested on Asterisk 1.6/FreePBX 2.8/Debian 5.06 # maintainer: sanjay@astiostech.com # the directory /tmp should exist and can be accessible by user asterisk and group asterisk # NOTE: FILES IN /tmp normally gets flushed on restarts # On grabbing agent number, should look exactly like "Local/1000@from-queue" eventually and should not contain any preceding or trailing characters # the extraction of agents in the script in the line "for agents..." may or not yield output, so test it out. # The sed part is to remove brackets from the output in the front and back (seen in FBX 2.8) # if the sed isn't required (like in FreePBX 2.7 and below) you can remove it, also lookout for the print $3, in FreePBX 2.7 and below its print $1, so test it out first stdin="0" datenano=`date +%N-%F` regulardate=`date +%F-%T` gennum=$RANDOM-$datenano.int-tmp queuenumbers="4001 4002 4003 5001 5002 5003 4021 4022 4023 5021 5022 5023" ########### while [ "$stdin" != "" ] do read stdin if [ "$stdin" != EOF ] then echo $stdin | grep agi_arg_1 | awk {'print $2'} >> $gennum fi done ############ include=`cat $gennum` #include=2006 ############ cleanup=`rm -v /tmp/$gennum` #echo $cleanup >> /tmp/cleanup ############ if [[ "$include" == "" ]] ; then echo Nothing to do, quitting exit else for queue in $queuenumbers; do #echo $queue >> /tmp/logfile.txt # see NOTES above #for agents in `asterisk -rx "queue show $queue" | grep from-queue | awk '{print $3}' | grep -w "$include" | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`; do # freePBX 2.8 or higher for agents in `asterisk -rx "queue show $queue" | grep from-queue | awk '{print $1}' | grep -w "$include"`; do #echo $agents >> /tmp/logfile.txt asterisk -rx "queue remove member $agents from $queue" echo "we remove $agents in $queue" echo $regulardate - Attempt removing agent $agents from queue $queue >> /tmp/agentremover.log done done fi ############ exit 0 |
1) Once the Asterisk dial plan calls the script, it will parse the user into bash and we will remove that user with a script that walks through all queues you have specified looking for this user and does a removal using asterisk –rx
2) Stores a simple log in /tmp
Make it executable, chmod +x /var/lib/asterisk/agi-bin/kick.sh and make sure the asterisk user can read/run the file, chown asterisk:asterisk /var/lib/asterisk/agi-bin/kick.sh
Reload the dialplan
asterisk -rx "dialplan reload" |
Let us know if this worked out. For help, write to sanjay@astiostech.com
No comments:
Post a Comment