Rubyによるファイルアップロード

By | 2017/03/17

 

ファイルをサーバーにアップロードするRubyスクリプト。
よく使うからメモっておく。
すべてのファイルをいつもアップロードしていると時間がかかってしょうがないので、タイムスタンプも取っておいて更新していないファイルはアップロードしない。

require "fileutils"
require 'net/ssh'
require 'net/sftp'
require 'yaml'
require 'time'

#
# タイムスタンプファイルを読み込む
#
def load_timestamp(filename)
	timestamps = Hash.new
	timestamps = YAML.load(File.open(filename, "r").read) if FileTest.exist?(filename)
	return timestamps
end

#
# 更新されたファイルかどうか
#
def is_updated(old_str_stamp, new_str_stamp)
	return true if old_str_stamp==nil

	old_date = Time.parse(old_str_stamp).to_i
	new_date = Time.parse(new_str_stamp).to_i
	# 5秒以上経過していたら更新対象とする
	return true if 5<(new_date-old_date)

	return false
end

#
# ファイルをアップロードする
#
def upload_files(server, account, password, port, files, remote_dir, timestamps)
	session = Net::SSH.start(server, account, {:port => port, :password => password});
	mySftp = session.sftp.connect

	# create directory
	mySftp.mkdir(remote_dir)

	# copy files
	files.each do |file|

		remote_name = file.gsub(base_dir, remote_dir)
		old_str_stamp = timestamps[remote_name]
		new_str_stamp = File.stat(file).mtime.strftime "%Y-%m-%d %H:%M:%S"

		if is_updated(old_str_stamp, new_str_stamp)
			if FileTest.directory?(file)
				mySftp.mkdir(remote_name)
			else
				mySftp.upload!(file, remote_name)
				timestamps[remote_name] = new_str_stamp
				puts "#{file} => #{remote_name}"
			end
		end
		
	end # end of files.each

end

#
# タイムスタンプを書き換える
#
def write_timestamp(filename, timestamps)
	File.open(timestamps_txt, "w"){ |f| 
		timestamps.each_pair{ |key,value|
			f.puts "#{key}: \"#{value}\""
		}	
	}
end

# ------------------------------------------------------
# ------------------------------------------------------
server = '123.456.789.123'
account = 'user'
password = 'ABCDEFG'
port = 1234
files = Dir.glob('data/**/*')
remote_dir = '/var/www/html/data/'

timestamp_name = "timestamps.txt"
timestamps = load_timestamp(timestamp_name)

upload_files(server, account, password, port, files, remote_dir, timestamps)

write_timestamp(timestamp_name, timestamps)

コメントを残す

メールアドレスが公開されることはありません。