class Sacback::CLI
Constants
- ARCHIVE_IMAGE_NAME
- DEFAULT_LOCAL_DIR_PATH
- FTP_PORT
- SACLOUD_API_VERSION
Public Instance Methods
a(disk_name, local_dir_path = DEFAULT_LOCAL_DIR_PATH)
click to toggle source
# File lib/sacback/cli.rb, line 25 def a(disk_name, local_dir_path = DEFAULT_LOCAL_DIR_PATH) log "a: Run all through: disk=#{disk_name}, local dir=#{local_dir_path}" log archive = invoke :c, [disk_name] # log "archive: #{archive.id} #{archive.name}" invoke :g, [archive.id, local_dir_path] invoke :r, [archive.id] compressed_file_name = archive.name + '.gz' invoke :z, [local_dir_path, ARCHIVE_IMAGE_NAME, compressed_file_name] end
c(disk_name)
click to toggle source
# File lib/sacback/cli.rb, line 38 def c(disk_name) log "c: Create an archive: disk=#{disk_name}" @api = authorize disk = get_disk disk_name # say "disk: #{disk.id}" archive = create_archive disk log "The archive was created: id=#{archive.id}, name=#{archive.name}" log archive end
g(archive_id, local_dir_path = DEFAULT_LOCAL_DIR_PATH)
click to toggle source
# File lib/sacback/cli.rb, line 51 def g(archive_id, local_dir_path = DEFAULT_LOCAL_DIR_PATH) log "g: Get the archive: archive id=#{archive_id}, local dir=#{local_dir_path}" @api = authorize archive = @api.archive.get_by_id archive_id log "archive: #{archive.id} #{archive.name}" archive.open_ftp log 'ftp opened' begin ftp_info = archive.ftp_info # log "ftp: #{ftp_info.user},#{ftp_info.password},#{ftp_info.host_name}" local_file = File.join local_dir_path, ARCHIVE_IMAGE_NAME if options[:curl] download_with_curl ftp_info, local_file else download_with_doublebugftps ftp_info, local_file end ensure archive.close_ftp log 'ftp closed' end log end
r(archive_id)
click to toggle source
# File lib/sacback/cli.rb, line 79 def r(archive_id) log "r: Remove the archive: archive id=#{archive_id}" @api = authorize archive = @api.archive.get_by_id archive_id result = archive.destroy if result[:Success] && result[:is_ok] log "The archive #{archive_id} was removed." else abort "Error: removing the archive #{archive_id} failed" end log end
z(dir, name_orig, name_new)
click to toggle source
# File lib/sacback/cli.rb, line 94 def z(dir, name_orig, name_new) log "z: Compress the local file: local dir=#{dir}, target file=#{name_orig}, compressed file=#{name_new}" path_orig = File.join dir, name_orig path_new = File.join dir, name_new log "Start compressing #{path_orig} to #{path_new}" # Zlib::GzipWriter.open(path_new, Zlib::BEST_COMPRESSION) do |gz| # gz.mtime = File.mtime(path_orig) # gz.orig_name = name_orig # File.open(path_orig, 'rb') do |fp| # while chunk = fp.read(1024 * 1024) do # gz.puts chunk # end # end # end command = "(gzip -c #{path_orig} > #{path_new}) && rm #{path_orig}" `#{command}` log "Compression succeeded: #{path_new}" log end
Private Instance Methods
create_archive(disk)
click to toggle source
# File lib/sacback/cli.rb, line 138 def create_archive(disk) datetime = DateTime.now.strftime "%Y%m%d-%H%M" archive_name = "#{disk.name}-#{datetime}" log "Creating a new archive: #{archive_name}" archive = @api.archive.create archive.name = archive_name archive.source = disk archive.save result = archive.sleep_while_copying abort "Creating the archive failed: #{archive_name}" unless result log "Creating the archive succeeded: #{archive_name}" archive end
download_with_curl(ftp_info, local_file)
click to toggle source
# File lib/sacback/cli.rb, line 174 def download_with_curl(ftp_info, local_file) url = "ftp://#{ftp_info.host_name}/#{ARCHIVE_IMAGE_NAME}" auth = "-u #{ftp_info.user}:#{ftp_info.password}" silent = options[:silent] ? '-s -S' : '' # Show errors only log "Start downloading (curl): remote file=#{ARCHIVE_IMAGE_NAME}, local file=#{local_file}" command = "curl --ftp-ssl --ftp-pasv #{silent} #{auth} -o #{local_file} #{url}" `#{command}` log "Finished downloading: #{local_file}" end
download_with_doublebugftps(ftp_info, local_file)
click to toggle source
# File lib/sacback/cli.rb, line 155 def download_with_doublebugftps(ftp_info, local_file) BasicSocket.do_not_reverse_lookup = true ftps = DoubleBagFTPS.new ftps.ftps_mode = DoubleBagFTPS::EXPLICIT ftps.passive = true # ftps.debug_mode = true block_size = options[:ftpblocksize] * 1024 ftps.connect ftp_info.host_name, FTP_PORT begin ftps.login ftp_info.user, ftp_info.password log "Start downloading (DoubleBagFTPS): remote file=#{ARCHIVE_IMAGE_NAME}, local file=#{local_file}, block size=#{block_size} bytes" ftps.getbinaryfile ARCHIVE_IMAGE_NAME, local_file, block_size log "Finished downloading: #{local_file}" ensure ftps.close unless ftps.closed? end end
get_disk(name)
click to toggle source
Get the disk data whose name includes the specific name
# File lib/sacback/cli.rb, line 130 def get_disk(name) disks = @api.disk.with_name_like(name).limit(1).find() abort "Error: disk is not found: #{name}" if disks.count == 0 disks[0] end
log(text = '')
click to toggle source
# File lib/sacback/cli.rb, line 119 def log(text = '') say text unless options[:silent] end