[rt-devel] RT::Action custom scrip - can't locate object method "new"

Bill Shinn packet791 at yahoo.com
Mon Dec 22 11:08:39 EST 2003


I am taking my first crack at writing a custom scrip.
Please be forgiving. Naturally, it's harder if you
don't know much perl...I

I need to be able to:
- parse the text of an incoming ticket for a hostname
- based on a query of custom field, return the ticket
number of any open tickets for that hostname
- if so, merge this new ticket with the one that's
already open. 

I am calling this from a Scrip called
AutoMergeTripwire ("On Create AutoMerge Tripwire
Global Template: Blank). This invokes
RT::Action::AutoMergeTripwire.pm (below). I think I
need to invoke MergeInto, but I know I am doing this
wrong. Also, the RT::Logger doesn't seems to log
(unless I am not even getting that far?) The following
error is entered in syslog.

Dec 22 15:38:01 myhost RT: Scrip 16 died. - Can't
locate object method "new" via package
"RT::Action::AutoMergeTripwire" at
/usr/local/rt/lib/RT/ScripAction_Overlay.pm line 146. 
Stack:  
[/usr/local/rt/lib/RT/ScripAction_Overlay.pm:146]  
[/usr/local/rt/lib/RT/Scrip_Overlay.pm:332]  
[/usr/local/rt/lib/RT/Transaction_Overlay.pm:169]  
[/usr/local/rt/lib/RT/Ticket_Overlay.pm:3743]  
[/usr/local/rt/lib/RT/Ticket_Overlay.pm:597]  
[/usr/local/rt/lib/RT/Interface/Email.pm:571]  
[/usr/local/rt/share/html/REST/1.0/NoAuth/mail-gateway:31]
 (/usr/local/rt/lib/RT/Scrip_Overlay.pm:363)

Any direction is helpful. My attempt is below.....

#
# Sat Dec 20 22:08:50 UTC 2003
#
#
#
# When a new ticket is created from a Tripwire
integrity report,
# automatically search in same queue, for open
tickets, where RT
# custom field is equal to regex pattern match for
$hostname specified
# in Tripwire report.

package RT::Action::AutoMergeTripwire;
require RT::Action::Generic;

use DBI;
use strict;
use vars qw/@ISA/;
@ISA=qw(RT::Action::Generic);

sub Describe {
  my $self = shift;
  return (ref $self );
}

sub Prepare {
  return (1);
}

sub Commit {
  my $self = shift;
  my $Ticket = $self->TicketObj;
  my $ScripObj = $self->ScripObj;
  my $Transaction = $self->TransactionObj;
  my $Queue = $Ticket->QueueObj->Id;


  my $hostname =
($Transaction->Attachments->First->Content =~
/host\s*name:\s*(.[^\s]*).*$/i);

  $RT::Logger->debug("hostname from ticket match as
$hostname");



  my $query;
  my $dbh;
  my $sth;
  my $openticket;
  my $ARGSRef;
  if ($hostname) {

    my $dbh = DBI->connect('DBI:mysql:rt3:localhost',
                       'rt_user',  # user name
                       '***********',  # password
                       { RaiseError => 0});

    $RT::Logger->debug("database connection string:
$dbh");

    if (!$dbh) {
    #     die "Cannot connect to database" }
    $RT::Logger->debug("database connection failed")
    }


    my $query = "SELECT Tickets.id
    FROM Tickets, Queues, TicketCustomFieldValues,
CustomFields
    WHERE Queues.id = '$Queue' AND
                CustomFields.Queue  = '$Queue' AND
                CustomFields.Name = 'Hostname' AND
                Tickets.Status = 'open' AND
                TicketCustomFieldValues.Content =
'$hostname' AND
                TicketCustomFieldValues.Ticket =
Tickets.id;";


    $RT::Logger->debug("Query was built as: $query");

    my $sth = $dbh->prepare($query);

    if (!$sth) {
      #die "Illegal query: $query" };
      $RT::Logger->debug("Illegal query: $query") }

      $sth ->execute();

      while (my @row = $sth->fetchrow_array) {


      if ($row[0]) {
        $openticket = $row[0]);
        $RT::Logger->debug("ticket number is:
$openticket");
        $Ticket->MergeInto( $ARGSRef->{ $openticket .
"-MergeInto" } );
      }

    }
  return(1);
}

1;


Any direction is appreciated. I have searched the
archives and tried to use others' examples, but no one
is trying to merge tickets from scrips.

Thanks,

Bill



__________________________________
Do you Yahoo!?
Protect your identity with Yahoo! Mail AddressGuard
http://antispam.yahoo.com/whatsnewfree



More information about the Rt-devel mailing list