Linux Install Memo

サーバー管理者によるLinux関連ソフトのインストールメモ

Home » □IPv6/IPv4自動切換えスクリプト(perl)

□IPv6/IPv4自動切換えスクリプト(perl)

どうも時々IPv6が安定しなくて、海外のVPSとの通信がパタッとできなくなったと思ったら、いろいろとあれなんです。

なので、IPv6の疎通を定期的にチェックして、途絶したらIPv4に切り替える、みたいな処理をするPerlスクリプトを作りましたので、適当に削って(笑)公開します。

適当に処理を追加するなどしてください。(自分はpgbouncerの接続先を一時的に切り替えるような処理を組んでます)

※なんでインデント(スペース)が無視されるんやー…適当に整形してください。

 

#!/usr/bin/perl -w
#
# IPv6でping6して、途絶したと判断したら何かをする(アクセス先をIPv4に変える、とか)
# IPv6の疎通が回復したら、元に戻す
#

#
# PING6
$PING6 = '/bin/ping6';

#
# HOSTNAME
#
$HOSTNAME = `/bin/hostname`;
chop $HOSTNAME;

#
# DAYTIME
#
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$NOW = sprintf("%04d/%02d/%02d %02d:%02d:%02d",
$year + 1900,
$mon + 1,
$mday,
$hour,
$min,
$sec);

#
# FROM ADDRESS
#
$FROM_ADDRESS = 'レポートの送信元アドレス';

#
# REPORT SEND TO ...
#
@MAIL = ('レポートの送信先アドレス01','レポートの送信先アドレス02');

#
# CHECK SERVER ...
#
@CHECK_LIST = ('監視したいサーバー01','監視したいサーバー02');

$MAIL_SUBJECT = '[WARNING] ';
$MAIL_STR = '';

#
# IPv6 LINK FLAG Init
#
$IPv6_FLAG = 0;

#
# ping6 check
#
foreach $CHECK_SERVER (@CHECK_LIST)
{
print '-> '.$CHECK_SERVER."\n";

if (system($PING6.' -c 5 '.$CHECK_SERVER.' > /dev/null') != 0)
{
$IPv6_FLAG ++;
$SERVER_RESULT .= $CHECK_SERVER.' IPv6 link down.'."\n";
}
}

#
# if IPv6 LINK DOWN ...
#
if ($IPv6_FLAG != 0)
{
print "IPv6 is DOWN!?"."\n";
#
# IPv6のリンクが途絶(不安定)な時の処理をする
#

$MAIL_SUBJECT .= 'IPv6 LINK DOWN!? ';
$MAIL_STR .= "\n".'['.$NOW.']'."\n";
#
# Send report mail
#
&send_report();
}
#
# if IPv6 LINK UP!
#
else
{
print "IPv6 is UP!!"."\n";
#
# IPv6のリンクが復活した時の処理をする
#

$MAIL_SUBJECT .= 'IPv6 LINK UP!! ';
$MAIL_STR .= "\n".'['.$NOW.']'."\n";
#
# Send report mail
#
&send_report();
}

# --------------------
# Send report mail
# --------------------
sub send_report
{
print $MAIL_SUBJECT."\n";
print $MAIL_STR."\n";

foreach $TO_ADDRESS (@MAIL)
{
print "-> $TO_ADDRESS\n";
if (open(ML, "| /usr/sbin/sendmail $TO_ADDRESS\n"))
{
print ML 'From: '.$FROM_ADDRESS."\n";
print ML 'To: '.$TO_ADDRESS."\n";
print ML 'Subject: '.$MAIL_SUBJECT."\n";
print ML "Priority: high\n";
print ML "X-Priority: 1\n";
print ML 'X-Mailer: checklink ver 1.0'."\n";
print ML "\n";
print ML $MAIL_STR;
print ML "\n".'from /root/checklink.pl'."\n";
close(ML);
}
}
}

Name of author

Name: admin

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です