自動更新するには


3.自動更新スクリプトの簡単な説明
(1)ADSLモデムから現在のIPアドレスを取得する場合
最初に、従来のモデムから現在のIPアドレスを取り出す方法について説明します。
以前、フレッツISDNを利用していたときには「 MN128 SOHO SL11 」というルータを使っていたのですが、これは telnet でログインできていました。
(ただ、この時も自動接続スクリプトを作成するのに必要な perl の「 Net::Telnet 」で嵌りましたが。。。^_^; )

しかし、今回使用しているADSLルータ「 MegaBit Gear TE4111C 」では、telnet でログインさせてくれません。
何故か、wwwベースでないとアクセスできないようです。

そこで、「 LWP::UserAgent 」というモジュールを用いて、目的のページにアクセスし、そのHTMLソースからIPアドレスを取得することにします。
#!/usr/bin/perl

$i=0;

#use strict;
#use vars qw($ua $rq $date_time);
#use vars qw($sec $min $hour $mday $mon $year $wday $yday $isdst);
#use vars qw($myip $firewall $target $username $password $version);
#use vars qw($pass $url $sock @result $result $code);

use LWP::UserAgent;
use MIME::Base64 ();
use Sys::Syslog qw(:DEFAULT setlogsock);
use IO::Socket;


##### モデムから接続中のIPアドレスを取得 #####

$ua = LWP::UserAgent->new;
$rq = HTTP::Request->new(GET => 'http://192.168.0.1/cgi-bin/main.cgi?cc_webname=STATUS');
$rq->authorization_basic('username', 'password'); ← (注)ユーザー名とパスワードです。
foreach (split(/\n/, $ua->request($rq)->as_string)) {
last if (($myip) = m|^<TR><TD NOWARP>ADSL IP</TD><TD NOWARP>:(.*?)</TD>|);
}

(2)myip.hn.org/ip.cgi から現在のIPアドレスを取得する場合
次に、今回発見した myip.hn.org/ip.cgi にアクセスし、そこから現在のIPアドレスを取り出す方法について説明します。
まず、hn.org にあるTOOLS ( http://hn.org/www/tools/ )のページにアクセスしてみてください。
そして、そこにある
 「 ・ myip.hn.org/ip.cgi - Your IP Address 」をクリックしてみてください。
すると、次のように現在自分に割り当てられているIPアドレスが表示されます。
(この図は2001年12月29日時点での、当サイトのIPアドレスを表示しています。)



今回の方法は、この1行目に表示される「<HEAD> as <!--IPADDR=」の後に続くIPアドレスを取り込むことにしました。
基本的には、「(1)ADSLモデムから現在のIPアドレスを取得する場合」と同じように、「 LWP::UserAgent 」というモジュールを用いて、目的のページにアクセスし、そのHTMLソースからIPアドレスを取得するという方法をとります。
下記の赤字で表記しているところが、その部分です。
#!/usr/bin/perl

$i=0;

#use strict;
#use vars qw($ua $rq $date_time);
#use vars qw($sec $min $hour $mday $mon $year $wday $yday $isdst);
#use vars qw($myip $firewall $target $username $password $version);
#use vars qw($pass $url $sock @result $result $code);

use LWP::UserAgent;
use MIME::Base64 ();
use Sys::Syslog qw(:DEFAULT setlogsock);
use IO::Socket;


##### hn.ogr から接続中のIPアドレスを取得 #####

$ua = LWP::UserAgent->new;
$rq = HTTP::Request->new(GET => 'http://myip.hn.org/ip.cgi');
foreach (split(/\n/, $ua->request($rq)->as_string)) {
last if (($myip) = m|^<HEAD><!--IPADDR=(.*?)--></HEAD>|);
}

さて、この後のステップはどちらも同じです。
まず、現在の日時とIPアドレスをセットした「 adsl.new 」というファイルを作成します。
「 adsl.new 」の内容は、次のとおりです。
date='2001/12/29 18:32:43'
IP='61.214.226.67'

この内容と前回チェックした時のIPアドレスとを比較し、変わっていればこの「 adsl.new 」というファイルを「 adsl.js 」として保存し、「 hammernode.pl 」を実行するという仕組みです。

ですから、最初に「 adsl.js 」というファイルを作成しておいてください。
(ファイルの内容は「 adsl.new 」と同じ形式です。)

下記は「 myip-hammernode.pl 」のルーチンです。(「 adsl-hammernode.pl 」のルーチンに少し修正を加えています。)
##### 現在の日時とIPアドレスを保存 #####

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$mon++;
$year = $year + 1900;
$date_time = sprintf("%04d/%02d/%02d %02d:%02d:%02d", $year, $mon, $mday, $hour,$min, $sec);

open (OUT,">/etc/adsl.new");
print OUT "date=\'".$date_time."\'\n";
print OUT "IP=\'".$myip."\'\n";
close OUT;

print "$date_time\n";
print "ADSL IP is $myip \n";


##### IPアドレスのチェック #####
open (IN,"/etc/adsl.js");
while (<IN>) {
chomp;
$adsl_data[$i] = substr($_, 4, length($_) - 5);
++$i;
}
close IN;
print "Old IP is $adsl_data[1] \n";

if ($myip eq $adsl_data[1]) {
print "IP is NOT changed.\n";
system ("rm /etc/adsl.new");
exit(0);
} else {
print "IP was Changed!\n";
system ("mv /etc/adsl.new /etc/adsl.js");
system ("/usr/local/bin/myip_mail.sh;"); ←次のセクションで説明します。
}

if ($myip eq "") {   ←ここの2行は、取得したIPアドレスが空白の場合「hammernode.pl」
exit(0)};           のルーチンを実行しないように処理を中止するためです。

以下は、「 hammernode.pl 」のルーチンです。
ただ、赤色で示した3箇所の部分は、修正しなければなりません。
##### hammernode.plのスタート #####

print "Starting hammernode.pl\n";
# YOUR hn.org name and password go here.
$username = "ryo"; ← hn.org のVanity Account のユーザ名です。
$password = "○○○○○○○○"; ← そのパスワードです

# If you're behind a firewall or HTTP proxy, set this to 1.
# If you're not sure, set it to 1; that's the safer setting anyway.
# If you KNOW you're not behind a firewall or proxy, set to 0.
$firewall = 1;


〜〜〜〜〜〜〜〜〜〜〜 途 中 省 略 〜〜〜〜〜〜〜〜〜〜〜〜〜

# If you don't let syslogd listen on an inet port, uncomment this line.
#
#setlogsock 'unix';

#openlog ("hammernode", 'pid', 'daemon');

#$myip = shift; ← 既に値をセットしているのでコメントアウトします。

if ($firewall && !$myip) {
# syslog ('err', "FATAL: IP required as command line argument when \$firewall is set to true.");
print "FATAL: IP required as command line argument when \$firewall is set to true.\n";
exit(1);
}
〜〜〜〜〜〜〜〜〜〜〜 以 下 省 略 〜〜〜〜〜〜〜〜〜〜〜〜〜
こうして作成したスクリプトを /usr/local/bin のディレクトリに置いて、crond で5分ごとに実行するようにしています。
具体的には、次の1行を /etc/crontab に追加します。(例は、myip-hammernode.pl )

 */5 * * * * root { /usr/local/bin/myip-hammernode.pl ;} >> /var/log/hammernode.log 2>&1


これをご覧になられた方で、こんなところがおかしいとか、こうすればもっとよくなるのに、というご意見があれば、当サイトのBBSに書き込んでください。
お待ちしております。(^o^)丿

なお、こう修正して欲しい、というご要望には(webmasterの実力がついていきませんので)お応えできません。(~_~;)
ご了承ください。m(__)m

back HOME