keima's caprice diary

気付いたことをメモのように綴ります。なるべく義務っぽくならないように気まぐれに記録します。

Perl で Ping 監視

第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";