At the newspaper we make heavy use of FreePBX and Asterisk to power our phone system. That includes the use of the call queue feature, where a caller interested in subscriptions or advertising or placing an obituary can be routed to the right place via a phone menu, hear an appropriate message, and then ring through to one of the staff members trained to help with that particular topic, or leave a voicemail in the right place if no one is available. We’re a small paper and our phone system is mostly quiet, but I have seen days where multiple calls are being handled simultaneously, and queues are very helpful.
One aspect of our setup that has taken some figuring out is having staff log in and out of the phone system so that they can be available to answer those queue calls at the right time.
Remembering to log in at the start of the day is fairly straightforward, though is still a habit all of us our developing. Remembering to log out at the end of the day is for some reason a bit more hit and miss; when my brain has decided it’s time to leave the office or stop working, for some reason logging out of the phone is frequently not top of mind, and apparently that’s often true for my coworkers as well.
It may not seem like it would be a big deal to just let folks stay logged in all the time, but it can mean the difference between a caller sitting on hold for an extra minute or two as the phone system rings the phones of folks who have left for the day, or the caller more quickly getting a useful message and the option to leave a voicemail. We could address this through more complex conditional logic in our phone system set up, but for now I’m trying to address it in a way that mostly maintains user-level control.
So, based on some other bits and pieces of scripts found on Stackoverflow and elsewhere (# #), I put together this Bash script that logs everyone out of all queues:
#!/usr/bin/bash
# Remove an Asterisk agent from queues, or all agents from all queues
Help()
{
# Display Help
echo "Remove Asterisk dynamic agents from queues."
echo
echo "Syntax: remove_from_queue.sh [-a|eh]"
echo "options:"
echo "a Remove all members from all queues."
echo "e <123> Specify an extension to be removed ."
echo "h Print this help."
echo
}
while getopts ":ahe:" option; do
case $option in
h) # display Help
Help
exit;;
e) # Enter a specific extension to be removed
member=$OPTARG;;
a) # set all queue members to be removed
all=true;;
\?) # Invalid option
echo "Error: Invalid option"
exit;;
esac
done
## all queues
declare -a queues=(`asterisk -rx "queue show" | cut -d " " -f1` )
for q in "${queues[@]}"
do
## all agents in queue
declare -a members=(`asterisk -rx "queue show $q" | grep "/" | cut -d"(" -f2 | cut -d" " -f1`)
for m in "${members[@]}"
do
if [ ! -z $member ]; then
if [[ $m == *"$member"* ]]; then
echo "Removing member Local/$member@from-queue/n from $q"
cmd="queue remove member Local/$member@from-queue/n from $q"
asterisk -rx "$cmd"
fi
else
if [ "$all" = "true" ]; then
echo "Removing member $m from $q"
cmd="queue remove member $m from $q"
asterisk -rx "$cmd"
fi
fi
done
done
I run it via cron like so:
# Remove all asterisk queue agents from all queues at the end of the day
0 18 * * * root /usr/local/bin/remove_from_queue.sh -a