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:~/')
動かしてみたところ、意図したとおりに動いてくれた。しばらくはこんな感じでやっていこうと思う。