2010年11月14日

自宅サーバを Ubuntu から Debian に変更

ServersMan@VPS で Debian を使い始めたので、自宅にあるサーバ用 Atom マシンを Ubuntu から Debian に切り替えた。
この PC は gPXE が使えるので、ネットワーク経由で小さいイメージを http ダウンロードして直接インストールできる。

基本的には ServersMan@VPS と同じような構成だけど、相変わらず自宅は固定 IP ではないので IP が変化するたびに DynamicDNS を更新する必要がある。
この更新は Ubuntu の時にも使っていた Python スクリプトがあるのでこれをそのまま持ち込んだ。
ただ、もちろん初期の状態では Python も入っていないので apt-get でインストールする。
apt-get install python
これでインストールされる Python は 2.5 で若干古いものの、世の中にある Python 用のライブラリなどを調べているとどうも 2.5 が一番無難そうな気配があるのでこのままにしておく。
Python も準備できたところでスクリプトを配置する。
mkdir /usr/local/share/diceoov/
vim /usr/local/share/diceoov/diceoov.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib2, re, os

IPCHECKER = r"http://global-ip.appspot.com/"
DDNS_UPDATER = r"[DDNS更新用のリクエスト先URL]"

def main(OLD_IP):
  #現在のIPアドレスを取得する
  now_ip = urllib2.urlopen(IPCHECKER).read().strip()

  #正しいIPアドレス表現で、前回からIPアドレスは変わっているか?
  if re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", now_ip) and now_ip != OLD_IP:
    #IPアドレスの更新リクエスト
    a = urllib2.urlopen(DDNS_UPDATER).read()
    #自分自身を読み込み
    lines = open(__file__, "rb").readlines()
    #一番最後のmain呼び出しコードの第一引数をIPアドレスに書き換える
    lines[len(lines)-1] = '  main("%s")' % now_ip
    #自分自身を書き換え
    open(__file__, "wb").writelines(lines)

if __name__ == "__main__":
  main("xxx.xxx.xxx.xxx")
スクリプト中に出てくる http://global-ip.appspot.com/ は Google App Engine 上に置いてある自作のアプリケーションで、IP 返す以外の機能を一切実装していない。似たような機能を持つスクリプトは世の中に腐るほどあるのだが、知らぬ間に止まったりするとわりと困るはずなので自分で用意した(自分で用意したものが止まるならまあしょうがない、という話で、このアプリケーションが確実に無停止だという話ではない)。

このスクリプトがIPの変化を察知すると DynamicDNS 更新用の URL へリクエストをかけて、その後自分自身のスクリプトファイルの最終行を書き換えて xxx.xxx.xxx.xxx の部分が実際のIPアドレスになるようにする(スクリプトが手抜きなせいで空行とかが入ってると書き換えに失敗するのでそこは注意)。
あとはこのスクリプトを cron で定期的に動かしてあげればいいだけ。IP が変わらない限り DynamicDNS の更新用リクエストは投げないので、Google App Engine のリクエスト数制限を超過しない程度なら頻繁に呼んでいても問題ない。
crontab -e
MAILTO=""
0,15,30,45 * * * * python /usr/local/share/diceoov/diceoov.py
Clip to Evernote