cloud66-bluepill 0.0.62

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +10 -0
  2. data/.rspec +1 -0
  3. data/DESIGN.md +10 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE +22 -0
  6. data/README.md +349 -0
  7. data/Rakefile +38 -0
  8. data/bin/bluepill +124 -0
  9. data/bin/bpsv +3 -0
  10. data/bin/sample_forking_server +53 -0
  11. data/bluepill.gemspec +37 -0
  12. data/examples/example.rb +87 -0
  13. data/examples/new_example.rb +89 -0
  14. data/examples/new_runit_example.rb +29 -0
  15. data/examples/runit_example.rb +26 -0
  16. data/lib/bluepill.rb +38 -0
  17. data/lib/bluepill/application.rb +215 -0
  18. data/lib/bluepill/application/client.rb +8 -0
  19. data/lib/bluepill/application/server.rb +23 -0
  20. data/lib/bluepill/condition_watch.rb +51 -0
  21. data/lib/bluepill/controller.rb +122 -0
  22. data/lib/bluepill/dsl.rb +12 -0
  23. data/lib/bluepill/dsl/app_proxy.rb +25 -0
  24. data/lib/bluepill/dsl/process_factory.rb +122 -0
  25. data/lib/bluepill/dsl/process_proxy.rb +44 -0
  26. data/lib/bluepill/group.rb +72 -0
  27. data/lib/bluepill/logger.rb +63 -0
  28. data/lib/bluepill/process.rb +514 -0
  29. data/lib/bluepill/process_conditions.rb +14 -0
  30. data/lib/bluepill/process_conditions/always_true.rb +18 -0
  31. data/lib/bluepill/process_conditions/cpu_usage.rb +19 -0
  32. data/lib/bluepill/process_conditions/file_time.rb +26 -0
  33. data/lib/bluepill/process_conditions/http.rb +58 -0
  34. data/lib/bluepill/process_conditions/mem_usage.rb +32 -0
  35. data/lib/bluepill/process_conditions/process_condition.rb +22 -0
  36. data/lib/bluepill/process_journal.rb +219 -0
  37. data/lib/bluepill/process_statistics.rb +27 -0
  38. data/lib/bluepill/socket.rb +58 -0
  39. data/lib/bluepill/system.rb +265 -0
  40. data/lib/bluepill/trigger.rb +60 -0
  41. data/lib/bluepill/triggers/flapping.rb +56 -0
  42. data/lib/bluepill/util/rotational_array.rb +20 -0
  43. data/lib/bluepill/version.rb +4 -0
  44. data/local-bluepill +129 -0
  45. data/spec/lib/bluepill/logger_spec.rb +3 -0
  46. data/spec/lib/bluepill/process_spec.rb +96 -0
  47. data/spec/lib/bluepill/process_statistics_spec.rb +24 -0
  48. data/spec/lib/bluepill/system_spec.rb +36 -0
  49. data/spec/spec_helper.rb +15 -0
  50. metadata +302 -0
@@ -0,0 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Bluepill
3
+ VERSION = "0.0.62".freeze
4
+ end
data/local-bluepill ADDED
@@ -0,0 +1,129 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ $LOAD_PATH.unshift(File.expand_path('lib', File.dirname(__FILE__)))
6
+
7
+ require 'optparse'
8
+ require 'bluepill'
9
+
10
+ begin
11
+ require 'rbconfig'
12
+ rescue LoadError
13
+ end
14
+
15
+ RbConfig = Config unless Object.const_defined?(:RbConfig)
16
+
17
+ # Default options
18
+ options = {
19
+ :log_file => "/var/log/bluepill.log",
20
+ :base_dir => "/var/run/bluepill",
21
+ :privileged => true,
22
+ :timeout => 10,
23
+ :attempts => 1
24
+ }
25
+
26
+ OptionParser.new do |opts|
27
+ opts.banner = "Usage: bluepill [app] cmd [options]"
28
+ opts.on('-l', "--logfile LOGFILE", "Path to logfile, defaults to #{options[:log_file]}") do |file|
29
+ options[:log_file] = file
30
+ end
31
+
32
+ opts.on('-c', "--base-dir DIR", "Directory to store bluepill socket and pid files, defaults to #{options[:base_dir]}") do |base_dir|
33
+ options[:base_dir] = base_dir
34
+ end
35
+
36
+ opts.on("-v", "--version") do
37
+ puts "bluepill, version #{Bluepill::VERSION}"
38
+ exit
39
+ end
40
+
41
+ opts.on("--[no-]privileged", "Allow/disallow to run #{$0} as non-privileged process. disallowed by default") do |v|
42
+ options[:privileged] = v
43
+ end
44
+
45
+ opts.on('-t', '--timeout Seconds', Integer, "Timeout for commands sent to the daemon, in seconds. Defaults to 10.") do |timeout|
46
+ options[:timeout] = timeout
47
+ end
48
+
49
+ opts.on('--attempts Count', Integer, "Attempts for commands sent to the daemon, in seconds. Defaults to 1.") do |attempts|
50
+ options[:attempts] = attempts
51
+ end
52
+
53
+ help = proc do
54
+ puts opts
55
+ puts
56
+ puts "Commands:"
57
+ puts " load CONFIG_FILE\t\tLoads new instance of bluepill using the specified config file"
58
+ puts " status\t\t\tLists the status of the proceses for the specified app"
59
+ puts " start [TARGET]\t\tIssues the start command for the target process or group, defaults to all processes"
60
+ puts " stop [TARGET]\t\tIssues the stop command for the target process or group, defaults to all processes"
61
+ puts " restart [TARGET]\t\tIssues the restart command for the target process or group, defaults to all processes"
62
+ puts " unmonitor [TARGET]\t\tStop monitoring target process or group, defaults to all processes"
63
+ puts " log [TARGET]\t\tShow the log for the specified process or group, defaults to all for app"
64
+ puts " quit\t\t\tStop bluepill"
65
+ puts
66
+ puts "See http://github.com/arya/bluepill for README"
67
+ exit
68
+ end
69
+
70
+ opts.on_tail('-h','--help', 'Show this message', &help)
71
+ help.call if ARGV.empty?
72
+ end.parse!
73
+
74
+ # Check for root
75
+ if options[:privileged] && ::Process.euid != 0
76
+ $stderr.puts "You must run bluepill as root or use --no-privileged option."
77
+ exit(3)
78
+ end
79
+
80
+ APPLICATION_COMMANDS = %w(status start stop restart unmonitor quit log)
81
+
82
+ controller = Bluepill::Controller.new(options.slice(:base_dir, :log_file))
83
+
84
+ if controller.running_applications.include?(File.basename($0)) && File.symlink?($0)
85
+ # bluepill was called as a symlink with the name of the target application
86
+ options[:application] = File.basename($0)
87
+ elsif controller.running_applications.include?(ARGV.first)
88
+ # the first arg is the application name
89
+ options[:application] = ARGV.shift
90
+ elsif APPLICATION_COMMANDS.include?(ARGV.first)
91
+ if controller.running_applications.length == 1
92
+ # there is only one, let's just use that
93
+ options[:application] = controller.running_applications.first
94
+ elsif controller.running_applications.length > 1
95
+ # There is more than one, tell them the list and exit
96
+ $stderr.puts "You must specify an application name to run that command. Here's the list of running applications:"
97
+ controller.running_applications.each_with_index do |app, index|
98
+ $stderr.puts " #{index + 1}. #{app}"
99
+ end
100
+ $stderr.puts "Usage: bluepill [app] cmd [options]"
101
+ exit(1)
102
+ else
103
+ # There are none running AND they aren't trying to start one
104
+ $stderr.puts "Error: There are no running bluepill daemons.\nTo start a bluepill daemon, use: bluepill load <config file>"
105
+ exit(2)
106
+ end
107
+ end
108
+
109
+ options[:command] = ARGV.shift
110
+
111
+ if options[:command] == "load"
112
+ file = ARGV.shift
113
+ if File.exists?(file)
114
+ # Restart the ruby interpreter for the config file so that anything loaded here
115
+ # does not stay in memory for the daemon
116
+ ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
117
+ load_path = File.expand_path("#{File.dirname(__FILE__)}/../lib")
118
+ file_path = File.expand_path(file)
119
+
120
+ exec(ruby, "-I#{load_path}", '-rbluepill', file_path)
121
+
122
+ else
123
+ $stderr.puts "Can't find file: #{file}"
124
+ end
125
+ else
126
+ target = ARGV.shift
127
+ controller.handle_command(options[:application], options[:command], target)
128
+ end
129
+
@@ -0,0 +1,3 @@
1
+ describe Bluepill::Logger do
2
+
3
+ end
@@ -0,0 +1,96 @@
1
+ describe Bluepill::Process do
2
+ subject do
3
+ Bluepill::Process.new(:proc_name, [],
4
+ :logger => Bluepill::Logger.new,
5
+ )
6
+ end
7
+ describe "#initialize" do
8
+ context "defaults" do
9
+ [
10
+ :start_command, :stop_command, :restart_command, :stdout, :stderr, :stdin,
11
+ :daemonize, :pid_file, :working_dir, :uid, :gid, :child_process_factory,
12
+ :pid_command, :auto_start, :supplementary_groups, :stop_signals
13
+ ].each do |attr|
14
+ its(attr) { should be_nil }
15
+ end
16
+ its(:monitor_children) { should be_false }
17
+ its(:cache_actual_pid) { should be_true }
18
+ its(:start_grace_time) { should eq 3 }
19
+ its(:stop_grace_time) { should eq 3 }
20
+ its(:restart_grace_time) { should eq 3 }
21
+ its(:on_start_timeout) { should eq "start" }
22
+ its(:environment) { should eq Hash[] }
23
+ end
24
+
25
+ context "overrides" do
26
+ subject { Bluepill::Process.new(:proc_name, [], :start_grace_time => 17) }
27
+ its(:start_grace_time) { should eq 17 }
28
+ end
29
+ end
30
+
31
+ describe "#start_process" do
32
+ it "functions" do
33
+ subject.stub(:start_command) { "/etc/init.d/script start" }
34
+ subject.stub(:on_start_timeout) { "freakout" }
35
+ subject.logger.stub(:warning)
36
+ subject.stub(:daemonize?) { false }
37
+
38
+ subject.should_receive(:with_timeout)
39
+ .with(3, "freakout")
40
+ .and_yield
41
+
42
+ Bluepill::System.should_receive(:execute_blocking)
43
+ .with("/etc/init.d/script start", subject.system_command_options)
44
+ .and_return(exit_code: 0)
45
+
46
+ subject.start_process
47
+ end
48
+
49
+ describe "#stop_process" do
50
+ it "functions" do
51
+ subject.stub(:stop_command) { "/etc/init.d/script stop" }
52
+ subject.logger.stub(:warning)
53
+ subject.should_receive(:with_timeout)
54
+ .with(3, "stop")
55
+ .and_yield
56
+
57
+ Bluepill::System.should_receive(:execute_blocking)
58
+ .with("/etc/init.d/script stop", subject.system_command_options)
59
+ .and_return(exit_code: 0)
60
+
61
+ subject.stop_process
62
+ end
63
+ end
64
+
65
+ describe "#restart_process" do
66
+ it "functions" do
67
+ subject.stub(:restart_command) { "/etc/init.d/script restart" }
68
+ subject.logger.stub(:warning)
69
+ subject.should_receive(:with_timeout)
70
+ .with(3, "restart")
71
+ .and_yield
72
+
73
+ Bluepill::System.should_receive(:execute_blocking)
74
+ .with("/etc/init.d/script restart", subject.system_command_options)
75
+ .and_return(exit_code: 0)
76
+
77
+ subject.restart_process
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "#with_timeout" do
83
+ let(:block) { proc { nil } }
84
+
85
+ before(:each) do
86
+ subject.logger.stub(:err)
87
+ Timeout.should_receive(:timeout).with(3.to_f, &block).and_raise(Timeout::Error)
88
+ end
89
+
90
+ it "proceeds to next_state on timeout." do
91
+ subject.should_receive(:dispatch!).with("state_override")
92
+ subject.with_timeout(3, "state_override", &block)
93
+ end
94
+ end
95
+
96
+ end
@@ -0,0 +1,24 @@
1
+ describe Bluepill::ProcessStatistics do
2
+ before(:each) do
3
+ @stats = Bluepill::ProcessStatistics.new
4
+ end
5
+
6
+ it "should record events" do
7
+ @stats.record_event('some event', 'some reason')
8
+ @stats.record_event('another event', 'another reason')
9
+ @stats.events.should have(2).events
10
+ end
11
+
12
+ it "should record #EVENTS_TO_PERSIST events" do
13
+ (2 * Bluepill::ProcessStatistics::EVENTS_TO_PERSIST).times do
14
+ @stats.record_event('some event', 'some reason')
15
+ end
16
+ @stats.events.should have(Bluepill::ProcessStatistics::EVENTS_TO_PERSIST).events
17
+ end
18
+
19
+ it "should return event history" do
20
+ @stats.record_event('some event', 'some reason')
21
+ @stats.to_s.should match(/some reason/)
22
+ @stats.to_s.should match(/event history/)
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ describe Bluepill::System do
2
+ describe :pid_alive? do
3
+ it "should be true if process responds to zero signal" do
4
+ Process.should_receive(:kill).with(0, 555).and_return(0)
5
+ Bluepill::System.should be_pid_alive(555)
6
+ end
7
+
8
+ it "should be false if process throws exception on zero signal" do
9
+ Process.should_receive(:kill).with(0, 555).and_raise(Errno::ESRCH)
10
+ Bluepill::System.should_not be_pid_alive(555)
11
+ end
12
+ end
13
+
14
+ describe :store do
15
+ it "should be Hash" do
16
+ Bluepill::System.store.should be_kind_of(Hash)
17
+ end
18
+
19
+ it "should return same Hash or every call" do
20
+ Bluepill::System.store.should be_equal(Bluepill::System.store)
21
+ end
22
+
23
+ it "should store assigned pairs" do
24
+ Bluepill::System.store[:somekey] = 10
25
+ Bluepill::System.store[:somekey].should be_eql(10)
26
+ end
27
+ end
28
+
29
+ describe :reset_data do
30
+ it 'should clear the #store' do
31
+ Bluepill::System.store[:anotherkey] = Faker::Lorem.sentence
32
+ Bluepill::System.reset_data
33
+ Bluepill::System.store.should be_empty
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ if RUBY_VERSION >= '1.9'
2
+ if ENV['ENABLE_SIMPLECOV']
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+ end
6
+ else
7
+ require 'rubygems'
8
+ end
9
+
10
+ require 'faker'
11
+ require 'rspec/core'
12
+
13
+ $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
14
+
15
+ require 'bluepill'
metadata ADDED
@@ -0,0 +1,302 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloud66-bluepill
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.62
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Arya Asemanfar
9
+ - Gary Tsang
10
+ - Rohith Ravi
11
+ - Cloud66
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+ date: 2013-04-19 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: daemons
19
+ requirement: !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 1.1.4
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.1.4
33
+ - !ruby/object:Gem::Dependency
34
+ name: state_machine
35
+ requirement: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.0
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: 1.1.0
49
+ - !ruby/object:Gem::Dependency
50
+ name: activesupport
51
+ requirement: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: 3.0.0
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: 3.0.0
65
+ - !ruby/object:Gem::Dependency
66
+ name: i18n
67
+ requirement: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: 0.5.0
73
+ type: :runtime
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: 0.5.0
81
+ - !ruby/object:Gem::Dependency
82
+ name: bundler
83
+ requirement: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: 1.0.10
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.10
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ! '!='
103
+ - !ruby/object:Gem::Version
104
+ version: 0.9.0
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '!='
111
+ - !ruby/object:Gem::Version
112
+ version: 0.9.0
113
+ - !ruby/object:Gem::Dependency
114
+ name: rspec
115
+ requirement: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ version: 2.12.0
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ~>
127
+ - !ruby/object:Gem::Version
128
+ version: 2.12.0
129
+ - !ruby/object:Gem::Dependency
130
+ name: rspec-core
131
+ requirement: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ~>
135
+ - !ruby/object:Gem::Version
136
+ version: 2.12.0
137
+ type: :development
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ~>
143
+ - !ruby/object:Gem::Version
144
+ version: 2.12.0
145
+ - !ruby/object:Gem::Dependency
146
+ name: rspec-expectations
147
+ requirement: !ruby/object:Gem::Requirement
148
+ none: false
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: 2.12.0
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ~>
159
+ - !ruby/object:Gem::Version
160
+ version: 2.12.0
161
+ - !ruby/object:Gem::Dependency
162
+ name: rspec-mocks
163
+ requirement: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ~>
167
+ - !ruby/object:Gem::Version
168
+ version: 2.12.0
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ~>
175
+ - !ruby/object:Gem::Version
176
+ version: 2.12.0
177
+ - !ruby/object:Gem::Dependency
178
+ name: faker
179
+ requirement: !ruby/object:Gem::Requirement
180
+ none: false
181
+ requirements:
182
+ - - ~>
183
+ - !ruby/object:Gem::Version
184
+ version: '0.9'
185
+ type: :development
186
+ prerelease: false
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ none: false
189
+ requirements:
190
+ - - ~>
191
+ - !ruby/object:Gem::Version
192
+ version: '0.9'
193
+ - !ruby/object:Gem::Dependency
194
+ name: yard
195
+ requirement: !ruby/object:Gem::Requirement
196
+ none: false
197
+ requirements:
198
+ - - ~>
199
+ - !ruby/object:Gem::Version
200
+ version: '0.7'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ~>
207
+ - !ruby/object:Gem::Version
208
+ version: '0.7'
209
+ description: Bluepill keeps your daemons up while taking up as little resources as
210
+ possible. After all you probably want the resources of your server to be used by
211
+ whatever daemons you are running rather than the thing that's supposed to make sure
212
+ they are brought back up, should they die or misbehave. Forked from http://github.com/arya/bluepill
213
+ email:
214
+ - entombedvirus@gmail.com
215
+ executables:
216
+ - bluepill
217
+ - bpsv
218
+ - sample_forking_server
219
+ extensions: []
220
+ extra_rdoc_files:
221
+ - LICENSE
222
+ - README.md
223
+ files:
224
+ - .gitignore
225
+ - .rspec
226
+ - DESIGN.md
227
+ - Gemfile
228
+ - LICENSE
229
+ - README.md
230
+ - Rakefile
231
+ - bin/bluepill
232
+ - bin/bpsv
233
+ - bin/sample_forking_server
234
+ - bluepill.gemspec
235
+ - examples/example.rb
236
+ - examples/new_example.rb
237
+ - examples/new_runit_example.rb
238
+ - examples/runit_example.rb
239
+ - lib/bluepill.rb
240
+ - lib/bluepill/application.rb
241
+ - lib/bluepill/application/client.rb
242
+ - lib/bluepill/application/server.rb
243
+ - lib/bluepill/condition_watch.rb
244
+ - lib/bluepill/controller.rb
245
+ - lib/bluepill/dsl.rb
246
+ - lib/bluepill/dsl/app_proxy.rb
247
+ - lib/bluepill/dsl/process_factory.rb
248
+ - lib/bluepill/dsl/process_proxy.rb
249
+ - lib/bluepill/group.rb
250
+ - lib/bluepill/logger.rb
251
+ - lib/bluepill/process.rb
252
+ - lib/bluepill/process_conditions.rb
253
+ - lib/bluepill/process_conditions/always_true.rb
254
+ - lib/bluepill/process_conditions/cpu_usage.rb
255
+ - lib/bluepill/process_conditions/file_time.rb
256
+ - lib/bluepill/process_conditions/http.rb
257
+ - lib/bluepill/process_conditions/mem_usage.rb
258
+ - lib/bluepill/process_conditions/process_condition.rb
259
+ - lib/bluepill/process_journal.rb
260
+ - lib/bluepill/process_statistics.rb
261
+ - lib/bluepill/socket.rb
262
+ - lib/bluepill/system.rb
263
+ - lib/bluepill/trigger.rb
264
+ - lib/bluepill/triggers/flapping.rb
265
+ - lib/bluepill/util/rotational_array.rb
266
+ - lib/bluepill/version.rb
267
+ - local-bluepill
268
+ - spec/lib/bluepill/logger_spec.rb
269
+ - spec/lib/bluepill/process_spec.rb
270
+ - spec/lib/bluepill/process_statistics_spec.rb
271
+ - spec/lib/bluepill/system_spec.rb
272
+ - spec/spec_helper.rb
273
+ homepage: http://github.com/arya/bluepill
274
+ licenses: []
275
+ post_install_message:
276
+ rdoc_options: []
277
+ require_paths:
278
+ - lib
279
+ required_ruby_version: !ruby/object:Gem::Requirement
280
+ none: false
281
+ requirements:
282
+ - - ! '>='
283
+ - !ruby/object:Gem::Version
284
+ version: '0'
285
+ required_rubygems_version: !ruby/object:Gem::Requirement
286
+ none: false
287
+ requirements:
288
+ - - ! '>='
289
+ - !ruby/object:Gem::Version
290
+ version: '0'
291
+ requirements: []
292
+ rubyforge_project:
293
+ rubygems_version: 1.8.24
294
+ signing_key:
295
+ specification_version: 3
296
+ summary: A process monitor written in Ruby with stability and minimalism in mind.
297
+ test_files:
298
+ - spec/lib/bluepill/logger_spec.rb
299
+ - spec/lib/bluepill/process_spec.rb
300
+ - spec/lib/bluepill/process_statistics_spec.rb
301
+ - spec/lib/bluepill/system_spec.rb
302
+ - spec/spec_helper.rb