upftp.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
require 'net/ftp' | |
require 'fileutils' | |
require 'time' | |
require 'pp' | |
HOSTNAME = ENV['UPFTP_HOSTNAME'] | |
USERNAME = ENV['UPFTP_USERNAME'] | |
PASSWORD = ENV['UPFTP_PASSWORD'] | |
LOCAL_ROOTDIR = ENV['UPFTP_LOCAL_ROOTDIR'] | |
REMOTE_ROOTDIR = ENV['UPFTP_REMOTE_ROOTDIR'] | |
DEBUG_MODE = true | |
LAST_LINE = '# upftp 2020' | |
def cputs(s) | |
puts "\x1b[31m#{s}\x1b[0m" | |
end | |
def error(message) | |
cputs "ERROR: upftp: #{message}" | |
abort | |
end | |
def main(filelist) | |
ftp = Net::FTP.new(HOSTNAME, { | |
# ssl: true, | |
debug_mode: DEBUG_MODE, | |
username: USERNAME, | |
password: PASSWORD, | |
}); | |
error "#{filelist} は存在しません。" if not File.exist?(filelist) | |
lines = IO.readlines(filelist).map {|line| line.chomp} | |
error "#{filelist} は空っぽです。" if lines.size == 0 | |
error "#{filelist} の最後の行は次のようになっている必要があります(バージョンチェックのため)。\n#{LAST_LINE}" if lines[-1] != LAST_LINE | |
updated_lines = [] | |
updated = false | |
lines.each_with_index do |line, index| | |
linenumber = index + 1 | |
updated_lines << line | |
next if line.match(/^#/) | |
error "#{linenumber}: #{line}\nの行は形式エラーです。" if not line.match(/^([^,\s]+)(,(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d \+0900)|,?)$/) | |
filename = $1.to_s | |
updatetime = $3.to_s | |
local_filename = "#{LOCAL_ROOTDIR}/#{filename}" | |
remote_filename = "#{REMOTE_ROOTDIR}/#{filename}" | |
error "#{linenumber}: #{local_filename} は存在しません。" if not File.exist?(local_filename) | |
if updatetime == '' | |
updatetime = '1999-01-01 00:00 +0900' | |
end | |
ut = Time.parse(updatetime) # filelist.txtに書かれている転送時刻 | |
mt = Time.parse(File::Stat.new(local_filename).mtime.to_s) # ファイルの更新タイムスタンプ | |
puts "COMPARE: #{ut} < #{mt}" if DEBUG_MODE | |
if ut < mt | |
puts "Update: #{filename}" | |
puts "PUT: #{local_filename} -> #{remote_filename}" if DEBUG_MODE | |
ftp.putbinaryfile(local_filename, remote_filename) | |
updatetime = mt.to_s | |
else | |
puts "IGNORE: #{local_filename}" if DEBUG_MODE | |
end | |
updated_lines[-1] = "#{filename},#{updatetime}" | |
updated = true | |
end | |
if updated | |
system("mv #{filelist} .#{filelist}") | |
open(filelist, "w") do |f| | |
updated_lines.each do |line| | |
f.puts line | |
end | |
end | |
end | |
ftp.quit | |
end | |
if ARGV.length == 0 | |
puts "This is upftp, Ruby version." | |
puts "Usage: upftp filelist.txt" | |
abort | |
end | |
main(ARGV[0]) | |
# vim: set filetype=ruby: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment