health_check 0.2.4 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,70 +1,99 @@
1
- class HealthCheckController < ActionController::Base
2
- session(:off) if Rails::VERSION::STRING < '2.3'
3
- layout nil
1
+ # Copyright (c) 2010-2013 Ian Heggie, released under the MIT license.
2
+ # See MIT-LICENSE for details.
4
3
 
5
- def index
6
- do_check('standard')
7
- end
4
+ module HealthCheck
5
+ class HealthCheckController < ActionController::Base
8
6
 
9
- def check
10
- do_check(params[:checks])
11
- end
7
+ # turn sessions off if we can
8
+ session(:off) rescue nil
12
9
 
13
- private
10
+ layout nil
14
11
 
15
- def do_check(checks)
16
- begin
17
- errors = process_checks(checks)
18
- rescue Exception => e
19
- errors = e.message
20
- end
21
- if errors.blank?
22
- render :text => HealthCheck.success, :content_type => 'text/plain'
23
- else
24
- msg = "health_check failed: #{errors}"
25
- render :text => msg, :status => 500, :content_type => 'text/plain'
26
- # Log a single line as some uptime checkers only record that it failed, not the text returned
27
- silence_level, logger.level = logger.level, @old_logger_level
28
- logger.info msg
29
- logger.level = silence_level
12
+ def index
13
+ do_check('standard')
30
14
  end
31
- end
32
15
 
33
- def process_checks(checks)
34
- errors = ''
35
- checks.split('_').each do |check|
36
- case check
37
- when 'and', 'site'
38
- # do nothing
39
- when "database"
40
- HealthCheck.get_database_version
41
- when "email"
42
- errors << HealthCheck.check_email
43
- when "migrations", "migration"
44
- database_version = HealthCheck.get_database_version
45
- migration_version = HealthCheck.get_migration_version
46
- if database_version.to_i != migration_version.to_i
47
- errors << "Current database version (#{database_version}) does not match latest migration (#{migration_version}). "
48
- end
49
- when "standard"
50
- errors << process_checks("database_migrations")
51
- errors << process_checks("email") unless HealthCheck.default_action_mailer_configuration?
52
- when "all", "full"
53
- errors << process_checks("database_migrations_email")
16
+ def check
17
+ do_check(params[:checks])
18
+ end
19
+
20
+ private
21
+
22
+ def do_check(checks)
23
+ begin
24
+ errors = process_checks(checks)
25
+ rescue Exception => e
26
+ errors = e.message
27
+ end
28
+ if errors.blank?
29
+ render :text => HealthCheck::Utils.success, :content_type => 'text/plain'
54
30
  else
55
- return "invalid argument to health_test. "
31
+ msg = "health_check failed: #{errors}"
32
+ render :text => msg, :status => 500, :content_type => 'text/plain'
33
+ # Log a single line as some uptime checkers only record that it failed, not the text returned
34
+ if logger
35
+ silence_level, logger.level = logger.level, @old_logger_level
36
+ logger.info msg
37
+ logger.level = silence_level
38
+ end
56
39
  end
57
40
  end
58
- return errors
59
- end
60
41
 
42
+ def process_checks(checks)
43
+ errors = ''
44
+ checks.split('_').each do |check|
45
+ case check
46
+ when 'and', 'site'
47
+ # do nothing
48
+ when "database"
49
+ HealthCheck::Utils.get_database_version
50
+ when "email"
51
+ errors << HealthCheck::Utils.check_email
52
+ when "migrations", "migration"
53
+ database_version = HealthCheck::Utils.get_database_version
54
+ migration_version = HealthCheck::Utils.get_migration_version
55
+ if database_version.to_i != migration_version.to_i
56
+ errors << "Current database version (#{database_version}) does not match latest migration (#{migration_version}). "
57
+ end
58
+ when "standard"
59
+ errors << process_checks("database_migrations")
60
+ errors << process_checks("email") unless HealthCheck::Utils.default_action_mailer_configuration?
61
+ when "all", "full"
62
+ errors << process_checks("database_migrations_email")
63
+ else
64
+ return "invalid argument to health_test. "
65
+ end
66
+ end
67
+ return errors
68
+ end
69
+
70
+ protected
61
71
 
62
- def process_with_silence(*args)
63
- @old_logger_level = logger.level
64
- logger.silence do
65
- process_without_silence(*args)
72
+ # turn cookies for CSRF off
73
+ def protect_against_forgery?
74
+ false
66
75
  end
67
- end
68
76
 
69
- alias_method_chain :process, :silence
77
+ # Silence logger as much as we can
78
+
79
+ def process_with_silent_log(method_name, *args)
80
+ if logger
81
+ @old_logger_level = logger.level
82
+ if Rails.version >= '3.2'
83
+ silence do
84
+ process_without_silent_log(method_name, *args)
85
+ end
86
+ else
87
+ logger.silence do
88
+ process_without_silent_log(method_name, *args)
89
+ end
90
+ end
91
+ else
92
+ process_without_silent_log(method_name, *args)
93
+ end
94
+ end
95
+
96
+ alias_method_chain :process, :silent_log
97
+
98
+ end
70
99
  end
@@ -0,0 +1,103 @@
1
+ # Copyright (c) 2010-2013 Ian Heggie, released under the MIT license.
2
+ # See MIT-LICENSE for details.
3
+
4
+ module HealthCheck
5
+ class Utils
6
+
7
+ @@success = "success"
8
+
9
+ cattr_accessor :success
10
+
11
+ @@smtp_timeout = 30.0
12
+
13
+ cattr_accessor :smtp_timeout
14
+
15
+ @@default_smtp_settings =
16
+ {
17
+ :address => "localhost",
18
+ :port => 25,
19
+ :domain => 'localhost.localdomain',
20
+ :user_name => nil,
21
+ :password => nil,
22
+ :authentication => nil,
23
+ :enable_starttls_auto => true,
24
+ }
25
+
26
+ cattr_accessor :default_smtp_settings
27
+
28
+ def self.db_migrate_path
29
+ # Lazy initialisation so Rails.root will be defined
30
+ @@db_migrate_path ||= File.join(Rails.root, 'db', 'migrate')
31
+ end
32
+
33
+ def self.db_migrate_path=(value)
34
+ @@db_migrate_path = value
35
+ end
36
+
37
+ def self.default_action_mailer_configuration?
38
+ ActionMailer::Base.delivery_method == :smtp && HealthCheck::Utils.default_smtp_settings == ActionMailer::Base.smtp_settings
39
+ end
40
+
41
+ def self.get_database_version
42
+ ActiveRecord::Migrator.current_version
43
+ end
44
+
45
+ def self.get_migration_version(dir = self.db_migrate_path)
46
+ latest_migration = nil
47
+ Dir[File.join(dir, "[0-9]*_*.rb")].each do |f|
48
+ l = f.scan(/0*([0-9]+)_[_a-zA-Z0-9]*.rb/).first.first
49
+ latest_migration = l if !latest_migration || l.to_i > latest_migration.to_i
50
+ end
51
+ latest_migration
52
+ end
53
+
54
+ def self.check_email
55
+ case ActionMailer::Base.delivery_method
56
+ when :smtp
57
+ HealthCheck::Utils.check_smtp(ActionMailer::Base.smtp_settings, HealthCheck::Utils.smtp_timeout)
58
+ when :sendmail
59
+ HealthCheck::Utils.check_sendmail(ActionMailer::Base.sendmail_settings)
60
+ else
61
+ ''
62
+ end
63
+ end
64
+
65
+
66
+ def self.check_sendmail(settings)
67
+ File.executable?(settings[:location]) ? '' : 'no sendmail executable found. '
68
+ end
69
+
70
+ def self.check_smtp(settings, timeout)
71
+ status = ''
72
+ begin
73
+ if @skip_external_checks
74
+ status = '221'
75
+ else
76
+ Timeout::timeout(timeout) do |timeout_length|
77
+ t = TCPSocket.new(settings[:address], settings[:port])
78
+ begin
79
+ status = t.gets
80
+ while status != nil && status !~ /^2/
81
+ status = t.gets
82
+ end
83
+ t.puts "HELO #{settings[:domain]}"
84
+ while status != nil && status !~ /^250/
85
+ status = t.gets
86
+ end
87
+ t.puts "QUIT"
88
+ status = t.gets
89
+ ensure
90
+ t.close
91
+ end
92
+ end
93
+ end
94
+ rescue Errno::EBADF => ex
95
+ status = "Unable to connect to service"
96
+ rescue Exception => ex
97
+ status = ex.to_s
98
+ end
99
+ (status =~ /^221/) ? '' : "SMTP: #{status || 'unexpected EOF on socket'}. "
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,11 @@
1
+ class CreateCountries < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :countries do |t|
4
+ t.column :name, :string
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ drop_table :countries
10
+ end
11
+ end
@@ -1,7 +1,8 @@
1
1
  class CreateUsers < ActiveRecord::Migration
2
2
  def self.up
3
3
  create_table "users", :force => true do |t|
4
- t.column :name, :string
4
+ t.column :name, :string
5
+ end
5
6
  end
6
7
 
7
8
  def self.down
@@ -13,7 +13,6 @@ else
13
13
  fail "TODO: Work out how to test as a gem (test as a plugin instead)"
14
14
  end
15
15
 
16
-
17
16
  gem "shoulda"
18
17
  require 'shoulda'
19
18
  require 'shoulda/action_controller'
@@ -0,0 +1,164 @@
1
+ #!/bin/bash
2
+
3
+ # Any failure causes exit
4
+ set -e
5
+
6
+ base_dir=`pwd`
7
+
8
+ testurl=$base_dir/test/testurl
9
+
10
+ test_dir=`pwd`/tmp
11
+ rm -rf tmp/Gemfile* tmp/railsapp tmp/bin tmp/gems
12
+ mkdir -p tmp/gems
13
+
14
+ echo Installing health_check as a gem into tmp/gems
15
+ env GEM_HOME=$test_dir/gems rake install
16
+
17
+ export GEM_PATH="$test_dir/gems:`gem environment gempath`"
18
+ echo Set GEM_PATH=$GEM_PATH
19
+
20
+ echo Gems in tmp/gems:
21
+ ls tmp/gems
22
+
23
+ echo GEM LIST
24
+ gem list
25
+
26
+ echo Environment:
27
+ env | egrep 'TRAVIS|RAILS|RUBY|_ENV'
28
+
29
+ server_pid=''
30
+
31
+ finish()
32
+ {
33
+ set +e
34
+ set +x
35
+ echo ========================================================
36
+ echo TEST ${1:-FAILED}
37
+ echo ========================================================
38
+ if [ -s $test_dir/railsapp/log/test.log ]
39
+ then
40
+ echo Last 300 lines of test log
41
+ tail -300 $test_dir/railsapp/log/test.log
42
+ fi
43
+ case "$server_pid" in
44
+ [0-9]*)
45
+ echo "Killing rails server [pid: $server_pid]"
46
+ kill -9 $server_pid
47
+ wait
48
+ ;;
49
+ esac
50
+ trap "" 0
51
+ exit ${2:-2}
52
+ }
53
+
54
+ trap "finish FAILED 1" 0
55
+
56
+ actual_rails_version=`rails -v`
57
+ echo "Creating $actual_rails_version app in $test_dir/railsapp"
58
+
59
+ cd $test_dir
60
+
61
+ case "$actual_rails_version" in
62
+ *' '[12].*)
63
+ rails railsapp
64
+ ;;
65
+ *' '[34].*)
66
+ rails new railsapp
67
+ ;;
68
+ *)
69
+ echo "Unknown rails version"
70
+ ;;
71
+ esac
72
+
73
+ cd railsapp
74
+ echo "Changed current directory to railsapp root: `pwd`"
75
+
76
+ echo "Fixing rdoc require in Rakefile if needed"
77
+ ruby -pi.bak -e "gsub(/rake.rdoctask/, 'rdoc/task')" Rakefile
78
+
79
+ if [ -f Gemfile ]
80
+ then
81
+ echo Installing health_check as gem ...
82
+ echo "gem 'health_check', :path => '$base_dir'" >> Gemfile
83
+ case "$BUNDLE_GEMFILE" in
84
+ ?*)
85
+ echo Unsetting BUNDLE_GEMFILE '(so Gemfile will be used)'
86
+ unset BUNDLE_GEMFILE
87
+ ;;
88
+ esac
89
+ bundle
90
+ else
91
+ echo Installing health_check as plugin ...
92
+ dest=`pwd`/vendor/plugins/health_check
93
+ mkdir -p $dest
94
+ (
95
+ cd $base_dir
96
+ find . | egrep -v '/tmp|/\.git|\.gem$' | cpio -pdl $dest
97
+ )
98
+ fi
99
+
100
+ port=3456
101
+ echo Starting server on port $port ...
102
+
103
+ export RAILS_ENV=test
104
+
105
+ if [ -x script/server ]
106
+ then
107
+ script/server webrick -p $port &
108
+ else
109
+ rails s webrick -p $port &
110
+ fi
111
+ server_pid=$!
112
+
113
+ echo STATIC-FILE > public/static.txt
114
+
115
+ host=http://localhost:${port}
116
+
117
+ # get a static file
118
+ echo
119
+ echo 'TESTING can get a static file ...'
120
+ $testurl ${host}/static.txt STATIC-FILE
121
+ echo
122
+
123
+ echo 'TESTING health_check should pass with no database migrations ...'
124
+ mkdir -p db/migrate
125
+ ls db/migrate
126
+ $testurl ${host}/health_check success
127
+ echo
128
+
129
+ echo 'TESTING health_check should fail without initial database migration ...'
130
+ cp $base_dir/test/migrate/nine/* db/migrate
131
+ ls db/migrate
132
+ $testurl ${host}/health_check failed
133
+ echo
134
+
135
+ echo 'TESTING health_check should pass after initial database migration ...'
136
+ rake db:migrate
137
+ $testurl ${host}/health_check success
138
+ echo
139
+
140
+ echo 'TESTING health_check should fail without all migrations ...'
141
+ cp $base_dir/test/migrate/twelve/* db/migrate
142
+ ls db/migrate
143
+ $testurl ${host}/health_check failed
144
+ echo
145
+
146
+ echo 'TESTING health_check should pass after both database migrations ...'
147
+ rake db:migrate
148
+ $testurl ${host}/health_check success
149
+ echo
150
+
151
+ echo "Killing rails server [pid: $server_pid]"
152
+ kill -9 $server_pid
153
+ server_pid=''
154
+
155
+ #if [ -d vendor/plugins/health_check ]
156
+ #then
157
+ # echo "RUNNING UNIT TESTS...."
158
+ # rake test:plugins
159
+ #fi
160
+
161
+ finish PASSED 0
162
+ exit 0
163
+
164
+ # vi: sw=4 ai sm: