#!/usr/bin/env ruby

require 'optparse'
require 'fileutils'

@options = {}
@dir = nil

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

  opts.on("--skip-pulp-content", "Create backup without Pulp content") do |skip_pulp|
    @options[:skip_pulp] = skip_pulp
  end

  opts.on("--incremental [PREVIOUS_BACKUP_DIR]", String, "Backup changes since previous backup") do |dir_path|
    if Dir.exist?(dir_path)
      dir_path.chop! if dir_path.end_with? "/"
      @options[:incremental] = dir_path
    else
      opts.abort("Previous backup directory does not exist: #{dir_path}")
    end
  end
  
  opts.on("--online-backup", "Backup Pulp data online") do |online|
    @options[:online] = online
  end

  opts.parse!

  if ARGV.length == 0
    opts.abort("**** ERROR: Please specify an export directory ****")
  elsif ARGV.length != 1
    puts opts
    exit(-1)
  end

  @dir = ARGV[0]
end

if @dir.nil?
  puts "**** ERROR: Please specify an export directory ****"
  puts optparse
  exit(-1)
else
  FileUtils.mkdir_p(@dir)
  puts "Creating backup folder #{@dir}"
  FileUtils.chown(nil, 'postgres', @dir)
  FileUtils.chmod 0770, @dir
  FileUtils.cd @dir

  `katello-service stop`

  CONFIGS=[
    '/etc/candlepin',
    '/etc/foreman',
    '/etc/foreman-proxy',
    '/etc/hammer',
    '/etc/httpd',
    '/etc/foreman-installer',
    '/etc/pki/katello',
    '/etc/pki/katello-certs-tools',
    '/etc/pki/pulp',
    '/etc/pulp',
    '/etc/puppet',
    '/etc/qpid',
    '/etc/qpid-dispatch',
    '/etc/sysconfig/tomcat*',
    '/etc/tomcat*',
    '/root/ssl-build',
    '/var/lib/candlepin',
    '/var/www/html/pub',
    '/var/lib/puppet/foreman_cache_data',
    '/var/lib/puppet/ssl'
  ]

  `cp #{@options[:incremental]}/*.snar .` if @options[:incremental]

  puts "Backing up config files... "
  `tar --selinux --create --gzip --file=config_files.tar.gz --listed-incremental=config.snar #{CONFIGS.join(' ')}`
  puts "Done."

  puts "Backing up postgres db... "
  `tar --selinux --create --gzip --file=pgsql_data.tar.gz --listed-incremental=postgres.snar /var/lib/pgsql/data/`
  puts "Done."

  puts "Backing up mongo db... "
  `tar --selinux --create --gzip --file=mongo_data.tar.gz --listed-incremental=mongo.snar --exclude=mongod.lock /var/lib/mongodb/`
  puts "Done."

  unless @options[:skip_pulp]
    if @options[:online]
      `katello-service start`
      puts "Backing up Pulp data... "
      matching = false
      until matching
        checksum1 = `find /var/lib/pulp -printf '%T@\n' | md5sum`
        `tar --selinux --create --file=pulp_data.tar --listed-incremental=pulp.snar /var/lib/pulp/ /var/www/pub/`
        checksum2 = `find /var/lib/pulp -printf '%T@\n' | md5sum`
        matching = (checksum1 == checksum2)
      end

      puts "Done."
    else
      puts "Backing up Pulp data... "
      `tar --selinux --create --file=pulp_data.tar --listed-incremental=pulp.snar /var/lib/pulp/ /var/www/pub/`
      puts "Done."
      `katello-service start`
    end
  else
    `katello-service start`
  end

  puts "**** BACKUP Complete, contents can be found in: #{@dir} ****"
end
