load File.expand_path(“../set_rails_env.rake”, __FILE__)

namespace :papertrail do

# desc 'Adds papertrail to rsyslog as an output channel'
task :add_to_rsyslog do
  on roles(:all) do
    as :root do
      within '/etc' do
        # TODO: this is awfully familiar to the ssh block, need to DRY up
        # TODO: instead of appending at the bottom, create a .conf in /etc/rsyslog.d/
        file = capture(:cat, 'rsyslog.conf')
        lines = file.split("\n")
        lines << "*.* @#{fetch(:papertrail_host, 'logs.papertrailapp.com')}:#{fetch(:papertrail_port, 1234)}" + "\n"
        new_file = StringIO.new(lines.join("\n"))
        upload! new_file, '/tmp/rsyslog.conf'
        execute :mv, '/tmp/rsyslog.conf', 'rsyslog.conf'
        execute :service, 'rsyslog restart'
      end
    end
  end
end

# desc 'Install remote_syslog on all app servers'
task :remote_syslog do
  on roles(:app) do |host|
    as :root do
      # TODO: only install the gem if the command doesn't exist
      # maybe which remote_syslog ?
      execute :gem, 'install remote_syslog'

      LOG_FILES_YML = <<-EOF

files:

- #{shared_path.join('log').to_s}/*.log

destination:

host: #{fetch(:papertrail_host, 'logs.papertrailapp.com')}
port: #{fetch(:papertrail_port, 1234)}

prepend: #{capture('hostname')} -> hostname: #{fetch(:application)}-#{host} EOF

within '/etc' do
  # again, DRY this up (because as() doesn't work with upload! or within yet)
  upload! StringIO.new(LOG_FILES_YML), '/tmp/log_files.yml'
  execute :mv, '/tmp/log_files.yml', 'log_files.yml'
end

within '/etc/init' do

  UPSTART_CONF = <<-EOF

description “Monitor files and send to remote syslog” start on runlevel [2345] stop on runlevel [!2345]

respawn

pre-start exec /usr/bin/test -e /etc/log_files.yml

exec /usr/local/bin/remote_syslog -D EOF

# TODO: find out where the remote_syslog is (or if it even got installed) # find / -name remote_syslog

        # again, DRY this up (because as() doesn't work with upload! or within yet)
        upload! StringIO.new(UPSTART_CONF), '/tmp/remote_syslog.conf'
        execute :mv, '/tmp/remote_syslog.conf', 'remote_syslog.conf'

      end

    end
  end
  invoke 'papertrail:restart_remote_syslog'
end

desc 'Restarts remote syslog'
task :restart_remote_syslog do
  on roles(:app) do
    as :root do
      execute :service, 'remote_syslog restart'
    end
  end
end

desc 'Installs papertrail and adds remote_syslog'
task :install do
  invoke 'papertrail:add_to_rsyslog'
  invoke 'papertrail:remote_syslog'
end

end