hostsファイルの自動書き換え

自宅LAN内から自宅サーバーをいじろうとすると、名前解決周りが少し面倒だったりする。
外出先から自宅サーバーを見るときにはkishibe.dyndns.tvを叩けばいいだけなのだが、自宅LAN内からこれを叩こうとすると、ルーターのほうを見に行ってしまう。これはdyndnsによりルーターのWAN側のIPに名前解決されてしまうためだ。そのため、内部から見る場合はマシン名を使って名前解決するかIPをじか打ちしなければならないのだが、これは結構面倒だ。
hostsファイルを書き換えれば内部LANからkishibe.dyndns.tvで自宅サーバーを引くことができるのだが、今度は出先で意味のないIPに解決されてしまう。
これらを解決するために少し前まではhostsファイルを内部LANと出先で書き換えるbatファイルを用意しておき、ネットする場所に応じて適宜hostsファイルの書き換えをして対処していた。だが、これも面倒になってきた。
どうにかhostsファイルを自動的に書き換えられないかと思っていたところ、そこそこよいアイデアが思いついた。プログラムでkishibe.dyndns.tvにアクセスできるかどうかを調べて、その結果に応じて内部LAN用と出先用の設定を切り替えればよいのだ。考えてみれば単純なことだった。さらにブラウザのプロファイルを自宅サーバーで共有するためのスクリプトに組み込めば、ブラウザ立ち上げ時に自動的に設定を書き換えてくれる。これは便利かもしれない。
ということで書いてみた。

#!/usr/bin/python
import os
import time
import urllib
import shutil

url = 'http://kishibe.dyndns.tv:8080/'
hosts_file_path = 'c:/Windows/System32/drivers/etc/hosts'

def contain(file_path, text):
	for line in open(file_path):
		if line.find(text) != -1:
			return True
	return False

is_local = contain(hosts_file_path, 'kishibe.dyndns.tv')

try:
	urllib.urlopen(url).close()
	print 'kishibe.dyndns.tv was found.'
except:
	print 'kishibe.dyndns.tv was not found.'
	src = None
	if is_local:
		print 'copying hosts.global to hosts'
		src = '/home/nodchip/firefox/hosts.global'
	else:
		print 'copying hosts.local to hosts'
		src = '/home/nodchip/firefox/hosts.local'
	shutil.copy(src, hosts_file_path)

os.system('rsync -avzu --progress --delete --exclude urlclassifier3.sqlite kishibe.dyndns.tv:~/firefox ~/')
os.system('firefox.exe')
while os.system('tasklist /FI "IMAGENAME eq firefox.exe" | grep firefox.exe') == 0:
	time.sleep(5)
os.system('rsync -avzu --progress --delete --exclude urlclassifier3.sqlite ~/firefox kishibe.dyndns.tv:~/')

動かしてみたところ、意図したとおりに動いてくれた。しばらくはこんな感じでやっていこうと思う。