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

authorize() click to toggle source
# File lib/sacback/cli.rb, line 124
def authorize
  Saklient::Cloud::API::authorize ENV['SACLOUD_TOKEN'], ENV['SACLOUD_SECRET'], ENV['SACLOUD_ZONE']
end
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