第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(上記と同じ形式)
スクリプトファイル名:PingPostslackSendmailg.pl
#!/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; # print "@except\n"; # for viewing 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('宛先メールアドレスを記述'); # real destination $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";