Hi everyone,<div><br></div><div><br></div><div>In our setup we're using Zabbix for monitoring and thus Zabbix sends e-mails to RT for our support-desk.</div><div>Before Zabbix we used Nagios and thus also had the Nagios plugin installed for merging similar e-mails together and closing a ticket when an e-mail comes with the status RECOVERED.</div>
<div><br></div><div>As such I've modified the actual script for the Nagios plugin so that it handles the Zabbix e-mails instead of Nagios e-mails.</div><div><br></div><div>This script requirers the following settings in your Zabbix action which sends the e-mail:</div>
<div><ul><li>Subject: {TRIGGER.STATUS} - {TRIGGER.SEVERITY} - {<a href="http://TRIGGER.NAME">TRIGGER.NAME</a>}</li><li>Conditions:</li><ul><li>Type: OR</li><li>Trigger severity = Disaster</li><li>Trigger severity = High</li>
<li>Trigger severity = Average</li><li>Trigger severity = Warning</li></ul></ul><div>In my opinion the default subject is a little limiting, I've added the severity to make it a little more informative for the person reading it.</div>
<div>Other then that the content of the e-mail that Zabbix sends doesn't matter, this plugin only checks the subject.</div><div><br></div><div>The actual modifications that I've made were done in the following file:</div>
<div><span style="font-family:'courier new',monospace"><br></span></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><span style="font-family:'courier new',monospace">/opt/rt4/local/plugins/RT-Extension-Nagios/lib/RT/Action/UpdateNagiosTickets.pm</span></div>
</div></blockquote><div><div><br></div><div>Below you'll find the content of that file with the modifications needed for Zabbix, the modifications are marked with bold text:</div><div><br></div><div><div><font face="courier new, monospace">package RT::Action::UpdateNagiosTickets;</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">use strict;</font></div><div><font face="courier new, monospace">use warnings;</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">use base qw(RT::Action);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">sub Describe {</font></div><div>
<font face="courier new, monospace">    my $self = shift;</font></div><div><font face="courier new, monospace">    return ( ref $self );</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">sub Prepare {</font></div><div><font face="courier new, monospace">    return (1);</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">sub Commit {</font></div><div><font face="courier new, monospace">    my $self = shift;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    my $attachment = $self->TransactionObj->Attachments->First;</font></div>
<div><font face="courier new, monospace">    return 1 unless $attachment;</font></div><div><font face="courier new, monospace">    my $new_ticket    = $self->TicketObj;</font></div><div><font face="courier new, monospace">    my $new_ticket_id = $new_ticket->id;</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    my $subject = $attachment->GetHeader('Subject');</font></div><div><font face="courier new, monospace">    return unless $subject;</font></div>
<div><font face="courier new, monospace"><b>    if ( my ( $type, $problem_severity, $problem_type ) =</b></font></div><div><font face="courier new, monospace">        $subject =~</font></div><div><font face="courier new, monospace"><b>m{(PROBLEM|OK|UNKNOWN)\s+-\s+(Warning|Average|High|Disaster)\s+-\s+([^/]+)/?(.*)}i</b></font></div>
<div><font face="courier new, monospace">      )</font></div><div><font face="courier new, monospace">    {</font></div><div><font face="courier new, monospace">        $problem_type ||= '';</font></div><div><font face="courier new, monospace">        $RT::Logger->info(</font></div>
<div><font face="courier new, monospace"><b>"Extracted type, problem_severity and problem_type from</b></font></div><div><font face="courier new, monospace"><b>subject with values $type, $problem_severity and $problem_type"</b></font></div>
<div><font face="courier new, monospace">        );</font></div><div><font face="courier new, monospace">        my $tickets = RT::Tickets->new( $self->CurrentUser );</font></div><div><font face="courier new, monospace">        $tickets->LimitQueue( VALUE => $new_ticket->Queue )</font></div>
<div><font face="courier new, monospace">          unless RT->Config->Get('NagiosSearchAllQueues');</font></div><div><font face="courier new, monospace">        $tickets->LimitSubject(</font></div><div><font face="courier new, monospace"><b>            VALUE => "$problem_type",</b></font></div>
<div><font face="courier new, monospace">            OPERATOR => 'LIKE',</font></div><div><font face="courier new, monospace">        );</font></div><div><font face="courier new, monospace">        my @active = RT::Queue->ActiveStatusArray();</font></div>
<div><font face="courier new, monospace">        for my $active (@active) {</font></div><div><font face="courier new, monospace">            $tickets->LimitStatus(</font></div><div><font face="courier new, monospace">                VALUE    => $active,</font></div>
<div><font face="courier new, monospace">                OPERATOR => '=',</font></div><div><font face="courier new, monospace">            );</font></div><div><font face="courier new, monospace">        }</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">        my $resolved = RT->Config->Get('NagiosResolvedStatus') || 'resolved';</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">        if ( my $merge_type = RT->Config->Get('NagiosMergeTickets') ) {</font></div><div><font face="courier new, monospace">            my $merged_ticket;</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">            $tickets->OrderBy(</font></div><div><font face="courier new, monospace">                FIELD => 'Created',</font></div>
<div><font face="courier new, monospace">                ORDER => $merge_type > 0 ? 'DESC' : 'ASC',</font></div><div><font face="courier new, monospace">            );</font></div><div><font face="courier new, monospace">            $merged_ticket = $tickets->Next;</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">            while ( my $ticket = $tickets->Next ) {</font></div><div><font face="courier new, monospace">                my ( $ret, $msg ) = $ticket->MergeInto( $merged_ticket->id );</font></div>
<div><font face="courier new, monospace">                if ( !$ret ) {</font></div><div><font face="courier new, monospace">                    $RT::Logger->error( 'failed to merge ticket '</font></div><div><font face="courier new, monospace">                          . $ticket->id</font></div>
<div><font face="courier new, monospace">                          . " into "</font></div><div><font face="courier new, monospace">                          . $merged_ticket->id</font></div><div><font face="courier new, monospace">                          . ": $msg" );</font></div>
<div><font face="courier new, monospace">                }</font></div><div><font face="courier new, monospace">            }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><b>            if ( $type eq 'OK' ) {</b></font></div>
<div><font face="courier new, monospace">                my ( $ret, $msg ) = $merged_ticket->SetStatus($resolved);</font></div><div><font face="courier new, monospace">                if ( !$ret ) {</font></div><div><font face="courier new, monospace">                    $RT::Logger->error( 'failed to resolve ticket '</font></div>
<div><font face="courier new, monospace">                          . $merged_ticket->id</font></div><div><font face="courier new, monospace">                          . ":$msg" );</font></div><div><font face="courier new, monospace">                }</font></div>
<div><font face="courier new, monospace">            }</font></div><div><font face="courier new, monospace">        }</font></div><div><font face="courier new, monospace"><b>        elsif ( $type eq 'OK' ) {</b></font></div>
<div><font face="courier new, monospace">            while ( my $ticket = $tickets->Next ) {</font></div><div><font face="courier new, monospace">                my ( $ret, $msg ) = $ticket->Comment(</font></div><div>
<font face="courier new, monospace">                    Content => 'going to be resolved by ' . $new_ticket_id,</font></div><div><font face="courier new, monospace">                    Status  => $resolved,</font></div>
<div><font face="courier new, monospace">                );</font></div><div><font face="courier new, monospace">                if ( !$ret ) {</font></div><div><font face="courier new, monospace">                    $RT::Logger->error(</font></div>
<div><font face="courier new, monospace">                        'failed to comment ticket ' . $ticket->id . ": $msg" );</font></div><div><font face="courier new, monospace">                }</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">                ( $ret, $msg ) = $ticket->SetStatus($resolved);</font></div><div><font face="courier new, monospace">                if ( !$ret ) {</font></div>
<div><font face="courier new, monospace">                    $RT::Logger->error(</font></div><div><font face="courier new, monospace">                        'failed to resolve ticket ' . $ticket->id . ": $msg" );</font></div>
<div><font face="courier new, monospace">                }</font></div><div><font face="courier new, monospace">            }</font></div><div><font face="courier new, monospace">            my ( $ret, $msg ) = $new_ticket->SetStatus($resolved);</font></div>
<div><font face="courier new, monospace">            if ( !$ret ) {</font></div><div><font face="courier new, monospace">                $RT::Logger->error(</font></div><div><font face="courier new, monospace">                    'failed to resolve ticket ' . $new_ticket->id . ":$msg" );</font></div>
<div><font face="courier new, monospace">            }</font></div><div><font face="courier new, monospace">        }</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace">}</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">1;</font></div></div><div><br></div><div>I haven't made any other changes to the Nagios plugin, by default the plugin does what it should do. The only difference is that the subject regex is different and the RECOVERED status with Zabbix is OK.</div>
<div>Below my settings for the Nagios plugin in the RT_SiteConfig:</div><div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><div><font face="courier new, monospace">Set($NagiosSearchAllQueues, 1);</font></div>
</div></div><div><div><div><font face="courier new, monospace">Set($NagiosMergeTickets, -1);</font></div></div></div><div><div><div><font face="courier new, monospace">Set($NagiosResolvedStatus, "resolved");</font></div>
</div></div></blockquote><div><div><br></div><div>You can find the Nagios plugin on this page:</div><div><ul><li><a href="http://search.cpan.org/dist/RT-Extension-Nagios/lib/RT/Extension/Nagios.pm">http://search.cpan.org/dist/RT-Extension-Nagios/lib/RT/Extension/Nagios.pm</a></li>
</ul><div>I'm sadly not handy enough with these plugins to make a new plugin out of this, or to make the required modifications to update the Nagios plugin e.g. allow setting the regex + RECOVERY/OK status, etc. in the RT_SiteConfig. Basically making it more customizable.</div>
<div><br></div><div>So these modifications will have to do, I hope this helps a few others out there that also use Zabbix for monitoring.</div></div><div><br></div><div><br></div>-- <br>Bart<br>
</div>