ようこそゲストさん

chibilog

2008/11/22(土) VALUE DOMAIN用のDDNS更新ツール

はてブ情報 はてブに登録 はてブ数 2008/11/22 22:01 パソコン

うちは非固定IPなのでDDNSの更新にはDiCEという有名なツールを使っていたんですが、今年の始めくらいに動かなくなったわけですよ。動いてないなんて全然気づかなかったし、自分のサイトにアクセスできなくなってることも全然気づかなかったな・・・確かposeたんの日記にちびたんのサイトに繋がらない。やったー閉鎖だっ!みたいなのが書かれてて気づいたわけですよ。

DiCEが動かないとなると、IPアドレスが変更する度に手動でドメインと現在のIPの対応付けをしてやらないといけない・・・こんな1円にもならないサイトの為にそんな労力を使いたくない・・・やだ!絶対に嫌だ!!いやだああああああ!!という思いで確か、大慌てでDDNS更新ツールを作ったのです。

まぁ、オレオレツールなので、僕がVALUE DOMAINを利用しているので、VALUE DOMAIN専用のDDNS更新ツールです。一応、何かの役に立つこともあるかもしれないので、晒しておきます。てか、ふと見たらpythonで書かれてる。何を持ってpythonで書き始めたのかは今年の始めの僕に聞いてみないと分かりませんね・・・そんなわけで必要な環境としては、Linuxとpythonです。

valuedomain.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# ValueDomain用のDDNS更新ツール
#
# ファイル構成:
#  valuedomain/
#    - valuedomain.py
#    - ip_addr.txt
#    - access_log
#    - error_log
#

import urllib
import re
import time
import sys

#########################
###  設定部分

# 更新する必要のあるドメイン
# 自分の環境に合わせて以下のように列挙
# e.g.)
# domainList = [
#   'chibilog.name',
#   'chibi.name',
#  ]
domainList = [
  '',
]

# 更新に必要なパスワード
# e.g.)
# password = 'password'
password = ''

# ホスト名の指定
# e.g.)
#  host = '*'  or host '@'
host = '@'

###  設定部分ここまで
##########################

# グローバルIPを取得できるURL
url = 'http://dyn2.value-domain.com/cgi-bin/dyn.fcg?ip'

# IPを記録しておくファイル
file = './ip_addr.txt'

# 成功した際に記録するログ
access_log = './access_log'

# 失敗した際に記録するログ
error_log = './error_log'

# DDNS更新時にアクセスするURL
ddnsUrl = 'http://dyn.value-domain.com/cgi-bin/dyn.fcg?'


# ValueDomainが提供しているページにアクセスし、自分のグローバルIPを取得
def getIP():
  doc = urllib.urlopen(url).read()
  return doc.rstrip()


# ファイルからIPアドレスを取得
def fromFile():
  f = open(file, 'r')
  try:
    ip = f.read()
  finally:
    f.close()

  return ip.rstrip()


# ファイルを新しいIPで上書き
def writeFile(ip):
  f = open(file, 'w')
  try:
    f.write(ip)
  finally:
    f.close()

# ログに記録
def writeLog(error_flag, message):
  if error_flag:
    log = error_log
  else:
    log = access_log

  fp = open(log, 'a')
  try:
    fp.write(message)
  finally:
    fp.close()


# DDNSの更新をかける
def ddnsUpdate(ddnsUrl, domainList, password, ip_addr):
  # アクセス例
  # http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=chibilog.name&p=password&h=*&i=124.102.53.48

  #host = '*'
  #host = '@'
  reg = re.compile(r'OK')

  for domain in domainList:
    # DDNS更新のアクセスに必要なURLに成形する
    url = ddnsUrl + 'd=' + domain + '&p=' + password + '&h=' + host + '&i=' + ip_addr
    
    now = time.ctime()
    res = urllib.urlopen(url).read()
    result = reg.search(res)
    time.sleep(5)
    
    if result:
      message = now + " " + domain + "  OK.\n"
      flag = 0
      writeLog(flag, message)
    else:
      message = now + " " + domain + "  NG.\n"
      flag = 1
      writeLog(flag, message)
      sys.exit(1)

  # 現在のIPアドレスをip_addr.txtに上書きする
  writeFile(ip_addr)
 

def main():
  # 現在のグローバルIPを取得
  ip_addr = getIP()

  # 前回実行時のIPアドレスをファイルから取得
  ip_addr2 = fromFile()

  # IPを比較して同じなら何もしないでプログラムを終了する。
  if ip_addr == ip_addr2:
    sys.exit(0)
  else:
    ddnsUpdate(ddnsUrl, domainList, password, ip_addr)


if __name__ == '__main__':
  main()

とりあえず、$HOMEにvaluedomain/ なんてディレクトリを作成して、上記のvaluedomain.pyファイルを設置。更にvaluedomain/ に ip_addr.txt というファイルを作成。あとはvaluedomain.pyに実行権限でも付与しておく。

$ cd valuedomain/
$ touch ip_addr.txt
$ chmod 755 valuedomain.py

他にも、access_log, error_logというファイルが必要だが、こっちは勝手に生成されるのでおk。ip_addr.txtには実行時のIPアドレスが記録される。更新が成功するとaccess_logに記録で失敗するとerror_logに記録。あと制限事項として、全部のドメインを更新するパスワードは同じである必要があること。あと、VALUE DOMAIN側で既にDDNS更新の設定が完了していること。

以上で、準備完了なので試しに実行してみてログなどを確認してみる。

$ ./valuedomain.py

あとはcronに10分置きにこのツールを実行するように登録してやる。これでIPアドレス変化時は10分のタイムラグは出るものの自動でDDNSの更新を行うことが可能。

$ crontab -e
 */10 * * * *  cd /home/chibi/valuedomain; python valuedomain.py > /dev/null 2>&1

スクリプトは以下に置いておきます。以下のURLにアクセスして、valuedomain.txtという名前のファイルを保存して下さい。保存後は、拡張子を.txtから.pyに変更して下さい。ちなみにノークレーム・ノーリターンでお願いしますw

http://chibilog.name/uploader.cgi/chibi/tools/


1: Ryuquo 2008年11月22日(土) 深夜1時10分

実は私も同じ事例で悩んでいました。

Pythonは使ったことありませんが、スクリプトを使って
みたいので頂いても宜しいでしょうか。

しかし、ずっと動いていたはずのDiCEが突然動かなく
なったのは何故なんでしょうね。

2: chibi 2008年11月23日(日) 午前5時06分

詳しくは覚えて無いですが、ライブラリがどうのこうのってエラーが出てた気がします。
依存していたライブラリのバージョンが変わっちゃって、動かなくなったとかですかね??
Diceはバイナリ形式だったし、修正もできないだろうから、自分で作ったほうが早いだろうって思って、そのまま原因は追求しませんでした。
たまに更新URLへのタイムアウトからかエラーが出ちゃったりしますが、ご自由に使ってください!
その代わりノークレーム・ノーリターンでお願いしますw
あと、自分好みへの改良はご自由にどうぞ。
以下から、ダウンロードできるようにしておきました。
http://chibilog.name/uploader.cgi/chibi/tools/

3: Ryuquo URL 2008年11月23日(日) 午後1時02分

ここまで聞いて、あれ何か症状違うな…と思ってしまいました。

うちの場合は、DiCEそのものは動いているのですが、たまーに
IP変わったのに更新されない事がありまして、代用案を探して
居た感じです。

プログラムダウンロードさせて貰って、少し読んでみたいと
思います。ありがとうございました。

4: 2008年11月25日(火) 午前11時27分

なんか・・・わからん┐(*´ω`*)┌

5: chibi 2008年11月25日(火) 深夜1時37分

もはやこんなことはどうでも良くて、アニメ見たりゲームしたりするほうが大事だよね!!


名前:  非公開コメント   

URL(任意):
  • TB-URL  http://chibilog.name/0296/tb/