なんか GUI のクライアント使うのさえ面倒くさくなってきてミラーリングツールを使って更新することにした。
#!/usr/bin/ruby
require 'optparse'
require 'pathname'
require 'open-uri'
ROOT = '/srv/www/virtual/userid/public_html'
SERV = '/virtual/userid/public_html'
HOST = 's63.xrea.com'
USER = 'userid'
PASS = 'hogehoge'
open("http://www.#{HOST}/jp/admin.xcg?id=#{USER}&pass=#{PASS}&telnet=t") do |f|
data = f.read
ip = data[/NAME="remote_host" VALUE="([¥d.]+)"/, 1]
raise "can't get IP" unless ip
open("http://www.#{HOST}/jp/admin.xcg?id=#{USER}&pass=#{PASS}&remote_host=#{ip}&ssh2=SSH%93o%98%5E") do |f|
end
end
host = nil
dry = false
OptionParser.new do |opts|
opts.on('-n', '--dry-run') { dry = true }
opts.parse!
host = ARGV[0]
unless host
puts opts
exit 1
end
end
def sync(host, dry=false)
dir = Pathname.new(ROOT) + host
raise "#{host} is not exists." unless dir.exist?
system(<<-EOC.gsub(/^¥t+/, ''))
rsync #{dry ? '--dry-run' : ''} -vptr #{dir}/ #{USER}@#{HOST}:#{SERV}/#{host}
EOC
end
unless sync(host, dry)
puts "rsync failed. retry after 5min."
(5 * 60).downto(0) do |i|
print i, "¥r"
$stdout.flush
sleep 1
end
sync(host, dry)
end
こんなスクリプト書いて実行させてる。ホストごとに rsync できるようにしてる。
最初は lftp でやってたのだけど、こいつはなぜかファイルサイズを見るらしく困ったうえに、ファイルリストとるのが劇遅くてやる気がなくなるので結局 rsync にした。ssh 登録がめんどいけどそれも自動化した。