daemon-kit 0.1.7 → 0.1.7.4

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.
Files changed (80) hide show
  1. data/Configuration.txt +58 -0
  2. data/History.txt +24 -0
  3. data/Manifest.txt +50 -2
  4. data/PostInstall.txt +1 -1
  5. data/README.rdoc +7 -9
  6. data/Rakefile +2 -4
  7. data/TODO.txt +6 -5
  8. data/app_generators/daemon_kit/daemon_kit_generator.rb +5 -0
  9. data/app_generators/daemon_kit/templates/Rakefile +3 -1
  10. data/app_generators/daemon_kit/templates/bin/daemon.erb +1 -1
  11. data/app_generators/daemon_kit/templates/config/arguments.rb +12 -0
  12. data/app_generators/daemon_kit/templates/config/boot.rb +2 -2
  13. data/app_generators/daemon_kit/templates/script/console +3 -0
  14. data/app_generators/daemon_kit/templates/script/destroy +14 -0
  15. data/app_generators/daemon_kit/templates/script/generate +14 -0
  16. data/daemon_generators/amqp/templates/config/amqp.yml +5 -5
  17. data/daemon_generators/deploy_capistrano/deploy_capistrano_generator.rb +4 -23
  18. data/daemon_generators/deploy_capistrano/templates/USAGE +10 -0
  19. data/daemon_generators/deploy_capistrano/templates/config/deploy.rb +3 -1
  20. data/lib/daemon_kit.rb +33 -5
  21. data/lib/daemon_kit/amqp.rb +2 -1
  22. data/lib/daemon_kit/application.rb +136 -11
  23. data/lib/daemon_kit/arguments.rb +151 -0
  24. data/lib/daemon_kit/commands/console.rb +38 -0
  25. data/lib/daemon_kit/config.rb +1 -0
  26. data/lib/daemon_kit/console_daemon.rb +2 -0
  27. data/lib/daemon_kit/core_ext.rb +1 -0
  28. data/lib/daemon_kit/core_ext/string.rb +22 -0
  29. data/lib/daemon_kit/deployment/capistrano.rb +6 -9
  30. data/lib/daemon_kit/error_handlers/mail.rb +52 -15
  31. data/lib/daemon_kit/initializer.rb +95 -41
  32. data/lib/daemon_kit/pid_file.rb +61 -0
  33. data/lib/daemon_kit/tasks/environment.rake +5 -4
  34. data/lib/daemon_kit/tasks/framework.rake +15 -1
  35. data/lib/daemon_kit/tasks/god.rake +62 -0
  36. data/lib/daemon_kit/tasks/log.rake +8 -0
  37. data/lib/daemon_kit/tasks/monit.rake +29 -0
  38. data/spec/argument_spec.rb +51 -0
  39. data/spec/config_spec.rb +77 -0
  40. data/spec/daemon_kit_spec.rb +2 -2
  41. data/spec/error_handlers_spec.rb +23 -0
  42. data/spec/fixtures/env.yml +15 -0
  43. data/spec/fixtures/noenv.yml +4 -0
  44. data/spec/initializer_spec.rb +4 -3
  45. data/spec/spec_helper.rb +8 -11
  46. data/templates/god/god.erb +69 -0
  47. data/templates/monit/monit.erb +14 -0
  48. data/test/test_daemon-kit_generator.rb +6 -1
  49. data/test/test_deploy_capistrano_generator.rb +1 -2
  50. data/vendor/tmail-1.2.3/tmail.rb +5 -0
  51. data/vendor/tmail-1.2.3/tmail/address.rb +426 -0
  52. data/vendor/tmail-1.2.3/tmail/attachments.rb +46 -0
  53. data/vendor/tmail-1.2.3/tmail/base64.rb +46 -0
  54. data/vendor/tmail-1.2.3/tmail/compat.rb +41 -0
  55. data/vendor/tmail-1.2.3/tmail/config.rb +67 -0
  56. data/vendor/tmail-1.2.3/tmail/core_extensions.rb +63 -0
  57. data/vendor/tmail-1.2.3/tmail/encode.rb +581 -0
  58. data/vendor/tmail-1.2.3/tmail/header.rb +960 -0
  59. data/vendor/tmail-1.2.3/tmail/index.rb +9 -0
  60. data/vendor/tmail-1.2.3/tmail/interface.rb +1130 -0
  61. data/vendor/tmail-1.2.3/tmail/loader.rb +3 -0
  62. data/vendor/tmail-1.2.3/tmail/mail.rb +578 -0
  63. data/vendor/tmail-1.2.3/tmail/mailbox.rb +495 -0
  64. data/vendor/tmail-1.2.3/tmail/main.rb +6 -0
  65. data/vendor/tmail-1.2.3/tmail/mbox.rb +3 -0
  66. data/vendor/tmail-1.2.3/tmail/net.rb +248 -0
  67. data/vendor/tmail-1.2.3/tmail/obsolete.rb +132 -0
  68. data/vendor/tmail-1.2.3/tmail/parser.rb +1476 -0
  69. data/vendor/tmail-1.2.3/tmail/port.rb +379 -0
  70. data/vendor/tmail-1.2.3/tmail/quoting.rb +118 -0
  71. data/vendor/tmail-1.2.3/tmail/require_arch.rb +58 -0
  72. data/vendor/tmail-1.2.3/tmail/scanner.rb +49 -0
  73. data/vendor/tmail-1.2.3/tmail/scanner_r.rb +261 -0
  74. data/vendor/tmail-1.2.3/tmail/stringio.rb +280 -0
  75. data/vendor/tmail-1.2.3/tmail/utils.rb +337 -0
  76. data/vendor/tmail-1.2.3/tmail/version.rb +39 -0
  77. data/vendor/tmail.rb +13 -0
  78. metadata +57 -18
  79. data/daemon_generators/deploy_capistrano/USAGE +0 -5
  80. data/lib/daemon_kit/patches/force_kill_wait.rb +0 -120
@@ -0,0 +1,14 @@
1
+ #
2
+ # This monit configuration file is built from the monit wiki with some
3
+ # very basic checks on memory and CPU usage.
4
+ #
5
+ # See the man page at http://mmonit.com/monit/documentation/monit.html
6
+ # for more information.
7
+ #
8
+ check process <%= DaemonKit.configuration.daemon_name %> with pidfile <%= DaemonKit.configuration.pid_file %>
9
+ group daemons
10
+ start program = "/usr/bin/env DAEMON_ENV=<%= DaemonKit.env %> <%= DaemonKit.root %>/bin/<%= DaemonKit.configuration.daemon_name %> start"
11
+ stop program = "/usr/bin/env DAEMON_ENV=<%= DaemonKit.env %> <%= DaemonKit.root %>/bin/<%= DaemonKit.configuration.daemon_name %> stop"
12
+ if 5 restarts within 5 cycles then timeout
13
+ if cpu usage > 99% for 5 cycles then alert
14
+ if mem usage > 99% for 5 cycles then alert
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
2
 
3
3
  class TestDaemonKitGenerator < Test::Unit::TestCase
4
4
  include RubiGen::GeneratorTestHelper
5
-
5
+
6
6
  attr_reader :daemon_name
7
7
  def setup
8
8
  bare_setup
@@ -35,6 +35,7 @@ class TestDaemonKitGenerator < Test::Unit::TestCase
35
35
  assert_directory_exists "bin"
36
36
  assert_generated_file "bin/#{daemon_name}"
37
37
  assert_directory_exists "config"
38
+ assert_generated_file "config/arguments.rb"
38
39
  assert_generated_file "config/boot.rb"
39
40
  assert_generated_file "config/environment.rb"
40
41
  assert_generated_file "config/environments/development.rb"
@@ -49,6 +50,10 @@ class TestDaemonKitGenerator < Test::Unit::TestCase
49
50
  assert_directory_exists "libexec"
50
51
  assert_generated_file "libexec/#{daemon_name}-daemon.rb"
51
52
  assert_directory_exists "log"
53
+ assert_directory_exists "script"
54
+ assert_generated_file "script/console"
55
+ assert_generated_file "script/destroy"
56
+ assert_generated_file "script/generate"
52
57
  assert_directory_exists "spec"
53
58
  assert_directory_exists "tasks"
54
59
  assert_directory_exists "vendor"
@@ -27,8 +27,7 @@ class TestDeployCapistranoGenerator < Test::Unit::TestCase
27
27
  # bare_teardown - place this in teardown method to destroy the TMP_ROOT or APP_ROOT folder after each test
28
28
 
29
29
  def test_generator_without_options
30
- name = "myapp"
31
- run_generator('deploy_capistrano', [name], sources)
30
+ run_generator('deploy_capistrano', ['myapp'], sources)
32
31
  assert_generated_file "Capfile"
33
32
  assert_directory_exists "config"
34
33
  assert_generated_file "config/deploy.rb"
@@ -0,0 +1,5 @@
1
+ require 'tmail/version'
2
+ require 'tmail/mail'
3
+ require 'tmail/mailbox'
4
+ require 'tmail/core_extensions'
5
+ require 'tmail/net'
@@ -0,0 +1,426 @@
1
+ =begin rdoc
2
+
3
+ = Address handling class
4
+
5
+ =end
6
+ #--
7
+ # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
8
+ #
9
+ # Permission is hereby granted, free of charge, to any person obtaining
10
+ # a copy of this software and associated documentation files (the
11
+ # "Software"), to deal in the Software without restriction, including
12
+ # without limitation the rights to use, copy, modify, merge, publish,
13
+ # distribute, sublicense, and/or sell copies of the Software, and to
14
+ # permit persons to whom the Software is furnished to do so, subject to
15
+ # the following conditions:
16
+ #
17
+ # The above copyright notice and this permission notice shall be
18
+ # included in all copies or substantial portions of the Software.
19
+ #
20
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
+ #
28
+ # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
+ # with permission of Minero Aoki.
30
+ #++
31
+
32
+ require 'tmail/encode'
33
+ require 'tmail/parser'
34
+
35
+
36
+ module TMail
37
+
38
+ # = Class Address
39
+ #
40
+ # Provides a complete handling library for email addresses. Can parse a string of an
41
+ # address directly or take in preformatted addresses themselves. Allows you to add
42
+ # and remove phrases from the front of the address and provides a compare function for
43
+ # email addresses.
44
+ #
45
+ # == Parsing and Handling a Valid Address:
46
+ #
47
+ # Just pass the email address in as a string to Address.parse:
48
+ #
49
+ # email = TMail::Address.parse('Mikel Lindsaar <mikel@lindsaar.net>)
50
+ # #=> #<TMail::Address mikel@lindsaar.net>
51
+ # email.address
52
+ # #=> "mikel@lindsaar.net"
53
+ # email.local
54
+ # #=> "mikel"
55
+ # email.domain
56
+ # #=> "lindsaar.net"
57
+ # email.name # Aliased as phrase as well
58
+ # #=> "Mikel Lindsaar"
59
+ #
60
+ # == Detecting an Invalid Address
61
+ #
62
+ # If you want to check the syntactical validity of an email address, just pass it to
63
+ # Address.parse and catch any SyntaxError:
64
+ #
65
+ # begin
66
+ # TMail::Mail.parse("mikel 2@@@@@ me .com")
67
+ # rescue TMail::SyntaxError
68
+ # puts("Invalid Email Address Detected")
69
+ # else
70
+ # puts("Address is valid")
71
+ # end
72
+ # #=> "Invalid Email Address Detected"
73
+ class Address
74
+
75
+ include TextUtils #:nodoc:
76
+
77
+ # Sometimes you need to parse an address, TMail can do it for you and provide you with
78
+ # a fairly robust method of detecting a valid address.
79
+ #
80
+ # Takes in a string, returns a TMail::Address object.
81
+ #
82
+ # Raises a TMail::SyntaxError on invalid email format
83
+ def Address.parse( str )
84
+ Parser.parse :ADDRESS, special_quote_address(str)
85
+ end
86
+
87
+ def Address.special_quote_address(str) #:nodoc:
88
+ # Takes a string which is an address and adds quotation marks to special
89
+ # edge case methods that the RACC parser can not handle.
90
+ #
91
+ # Right now just handles two edge cases:
92
+ #
93
+ # Full stop as the last character of the display name:
94
+ # Mikel L. <mikel@me.com>
95
+ # Returns:
96
+ # "Mikel L." <mikel@me.com>
97
+ #
98
+ # Unquoted @ symbol in the display name:
99
+ # mikel@me.com <mikel@me.com>
100
+ # Returns:
101
+ # "mikel@me.com" <mikel@me.com>
102
+ #
103
+ # Any other address not matching these patterns just gets returned as is.
104
+ case
105
+ # This handles the missing "" in an older version of Apple Mail.app
106
+ # around the display name when the display name contains a '@'
107
+ # like 'mikel@me.com <mikel@me.com>'
108
+ # Just quotes it to: '"mikel@me.com" <mikel@me.com>'
109
+ when str =~ /\A([^"].+@.+[^"])\s(<.*?>)\Z/
110
+ return "\"#{$1}\" #{$2}"
111
+ # This handles cases where 'Mikel A. <mikel@me.com>' which is a trailing
112
+ # full stop before the address section. Just quotes it to
113
+ # '"Mikel A. <mikel@me.com>"
114
+ when str =~ /\A(.*?\.)\s(<.*?>)\Z/
115
+ return "\"#{$1}\" #{$2}"
116
+ else
117
+ str
118
+ end
119
+ end
120
+
121
+ def address_group? #:nodoc:
122
+ false
123
+ end
124
+
125
+ # Address.new(local, domain)
126
+ #
127
+ # Accepts:
128
+ #
129
+ # * local - Left of the at symbol
130
+ #
131
+ # * domain - Array of the domain split at the periods.
132
+ #
133
+ # For example:
134
+ #
135
+ # Address.new("mikel", ["lindsaar", "net"])
136
+ # #=> "#<TMail::Address mikel@lindsaar.net>"
137
+ def initialize( local, domain )
138
+ if domain
139
+ domain.each do |s|
140
+ raise SyntaxError, 'empty word in domain' if s.empty?
141
+ end
142
+ end
143
+
144
+ # This is to catch an unquoted "@" symbol in the local part of the
145
+ # address. Handles addresses like <"@"@me.com> and makes sure they
146
+ # stay like <"@"@me.com> (previously were becoming <@@me.com>)
147
+ if local && (local.join == '@' || local.join =~ /\A[^"].*?@.*?[^"]\Z/)
148
+ @local = "\"#{local.join}\""
149
+ else
150
+ @local = local
151
+ end
152
+
153
+ @domain = domain
154
+ @name = nil
155
+ @routes = []
156
+ end
157
+
158
+ # Provides the name or 'phrase' of the email address.
159
+ #
160
+ # For Example:
161
+ #
162
+ # email = TMail::Address.parse("Mikel Lindsaar <mikel@lindsaar.net>")
163
+ # email.name
164
+ # #=> "Mikel Lindsaar"
165
+ def name
166
+ @name
167
+ end
168
+
169
+ # Setter method for the name or phrase of the email
170
+ #
171
+ # For Example:
172
+ #
173
+ # email = TMail::Address.parse("mikel@lindsaar.net")
174
+ # email.name
175
+ # #=> nil
176
+ # email.name = "Mikel Lindsaar"
177
+ # email.to_s
178
+ # #=> "Mikel Lindsaar <mikel@me.com>"
179
+ def name=( str )
180
+ @name = str
181
+ @name = nil if str and str.empty?
182
+ end
183
+
184
+ #:stopdoc:
185
+ alias phrase name
186
+ alias phrase= name=
187
+ #:startdoc:
188
+
189
+ # This is still here from RFC 822, and is now obsolete per RFC2822 Section 4.
190
+ #
191
+ # "When interpreting addresses, the route portion SHOULD be ignored."
192
+ #
193
+ # It is still here, so you can access it.
194
+ #
195
+ # Routes return the route portion at the front of the email address, if any.
196
+ #
197
+ # For Example:
198
+ # email = TMail::Address.parse( "<@sa,@another:Mikel@me.com>")
199
+ # => #<TMail::Address Mikel@me.com>
200
+ # email.to_s
201
+ # => "<@sa,@another:Mikel@me.com>"
202
+ # email.routes
203
+ # => ["sa", "another"]
204
+ def routes
205
+ @routes
206
+ end
207
+
208
+ def inspect #:nodoc:
209
+ "#<#{self.class} #{address()}>"
210
+ end
211
+
212
+ # Returns the local part of the email address
213
+ #
214
+ # For Example:
215
+ #
216
+ # email = TMail::Address.parse("mikel@lindsaar.net")
217
+ # email.local
218
+ # #=> "mikel"
219
+ def local
220
+ return nil unless @local
221
+ return '""' if @local.size == 1 and @local[0].empty?
222
+ # Check to see if it is an array before trying to map it
223
+ if @local.respond_to?(:map)
224
+ @local.map {|i| quote_atom(i) }.join('.')
225
+ else
226
+ quote_atom(@local)
227
+ end
228
+ end
229
+
230
+ # Returns the domain part of the email address
231
+ #
232
+ # For Example:
233
+ #
234
+ # email = TMail::Address.parse("mikel@lindsaar.net")
235
+ # email.local
236
+ # #=> "lindsaar.net"
237
+ def domain
238
+ return nil unless @domain
239
+ join_domain(@domain)
240
+ end
241
+
242
+ # Returns the full specific address itself
243
+ #
244
+ # For Example:
245
+ #
246
+ # email = TMail::Address.parse("mikel@lindsaar.net")
247
+ # email.address
248
+ # #=> "mikel@lindsaar.net"
249
+ def spec
250
+ s = self.local
251
+ d = self.domain
252
+ if s and d
253
+ s + '@' + d
254
+ else
255
+ s
256
+ end
257
+ end
258
+
259
+ alias address spec
260
+
261
+ # Provides == function to the email. Only checks the actual address
262
+ # and ignores the name/phrase component
263
+ #
264
+ # For Example
265
+ #
266
+ # addr1 = TMail::Address.parse("My Address <mikel@lindsaar.net>")
267
+ # #=> "#<TMail::Address mikel@lindsaar.net>"
268
+ # addr2 = TMail::Address.parse("Another <mikel@lindsaar.net>")
269
+ # #=> "#<TMail::Address mikel@lindsaar.net>"
270
+ # addr1 == addr2
271
+ # #=> true
272
+ def ==( other )
273
+ other.respond_to? :spec and self.spec == other.spec
274
+ end
275
+
276
+ alias eql? ==
277
+
278
+ # Provides a unique hash value for this record against the local and domain
279
+ # parts, ignores the name/phrase value
280
+ #
281
+ # email = TMail::Address.parse("mikel@lindsaar.net")
282
+ # email.hash
283
+ # #=> 18767598
284
+ def hash
285
+ @local.hash ^ @domain.hash
286
+ end
287
+
288
+ # Duplicates a TMail::Address object returning the duplicate
289
+ #
290
+ # addr1 = TMail::Address.parse("mikel@lindsaar.net")
291
+ # addr2 = addr1.dup
292
+ # addr1.id == addr2.id
293
+ # #=> false
294
+ def dup
295
+ obj = self.class.new(@local.dup, @domain.dup)
296
+ obj.name = @name.dup if @name
297
+ obj.routes.replace @routes
298
+ obj
299
+ end
300
+
301
+ include StrategyInterface #:nodoc:
302
+
303
+ def accept( strategy, dummy1 = nil, dummy2 = nil ) #:nodoc:
304
+ unless @local
305
+ strategy.meta '<>' # empty return-path
306
+ return
307
+ end
308
+
309
+ spec_p = (not @name and @routes.empty?)
310
+ if @name
311
+ strategy.phrase @name
312
+ strategy.space
313
+ end
314
+ tmp = spec_p ? '' : '<'
315
+ unless @routes.empty?
316
+ tmp << @routes.map {|i| '@' + i }.join(',') << ':'
317
+ end
318
+ tmp << self.spec
319
+ tmp << '>' unless spec_p
320
+ strategy.meta tmp
321
+ strategy.lwsp ''
322
+ end
323
+
324
+ end
325
+
326
+
327
+ class AddressGroup
328
+
329
+ include Enumerable
330
+
331
+ def address_group?
332
+ true
333
+ end
334
+
335
+ def initialize( name, addrs )
336
+ @name = name
337
+ @addresses = addrs
338
+ end
339
+
340
+ attr_reader :name
341
+
342
+ def ==( other )
343
+ other.respond_to? :to_a and @addresses == other.to_a
344
+ end
345
+
346
+ alias eql? ==
347
+
348
+ def hash
349
+ map {|i| i.hash }.hash
350
+ end
351
+
352
+ def []( idx )
353
+ @addresses[idx]
354
+ end
355
+
356
+ def size
357
+ @addresses.size
358
+ end
359
+
360
+ def empty?
361
+ @addresses.empty?
362
+ end
363
+
364
+ def each( &block )
365
+ @addresses.each(&block)
366
+ end
367
+
368
+ def to_a
369
+ @addresses.dup
370
+ end
371
+
372
+ alias to_ary to_a
373
+
374
+ def include?( a )
375
+ @addresses.include? a
376
+ end
377
+
378
+ def flatten
379
+ set = []
380
+ @addresses.each do |a|
381
+ if a.respond_to? :flatten
382
+ set.concat a.flatten
383
+ else
384
+ set.push a
385
+ end
386
+ end
387
+ set
388
+ end
389
+
390
+ def each_address( &block )
391
+ flatten.each(&block)
392
+ end
393
+
394
+ def add( a )
395
+ @addresses.push a
396
+ end
397
+
398
+ alias push add
399
+
400
+ def delete( a )
401
+ @addresses.delete a
402
+ end
403
+
404
+ include StrategyInterface
405
+
406
+ def accept( strategy, dummy1 = nil, dummy2 = nil )
407
+ strategy.phrase @name
408
+ strategy.meta ':'
409
+ strategy.space
410
+ first = true
411
+ each do |mbox|
412
+ if first
413
+ first = false
414
+ else
415
+ strategy.meta ','
416
+ end
417
+ strategy.space
418
+ mbox.accept strategy
419
+ end
420
+ strategy.meta ';'
421
+ strategy.lwsp ''
422
+ end
423
+
424
+ end
425
+
426
+ end # module TMail