ふと、Linuxのtopコマンドを見ると。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2756 root 20 0 4108 416 300 R 9.7 0.0 14:35.45 diced
DiCEがなぜかCPUを食べているので、変わりになるものをperlで書いてみた。
DDNS_UPDATER.pm
package DDNS_UPDATER; use LWP::UserAgent; my $DDNS_SERVICE_Format={ 'dyndns.org' => ['http://members.dyndns.org/nic/update?hostname=$self->{HOST}.dyndns.org&myip=$self->{IP}', 'basic'], 'value-domain.com' => ['http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=$self->{DOMAIN}&p=$self->{PASS}&h=$self->{HOST}&i=$self->{IP}'] }; sub new{ my $self = shift; my $hash = { SERVICE => '', DOMAIN => '', HOST => '', ID => '', PASS => '', IP => '', IP_URL =>'http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip', }; if(ref($_[0]) eq 'HASH'){ %$hash = (%$hash , %{$_[0]}); } return bless $hash, $self; } sub set{ my $self = shift; my $key = shift; my $value = shift; $self->{$key} = $value if(exists $self->{$key}); return $self; } sub exec{ my $self = shift; if(exists $DDNS_SERVICE_Format->{$self->{SERVICE}}){ my $nowIP = $self->getIP(); if($self->{IP} ne $nowIP){ $self->{IP} = $nowIP; my $url = do{ eval "\"$DDNS_SERVICE_Format->{$self->{SERVICE}}->[0]\"" }; my $req = HTTP::Request->new(GET => "$url"); if($DDNS_SERVICE_Format->{$self->{SERVICE}}->[1] eq 'basic'){ $req->authorization_basic($self->{ID} , $self->{PASS}); } return LWP::UserAgent->new()->simple_request($req)->content(); }else{ return -1; # IPの変化なし } } return 0; } sub getIP{ my $self = shift; return do{ $self->{IP_URL} ? join( '.', LWP::UserAgent->new()->simple_request(HTTP::Request->new(GET => "$self->{IP_URL}"))->content() =~/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/) : '' }; } 1;
DDNS_UPDATE.pl
#!/usr/bin/perl use strict; eval{ use DDNS_UPDATER; my $intarval = 300; # 5分毎に更新チェック my @list = ( new DDNS_UPDATER({ SERVICE => 'value-domain.com', ID => '*', PASS => 'asdf', DOMAIN => 'rying.net', HOST => 'www', }) ,new DDNS_UPDATER({ SERVICE => 'value-domain.com', ID => '*', PASS => 'asdf', DOMAIN => 'rying.net', HOST => '*', }) ,new DDNS_UPDATER({ SERVICE => 'dyndns.org', ID => 'nullpo', PASS => 'asdf', DOMAIN => '', HOST => 'nullpo', }) ); while(1){ foreach my $obj (@list){ $obj->exec(); sleep(1); } sleep ($intarval); } }; exit(1);
どう見ても使いにくいです。本当にありがとうございました。
こんなもんをつくって、
モジュールは適当なperlモジュールディレクトリ、
本体はroot下のbinディレクトリに放り込んで、
vi /etc/rc.d/rc.local
#/usr/local/bin/DiCE/diced -d -l /root/bin/DDNS_UPDATE.pl
とかやって終了。
URLで飛ぶとDNSが更新されるサービスを利用しているもの。
自分がよければいいので、サービスはdyndns.orgとvalue-domainしか対応をしてないけども、
念のため、DDNS_SERVICE_Formatで定義していけば、いくらでもサービスは増やせるはず。
ただ、ログが一切でないので、ちゃんと更新できているか不安・・・
なかなかIP変わらないからチェックしようがない。
応答メッセージを見る限りは大丈夫そうだが。
5分間隔でIP変動をチェックし、変動があったら更新する。
ここまで書いて気づいたが、IPアドレスを取得失敗したときを考慮してなかった!!
眠いからまた今度でいいや、ねる。