fc2ブログ
2007
11.12

ddclient で mydns

Category: PC
そうでなくてもしんどい毎日なのに、なんで風邪までひきますか・・・

じっと座って仕事してられないぐらいになって、今日は14:30で仕事を終えて、とっとと医者に行って薬を貰って帰りました。

明後日はインフルエンザの予防接種の予定でしたが、この状態では無理やな・・・。の上に、今週はだいぶ寒くなるようで、とことん追い込んでいただけるようで、あまりの嬉しさにうち震えます。

という事とは全く何の関連性も無い話ですが、現在、固定のドメイン名を1つ持っておりまして、自宅サーバでメールとかいくつかのサービスを動かしておるのですが、グローバルIPアドレスの変化を検知して自動的にDDNSのエントリを書き換えるスクリプトを宅内サーバで動かしております。

このスクリプト、どなたかが作って公開されていたものを、自分向けに勝手に書き換えて使っておるのですが、現在自宅で使っているルータの仕様にカリカリに合わせた作りをしてあるので、ルータが変っちゃうとスクリプトも書き換えないといけません。「自分仕様」にしたのは、たしかルータのWAN側IPアドレスを取得する部分だけだったような気がするのですが、ま、何にしても汎用性の無い作りのものをずっと使い続けてるのも精神的によろしくありません。

ということもあって、DDNSエントリ更新ツールとして著名なddclientを改造して、MyDNS.jpのサービスを利用できるようにしました。(「風邪でしんどい」とか言うてるヤツが、そんなことしててエエんかいや・・・)

「ddclient mydns」でググってみると、こちらのページがヒットしました。

そのものズバリやん。

ということで、情報/コードそのまんま頂戴してやってみたのですが、現時点で配布されている ddclient 3.7.3 では少し合わない部分がありました。一部エスケープ文字が抜けてたりする箇所もあったりしたので、トライ&エラーで自力修正してみました。

こんなのが参考になるのかどうかも怪しいですが、なんとなく掲載しておきます。ddclient 3.7.3 のソースに対する修正点です。自分の手元では「なんとなく動いてそう」ですが、他の環境でどうなのか、まったく無保証ですが・・・。

ddclient.confとかの書き方については、上記の、ネタ元のページをご参照下さいませ。(ddclient -help でも簡易な説明が表示されます)

■ オリジナル ddclient の378行目の下に下記を追加
    'mydns-common-defaults'       => {
	'min-interval'        => setv(T_DELAY,  0, 0, 1, interval('5m'),     0),
	'max-interval'        => setv(T_DELAY,  0, 0, 1, interval('5d'),     0),
	'server'              => setv(T_FQDNP,  1, 0, 1, 'www.mydns.jp', undef),
    },

■ オリジナル ddclient の481行目の下に下記を追加
    'mydns' => {
	'updateable' => undef,
	'update'     => \&nic_mydns_update,
	'examples'   => \&nic_mydns_examples,
	'variables'  => merge(
			  $variables{'mydns-common-defaults'},
 			  $variables{'service-common-defaults'},
		        ),
    },

■ オリジナル ddclient の 3169行目の上に下記を追加
######################################################################
## nic_mydns_examples
######################################################################
sub nic_mydns_examples {
    return <<EoEXAMPLE;
 
o 'mydns'
 
The 'mydns' protocol is used by DNS service offered by www.mydns.jp.
 
Configuration variables applicable to the 'mydns' protocol are:
  protocol=mydns               ##
  server=fqdn.of.service       ## defaults to dynamicdns.park-your-domain.com
  login=service-login          ## login name and password  registered with the service
  password=service-password    ##
  fully.qualified.host         ## the host registered with the service.
 
Example ${program}.conf file entries:
  ## single host update
  protocol=mydns,                                         
  login=my-mydns.jp-login,                               
  password=my-mydns.jp-password                          
  myhost.mydns.jp
 
EoEXAMPLE
}
######################################################################
## nic_mydns_update
##
## Original code by Dan Boardman
## Modified for MyDNS.jp by ta-ta
## fine adjusted for MyDNS.jp by yukkyo
##
######################################################################
sub nic_mydns_update {
 
    debug("nnic_mydns_update -------------------");
 
    ## update each configured host
    foreach my $h (@_) {
        info("setting IP address to %s for %s", $ip, $h);
        verbose("UPDATE:","updating %s", $h);
 
        my $url;
        $url   = "http://$config{$h}{'server'}/login.html";
 
        my $reply = geturl(opt('proxy'), $url, $config{$h}{'login'}, $config{$h}{'password'});
#        my $reply = geturl(opt('proxy'), $url);
        if (!defined($reply) || !$reply) {
            failed("updating %s: Could not connect to %s.", $h, $config{$h}{'server'});
            last;
        }
        last if !header_ok($h, $reply);
 
        my @reply = split /\n/, $reply;
        if (grep /login_status = 1/i, @reply) {
            $config{$h}{'ip'}     = $ip;
            $config{$h}{'mtime'}  = $now;
            $config{$h}{'status'} = 'good';
            success("updating %s: good: IP address set to %s", $h, $ip);
        } else {
            $config{$h}{'status'} = 'failed';
            warning("SENT:    %s", $url) unless opt('verbose');
            warning("REPLIED: %s", $reply);
            failed("updating %s: Invalid reply.", $h);
        }
    }
}
 
######################################################################


■ 2011/9/6(tue)追記 ■
2011/9/5にmydns.jp側のシステムがリニューアルされたみたいで、DiCE等を含むDDNS更新通知系ツール類で動作に調整が必要になったみたい。
その中で、「ddclientも、IP更新通知完了のメッセージを読み替えるように対応してくれ」とアナウンスにあったので、急いで対応しようとしましたが…。v3.7.3と少し古い版を使ってますが、更新通知完了はHTTPレスポンスの200を見て判断してますし、更新通知する為のURL(login.html)も変わってないですし、特に何も対応せずとも「大丈夫よん」という感じに思えたのですが…。

なんか勘違いしてるのかしらん…

ま、そのうちに強制更新が発生するでしょうから、その時に確認することにします。


トラックバックURL
http://yukkyo.blog62.fc2.com/tb.php/330-eaa62558
トラックバック
コメント
こういうScript満載の日記を見るとついついSlashdotを思い出します…
昔はあそこにいたんですが…(笑)

mydnsは以前使っていたのですが、WindowsだったのですがDiceを使用していた記憶がありんす。
その前はLinux鯖だったのですが…はて…何使ってたっけ…
dekkundot 2007.11.12 22:10 | 編集
> dekkunさん、こんにちわ

会社休んじゃって家でゴロゴロして・・・(略

固定ドメイン名以外に dyndns.org でも2つほどドメイン名を持ってて(^^;
これら全部の更新を ddclient 1つに任せたかったのもありまして。

宅の基幹サーバは、あろうことか玄箱だったりします。
もう少しマトモなサーバにしてやらんとあかんのですが・・・
yukkyodot 2007.11.13 09:50 | 編集
管理者にだけ表示を許可する
 
back-to-top