□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); } } }