MyDNS.JP対応ddclient

DiCEの信頼性がいまひとつだから、ddclientを復活させて、なんとかMyDNS.jpに対応できるようにしてみた。今のところうまくいっているから公開してみよう。

まず、ddclient-3.6.6をSourceForce.Netからとってくる。ダウンロードしたものを/usr/local/bin/あたりにディレクトリごと展開して(/usr/local/bin/ddclient-3.6.6/以下に。。。)、ついでに/etc/ddclientディレクトリも作っておく。/usr/local/bin/ddclient-3.6.6をカレントディレクトリとしてFedora Coreであるとして作業を進めると、

# cp sample_etc_rc.d_init.d_ddclient.redhat 
/etc/rc.d/init.d/ddclient

と起動/停止スクリプトをコピーする。設定(conf)ファイルは後でまっさらな状態から作るからsampleのコピーは行わない。

次が肝心のMyDNS.jp対応だけど、これはddclientスクリプトの改造が必要になる。とはいってもそんなに難しくないけど。

まずは284行目に

    'mydns-common-defaults'       => {
	'min-interval'        => setv(T_DELAY,  0, 0, 1, interval('30s'),     0),
	'max-interval'        => setv(T_DELAY,  0, 0, 1, interval('3d'),     0),
	'server'              => setv(T_FQDNP,  1, 0, 1, 'www.mydns.jp', undef),
    },

を挿入する。xxx-common-defaultsが並んでいるので、最後にMyDNS固有のデフォルト値を設定する。

次にオリジナルddclientの366行目に、上記改変後は376行目に

    'mydns' => {
	'updateable' => undef,
	'update'     => \&nic_mydns_update,
	'examples'   => \&nic_mydns_examples,
	'variables'  => merge(
			  $variables{'mydns-common-defaults'},
 			  $variables{'service-common-defaults'},
		        ),
    },

を挿入する。こちらはconfファイルにてprotocol=mydnsと設定された場合の動作を記述している。

その次にファイルの一番最後に以下のコードを追加する。

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

これでコード改造終了。

次に、/etc/ddclient/ddclient.confファイルを作ろう。

# vi /etc/ddclient/ddclient.conf

(別にviでなくてもいいけど)に以下の設定を記述する。

daemon=300
syslog=yes
pid=/var/run/ddclient.pid
use=web, web=checkip.dyndns.org/, fw-skip='IP Address'
 
protocol=mydns
server=www.mydns.jp
login=xxxxxxxx
password=********
max-interval=1d
myhost.hogehoge.com

びっくりしたのはmax-intervalなんて値が設定できちゃうこと。ちなみに、max-interval=1dは「IPアドレスの変更がなくても前回更新時から1日後に強制的に更新する」という意味。

ちなみに、ddclient.confに続けて

# ワイルドカード指定なしのDynamicDNS
protocol=dyndns2
server=members.dyndns.org
login=xxxxxx
password=******
host1.hogehoge.com
 
# ワイルドカード指定ありのDynamicDNS
protocol=dyndns2
server=members.dyndns.org
login=xxxxxx
password=******
wildcard=yes
host2.fugafuga.com
 
# 独自ドメインのDynamicDNS
custom=yes
protocol=dyndns2
server=members.dyndns.org
login=xxxxxx
password=******
watanet.com

と指定すれば4ヶ所いっぺんにDynamicDNS更新処理の面倒をみることができちゃう。

とりあえず設定を行ったらうまくいくか試してみよう。

# ddclient -daemon=0 -debug -verbose -noquiet

うまくいったら/usr/sbinにコピーしよう。

# cp ddclient /usr/sbin/
か
# cd /usr/sbin
# ln -s /usr/local/bin/ddclient-3.6.6/ddclient

そして起動してみよう。

# /etc/rc.d/init.d/ddclient start

止めるときは

# /etc/rc.d/init.d/ddclient stop

ブート時に自動起動するには

# /sbin/chkconfig --add ddclient

以上!

え”〜、面倒くさ〜い、ってな方には改造済みコードがここにあります。

「MyDNS.JP対応ddclient」への7件のフィードバック

  1. ddclientの改造コード&情報、ありがとうございました。
    僅かの微調整で ddclient 3.7.3 でも無事に動きました。

  2. 参考に書き換えたのですが、エラーが出て困っています。

    info(“setting IP address to %s for %s”, $ip, $h);
    $config{$h}{‘ip’} = $ip;
    success(“updating %s: good: IP address set to %s”, $h, $ip);
    の部分で、
    Global symbol “$ip” requires explicit package name at /opt/sbin/ddclient line 3350.
    Global symbol “$ip” requires explicit package name at /opt/sbin/ddclient line 3366.
    Global symbol “$ip” requires explicit package name at /opt/sbin/ddclient line 3369.
    Execution of /opt/sbin/ddclient aborted due to compilation errors.
    と怒られてしまいます。

    prelはサッパリなので、何処を修正したら良いかも見当が付かないです。
    少しアドバイスを頂けたら助かります。

  3. 随分いじってないのでPerlはもう分からなくなってます。
    修正済みコードを試してみるか、少しずつ修正していってエラーの出るところを特定するんでしょうね。

  4. #2のふぉっくすさんが使用したddclientのversionと同じかはわかりませんが,version3.8.0で試したところ、同様のエラーが出ました。
    一部修正して、一応動作しましたので記載させていただきます。

    #2の書き込みのエラーが出た部分のうち、
    info(“setting IP address to %s for %s”, $ip, $h);
    の一行上に、
    my $ip = delete $config{$h}{‘wantip’};
    を挿入しました。
    これでエラーは出ず、mydnsのアドレスが正しく更新されました。
    ただ、ソースを全部追って直した訳ではないので、
    不具合が無いとは限りませんのでご注意ください。

  5. フォローありがとうございます。
    最新のコードでMyDNS対応してみようかとも思うのですが、どうしてもperlはやる気が失せてしまいます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です