第1引数のIPアドレスにPingを5回実行して、全てNGだったらSlackにPostし、さらに任意の宛先にメールを送信するPerlスクリプト。メールは日本語に対応。ちなみに、Ping実行時にRTTを取得といてMRTGでグラフ化して満足する。状況に応じて監視対象除外を設定することも想定。
Ping監視対象IPを記述したファイル
/etc/mrtg/all-address.csv(カンマ区切りで IP,名称\n(改行) という形式で対象IPの数だけ複数行に渡って記述)
Ping監視除外IPを記述したファイル
/etc/mrtg/exception-address.csv(上記と同じ形式)
スクリプト内容
#!/usr/bin/perl
use warnings;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use utf8;
use Digest::MD5;
use Authen::SASL;
use Net::SMTP;
use MIME::Base64;
my $target_ip=$ARGV[0];
my $resultofping=`ping -c 5 $target_ip | grep rtt`;
my @tmp = ();
my @except = ();
my $tmp = '';
my $flag = 0;
open (IN, '/etc/mrtg/exception-address.csv') or die "$!";
while(){
@tmp = split(/,/, $_);
push(@except, $tmp[0]);
}
close IN;
foreach $tmp (@except) {
if( $target_ip eq $tmp ){
$flag = 1;
}else{
next;
}
}
open (IN, '/etc/mrtg/all-address.csv') or die "$!";
@tmp = ();
my $tagetname = undef;
while(){
@tmp = split(/,/, $_);
if ( $tmp[0] eq $target_ip ){
$targetname = $tmp[1];
last;
}
}
close IN;
unless ( $flag == 1 ) {
unless ( $resultofping =~ /rtt/ ) {
###### SLACK-POST
my $url = 'https://slack.com/api/chat.postMessage';
my %postdata = (
'token' => 'スラックのトークンを記述',
'text' => "\!\! Ping Unreachable \!\! Destination host : " . "$targetname" . '(' . "$target_ip" . ').',
'username' => 'hoge',
'channel' => 'スラックのチャンネルIDを記述',
);
my $request = POST( $url, \%postdata );
my $ua = LWP::UserAgent->new;
my $res = $ua->request($request)->as_string;
###### MAIL
my $header = "From: hogehoge\@domain";
$header .= "\nTo: fugafugat\@domain";
$header .= "\nSubject: 件名を記述";
$header .= "\nMIME-Version: 1.0";
$header .= "\nContent-Type: text/plain; charset=UTF-8";
$header .= "\nContent-Transfer-Encoding: 7bit\n";
my $smtp = Net::SMTP->new('SMTPサーバのFQDNを記述', Port => SMTPサーバのポート番を記述);
$smtp->auth('SMTP認証用メールアドレスを記述', 'SMTP認証パスワードを記述');
$smtp->to('宛先メールアドレスを記述');
$smtp->data();
$smtp->datasend($header);
$smtp->datasend("\n");
my $body = 'Ping Unreachable !!' . "\n\nDestination host : $targetname" . '(' . "$target_ip" . ')';
$smtp->datasend("$body");
$smtp->quit;
}
}
my $sp = " ";
my $slash = "/";
my @array = split(/$sp/,$resultofping);
my @array2 = split(/$slash/,$array[3]);
print $array2[1] *1000 . "\n"; # avg
print $array2[2] *1000 . "\n"; # max
my $uptime=`uptime`;
my @array3 = split(/$sp/,$uptime);
$array3[5] =~ s/,//;
print "$array3[3] . $array3[4] . $sp . $array3[5] . \n";
print "ICMP_RTT_of_$target_ip\n";