#!/usr/bin/env ruby

require 'optparse'
require 'fileutils'

confirmed = false

optparse = OptionParser.new do |opts|
  opts.banner = "Usage: katello-restore /path/to/dir [options]\n eg: $ katello-restore /tmp/katello-backup"

  opts.on("-y", "--assumeyes", "Answer yes for all questions") do
    confirmed = true
  end
end

optparse.parse!
DIR = ARGV.pop

def restore
  puts "#{DIR}"
  FileUtils.chown(nil, 'postgres', DIR)
  Dir.chdir(DIR)

  puts "Setting file security"
  `restorecon -Rnv /`
  puts "Done.\n"

  puts "Resetting Katello"
  `tar --selinux --overwrite --listed-incremental=/dev/null -xzf config_files.tar.gz -C /`
  `foreman-installer --scenario katello --reset`
  puts "Done.\n"

  puts "Stopping Katello services"
  `katello-service stop`
  `service postgresql stop`
  puts "Done.\n"

  puts "Restoring backend data"
  `tar --selinux --overwrite --listed-incremental=/dev/null -xf pulp_data.tar -C /`
  `tar --selinux --overwrite --listed-incremental=/dev/null -xzf mongo_data.tar.gz -C /`
  `tar --selinux --overwrite --listed-incremental=/dev/null -xzf pgsql_data.tar.gz -C /`
  puts "Done.\n"

  puts "Restarting all Katello processes"
  `service postgresql start`
  `katello-service start`
  puts "Done.\n"
end

def confirm
  puts "WARNING: This script will drop and restore your database."
  puts "Your existing installation will be replaced with the backup database."
  puts "Once this operation is complete there is no going back.\n"
  print "Are you sure(Y/N)? "
  response = gets.chomp
  if /[Y]/i.match(response)
    restore
  else
    puts "**** cancelled ****"
  end
end

if !DIR.nil? && File.directory?(DIR)
  if Dir.entries(DIR).include?('pulp_data.tar')
    confirmed ? restore : confirm
  else
    puts "**** Given directory does not include pulp content ****"
    puts "**** Please choose a backup that contains pulp content ****"
    puts optparse
    exit(-1)
  end
else
  puts "**** Given directory is not valid ****"
  puts optparse
  exit(-1)
end
