DiCE代用品

ふと、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アドレスを取得失敗したときを考慮してなかった!!


眠いからまた今度でいいや、ねる。