CouchDBに添付してあるスクリプトを直接実行する。

http://www.yssk22.info/relax/_design/twitter/_list/timeline/by_date?descending=true&limit=10 のバックアップだけれども、

  • 自動で取得するようにcronにしたい。
  • でもスクリプト自体はCouchDBに添付してあるのでそのまま使いたい。

ということでこんな感じのcronにしてみました。

DB=http://******:*******@localhost:5984/relax
TW_PASS=*********
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

# m h  dom mon dow   command
*/15 * * * * /usr/bin/curl -X GET ${DB}/_design/twitter/backup.rb | /usr/bin/ruby1.9 - -u yssk22 -p ${TW_PASS} -d ${DB} > /dev/null 2>&1

curl で直接backup.rb を標準入力に書き出して、それをパイプで ruby に渡してあげる。これでOKです。ただし、ファイル分割をする場合はこれだとうまくいかないんじゃ...?

そこで、ruby 自体にも、LoadError起こしたら引数で渡されたDBからもってくるようなロジックを仕込んでおきます。

# backup.rb 抜粋

# open-uri style pass
open_dst = "#{dst.scheme}://#{dst.host}:#{dst.port}/#{dst.path}"
open_params = {}
if dst.user && dst.password
  open_params["Authorization"] = 'Basic '+[dst.user+':'+dst.password].pack('m')
end

begin
  require File.join(File.dirname(__FILE__), "../../tools/_attachments/lib/util")
rescue LoadError => e
  util_path = File.join(open_dst, "_design/tools/lib/util.rb")
  puts "Loading #{util_path}"
  open(util_path, open_params) do |f|
    eval(f.read)
  end
  info "The library loading has been done."
end

http://user:pass@host:port/ 形式だとopen-uri が動かなかったのが困りものですが。あと、eval は少し危険かも。