Tags

    Accesses to Dozens API via Shell Script

    巨人の死

    無料で高性能、ダイナミック DNS まで使えた EveryDNS.net が 2011年8月末をもって終了し、DynDNS に移行します。無償プランがあれば良かったのですが、独自ドメインの運用に関しては有料とのこと。ネットでもユーザの悲鳴のようなものが散見し、EveryDNS というサービスの大きさと偉大さを思い知らされます。
    かくいう我が家の場合も、ダイナミック DNS が必要な上に Google Groups や MobileMe のパーソナルドメインを運用していることもあり、レコード数も18個くらい必要でなかなかのコストになりそうです。固定 IP を取得して DNS を自宅で賄うことも考えましたが、その前にどうにかならないかと思いぎりぎりまで他のサービスを探してみることにしました。

    新たな出会い

    そこでぐぐってみたところ、国産のサービスに出会いました。Dozens(ダズンス)です。ちょうど EveryDNS ユーザ向けに通常12レコードまで無料のところをもう12レコードまで追加してくれるという大変太っ腹なキャンペーンも展開されており、飛びつきました。当初は「ダイナミック DNS には現在非対応」と FAQ に記載されていることもあり、ダイナミック DNS に関しては機能追加までは諦めて、外から繋がらなくなったら更新すれば良いか…くらいで考えていました。

    素晴らしきかな API

    ところが、サイトをよく見ると API ドキュメントがあります。しかも REST。ということは curl コマンドで行けるんじゃないかなと思い至りました。グローバル IP を取得して、指定したレコードをアップロードする。これをスケジュールを決めて定期的にアクセスすれば結果的にダイナミック DNS と同じような振る舞いができるのではないかと。Dozens の松田さんにもご協力いただき(無料ユーザなのにほんとうにお手数おかけします)、dynamicIPUpdate.sh として GitHub にソースコードを公開しました。

    Readme にも記載しましたが最初の数行に、Dozens ユーザ名、API Key、ドメイン名、更新したい A レコードのFQDN を上書きして実行権限を与えてやれば、
    $ ./dynamicIPUpdate.sh
    で自動更新します。
    我が家はこれを launchctl でスケジュール化し、1時間おきに更新する予定です。もちろん crontab でも良いでしょう。*nix ユーザの方なら使っていただけるのではないでしょうか。

    作業メモ的なもの

    GitHub にシェルスクリプトを公開しているので、見ればわかるという話もありますが自分の頭の整理も含めて何をしたかを記録しておきます。
    まず、最初に必要なのはグローバル IP の確認です。これは ifconfig.me を利用しています。コマンドラインでの利用を想定されており、
    $ curl ifconfig.me
    でアクセスすると IP アドレスだけを返してくれるのでこれを変数として利用することにします。

    次に Dozens API ですが、最初に token を取得します。期限が24時間の時限制なのとリクエストするたびに新しい token をもらえるので毎回アクセス時に新しいものをもらっておくことにしました。結果は
    {"auth_token":"6cfb3debbbac7d144e9eb7b701f79c2225bd6646"}
    という形式で返ってくるので、sed で削って X-Auth-Token の値だけを取得します。

    レコードの情報は、http://dozens.jp/api/zonename.json (zonename には実際のドメイン名)から取得できるので、
    $ curl http://dozens.jp/api/record/zonename.json -H "X-Auth-Token:6cfb3debbbac7d144e9eb7b701f79c2225bd6646"
    のような形式で GET すると 下記のようなJSON形式でリストが返ってきます。
    {"record":[{"id":"1","name":"www.dozens.jp","type":"A","prio":null,"content":"192.168.1.80","ttl":"7200"},{"id":"2","name":"ghost_cname_auth.dozens.jp","type":"CNAME","prio":null,"content":"ghs.google.com","ttl":"7200"},{"id":"4","name":"dozens.jp","type":"MX","prio":"10","content":"ASPMX.L.GOOGLE.COM","ttl":"7200"},{"id":"11","name":"dozens.jp","type":"TXT","prio":null,"content":"v=spf1 include:_spf.google.com ~all","ttl":"7200"}]}
    ちなみにこれテキストに書き出すと改行されるのですが、コマンドラインだと改行されませんでした。嗚呼…。
    やむを得ないので、tr でカンマを改行コードで区切って、grep -n でターゲットの位置を取得して、sed -n に受け渡してレコード id のみを取得しました。

    これで、グローバル IP と、更新するべき id が取得できたので、
    $ curl -d '{"prio":"","content":"xxx.xxx.xxx.xxx","ttl":"7200"}' -H "X-Auth-Token:6cfb3debbbac7d144e9eb7b701f79c2225bd6646" -H "Host: dozens.jp" -H "Content-Type:application/json" http://dozens.jp/api/record/update/recordid.json
    のような形でPOSTします。
    200が返って来て、IP アドレスが更新されていればOKです。

    Dozens API はこれ以外にもレコードの追加や削除なども可能ですのでこちら方面へスクリプトを拡張も可能でしょう。
    個人的には、API 越しにダイナミック DNS 的な挙動をしてくれれば充分なので、好きな方が GitHub のソースをフォークしてくれることを期待します。

    Comments