[rt-users] help in creating Scrips
Raed El-Hames
rfh at vialtus.com
Thu Jun 11 12:44:50 EDT 2009
Roehl;
The below:
$search->LimitStatus(VALUE => 'new', OPERATOR => '=', ENTRYAGGREGATOR =>
'or');
$search->LimitStatus(VALUE => 'open', OPERATOR => '=');
simply means in sql terms :
Select from Tickets where Status = 'new' OR Status = 'open'
OPERATOR => '=', is the =
ENTRYAGGREGATOR => 'or' is the OR
However generally with Status the default ENTRYAGGREGATOR is 'OR' and
default operator is '=' so you can re-write the above two lines as:
$search->LimitStatus(VALUE => 'new');
$search->LimitStatus(VALUE => 'open');
achieves the same query.
Roy
rmp dmd wrote:
> Thank you very Matthew for that concise response. Appreciate it!
>
> Follow-up though or anyone who understand scrips, kindly help.
>
> Please teach me what is OPERATOR => '=', ENTRYAGGREGATOR,
> OPERATOR value is expecting from status.
>
> This is the line from the scrip:
>
> $search->LimitStatus(VALUE => 'new', OPERATOR => '=', ENTRYAGGREGATOR
> => 'or');
> $search->LimitStatus(VALUE => 'open', OPERATOR => '=');
>
> The entire script is below.
>
> Thank you very much!
> Roehl
>
> # If the subject of the ticket matches a pattern suggesting
> # that this is a Nagios RECOVERY message AND there is
> # an existing ticket (open or new) in the "General" queue with a matching
> # "problem description", (that is not this ticket)
> # merge this ticket into that ticket
> #
> # Based on http://marc.free.net.ph/message/20040319.180325.27528377.en.html
>
> my $problem_desc = undef;
>
> my $Transaction = $self->TransactionObj;
> my $subject = $Transaction->Attachments->First->GetHeader('Subject');
> if ($subject =~ /\*\* RECOVERY (\w+) - (.*) OK \*\*/) {
> # This looks like a nagios recovery message
> $problem_desc = $2;
>
> $RT::Logger->debug("Found a recovery msg: $problem_desc");
> } else {
> return 1;
> }
>
> # Ok, now let's merge this ticket with it's PROBLEM msg.
> my $search = RT::Tickets->new($RT::SystemUser);
> $search->LimitQueue(VALUE => 'General');
> $search->LimitStatus(VALUE => 'new', OPERATOR => '=', ENTRYAGGREGATOR => 'or');
> $search->LimitStatus(VALUE => 'open', OPERATOR => '=');
>
> if ($search->Count == 0) { return 1; }
> my $id = undef;
> while (my $ticket = $search->Next) {
> # Ignore the ticket that opened this transation (the recovery one...)
> next if $self->TicketObj->Id == $ticket->Id;
> # Look for nagios PROBLEM warning messages...
> if ( $ticket->Subject =~ /\*\* PROBLEM (\w+) - (.*) (\w+) \*\*/ ) {
> if ($2 eq $problem_desc){
> # Aha! Found the Problem TICKET corresponding to this RECOVERY
> # ticket
> $id = $ticket->Id;
> # Nagios may send more then one PROBLEM message, right?
> $RT::Logger->debug("Merging ticket " . $self->TicketObj->Id . " into $id because of OA number match.");
> $self->TicketObj->MergeInto($id);
> # Keep looking for more PROBLEM tickets...
> }
> }
> }
>
> $id || return 1;
> # Auto-close/resolve this whole thing
> $self->TicketObj->SetStatus( "resolved" );
> 1;
>
>
>
> On Thu, Jun 11, 2009 at 3:37 AM, Matthew Seaman
> <matthew.seaman at thebunker.net <mailto:matthew.seaman at thebunker.net>>
> wrote:
>
> rmp dmd wrote:
> > Thank you very much Drew. Your link definitely is a big help.
> >
> > The syntax are quite different with the programming applications
> that I am
> > familiar (very few though). It's very hard modifying it for our
> specific
> > use. Is there a guide about this?
>
> These are perl regular expressions. See
> http://perldoc.perl.org/perlre.html for details, but the following
> means...
>
> > For starters, someone kindly teach me the meaning of \w+) - (.*)
> (\w+) on
>
> > Subject =~ /\*\* PROBLEM (\w+) - (.*) (\w+) \*\*/ )
>
> / <-- start of matching operator
> \*\* <-- match two * characters literally. Without
> the \ escape, * is an operator that means
> 'zero or more times'
> PROBLEM <-- match literal text
> ( <-- start of capture group
> \w+ <-- one or more 'word' characters
> ) <-- close capture group
> - <-- match literal text
> (.*) <-- capture group of
> zero or
> more of any sequence of
> characters. '.' is the
> wildcard character
> <-- match literal ' ' char
> (\w+) <-- capture group of one
> or more word chars.
> <-- another space
> \*\* <-- two more
> stars
> / <-- end of match
> expression
>
> Note that all the white space in the expression also has to match
> literally. In summary this captures 3 strings out of the matched
> text: the first word after '** PROBLEM ', Everything in the middle
> and then the last word at the end before ' **'.
>
> >
> > and *(\d\d\d\d\d\d?) on
> >
> > $subject =~ /\D*(\d\d\d\d\d\d?)\D*/)
>
> \D is a non-digit character. \d is a digit, so this matches any
> number of non-digit characters \D*, then it captures 5 digits
> \d\d\d\d\d and possibly also a 6th digit \d? (? is an operator
> meaning 0 or 1 times) followed by any number of non-digit characters
> \D* again. You could write the capture expression bit as (\d{5,6})
> meaning 'from 5 to 6 digits'
>
> Cheers,
>
> Matthew
>
> --
> Dr Matthew Seaman The Bunker, Ash Radar Station
> PGP: 0x60AE908C on servers Marshborough Rd
> Tel: +44 1304 814890 Sandwich
> Fax: +44 1304 814899 Kent, CT13 0PL, UK
>
>
More information about the rt-users
mailing list