It has recently become clear that a script which calls rtx-shredder never
finishes. It seems that shredder is actually hanging on something but I can't
figure out what. Script follows.
#!/usr/bin/perl
#############################################
# File: delete_spam.pl
# Version: 2.1.2
# Author: Mathew Snyder
# Date: August 5, 2007
# Comments: A script to gather up the spam
# sent to the Security queue and
# eliminate the "users" that
# created it. It then marks those
# tickets as deleted for the purpose
# of further housecleaning by the
# rtx-shredder cronjob.
#############################################
#Set up our environment
use warnings;
use strict;
use lib '/usr/local/rt3/lib';
use lib '/usr/local/rt3/local/lib';
use lib '/usr/local/lib';
use RT;
use RT::Users;
use RT::Tickets;
use MIME::Lite;
use Reports::Emails;
RT::LoadConfig();
RT::Init();
my @usrID;
my %userID;
my @emails;
my %spammers;
my $users = new RT::Users(RT::SystemUser);
$users->LimitToPrivileged;
while ( my $user = $users->Next ) {
next if $user->Name eq 'root';
$skipEmails{$user->EmailAddress} = undef;
}
my $tix = new RT::Tickets(RT::SystemUser);
$tix->FromSQL('Queue = "zSPAM"');
while (my $ticket = $tix->Next) {
if ($ticket->RequestorAddresses =~ /^[email protected]$/ ||
$ticket->RequestorAddresses =~ /^[email protected]$/) {
$ticket->DeleteWatcher (
Type => 'Requestor',
Email => $ticket->RequestorAddresses
);
# $ticket->AddWatcher (
# Type => 'Requestor',
# Email => '[email protected]'
# );
}
next if (exists($skipEmails{$ticket->RequestorAddresses}));
$spammers{$ticket->RequestorAddresses} = undef;
# push @emails, $ticket->RequestorAddresses;
$ticket->SetStatus("deleted");
}
my $count = 0;
#foreach my $email (@emails) {
foreach my $email (keys %spammers) {
system("/usr/local/rt3/local/sbin/rtx-shredder","--force","--plugin","Users=status,any;email,$email;replace_relations,zbeeblebrox;no_tickets,true");
$count++;
}
system("/usr/local/rt3/local/sbin/rtx-shredder --force --plugin
'Tickets=status,deleted;queue,zSPAM;limit,1000' && rm -f /root/*.sql)";
my $emailTo = '[email protected]';
my $emailFrom = "RT";
my $emailSubj = "RT Spam Removal";
my $emailMsg = "The spam removal script has completed and has removed
$count spam created users";
my $fullEmail = new MIME::Lite(From => $emailFrom,
To => $emailTo,
Subject => $emailSubj,
Data => $emailMsg,
);
$fullEmail->send("sendmail", "/usr/sbin/sendmail -t");
unlink glob "*.sql";
exit;
There are likely some changes which I won't be able to explain since they were
made after I left the company. Admittedly, this is a poorly documented script
which has left me scratching my own head wondering why I did things. Hopefully
that won't stop anyone from helping.
One thing that has been noticed is that there are two calls to rtx-shredder for
each instance of the script. You'll see that one is a system call (sh -c) and
the other is a via perl (I'm guessing from the script itself)
Here is the ps output:
10013 pts/1 S 0:00 /usr/bin/perl /usr/local/sbin/delete_spam.pl
10014 pts/1 S 0:00 sh -c /usr/local/rt3/local/sbin/rtx-shredder
--force --plugin 'Tickets=status,deleted;queue,zSPAM;limit,500' && rm -f
/root/*.sql
10015 pts/1 S 0:31 /usr/bin/perl
/usr/local/rt3/local/sbin/rtx-shredder --force --plugin
Tickets=status,deleted;queue,zSPAM;limit,500
In this output, I found that by killing process 10015 the other two terminated
instantly. I'm guessing that when the system call is made perl is invoked
again by way of rtx-shredder and 10015 reflect all the arguments passed.
However, it never exits giving control back to the system call which would
then, in turn, terminate giving control back to the script.
I haven't seen any particular errors but then, I don't know what they would
look like. Anyone else run into a similar problem?
-Mathew
--
Keep up with my goings on at http://feeds.feedburner.com/theillien_atom
_______________________________________________
http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-users
Community help: http://wiki.bestpractical.com
Commercial support: [email protected]
Discover RT's hidden secrets with RT Essentials from O'Reilly Media.
Buy a copy at http://rtbook.bestpractical.com