require 'capistrano/helpers/base' require 'capistrano/helpers/monit' require 'capistrano/dsl/base_paths' require 'capistrano/helpers/puma/monit'

namespace :puma do

include Capistrano::DSL::BasePaths
include Capistrano::Helpers::Base
include Capistrano::Helpers::Monit
namespace :monit do
  desc 'MONIT: Setup Puma service'
  task :setup do
    on roles(:app) do |host|
      info "MONIT: Uploading configuration for puma for #{fetch(:application)} on #{host}"
      # Upload configuration
      upload! template_to_s_io(fetch(:puma_monit_config_template)), Capistrano::Helpers::Puma::Monit.available_configuration_with_path
    end
  end

  desc 'MONIT: Enable services for Puma'
  task :enable do
    on roles(:app) do |host|
      info "MONIT: Enabling service for puma for application #{fetch(:application)} on #{host}"
      enable_monitor(Capistrano::Helpers::Puma::Monit.available_configuration_file)
    end
  end

  desc 'MONIT: Disable and Stop services for  Puma'
  task :disable do
    on roles(:app) do |host|
      info "MONIT: Disabling service for puma for application #{fetch(:application)} on #{host}"
      disable_monitor(Capistrano::Helpers::Puma::Monit.available_configuration_file)
    end
  end

  %w(start stop restart monitor unmonitor).each do |cmd|
    desc "MONIT: #{cmd.capitalize} puma"
    task cmd.to_sym do
      on roles(:app) do |host|
        info "MONIT: #{cmd} #{fetch(:puma_monit_service_name)} on #{host}"
        command_monit_service(cmd, fetch(:puma_monit_service_name))
      end
    end
  end

  desc 'MONIT: Purge Puma configuration'
  task :purge do
    on roles(:app) do |host|
      info "MONIT: Purging config for #{fetch(:puma_monit_service_name)} on #{host}"
    end
  end
end

end

after 'monit:setup', 'puma:monit:setup' # after 'puma:monit:setup', 'puma:monit:enable' after 'puma:monit:enable', 'monit:reload'

before 'puma:monit:disable', 'puma:monit:unmonitor' after 'puma:monit:disable', 'monit:reload'

before 'monit:enable', 'puma:monit:enable'

# start service after update in case it has not been stopped # This shouldn't be necessary, as monit should pick up a non-running service. # Starting it here might trigger double starting if monit is triggered simultaniously. # after “deploy:update”, “puma:monit:start”