namespace :passenger do

# This task with bounce the standalone passenger server.
# The rails_env and passenger_port are specified in the deploy environment files, ex: "config/deploy/staging.rb"
desc "Restart Passenger server"
task :restart do
  on roles(:web) do
    execute "sudo invoke-rc.d #{fetch(:application)}_#{fetch(:rails_env)}_passenger restart"
  end
end

desc "Generate the init script for passenger"
task :generate_init_script do
  # on roles(:web) do
  #   memory_available_kb = `cat /proc/meminfo | grep MemTotal | awk '{print $2}'`.to_i
  #   thread_use_kb = 175000
  #   set :default_pool_size, ((memory_available_kb * 0.75) / thread_use_kb).to_i
  # end

  # create the shell script that upstart will exec
  file   = File.join(File.dirname(__FILE__), "templates", "passenger", "passenger_init.erb")
  buffer = ERB.new(File.read(file)).result(binding)
  filename = "#{fetch(:application)}_#{fetch(:rails_env)}_passenger"
  on roles(:web) do
    unless test("[ -f /etc/init.d/#{filename} ]")
      upload! StringIO.new(buffer), "/tmp/#{filename}"
      execute "sudo mv /tmp/#{filename} /etc/init.d/#{filename}"
      execute "sudo chmod +x /etc/init.d/#{filename}"
      execute "sudo update-rc.d #{filename} defaults"
    end
  end
end

def passenger_path
  if fetch(:use_system_passenger, false)

    on roles(fetch(:rvm1_roles, :all)) do
      within release_path do
        set :ruby_version, capture(:rvm, "current")
      end
    end

    "RACK_ENV=#{fetch(:rails_env)} && /usr/local/rvm/gems/#{fetch(:ruby_version)}/wrappers/ruby /usr/bin/passenger"
  else
    "RACK_ENV=#{fetch(:rails_env)} && #{fetch(:rvm1_auto_script_path)}/rvm-auto.sh . bundle exec passenger"
  end

end

def stop_passenger_command
  return <<-CMD
    if [ -f #{current_path}/tmp/pids/passenger.#{fetch(:passenger_port)}.pid ];
    then
      cd #{current_path} && (#{passenger_path} stop --pid-file #{current_path}/tmp/pids/passenger.#{fetch(:passenger_port)}.pid)
    fi
  CMD
end

def start_passenger_command
  default_pool_size = 6
  return <<-CMD
  # VERSION #{fetch(:rvm1_alias_name)}
    rm -f #{current_path}/tmp/pids/passenger.#{fetch(:passenger_port)}.pid;
    cd #{current_path} && (#{passenger_path} start --max-pool-size=#{fetch(:passenger_max_pool_size,default_pool_size)} --min-instances=#{fetch(:passenger_min_instances,default_pool_size)} -e #{fetch(:rails_env)} -p #{fetch(:passenger_port)} -d)
  CMD
end

def restart_passenger_command
  return <<-CMD
    #{stop_passenger_command}
    #{start_passenger_command}
  CMD
end

end

after “deploy:published”, “passenger:generate_init_script” after “deploy:finished”, “passenger:restart”