class HealthCheck::Utils

Public Class Methods

check_cache() click to toggle source
# File lib/health_check/utils.rb, line 161
def self.check_cache
  t = Time.now.to_i
  value = "ok #{t}"
  ret = ::Rails.cache.read('__health_check_cache_test__')
  if ret.to_s =~ /^ok (\d+)$/ 
    diff = ($1.to_i - t).abs
    return('Cache expiry is broken. ') if diff > 30
  elsif ret
    return 'Cache is returning garbage. '
  end
  if ::Rails.cache.write('__health_check_cache_test__', value, expires_in: 2.seconds)
    ret = ::Rails.cache.read('__health_check_cache_test__')
    if ret =~ /^ok (\d+)$/ 
      diff = ($1.to_i - t).abs
      (diff < 2 ? '' : 'Out of date cache or time is skewed. ')
    else
      'Unable to read from cache. '
    end
  else
    'Unable to write to cache. '
  end
end
check_email() click to toggle source
# File lib/health_check/utils.rb, line 126
def self.check_email
  case ActionMailer::Base.delivery_method
    when :smtp
      HealthCheck::Utils.check_smtp(ActionMailer::Base.smtp_settings, HealthCheck.smtp_timeout)
    when :sendmail
      HealthCheck::Utils.check_sendmail(ActionMailer::Base.sendmail_settings)
    else
      ''
  end
end
check_sendmail(settings) click to toggle source
# File lib/health_check/utils.rb, line 137
def self.check_sendmail(settings)
  File.executable?(settings[:location]) ? '' : 'no sendmail executable found. '
end
check_smtp(settings, timeout) click to toggle source
# File lib/health_check/utils.rb, line 141
def self.check_smtp(settings, timeout)
  status = ''
  begin
    if @skip_external_checks
      status = '250'
    else
      smtp = Net::SMTP.new(settings[:address], settings[:port])
      smtp.enable_starttls if settings[:enable_starttls_auto]
      smtp.open_timeout = timeout
      smtp.read_timeout = timeout
      smtp.start(settings[:domain], settings[:user_name], settings[:password], settings[:authentication]) do
        status = smtp.helo(settings[:domain]).status
      end
    end
  rescue Exception => ex
    status = ex.to_s
  end
  (status =~ /^250/) ? '' : "SMTP: #{status || 'unexpected error'}. "
end
db_migrate_path() click to toggle source
# File lib/health_check/utils.rb, line 100
def self.db_migrate_path
  # Lazy initialisation so Rails.root will be defined
  @@db_migrate_path ||= File.join(::Rails.root, 'db', 'migrate')
end
db_migrate_path=(value) click to toggle source
# File lib/health_check/utils.rb, line 105
def self.db_migrate_path=(value)
  @@db_migrate_path = value
end
get_database_version() click to toggle source
# File lib/health_check/utils.rb, line 113
def self.get_database_version
  ActiveRecord::Migrator.current_version if defined?(ActiveRecord)
end
get_migration_version(dir = self.db_migrate_path) click to toggle source
# File lib/health_check/utils.rb, line 117
def self.get_migration_version(dir = self.db_migrate_path)
  latest_migration = nil
  Dir[File.join(dir, "[0-9]*_*.rb")].each do |f|
    l = f.scan(/0*([0-9]+)_[_.a-zA-Z0-9]*.rb/).first.first rescue -1
    latest_migration = l if !latest_migration || l.to_i > latest_migration.to_i
  end
  latest_migration
end
mailer_configured?() click to toggle source
# File lib/health_check/utils.rb, line 109
def self.mailer_configured?
  defined?(ActionMailer::Base) && (ActionMailer::Base.delivery_method != :smtp || HealthCheck::Utils.default_smtp_settings != ActionMailer::Base.smtp_settings)
end
process_checks(checks, called_from_middleware = false) click to toggle source

process an array containing a list of checks

# File lib/health_check/utils.rb, line 21
def self.process_checks(checks, called_from_middleware = false)
  errors = ''
  checks.each do |check|
    case check
      when 'and', 'site'
        # do nothing
      when "database"
        HealthCheck::Utils.get_database_version
      when "email"
        errors << HealthCheck::Utils.check_email
      when "emailconf"
        errors << HealthCheck::Utils.check_email if HealthCheck::Utils.mailer_configured?
      when "migrations", "migration"
        if defined?(ActiveRecord::Migration) and ActiveRecord::Migration.respond_to?(:check_pending!)
          # Rails 4+
          begin
            ActiveRecord::Migration.check_pending!
          rescue ActiveRecord::PendingMigrationError => ex
              errors << ex.message
          end
        else
          database_version  = HealthCheck::Utils.get_database_version
          migration_version = HealthCheck::Utils.get_migration_version
          if database_version.to_i != migration_version.to_i
            errors << "Current database version (#{database_version}) does not match latest migration (#{migration_version}). "
          end
        end
      when 'cache'
        errors << HealthCheck::Utils.check_cache
      when 'resque-redis-if-present'
        errors << HealthCheck::ResqueHealthCheck.check if defined?(::Resque)
      when 'sidekiq-redis-if-present'
        errors << HealthCheck::SidekiqHealthCheck.check if defined?(::Sidekiq)
      when 'redis-if-present'
        errors << HealthCheck::RedisHealthCheck.check if defined?(::Redis)
      when 's3-if-present'
        errors << HealthCheck::S3HealthCheck.check if defined?(::Aws)
      when 'elasticsearch-if-present'
        errors << HealthCheck::ElasticsearchHealthCheck.check if defined?(::Elasticsearch)
      when 'resque-redis'
        errors << HealthCheck::ResqueHealthCheck.check
      when 'sidekiq-redis'
        errors << HealthCheck::SidekiqHealthCheck.check
      when 'redis'
        errors << HealthCheck::RedisHealthCheck.check
      when 's3'
        errors << HealthCheck::S3HealthCheck.check
      when 'elasticsearch'
        errors << HealthCheck::ElasticsearchHealthCheck.check
      when 'rabbitmq'
        errors << HealthCheck::RabbitMQHealthCheck.check
      when "standard"
        errors << HealthCheck::Utils.process_checks(HealthCheck.standard_checks, called_from_middleware)
      when "middleware"
        errors << "Health check not called from middleware - probably not installed as middleware." unless called_from_middleware
      when "custom"
        HealthCheck.custom_checks.each do |name, list|
          list.each do |custom_check|
            errors << custom_check.call(self)
          end
        end
      when "all", "full"
        errors << HealthCheck::Utils.process_checks(HealthCheck.full_checks, called_from_middleware)
      else
        if HealthCheck.custom_checks.include? check
           HealthCheck.custom_checks[check].each do |custom_check|
             errors << custom_check.call(self)
           end
        else
          return "invalid argument to health_test."
        end
    end
    errors << '. ' unless errors == '' || errors.end_with?('. ')
  end
  return errors.strip
rescue => e
  return e.message
end