June 24, 2007

flets squareへのroute

今さらなことだけれど、flets squareへのroutingを手でいじったりちょくちょく確認するのが面倒なので、スクリプトでも書いて勝手に更新するようにしてみた。

#! /usr/bin/env ruby
#

require 'open-uri'
require 'htree'
require 'rexml/document'
require 'tempfile'

scriptfile = '/usr/local/sbin/flets-route.sh'
pppdev = 'ppp1'

ht = HTree.parse(open('http://routing.flets/routing.html').read)
xml = REXML::XPath.match(ht.to_rexml,'/html/body/text()')
tmp = Tempfile.new('flets-route')
fp = tmp.open
fp.printf("#! /bin/sh\n" \
"\n" \
"if [ \"x$1\" = \"xup\" ]; then\n" \
" OP=\"add\"\n" \
"else\n" \
" OP=\"del\"\n" \
"fi\n")
lines = xml[0].to_s.split("\n").grep(/\ARoute\d+=/)
exit(1) if lines.empty?
lines.each do |line|
if line =~ /Route\d+=Add,((?:\d{1,3}\.){3}\d{1,3}),((?:\d{1,3}\.){3}\d{1,3})/
then
fp.printf("/sbin/route $OP -net %s netmask %s dev $2\n", $1, $2)
end
end
fp.close

updated = false
if File.exist?(scriptfile) then
system("diff #{scriptfile} #{fp.path} > /dev/null")
if $? != 0 then
system("#{scriptfile} down #{pppdev}")
File.rename(scriptfile, "#{scriptfile}.#{Time.now.strftime('%Y%m%d')}")
updated = true
end
else
updated = true
end
if updated then
File.rename(fp.path, scriptfile)
File.chmod(0755, scriptfile)
system("#{scriptfile} up #{pppdev}")
end

cronにでも一日一回チェックするように仕込んどけばおk。動かす前にflets squareへ接続できるようにしておく必要はあるけど、そのあたりの設定はぐぐると山ほど出てくるので割愛。出来たファイルは/etc/ppp/{ip -up.d,ip-down.d}もしくはそれに類似するものから呼ぶようにしておけば、rebootなりなんかの都合でpoff/ponする必要があっ たりしても問題なし。

No comments: