sensu/handlers/mailer.pl

89 lines
1.9 KiB
Perl
Raw Normal View History

2015-07-10 14:43:42 +03:00
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
my $json = <>;
my $message = decode_json($json);
my $statuses = {
'2' => 'Critical',
'1' => 'Warning',
'0' => 'Ok'
};
# Get client values
my $client_name = $message->{client}->{name};
my $client_addr = $message->{client}->{address};
my $timestamp = localtime( $message->{client}->{timestamp} );
# Get check information
my $check_name = $message->{check}->{name};
my $check_out = $message->{check}->{output};
my $check_command = $message->{check}->{command};
my $check_interval = $message->{check}->{interval};
my $check_status = $statuses->{ $message->{check}->{status} };
my @ch = $message->{check}->{history};
my @check_history;
foreach my $c (@ch) {
@check_history = @$c;
}
# Count history
my $ok_count = 0;
my $warn_count = 0;
my $crit_count = 0;
my $total = @check_history;
foreach my $stat (@check_history) {
if ( $stat eq '2' ) {
$crit_count++;
}
elsif ( $stat eq '1' ) {
$warn_count++;
}
else {
$ok_count++;
}
}
# Build mail body message
my $mail_body = "
$timestamp
----------------------------------------------------
$client_name with $client_addr status: $check_status
=== Summary ===
CHECK: $check_name
CHECK COMMAND: $check_command
CHECK MESSAGE: $check_out
=== Check history ===
Check interval in seconds: $check_interval
TOTAL: $total
OK: $ok_count
WARNING: $warn_count
CRITICAL: $crit_count
";
# Send email
my $mail_cmd = 'mail';
my $mail_subg = "$client_name with address $client_addr status: $check_status";
my $mail_to = 'admins@example.com';
# Make text file
my $mail_file = '/tmp/'.$message->{client}->{timestamp}.'mail.txt';
open my $mail_fh, '>', $mail_file or die "$!\n";
print $mail_fh $mail_body;
close $mail_fh;
# Send it now!
`cat $mail_file | $mail_cmd -s "'$mail_subg'" $mail_to`;
# Remove temp file
my @rm_cmd = ('rm', '-f', $mail_file);
system(@rm_cmd) == 0 or die "$!\n";