自作スクリプトでDDNSのIPアドレスを自動更新する

はじめに

DDNS NowでIPアドレスの自動更新をする方法を紹介します。
DiCEを使用せずに、cronにスクリプトを登録して更新します。
DDNS Now - 無料ダイナミックDNSサービス

スクリプト作成

DDNS Nowの更新方法ページ読んでみると、HTTPリクエストでIPアドレス更新が可能みたいです。

下記のHTTP GETでAレコードの更新が可能です。
https://f5.si/update.php?domain=ユーザ名&password=パスワード&ip=IPアドレス
※「&ip=」を指定しない場合はアクセス元のIPアドレスを自動的に設定できます。
※「パスワード」は平文のパスワードのほかにAPIトークンも使用できます。
https://ddns.kuku.lu/setupinfo.php

上記のURLをスクリプトで叩いてDDNSの更新を行います。

まずは以下のコマンドで稼動確認を行います。
パスワードは平文ではなくAPIトークンで実行することをおすすめします。
APIトークンは詳細ページの一番下にあるのでコピペしてください。

curl -X GET https://f5.si/update.php?domain=ユーザ名\&password=APIトークン
注意点:&をエスケープ処理すること(bashの&はバックグランド処理を意味するため)

以下のように表示されたら成功です。

OK:SUCCESS (good)

エラーコードが表示される場合は、更新方法ページの一番下にエラーコードの内容が書いてありますので、それを参考にURLを修正してください。(私の場合は&をエスケープしなかったためパスワードを送信できていなかった)

稼動確認ができたら、/usr/local/bin/callApiDDNSを作成します

#!/bin/bash 
# IPアドレスを更新する
# /usr/local/bin/callApiDDNS

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
LOGFILE=/var/log/callApiDdns.log

echo -n "/usr/local/bin/callApiDDNS start at `date '+%Y/%m/%d %R'` " >> $LOGFILE
echo -n "Result: " >> $LOGFILE
curl -X GET https://f5.si/update.php?domain=ユーザ名\&password=APIトークン >> $LOGFILE
echo "" >> $LOGFILE
 
exit 0

作成できたら実行権限を付与します。

sudo chmod 755 /usr/local/bin/callApiDDNS

ここでもう一度稼動確認を行います。上手く行けば/var/log/callApiDdns.logにログが吐かれます。

sudo /usr/local/bin/callApiDDNS

ログファイルにOK:SUCCESS (good)と出力されたらOKです。

cronで定期実行

上記のスクリプトを自動で起動するように設定します。
起動時間は任意で変更してください。

sudo vi /etc/cron.d/callApiDDNS
# 毎日01:00に処理を実行する
# m h dom mon dow user  command
0 1    * * *    root    /usr/local/bin/callApiDDNS

編集後は権限を変更して、cronの再起動

sudo chmod 644 /etc/cron.d/callApiDDNS
sudo chown root:root /etc/cron.d/callApiDDNS
sudo service cron restart
sudo service cron status # 再起動確認

ログローテーションの設定

このままでは実行ログが肥大化していくので、logrotateで自動的に削除するようにします。

sudo vi /etc/logrotate.d/callApiDDNS
/var/log/callApiDDNS.log
{
    rotate 4
    weekly
    missingok
    notifempty
}

上記では4週間ログを保持する設定にしてます。それ以上古いものは自動的に削除されます。
最後にテスト実行でエラーが発生しないことを確認できたらOKです。

logrotate -dv /etc/logrotate.d/callApiDDNS

おわりに

今回は簡易なスクリプトにしましたが、エラーコードが返ったときはメール通知する処理を入れた方が丁寧ですね。時間があればメール送信処理を入れてみます。

以上