#!/usr/bin/env ruby

require 'rubygems'
require 'abiquo-etk'

def create_schemas(user = 'root', password = '')
  log = AETK::Log.instance
  cmd = ''

  # if abiquo-server RPM not installed, return
  `/bin/rpm -q abiquo-server`
  if $? != 0
    log.warn 'abiquo-server package not found. Skipping schema creation.'
    return
  end
  if password.strip.chomp.empty? 
    cmd = "mysql -u #{user} "
  else
    cmd = "mysql -u #{user} -p#{password} "
  end
  
  if `#{cmd} -e 'show databases'` != 0
    log.error "Can't access MySQL with username #{user}, password #{password}"
    return
  end

  if `#{cmd} -e 'show databases'|grep kinton`.strip.chomp.empty?
    out = `mysql -u root < /usr/share/doc/abiquo-server/database/kinton-schema.sql`
    if $?.exitstatus == 0 
      log.info 'kinton-schema imported succesfully.'
    else
      log.error "Error importing kinton-schema: #{out}"
    end
    out = `mysql -u root < /usr/share/doc/abiquo-server/database/kinton-premium-schema.sql`
    if $?.exitstatus == 0 
      log.info 'kinton-premium-schema imported succesfully.'
    else
      log.error "Error importing kinton-premium-schema: #{out}"
    end
  else
    log.warn 'kinton schema found. Skipping schema creation.'
  end
  
end

def init_server_install
  config_file ='/opt/abiquo/config/abiquo.properties'
  log = AETK::Log.instance

  begin
    if File.exist? config_file 
      settings = abiquo_server_settings
    else
      log.error "Config file #{config_file} does not exist. Exit."
      exit
    end

    log.info "Setting DB Properties"
    `abicli set database-host #{settings['abiquo.database.host']}`
    `abicli set database-user root`
    `abicli set database-password #{settings['abiquo.database.password']}`
    `abicli set mail-server 127.0.0.1`
      
    log.info "Creating database schemas..."
    create_schemas
  rescue Exception => e
    log.error "Unhandled exception: #{e.message}"
    log.error "BACKTRACE: #{e.backtrace}"
    raise e
  end
end

def init_remote_services_install
  config_file ='/opt/abiquo/config/abiquo.properties'

  log = AETK::Log.instance

  begin
    settings = {}
    if File.exist? config_file
      settings = abiquo_rs_settings
    else
      log.error "Config file #{config_file} does not exist. Exit."
      exit
    end
    repo = settings['abiquo.appliancemanager.repositoryLocation']
    log.info "Setting nfs-repository to #{repo}"
    `abicli set nfs-repository #{repo}`
    log.info "Setting cifs-repository to #{repo}"
    `abicli set cifs-repository //your-cifs-server-ip-here/opt/vm_repository`

  rescue Exception => e
    log.error "Unhandled exception: #{e.message}"
    log.error "BACKTRACE: #{e.backtrace}"
    raise e
  end
end

def init_v2v_install
end

def init_rs_plus_v2v_install
  init_remote_services_install
  init_v2v_install
end

log = AETK::Log.instance
log.info "Running abiquo-initenv..."

# Check if we need to run
if File.exist?(ABIQUO_BASE_DIR + '/config/.configured') and \
  (not File.exists?(ABIQUO_BASE_DIR + '/config/.needsupgrade'))
    log.info "Ok Sargent. No need to change anything. Exit."
    exit 0
end

begin
  if File.exist?('/opt/abiquo/config/.needsupgrade')
    log.info "Upgrade needed, upgrading..."
    upgrade_script = File.readlines('/opt/abiquo/config/.needsupgrade').first
    if not upgrade_script.nil?
      script_file = File.dirname(__FILE__) + "/../lib/upgrades/#{upgrade_script.strip.chomp}"
      log.info "Using upgrade script #{script_file}"
      load script_file
      log.info "Upgrade completed succesfully."
    else
      log.error "Invalid upgrade script found in .needsupgrade file. Aborting the upgrade"
    end
  end
rescue Exception => e
  log.error "Unknown error upgrading: #{e.message}"
  log.error "BACKTRACE: #{e.backtrace}"
  log.error "Aborting."
  exit 1
end
  
case AETK::System.detect_install_type 
when :monolithic
  log.info "Monolithic install detected. Setting up the environment."
  init_server_install
  init_remote_services_install
  init_v2v_install
when :server
  log.info "Server install detected. Setting up the environment."
  init_server_install
when :remote_services
  log.info "Remote Services install detected. Setting up the environment."
  init_remote_services_install
when :v2v
  log.info "V2V install detected. Setting up the environment."
  init_v2v_install
when :rs_plus_v2v
  log.info "Remote Services + V2V install detected. Setting up the environment."
  init_rs_plus_v2v_install
else
  AETK::Log.instance.error "Couldn't detect install type. Skipping first setup."
end

#
# Set nofile limits in /etc/security/limits.conf
#
begin
  slimits_found = false
  hlimits_found = false
  File.readlines('/etc/security/limits.conf').each do |l|
    slimits_found = true if l =~ /^\s*root\s+soft\s+nofile\s+4096/
    hlimits_found = true if l =~ /^\s*root\s+hard\s+nofile\s+10240/
  end
  if not slimits_found
    AETK::Log.info "Setting soft nofile limits to 4096"
    File.open('/etc/security/limits.conf', 'a') do |f|
      f.puts "root soft nofile 4096"
    end
  end
  if not hlimits_found
    AETK::Log.info "Setting hard nofile limits to 10240"
    File.open('/etc/security/limits.conf', 'a') do |f|
      f.puts "root hard nofile 10240"
    end
  end
  if slimits_found and hlimits_found
    AETK::Log.info "System hard/soft nofile limits Ok. Not updating."
  end
rescue Exception => e
  AETK::Log.error "Error setting nofile limits: #{e.message}"
end

FileUtils.touch(ABIQUO_BASE_DIR + '/config/.configured')
