god 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/Announce.txt +6 -6
  2. data/Gemfile +2 -0
  3. data/History.txt +19 -2
  4. data/{README.txt → LICENSE} +0 -37
  5. data/README.md +31 -0
  6. data/Rakefile +80 -38
  7. data/bin/god +21 -21
  8. data/doc/god.asciidoc +1487 -0
  9. data/doc/intro.asciidoc +20 -0
  10. data/ext/god/extconf.rb +3 -3
  11. data/ext/god/kqueue_handler.c +18 -18
  12. data/ext/god/netlink_handler.c +31 -31
  13. data/god.gemspec +24 -16
  14. data/lib/god.rb +261 -204
  15. data/lib/god/behavior.rb +14 -14
  16. data/lib/god/behaviors/clean_pid_file.rb +5 -5
  17. data/lib/god/behaviors/clean_unix_socket.rb +10 -10
  18. data/lib/god/behaviors/notify_when_flapping.rb +12 -12
  19. data/lib/god/cli/command.rb +59 -46
  20. data/lib/god/cli/run.rb +33 -37
  21. data/lib/god/cli/version.rb +6 -6
  22. data/lib/god/compat19.rb +1 -4
  23. data/lib/god/condition.rb +21 -21
  24. data/lib/god/conditions/always.rb +19 -6
  25. data/lib/god/conditions/complex.rb +18 -18
  26. data/lib/god/conditions/cpu_usage.rb +14 -14
  27. data/lib/god/conditions/degrading_lambda.rb +8 -8
  28. data/lib/god/conditions/disk_usage.rb +5 -5
  29. data/lib/god/conditions/flapping.rb +23 -23
  30. data/lib/god/conditions/http_response_code.rb +35 -19
  31. data/lib/god/conditions/lambda.rb +2 -2
  32. data/lib/god/conditions/memory_usage.rb +13 -13
  33. data/lib/god/conditions/process_exits.rb +14 -20
  34. data/lib/god/conditions/process_running.rb +16 -25
  35. data/lib/god/conditions/socket_responding.rb +132 -0
  36. data/lib/god/conditions/tries.rb +10 -10
  37. data/lib/god/configurable.rb +10 -10
  38. data/lib/god/contact.rb +20 -20
  39. data/lib/god/contacts/email.rb +7 -4
  40. data/lib/god/contacts/jabber.rb +1 -1
  41. data/lib/god/driver.rb +96 -64
  42. data/lib/god/errors.rb +9 -9
  43. data/lib/god/event_handler.rb +19 -19
  44. data/lib/god/event_handlers/dummy_handler.rb +4 -4
  45. data/lib/god/event_handlers/kqueue_handler.rb +3 -3
  46. data/lib/god/event_handlers/netlink_handler.rb +2 -2
  47. data/lib/god/logger.rb +13 -13
  48. data/lib/god/metric.rb +50 -22
  49. data/lib/god/process.rb +53 -52
  50. data/lib/god/registry.rb +7 -7
  51. data/lib/god/simple_logger.rb +14 -14
  52. data/lib/god/socket.rb +11 -11
  53. data/lib/god/sugar.rb +30 -15
  54. data/lib/god/sys_logger.rb +2 -2
  55. data/lib/god/system/portable_poller.rb +8 -8
  56. data/lib/god/system/process.rb +8 -8
  57. data/lib/god/system/slash_proc_poller.rb +13 -13
  58. data/lib/god/task.rb +237 -188
  59. data/lib/god/timeline.rb +5 -5
  60. data/lib/god/trigger.rb +11 -11
  61. data/lib/god/watch.rb +205 -53
  62. data/test/configs/child_events/child_events.god +5 -5
  63. data/test/configs/child_events/simple_server.rb +1 -1
  64. data/test/configs/child_polls/child_polls.god +4 -4
  65. data/test/configs/child_polls/simple_server.rb +4 -4
  66. data/test/configs/complex/complex.god +7 -7
  67. data/test/configs/complex/simple_server.rb +1 -1
  68. data/test/configs/contact/contact.god +1 -1
  69. data/test/configs/contact/simple_server.rb +1 -1
  70. data/test/configs/daemon_events/daemon_events.god +5 -5
  71. data/test/configs/daemon_events/simple_server.rb +1 -1
  72. data/test/configs/daemon_events/simple_server_stop.rb +1 -1
  73. data/test/configs/daemon_polls/daemon_polls.god +3 -3
  74. data/test/configs/daemon_polls/simple_server.rb +1 -1
  75. data/test/configs/degrading_lambda/degrading_lambda.god +3 -3
  76. data/test/configs/keepalive/keepalive.god +9 -0
  77. data/test/configs/keepalive/keepalive.rb +12 -0
  78. data/test/configs/lifecycle/lifecycle.god +2 -2
  79. data/test/configs/matias/matias.god +6 -6
  80. data/test/configs/real.rb +7 -7
  81. data/test/configs/running_load/running_load.god +2 -2
  82. data/test/configs/stop_options/simple_server.rb +1 -1
  83. data/test/configs/stress/simple_server.rb +1 -1
  84. data/test/configs/stress/stress.god +2 -2
  85. data/test/configs/task/task.god +5 -5
  86. data/test/configs/test.rb +7 -7
  87. data/test/helper.rb +8 -8
  88. data/test/test_behavior.rb +3 -3
  89. data/test/test_campfire.rb +1 -2
  90. data/test/test_condition.rb +10 -10
  91. data/test/test_conditions_disk_usage.rb +12 -12
  92. data/test/test_conditions_http_response_code.rb +24 -24
  93. data/test/test_conditions_process_running.rb +7 -7
  94. data/test/test_conditions_socket_responding.rb +122 -0
  95. data/test/test_conditions_tries.rb +12 -12
  96. data/test/test_contact.rb +19 -19
  97. data/test/test_driver.rb +17 -3
  98. data/test/test_event_handler.rb +12 -12
  99. data/test/test_god.rb +195 -117
  100. data/test/test_handlers_kqueue_handler.rb +4 -4
  101. data/test/test_jabber.rb +1 -1
  102. data/test/test_logger.rb +17 -17
  103. data/test/test_metric.rb +16 -16
  104. data/test/test_process.rb +47 -41
  105. data/test/test_prowl.rb +1 -1
  106. data/test/test_registry.rb +2 -2
  107. data/test/test_socket.rb +3 -3
  108. data/test/test_sugar.rb +7 -7
  109. data/test/test_system_portable_poller.rb +1 -1
  110. data/test/test_system_process.rb +5 -5
  111. data/test/test_task.rb +57 -57
  112. data/test/test_timeline.rb +8 -8
  113. data/test/test_trigger.rb +16 -16
  114. data/test/test_watch.rb +69 -62
  115. metadata +182 -69
  116. data/lib/god/dependency_graph.rb +0 -41
  117. data/lib/god/diagnostics.rb +0 -37
  118. data/test/test_dependency_graph.rb +0 -62
@@ -52,7 +52,7 @@ EXAMPLE
52
52
  The easiest way to understand how god will make your life better is by looking at a sample config file. The following configuration file is what I use at gravatar.com to keep the mongrels running:
53
53
 
54
54
  # run with: god -c /path/to/gravatar.god
55
- #
55
+ #
56
56
  # This is the actual config file used to keep the mongrels of
57
57
  # gravatar.com running.
58
58
 
@@ -61,7 +61,7 @@ RAILS_ROOT = "/Users/tom/dev/gravatar2"
61
61
  %w{8200 8201 8202}.each do |port|
62
62
  God.watch do |w|
63
63
  w.name = "gravatar2-mongrel-#{port}"
64
- w.interval = 30.seconds # default
64
+ w.interval = 30.seconds # default
65
65
  w.start = "mongrel_rails start -c #{RAILS_ROOT} -p #{port} \
66
66
  -P #{RAILS_ROOT}/log/mongrel.#{port}.pid -d"
67
67
  w.stop = "mongrel_rails stop -P #{RAILS_ROOT}/log/mongrel.#{port}.pid"
@@ -69,7 +69,7 @@ RAILS_ROOT = "/Users/tom/dev/gravatar2"
69
69
  w.start_grace = 10.seconds
70
70
  w.restart_grace = 10.seconds
71
71
  w.pid_file = File.join(RAILS_ROOT, "log/mongrel.#{port}.pid")
72
-
72
+
73
73
  w.behavior(:clean_pid_file)
74
74
 
75
75
  w.start_if do |start|
@@ -78,19 +78,19 @@ RAILS_ROOT = "/Users/tom/dev/gravatar2"
78
78
  c.running = false
79
79
  end
80
80
  end
81
-
81
+
82
82
  w.restart_if do |restart|
83
83
  restart.condition(:memory_usage) do |c|
84
84
  c.above = 150.megabytes
85
85
  c.times = [3, 5] # 3 out of 5 intervals
86
86
  end
87
-
87
+
88
88
  restart.condition(:cpu_usage) do |c|
89
89
  c.above = 50.percent
90
90
  c.times = 5
91
91
  end
92
92
  end
93
-
93
+
94
94
  # lifecycle
95
95
  w.lifecycle do |on|
96
96
  on.condition(:flapping) do |c|
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
@@ -1,3 +1,20 @@
1
+ == 0.12.0
2
+ * Minor Enhancements
3
+ * Add umask support
4
+ * Add socket response condition (#25)
5
+ * Don't require tests run as sudo under non-linux systems (#15)
6
+ * Add Bundler support
7
+ * Add keepalive simple conditional setups (#71)
8
+ * Better load command to act upon removed watches (#70)
9
+ * Add support for ssl in http_response_code condition (#36)
10
+ * New documentation at http://godrb.com
11
+ * Bug Fixes
12
+ * Use IO.print instead of IO.puts for thread safety (#35)
13
+ * Fix Slashproc poller for commands with spaces (#31)
14
+ * Various segfault and kernel panic fixes
15
+ * Fix SMTP Auth documentation (#29)
16
+ * Fix a bunch of tests that were failing on Ruby 1.9
17
+
1
18
  == 0.11.0 / 2010-07-01
2
19
  * Major Changes
3
20
  * Rewrite notification system to be more consistent and flexible.
@@ -119,7 +136,7 @@
119
136
  * Major Enhancements
120
137
  * Enable sending of arbitrary signals to a task or group via `god signal`
121
138
  * Bug Fixes
122
- * setup logging *after* loading a given config file when daemonized.
139
+ * setup logging *after* loading a given config file when daemonized.
123
140
  enables logging to the 'God.log_file' specified in a config file. [github.com/jnewland]
124
141
  * New Conditions
125
142
  * FileMtime < PollCondition - trigger on file mtime durations [github.com/jwilkins]
@@ -274,7 +291,7 @@
274
291
 
275
292
  * Minor Enhancement
276
293
  * Allow extra args to pass through to config file
277
-
294
+
278
295
  == 0.5.1 / 2007-10-08
279
296
 
280
297
  * Bug Fixes
@@ -1,40 +1,3 @@
1
- god
2
- by Tom Preston-Werner
3
- Kevin Clark (kqueue/netlink support)
4
-
5
- http://god.rubyforge.org
6
-
7
- == DESCRIPTION:
8
-
9
- God is an easy to configure, easy to extend monitoring framework written
10
- in Ruby.
11
-
12
- Keeping your server processes and tasks running should be a simple part of
13
- your deployment process. God aims to be the simplest, most powerful
14
- monitoring application available.
15
-
16
- == DOCUMENTATION:
17
-
18
- See online documentation at http://god.rubyforge.org
19
-
20
- == COMMUNITY:
21
-
22
- Sign up for the god mailing list at http://groups.google.com/group/god-rb
23
-
24
- == INSTALL:
25
-
26
- $ sudo gem install god
27
-
28
- == CONTRIBUTE:
29
-
30
- Latest code is available at http://github.com/mojombo/god
31
-
32
- The 'master' branch can be cloned with:
33
-
34
- $ git clone git://github.com/mojombo/god.git
35
-
36
- == LICENSE:
37
-
38
1
  (The MIT License)
39
2
 
40
3
  Copyright (c) 2007 Tom Preston-Werner
@@ -0,0 +1,31 @@
1
+ God: The Ruby Framework for Process Management
2
+ ==============================================
3
+
4
+ * Authors: Tom Preston-Werner, Kevin Clark, Eric Lindval
5
+ * Website: http://godrb.com
6
+
7
+ Description
8
+ -----------
9
+
10
+ God is an easy to configure, easy to extend monitoring framework written in
11
+ Ruby.
12
+
13
+ Keeping your server processes and tasks running should be a simple part of
14
+ your deployment process. God aims to be the simplest, most powerful monitoring
15
+ application available.
16
+
17
+ Documentation
18
+ -------------
19
+
20
+ See in-repo documentation at `REPO_ROOT/doc`.
21
+ See online documentation at http://godrb.com.
22
+
23
+ Community
24
+ ---------
25
+
26
+ Sign up for the god mailing list at http://groups.google.com/group/god-rb
27
+
28
+ License
29
+ -------
30
+
31
+ See LICENSE file.
data/Rakefile CHANGED
@@ -1,32 +1,41 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
+ require 'rdoc/task'
3
4
  require 'date'
4
5
 
5
- #############################################################################
6
- #
7
- # The name of the package
8
- #
9
- #############################################################################
10
-
11
- NAME = 'god'
12
-
13
6
  #############################################################################
14
7
  #
15
8
  # Helper functions
16
9
  #
17
10
  #############################################################################
18
11
 
19
- def source_version
20
- line = File.read("lib/#{NAME}.rb")[/^\s*VERSION\s*=\s*.*/]
12
+ def name
13
+ @name ||= Dir['*.gemspec'].first.split('.').first
14
+ end
15
+
16
+ def version
17
+ line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
21
18
  line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
22
19
  end
23
20
 
21
+ def date
22
+ Date.today.to_s
23
+ end
24
+
25
+ def rubyforge_project
26
+ name
27
+ end
28
+
24
29
  def gemspec_file
25
- "#{NAME}.gemspec"
30
+ "#{name}.gemspec"
26
31
  end
27
32
 
28
33
  def gem_file
29
- "#{NAME}-#{source_version}.gem"
34
+ "#{name}-#{version}.gem"
35
+ end
36
+
37
+ def replace_header(head, header_name)
38
+ head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
30
39
  end
31
40
 
32
41
  #############################################################################
@@ -44,7 +53,7 @@ Rake::TestTask.new(:test) do |test|
44
53
  test.verbose = true
45
54
  end
46
55
 
47
- desc "Generate and open coverage stats via rcov"
56
+ desc "Generate RCov test coverage and open in your browser"
48
57
  task :coverage do
49
58
  require 'rcov'
50
59
  sh "rm -fr coverage"
@@ -52,17 +61,17 @@ task :coverage do
52
61
  sh "open coverage/index.html"
53
62
  end
54
63
 
55
- require 'rake/rdoctask'
64
+ require 'rdoc/task'
56
65
  Rake::RDocTask.new do |rdoc|
57
66
  rdoc.rdoc_dir = 'rdoc'
58
- rdoc.title = "#{NAME} #{source_version}"
67
+ rdoc.title = "#{name} #{version}"
59
68
  rdoc.rdoc_files.include('README*')
60
69
  rdoc.rdoc_files.include('lib/**/*.rb')
61
70
  end
62
71
 
63
72
  desc "Open an irb session preloaded with this library"
64
73
  task :console do
65
- sh "irb -rubygems -r ./lib/#{NAME}.rb"
74
+ sh "irb -rubygems -r ./lib/#{name}.rb"
66
75
  end
67
76
 
68
77
  #############################################################################
@@ -72,7 +81,7 @@ end
72
81
  #############################################################################
73
82
 
74
83
  desc "Upload site to Rubyforge"
75
- task :site do
84
+ task :site_old do
76
85
  sh "scp -r site/* mojombo@god.rubyforge.org:/var/www/gforge-projects/god"
77
86
  end
78
87
 
@@ -81,44 +90,89 @@ task :site_edge do
81
90
  sh "scp -r site/* mojombo@god.rubyforge.org:/var/www/gforge-projects/god/edge"
82
91
  end
83
92
 
93
+ desc "Generate the new-style site"
94
+ task :site do
95
+ # Generate the dynamic parts of the site.
96
+ puts "Generating dynamic..."
97
+ require 'gollum'
98
+ wiki = Gollum::Wiki.new('.', :base_path => '/doc')
99
+ html = wiki.page('god', 'HEAD').formatted_data.gsub("\342\200\231", "'")
100
+ template = File.read('./site/index.template.html')
101
+ index = template.sub("{{ content }}", html)
102
+ File.open('./site/index.html', 'w') do |f|
103
+ f.write(index)
104
+ end
105
+
106
+ puts "Done. Opening in browser..."
107
+ sh "open site/index.html"
108
+ end
109
+
110
+ desc "Generate the new-style site"
111
+ task :site_release do
112
+ # Ensure the gh-pages dir exists so we can generate into it.
113
+ puts "Checking for gh-pages dir..."
114
+ unless File.exist?("./gh-pages")
115
+ puts "No gh-pages directory found. Run the following commands first:"
116
+ puts " `git clone git@github.com:mojombo/god gh-pages"
117
+ puts " `cd gh-pages"
118
+ puts " `git checkout gh-pages`"
119
+ exit(1)
120
+ end
121
+
122
+ # Copy the rest of the site over.
123
+ puts "Copying static..."
124
+ sh "cp -R site/* gh-pages/"
125
+
126
+ # Commit the changes
127
+ sha = `git log`.match(/[a-z0-9]{40}/)[0]
128
+ sh "cd gh-pages && git add . && git commit -m 'Updating to #{sha}.' && git push"
129
+ puts 'Done.'
130
+ end
84
131
  #############################################################################
85
132
  #
86
133
  # Packaging tasks
87
134
  #
88
135
  #############################################################################
89
136
 
137
+ desc "Create tag v#{version} and build and push #{gem_file} to Rubygems"
90
138
  task :release => :build do
91
139
  unless `git branch` =~ /^\* master$/
92
140
  puts "You must be on the master branch to release!"
93
141
  exit!
94
142
  end
95
- sh "git commit --allow-empty -a -m 'up to #{source_version}'"
96
- sh "git tag v#{source_version}"
97
- sh "git push origin master --tags"
98
- sh "gem push pkg/#{NAME}-#{source_version}.gem"
143
+ sh "git commit --allow-empty -a -m 'Release #{version}'"
144
+ sh "git tag v#{version}"
145
+ sh "git push origin master"
146
+ sh "git push origin v#{version}"
147
+ sh "gem push pkg/#{name}-#{version}.gem"
99
148
  end
100
149
 
150
+ desc "Build #{gem_file} into the pkg directory"
101
151
  task :build => :gemspec do
102
152
  sh "mkdir -p pkg"
103
153
  sh "gem build #{gemspec_file}"
104
154
  sh "mv #{gem_file} pkg"
105
155
  end
106
156
 
107
- task :gemspec => :validate do
157
+ desc "Generate #{gemspec_file}"
158
+ task :gemspec do
108
159
  # read spec file and split out manifest section
109
160
  spec = File.read(gemspec_file)
110
161
  head, manifest, tail = spec.split(" # = MANIFEST =\n")
111
162
 
112
- # replace version and date
113
- head.sub!(/\.version = '.*'/, ".version = '#{source_version}'")
114
- head.sub!(/\.date = '.*'/, ".date = '#{Date.today.to_s}'")
163
+ # replace name version and date
164
+ replace_header(head, :name)
165
+ replace_header(head, :version)
166
+ replace_header(head, :date)
167
+ #comment this out if your rubyforge_project has a different name
168
+ replace_header(head, :rubyforge_project)
115
169
 
116
170
  # determine file list from git ls-files
117
171
  files = `git ls-files`.
118
172
  split("\n").
119
173
  sort.
120
174
  reject { |file| file =~ /^\./ }.
121
- reject { |file| file =~ /^(examples|ideas|init|site)/ }.
175
+ reject { |file| file =~ /^(rdoc|pkg|examples|ideas|init|site)/ }.
122
176
  map { |file| " #{file}" }.
123
177
  join("\n")
124
178
 
@@ -128,15 +182,3 @@ task :gemspec => :validate do
128
182
  File.open(gemspec_file, 'w') { |io| io.write(spec) }
129
183
  puts "Updated #{gemspec_file}"
130
184
  end
131
-
132
- task :validate do
133
- libfiles = Dir['lib/*'] - ["lib/#{NAME}.rb", "lib/#{NAME}"]
134
- unless libfiles.empty?
135
- puts "Directory `lib` should only contain a `#{NAME}.rb` file and `#{NAME}` dir."
136
- exit!
137
- end
138
- unless Dir['VERSION*'].empty?
139
- puts "A `VERSION` file at root level violates Gem best practices."
140
- exit!
141
- end
142
- end
data/bin/god CHANGED
@@ -20,13 +20,13 @@ begin
20
20
  Usage:
21
21
  Starting:
22
22
  god [-c <config file>] [-p <port> | -b] [-P <file>] [-l <file>] [-D]
23
-
23
+
24
24
  Querying:
25
25
  god <command> <argument> [-p <port>]
26
26
  god <command> [-p <port>]
27
27
  god -v
28
28
  god -V (must be run as root to be accurate on Linux)
29
-
29
+
30
30
  Commands:
31
31
  start <task or group name> start task or group
32
32
  restart <task or group name> restart task or group
@@ -34,77 +34,77 @@ begin
34
34
  monitor <task or group name> monitor task or group
35
35
  unmonitor <task or group name> unmonitor task or group
36
36
  remove <task or group name> remove task or group from god
37
- load <file> load a config into a running god
37
+ load <file> [action] load a config into a running god
38
38
  log <task name> show realtime log for given task
39
39
  status [task or group name] show status
40
40
  signal <task or group name> <sig> signal all matching tasks
41
41
  quit stop god
42
42
  terminate stop god and all tasks
43
43
  check run self diagnostic
44
-
44
+
45
45
  Options:
46
46
  EOF
47
-
47
+
48
48
  opts.on("-cCONFIG", "--config-file CONFIG", "Configuration file") do |x|
49
49
  options[:config] = x
50
50
  end
51
-
51
+
52
52
  opts.on("-pPORT", "--port PORT", "Communications port (default 17165)") do |x|
53
53
  options[:port] = x
54
54
  end
55
-
55
+
56
56
  opts.on("-b", "--auto-bind", "Auto-bind to an unused port number") do
57
57
  options[:port] = "0"
58
58
  end
59
-
59
+
60
60
  opts.on("-PFILE", "--pid FILE", "Where to write the PID file") do |x|
61
61
  options[:pid] = x
62
62
  end
63
-
63
+
64
64
  opts.on("-lFILE", "--log FILE", "Where to write the log file") do |x|
65
65
  options[:log] = x
66
66
  end
67
-
67
+
68
68
  opts.on("-D", "--no-daemonize", "Don't daemonize") do
69
69
  options[:daemonize] = false
70
70
  end
71
-
71
+
72
72
  opts.on("-v", "--version", "Print the version number and exit") do
73
73
  options[:version] = true
74
74
  end
75
-
75
+
76
76
  opts.on("-V", "Print extended version and build information") do
77
77
  options[:info] = true
78
78
  end
79
-
79
+
80
80
  opts.on("--log-level LEVEL", "Log level [debug|info|warn|error|fatal]") do |x|
81
81
  options[:log_level] = x.to_sym
82
82
  end
83
-
83
+
84
84
  opts.on("--no-syslog", "Disable output to syslog") do
85
85
  options[:syslog] = false
86
86
  end
87
-
87
+
88
88
  opts.on("--attach PID", "Quit god when the attached process dies") do |x|
89
89
  options[:attach] = x
90
90
  end
91
-
91
+
92
92
  opts.on("--no-events", "Disable the event system") do
93
93
  options[:events] = false
94
94
  end
95
-
95
+
96
96
  opts.on("--bleakhouse", "Enable bleakhouse profiling") do
97
97
  options[:bleakhouse] = true
98
98
  end
99
99
  end
100
-
100
+
101
101
  opts.parse!
102
-
102
+
103
103
  # validate
104
104
  if options[:log_level] && ![:debug, :info, :warn, :error, :fatal].include?(options[:log_level])
105
105
  abort("Invalid log level '#{options[:log_level]}'")
106
106
  end
107
-
107
+
108
108
  # dispatch
109
109
  if !options[:config] && options[:version]
110
110
  require 'god'
@@ -129,4 +129,4 @@ rescue Exception => e
129
129
  puts e.message
130
130
  puts e.backtrace.join("\n")
131
131
  end
132
- end
132
+ end