I’ve had stragglers before and fixed it with a cron job.
The program will clear out all dynamic queue members from all queues. There are probably better ways to make this magic happen, but it’s been working well for us since July.
I run this against 1.6.x – other versions may need tweaking.
[code]#!/usr/bin/perl -w
pae 3 Jul 2010
use File::Basename;
use Sys::Syslog qw( :DEFAULT setlogsock);
my $debug = 0;
my $scancmd = ‘/usr/sbin/asterisk -rx “queue show”’;
my $clearcmd = ‘/usr/sbin/asterisk -rx “queue remove member %s from %s”’;
sub openSyslog {
my $name = shift;
setlogsock(‘unix’);
openlog($name, ‘pid’, ‘daemon’);
}
sub fetchDynamicAgents {
my $queue;
my $agent;
my %results;
open(IN, "$scancmd|");
while (<IN>) {
chop;
$line = $_;
if ($line =~ /strategy/) {
$queue = (split)[0];
print 'sifting through queue: ' . $queue . "\n"
if ($debug);
}
if (($line =~ /Local/) && ($line =~ /dynamic/)) {
$agent = (split)[0];
print ' found dynamic agent: ' . $agent . "\n"
if ($debug);
$results{$queue . ' ' . $agent} = 1;
}
}
close(IN);
return %results;
}
sub removeAgentFromQueue {
my $agent = shift;
my $queue = shift;
return ''
if (($queue eq ‘’) || ($agent eq ‘’));
my $cmd = sprintf($clearcmd, $agent, $queue);
print $cmd . "\n"
if ($debug);
# log what we're about to do
syslog('info', $cmd);
open(IN, "$cmd|");
while (<IN>) {
chop;
# log the return values
syslog('info', $_);
}
close(IN);
}
set up logging
openSyslog(basename($0));
gather a hash of all the dynamic agents in the queues
my %actions = fetchDynamicAgents();
print ‘and the survey says:’ . "\n"
if ($debug);
now iterate over the results
foreach my $entry ( keys %actions ) {
print $entry . “\n”;
# remove each entry iteratively
my ($queue, $agent) = split(/ /, $entry);
removeAgentFromQueue($agent, $queue);
}
[/code]