[Rt-devel] [script] Automatic removal of bounce-generating addresses from ticket

Ruslan Zakirov ruslan.zakirov at gmail.com
Fri Jan 13 12:28:15 EST 2006


On 1/13/06, Petter Reinholdtsen <pere at hungry.com> wrote:
>
> Our RT installation are mostly feed using email, and our users have
> not quite learned to limit their request to only one queue.  This
> typically give us two tickets, one in each queue, with CC set to the
> address of the other queue.  When someone add correspondence to these
> tickets, RT tries to send an email to the queue address of the other
> queue, and the RT administrators (for example me), get an email from
> RT with the report of a suspected bounce.
You didn't configure your RT, see $RTAddressRegexp in config. I don't
remember if with this option RT addresses wouldbe in Cc, AdminCc...
lists, but I'm sure that notify scrip would skip them.

>
> I am getting tired of this, so I sat down to write a script to
> automatically get rid of these Requestor, CC and AdminCC entries.  The
> script is below, and it seem to work.  The only problem is that it is
> dead slow.  It uses several seconds per ticket.  I see 2-3 seconds
> between '.' is printed in debug mode.  Am I doing something wrong
> here?
>
>
> #!/site/perl-5.8.6/bin/perl
> #
> # Author: Petter Reinholdtsen
> # Date:   2006-01-13
> #
> # Look at all open tickets, and remove all queue addresses from
> # requestor, cc and admincc.  This reduces the amount of bounce emails
> # sent to the RT admins.
>
>
> use warnings;
> use strict;
>
> use lib ("/site/rttest/local/lib", "/site/rttest/lib");
>
> package RT;
>
> use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
> use RT::Date;
> use RT::Queue;
> use RT::Queues;
> use RT::Tickets;
>
> my $debug = 1;
>
> # Find all queue addresses of enabled queues
> my @queueaddrs = ();
>
> $| = 1;
> initialize();
>
> my $user = RT::User->new( $RT::SystemUser );
>
> load_queue_addresses();
>
> # Loop over all tickets, remove addresses (log changes)
>
> my $tickets = new RT::Tickets($RT::SystemUser);
> $tickets->LimitStatus(VALUE => 'new');
> $tickets->LimitStatus(VALUE => 'open');
> $tickets->LimitStatus(VALUE => 'stalled');
>
> if ($debug) {
>     my $queue = new RT::Queue($RT::SystemUser);
>     $queue->Load("www-drift");
>     $tickets->LimitQueue(VALUE => $queue->Id);
> }
>
> # Sort tickets in to lists for each owner
> my $principal = RT::Principal->new( $RT::SystemUser );
> my $group = RT::Group->new( $RT::SystemUser );
> while (my $ticket = $tickets->Next) {
>     print ":" if $debug;
>     # check Requestor, Cc, AdminCc, remove the addresses listed in @queueaddrs
>     foreach my $type ( "Cc", "AdminCc", "Requestor" ) {
>         print "." if $debug;
>         $group->LoadTicketRoleGroup( Type => $type, Ticket => $ticket->Id );
>         next unless ( $group->id );
>
>         for my $address (@queueaddrs) {
>             $user->LoadByEmail( $address );
>             $principal->Load( $user->Id );
>             if ($group->HasMember( $principal )) {
>                 my $id = $ticket->Id;
>                 if ($debug) {
>                     print "Want to remove $address as $type from ticket $id\n";
>                 } else {
>                     $RT::Logger->info("Removed queue address $address ".
>                                       "as $type from ticket $id");
>                     $ticket->DeleteWatcher(Type => $type,
>                                            PrincipalId => $principal->Id);
>                 }
>             }
>         }
>     }
> }
>
>
> sub initialize {
>     CleanEnv();       # Clean our the environment
>     RT::LoadConfig(); # Load the RT configuration
>     RT::Init();       # Initialise RT
> }
>
> sub load_queue_addresses {
>     my $queues = new RT::Queues($RT::SystemUser);
>     $queues->LimitToEnabled();
>     foreach my $queue (@{$queues->ItemsArrayRef()}) {
>         for my $address ($queue->CorrespondAddress, $queue->CommentAddress) {
>             next unless $user->LoadByEmail( $address );
>             push @queueaddrs, $address;
>             print "Found queue address '$address'\n" if $debug;
>         }
>     }
> }
> _______________________________________________
> Rt-devel mailing list
> Rt-devel at lists.bestpractical.com
> http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-devel
>


--
Best regards, Ruslan.


More information about the Rt-devel mailing list