textgoeshere-daemon-kit 0.1.8rc3

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 (185) hide show
  1. data/.gitignore +5 -0
  2. data/Configuration.txt +110 -0
  3. data/Deployment.txt +113 -0
  4. data/History.txt +124 -0
  5. data/Logging.txt +96 -0
  6. data/PostInstall.txt +6 -0
  7. data/README.rdoc +128 -0
  8. data/Rakefile +29 -0
  9. data/RuoteParticipants.txt +113 -0
  10. data/TODO.txt +27 -0
  11. data/bin/daemon-kit +18 -0
  12. data/config/website.yml +2 -0
  13. data/daemon-kit.gemspec +265 -0
  14. data/lib/daemon_kit/abstract_logger.rb +249 -0
  15. data/lib/daemon_kit/amqp.rb +39 -0
  16. data/lib/daemon_kit/application.rb +230 -0
  17. data/lib/daemon_kit/arguments.rb +165 -0
  18. data/lib/daemon_kit/commands/console.rb +38 -0
  19. data/lib/daemon_kit/commands/destroy.rb +10 -0
  20. data/lib/daemon_kit/commands/generate.rb +10 -0
  21. data/lib/daemon_kit/config.rb +113 -0
  22. data/lib/daemon_kit/console_daemon.rb +2 -0
  23. data/lib/daemon_kit/core_ext/configurable.rb +96 -0
  24. data/lib/daemon_kit/core_ext/string.rb +22 -0
  25. data/lib/daemon_kit/core_ext.rb +1 -0
  26. data/lib/daemon_kit/cron.rb +48 -0
  27. data/lib/daemon_kit/cucumber/world.rb +38 -0
  28. data/lib/daemon_kit/deployment/capistrano.rb +516 -0
  29. data/lib/daemon_kit/em.rb +43 -0
  30. data/lib/daemon_kit/error_handlers/base.rb +32 -0
  31. data/lib/daemon_kit/error_handlers/hoptoad.rb +180 -0
  32. data/lib/daemon_kit/exceptions.rb +15 -0
  33. data/lib/daemon_kit/generators/base.rb +60 -0
  34. data/lib/daemon_kit/generators.rb +67 -0
  35. data/lib/daemon_kit/initializer.rb +453 -0
  36. data/lib/daemon_kit/jabber.rb +171 -0
  37. data/lib/daemon_kit/nanite/agent.rb +77 -0
  38. data/lib/daemon_kit/nanite.rb +7 -0
  39. data/lib/daemon_kit/pid_file.rb +61 -0
  40. data/lib/daemon_kit/ruote_participants.rb +125 -0
  41. data/lib/daemon_kit/ruote_pseudo_participant.rb +68 -0
  42. data/lib/daemon_kit/ruote_workitem.rb +187 -0
  43. data/lib/daemon_kit/safety.rb +84 -0
  44. data/lib/daemon_kit/tasks/environment.rake +10 -0
  45. data/lib/daemon_kit/tasks/framework.rake +123 -0
  46. data/lib/daemon_kit/tasks/god.rake +62 -0
  47. data/lib/daemon_kit/tasks/log.rake +8 -0
  48. data/lib/daemon_kit/tasks/monit.rake +29 -0
  49. data/lib/daemon_kit/tasks.rb +2 -0
  50. data/lib/daemon_kit/vendor/thor-0.13.6/CHANGELOG.rdoc +89 -0
  51. data/lib/daemon_kit/vendor/thor-0.13.6/LICENSE +20 -0
  52. data/lib/daemon_kit/vendor/thor-0.13.6/README.rdoc +297 -0
  53. data/lib/daemon_kit/vendor/thor-0.13.6/Thorfile +69 -0
  54. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/create_file.rb +103 -0
  55. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/directory.rb +91 -0
  56. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/empty_directory.rb +134 -0
  57. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/file_manipulation.rb +223 -0
  58. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/inject_into_file.rb +104 -0
  59. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions.rb +296 -0
  60. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/base.rb +540 -0
  61. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/core_ext/file_binary_read.rb +9 -0
  62. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
  63. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/core_ext/ordered_hash.rb +100 -0
  64. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/error.rb +30 -0
  65. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/group.rb +271 -0
  66. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/invocation.rb +180 -0
  67. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser/argument.rb +67 -0
  68. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser/arguments.rb +150 -0
  69. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser/option.rb +128 -0
  70. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser/options.rb +169 -0
  71. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser.rb +4 -0
  72. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/rake_compat.rb +66 -0
  73. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/runner.rb +314 -0
  74. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/shell/basic.rb +239 -0
  75. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/shell/color.rb +108 -0
  76. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/shell.rb +83 -0
  77. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/task.rb +102 -0
  78. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/util.rb +224 -0
  79. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/version.rb +3 -0
  80. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor.rb +244 -0
  81. data/lib/daemon_kit/xmpp.rb +100 -0
  82. data/lib/daemon_kit.rb +59 -0
  83. data/lib/generators/daemon_kit/amqp/USAGE +5 -0
  84. data/lib/generators/daemon_kit/amqp/amqp_generator.rb +24 -0
  85. data/lib/generators/daemon_kit/amqp/templates/config/amqp.yml +28 -0
  86. data/lib/generators/daemon_kit/amqp/templates/config/pre-daemonize/amqp.rb +7 -0
  87. data/lib/generators/daemon_kit/amqp/templates/libexec/%app_name%-daemon.rb +37 -0
  88. data/lib/generators/daemon_kit/app/USAGE +7 -0
  89. data/lib/generators/daemon_kit/app/app_generator.rb +140 -0
  90. data/lib/generators/daemon_kit/app/templates/Gemfile +8 -0
  91. data/lib/generators/daemon_kit/app/templates/README.tt +58 -0
  92. data/lib/generators/daemon_kit/app/templates/Rakefile +6 -0
  93. data/lib/generators/daemon_kit/app/templates/bin/daemon.tt +7 -0
  94. data/lib/generators/daemon_kit/app/templates/config/arguments.rb +12 -0
  95. data/lib/generators/daemon_kit/app/templates/config/boot.rb +70 -0
  96. data/lib/generators/daemon_kit/app/templates/config/environment.rb.tt +26 -0
  97. data/lib/generators/daemon_kit/app/templates/config/environments/development.rb +2 -0
  98. data/lib/generators/daemon_kit/app/templates/config/environments/production.rb +5 -0
  99. data/lib/generators/daemon_kit/app/templates/config/environments/test.rb +2 -0
  100. data/lib/generators/daemon_kit/app/templates/config/post-daemonize/readme +5 -0
  101. data/lib/generators/daemon_kit/app/templates/config/pre-daemonize/readme +12 -0
  102. data/lib/generators/daemon_kit/app/templates/lib/%app_name%.rb +2 -0
  103. data/lib/generators/daemon_kit/app/templates/libexec/%app_name%-daemon.rb +18 -0
  104. data/lib/generators/daemon_kit/app/templates/script/console +3 -0
  105. data/lib/generators/daemon_kit/app/templates/script/destroy +3 -0
  106. data/lib/generators/daemon_kit/app/templates/script/generate +3 -0
  107. data/lib/generators/daemon_kit/capistrano/capistrano_generator.rb +26 -0
  108. data/lib/generators/daemon_kit/capistrano/templates/Capfile +10 -0
  109. data/lib/generators/daemon_kit/capistrano/templates/USAGE +10 -0
  110. data/lib/generators/daemon_kit/capistrano/templates/config/deploy/logrotate.erb +13 -0
  111. data/lib/generators/daemon_kit/capistrano/templates/config/deploy/production.rb.tt +6 -0
  112. data/lib/generators/daemon_kit/capistrano/templates/config/deploy/staging.rb.tt +6 -0
  113. data/lib/generators/daemon_kit/capistrano/templates/config/deploy.rb.tt +67 -0
  114. data/lib/generators/daemon_kit/capistrano/templates/config/environments/staging.rb +0 -0
  115. data/lib/generators/daemon_kit/cron/USAGE +5 -0
  116. data/lib/generators/daemon_kit/cron/cron_generator.rb +24 -0
  117. data/lib/generators/daemon_kit/cron/templates/config/pre-daemonize/cron.rb +11 -0
  118. data/lib/generators/daemon_kit/cron/templates/libexec/%app_name%-daemon.rb +43 -0
  119. data/lib/generators/daemon_kit/cucumber/USAGE +11 -0
  120. data/lib/generators/daemon_kit/cucumber/cucumber_generator.rb +45 -0
  121. data/lib/generators/daemon_kit/cucumber/templates/config/environments/cucumber.rb +2 -0
  122. data/lib/generators/daemon_kit/cucumber/templates/features/step_definitions/.empty_directory +0 -0
  123. data/lib/generators/daemon_kit/cucumber/templates/features/support/env.rb +7 -0
  124. data/lib/generators/daemon_kit/cucumber/templates/script/cucumber +7 -0
  125. data/lib/generators/daemon_kit/cucumber/templates/tasks/cucumber.rake +13 -0
  126. data/lib/generators/daemon_kit/nanite_agent/USAGE +5 -0
  127. data/lib/generators/daemon_kit/nanite_agent/nanite_agent_generator.rb +29 -0
  128. data/lib/generators/daemon_kit/nanite_agent/templates/config/nanite.yml +35 -0
  129. data/lib/generators/daemon_kit/nanite_agent/templates/config/pre-daemonize/nanite_agent.rb +6 -0
  130. data/lib/generators/daemon_kit/nanite_agent/templates/lib/actors/sample.rb +11 -0
  131. data/lib/generators/daemon_kit/nanite_agent/templates/libexec/%app_name%-daemon.rb +31 -0
  132. data/lib/generators/daemon_kit/rspec/USAGE +5 -0
  133. data/lib/generators/daemon_kit/rspec/rspec_generator.rb +20 -0
  134. data/lib/generators/daemon_kit/rspec/templates/spec/%app_name%_spec.rb +11 -0
  135. data/lib/generators/daemon_kit/rspec/templates/spec/spec.opts +1 -0
  136. data/lib/generators/daemon_kit/rspec/templates/spec/spec_helper.rb +23 -0
  137. data/lib/generators/daemon_kit/rspec/templates/tasks/rspec.rake +19 -0
  138. data/lib/generators/daemon_kit/ruote/USAGE +5 -0
  139. data/lib/generators/daemon_kit/ruote/ruote_generator.rb +29 -0
  140. data/lib/generators/daemon_kit/ruote/templates/config/amqp.yml +30 -0
  141. data/lib/generators/daemon_kit/ruote/templates/config/pre-daemonize/ruote.rb +13 -0
  142. data/lib/generators/daemon_kit/ruote/templates/config/ruote.yml +23 -0
  143. data/lib/generators/daemon_kit/ruote/templates/lib/%app_name%.rb +4 -0
  144. data/lib/generators/daemon_kit/ruote/templates/lib/sample.rb +26 -0
  145. data/lib/generators/daemon_kit/ruote/templates/libexec/%app_name%-daemon.rb +33 -0
  146. data/lib/generators/daemon_kit/test_unit/USAGE +5 -0
  147. data/lib/generators/daemon_kit/test_unit/templates/tasks/test_unit.rake +7 -0
  148. data/lib/generators/daemon_kit/test_unit/templates/test/%app_name%_test.rb.tt +9 -0
  149. data/lib/generators/daemon_kit/test_unit/templates/test/test_helper.rb +6 -0
  150. data/lib/generators/daemon_kit/test_unit/test_unit_generator.rb +20 -0
  151. data/lib/generators/daemon_kit/xmpp/templates/config/pre-daemonize/xmpp.rb +6 -0
  152. data/lib/generators/daemon_kit/xmpp/templates/config/xmpp.yml +29 -0
  153. data/lib/generators/daemon_kit/xmpp/templates/libexec/%app_name%-daemon.rb +27 -0
  154. data/lib/generators/daemon_kit/xmpp/xmpp_generator.rb +24 -0
  155. data/script/console +10 -0
  156. data/script/destroy +14 -0
  157. data/script/generate +14 -0
  158. data/script/txt2html +71 -0
  159. data/spec/abstract_logger_spec.rb +126 -0
  160. data/spec/argument_spec.rb +70 -0
  161. data/spec/config_spec.rb +83 -0
  162. data/spec/configurable_spec.rb +56 -0
  163. data/spec/daemon_kit_spec.rb +7 -0
  164. data/spec/error_handlers_spec.rb +23 -0
  165. data/spec/fixtures/env.yml +15 -0
  166. data/spec/fixtures/noenv.yml +4 -0
  167. data/spec/initializer_spec.rb +26 -0
  168. data/spec/spec.opts +1 -0
  169. data/spec/spec_helper.rb +27 -0
  170. data/tasks/cucumber.rake +13 -0
  171. data/tasks/rspec.rake +21 -0
  172. data/tasks/tests.rake +6 -0
  173. data/templates/god/god.erb +69 -0
  174. data/templates/monit/monit.erb +14 -0
  175. data/test/test_amqp_generator.rb +48 -0
  176. data/test/test_cron_generator.rb +45 -0
  177. data/test/test_daemon-kit_generator.rb +84 -0
  178. data/test/test_daemon_kit_config.rb +28 -0
  179. data/test/test_deploy_capistrano_generator.rb +48 -0
  180. data/test/test_generator_helper.rb +29 -0
  181. data/test/test_helper.rb +7 -0
  182. data/test/test_nanite_agent_generator.rb +49 -0
  183. data/test/test_ruote_generator.rb +51 -0
  184. data/test/test_test_unit_generator.rb +46 -0
  185. metadata +325 -0
@@ -0,0 +1,187 @@
1
+ module DaemonKit
2
+
3
+ # Dual purpose class that is a) responsible for parsing incoming workitems and
4
+ # delegating to the correct RuotePseudoParticipant, and b) wrapping the
5
+ # workitem hash into something a bit more digestable.
6
+ class RuoteWorkitem
7
+
8
+ class << self
9
+
10
+ # = Process incoming commands via an AMQP queue
11
+ #
12
+ # Expects a JSON workitem from ruote that has these fields set in
13
+ # fields key:
14
+ #
15
+ # {
16
+ # 'reply_queue' => 'queue to send replies to',
17
+ # 'params' => {
18
+ # 'command' => '/actor/method'
19
+ # }
20
+ # }
21
+ #
22
+ # == Notes on the command key:
23
+ #
24
+ # It looks like a resource, and will be treated as such. Is should
25
+ # be in the format of +/class/method+, and it will be passed the
26
+ # complete workitem as a hash.
27
+ #
28
+ # == Notes on replies
29
+ #
30
+ # Replies are sent back to the queue specified in the +reply_queue+ key.
31
+ #
32
+ # == Notes on errors
33
+ #
34
+ # Where daemon-kit detects errors in attempting to parse and delegate the
35
+ # workitems, it will reply to the engine and set the following field with
36
+ # the error information:
37
+ #
38
+ # daemon_kit.error
39
+ def process( transport, workitem )
40
+ # keep it singleton
41
+ @instance ||= new
42
+
43
+ work = parse( workitem )
44
+
45
+ # Invalid JSON... mmm
46
+ return if work.nil?
47
+
48
+ DaemonKit.logger.warn "Processing workitem that has timed out!" if work.timed_out?
49
+
50
+ target, method = parse_command( work )
51
+
52
+ if target.nil? || method.nil?
53
+ msg = "Missing target/method in command parameter, or command parameter missing"
54
+ DaemonKit.logger.error( msg )
55
+ work["__error__"] = msg
56
+
57
+ elsif target.public_methods.map { |m| m.to_s }.include?( method ) # 1.8.x => [ 'foo' ]
58
+ target.perform( method, work ) # 1.9.x => [ :foo ]
59
+
60
+ else
61
+ msg = "Workitem cannot be processes: '#{method}' not exposed by #{target.inspect}"
62
+ DaemonKit.logger.error( msg )
63
+ p [ :work, work.inspect ]
64
+ work["__error__"] = msg
65
+ end
66
+
67
+ reply_to_engine( transport, work )
68
+ end
69
+
70
+ # Extract the class and method name from the workitem, then pick the matching
71
+ # class from the registered list of participants
72
+ def parse_command( work )
73
+ return nil if work['params']['command'].nil?
74
+
75
+ _, klass, method = work['params']['command'].split('/')
76
+
77
+ instance = RuoteParticipants.instance.participants[ klass ]
78
+
79
+ if instance.nil?
80
+ msg = "No instance registered for #{klass}"
81
+ DaemonKit.logger.error( msg )
82
+ raise DaemonKit::MissingParticipant, msg
83
+ end
84
+
85
+ return instance, method
86
+ end
87
+
88
+ def reply_to_engine( transport, response )
89
+ send( "reply_via_#{transport}", response )
90
+ end
91
+
92
+ def reply_via_amqp( response )
93
+ DaemonKit.logger.debug("Replying to engine via AMQP with #{response.inspect}")
94
+ ::MQ.queue( response['params']['reply_queue'] ).publish( response.to_json )
95
+
96
+ response
97
+ end
98
+
99
+ def parse( workitem )
100
+ begin
101
+ return new( JSON.parse( workitem ) )
102
+ rescue JSON::ParserError => e
103
+ DaemonKit.logger.error "No valid JSON payload found in #{workitem}"
104
+ return nil
105
+ end
106
+ end
107
+ end
108
+
109
+ def initialize( workitem = {} )
110
+ @workitem = workitem
111
+ end
112
+
113
+ def fei
114
+ @workitem['fei']
115
+ end
116
+
117
+ def short_fei
118
+ @short_fei ||=
119
+ '(' + [
120
+ 'fei', self.fei['owfe_version'], self.fei['engine_id'],
121
+ self.fei['workflow_definition_url'], self.fei['workflow_definition_name'],
122
+ self.fei['workflow_definition_revision'], self.fei['wfid'],
123
+ self.fei['expression_name'], self.fei['expid']
124
+ ].join(' ') + ')'
125
+ end
126
+
127
+ def dispatch_time
128
+ @dispath_time ||= Time.parse( @workitem['dispatch_time'] )
129
+ end
130
+
131
+ def last_modified
132
+ @last_modified ||= Time.parse( @workitem['last_modified'] )
133
+ end
134
+
135
+ def participant_name
136
+ @workitem['participant_name']
137
+ end
138
+
139
+ def has_field?(a)
140
+ self.fields.keys.include?( a )
141
+ end
142
+
143
+ def fields
144
+ @workitem['fields'] ||= @workitem['attributes']
145
+ end
146
+
147
+ # backwards compatible..
148
+
149
+ alias :attributes :fields
150
+ alias :has_attribute? :has_field?
151
+
152
+
153
+ def []( key )
154
+ self.fields[ key ]
155
+ end
156
+
157
+ def []=( key, value )
158
+ self.fields[ key ] = value
159
+ end
160
+
161
+ def to_json
162
+ @workitem.to_json
163
+ end
164
+
165
+ # Look at the workitem payload and attempt to determine if this workitem
166
+ # has timed out or not. This method will only ever work if you used the
167
+ # +:timeout: parameter was set for the expression.
168
+ def timed_out?
169
+ key = fei['wfid'] + '__' + fei['expid']
170
+
171
+ if self.fields["__timeouts__"] && timeout = self.fields["__timeouts__"][ key ]
172
+ return Time.at( timeout.last ) < Time.now
173
+ end
174
+
175
+ return false
176
+ end
177
+
178
+ def method_missing( method_name, *args )
179
+ if self.fields.keys.include?( method_name.to_s )
180
+ return self.fields[ method_name.to_s ]
181
+ end
182
+
183
+ super
184
+ end
185
+
186
+ end
187
+ end
@@ -0,0 +1,84 @@
1
+ module DaemonKit
2
+ # Provides a wrapper for running code inside a 'safety net' Any
3
+ # exceptions raised inside a safety net is handled and reported via
4
+ # loggers, email or Hoptoad.
5
+ #
6
+ # The safety net can be configured via DaemonKit.config.safety,
7
+ # which holds the only instance of the safety net.
8
+ class Safety
9
+
10
+ # Who get's notified.
11
+ @handler = nil
12
+ attr_accessor :handler
13
+
14
+ # Registered error handlers
15
+ @error_handlers = {}
16
+ attr_reader :error_handlers
17
+
18
+ class << self
19
+
20
+ # Singleton
21
+ @instance = nil
22
+
23
+ def instance
24
+ @instance ||= new
25
+ end
26
+ private :new
27
+
28
+ # Run the provided block inside a safety net.
29
+ def run(&block)
30
+ self.instance.run(&block)
31
+ end
32
+
33
+ def register_error_handler( klass )
34
+ name = klass.to_s.split('::').last.downcase
35
+
36
+ DaemonKit.logger.debug( "Registering error handler '#{name}' (#{klass})" ) if DaemonKit.logger
37
+
38
+ instance.instance_eval( <<-EOF, __FILE__, __LINE__ )
39
+ def #{name}
40
+ @#{name} ||= #{klass}.instance
41
+ end
42
+ EOF
43
+ end
44
+ end
45
+
46
+ # Run the provided block inside a safety net.
47
+ def run(&block)
48
+ begin
49
+ block.call
50
+ rescue => e
51
+ # Log
52
+ DaemonKit.logger.fatal "Safety net caught exception: #{e.message}"
53
+ DaemonKit.logger.fatal "Backtrace: #{e.backtrace.join("\n ")}"
54
+
55
+ get_handler.handle_exception( e ) if get_handler
56
+ end
57
+ end
58
+
59
+ def get_handler
60
+ if @handler && self.respond_to?( @handler )
61
+ h = send( @handler )
62
+ return h if h.class.ancestors.include?( DaemonKit::ErrorHandlers::Base )
63
+ end
64
+
65
+ return nil
66
+ end
67
+ end
68
+ end
69
+
70
+ class Object
71
+ class << self
72
+ def safely(&block)
73
+ DaemonKit::Safety.run(&block)
74
+ end
75
+ end
76
+
77
+ def safely(&block)
78
+ DaemonKit::Safety.run(&block)
79
+ end
80
+ end
81
+
82
+ # Load our error handlers
83
+ require 'daemon_kit/error_handlers/base'
84
+ require 'daemon_kit/error_handlers/hoptoad'
@@ -0,0 +1,10 @@
1
+ task :environment do
2
+ $daemon_kit_rake_task = true
3
+
4
+ require 'config/environment'
5
+ end
6
+
7
+ task "Execute system commands in other tasks with sudo"
8
+ task :sudo do
9
+ $RAKE_USE_SUDO = true
10
+ end
@@ -0,0 +1,123 @@
1
+ namespace :daemon_kit do
2
+ namespace :freeze do
3
+ desc "Lock this application to the current gem (by unpacking it into vendor/daemon_kit)"
4
+ task :gems do
5
+ deps = %w()
6
+ require 'rubygems'
7
+ require 'rubygems/gem_runner'
8
+
9
+ kit = (version = ENV['VERSION']) ?
10
+ Gem.cache.find_name('daemon-kit', "= #{version}").first :
11
+ Gem.cache.find_name('daemon-kit').sort_by { |g| g.version }.last
12
+
13
+ version ||= kit.version
14
+
15
+ unless kit
16
+ puts "No daemon_kit gem #{version} is installed. Do 'gem list daemon-kit' to see what you have available."
17
+ exit
18
+ end
19
+
20
+ puts "Freezing the gem for DaemonKit #{kit.version}"
21
+ mkdir_p "vendor"
22
+
23
+ begin
24
+ chdir("vendor") do
25
+ kit.dependencies.select { |g| deps.include? g.name }.each do |g|
26
+ Gem::GemRunner.new.run(["unpack", g.name, "--version", g.version_requirements.to_s])
27
+ mv(Dir.glob("#{g.name}*").first, g.name)
28
+ end
29
+
30
+ Gem::GemRunner.new.run(["unpack", "daemon-kit", "--version", "=#{version}"])
31
+ FileUtils.mv(Dir.glob("daemon-kit*").first, "daemon-kit")
32
+ end
33
+ rescue Exception
34
+ rm_rf "vendor/daemon-kit"
35
+ raise
36
+ end
37
+ end
38
+
39
+ desc 'Lock to latest edge daemon_kit'
40
+ task :edge do
41
+ require 'open-uri'
42
+ #version = ENV["RELEASE"] || "edge"
43
+ commits = "http://github.com/api/v1/yaml/kennethkalmer/daemon-kit/commits/master"
44
+ url = "http://github.com/kennethkalmer/daemon-kit/zipball/master"
45
+
46
+ rm_rf "vendor/daemon-kit"
47
+
48
+ chdir 'vendor' do
49
+ latest_revision = YAML.load(open(commits))["commits"].first["id"]
50
+
51
+ puts "Downloading DaemonKit from #{url}"
52
+ File.open('daemon-kit.zip', 'wb') do |dst|
53
+ open url do |src|
54
+ while chunk = src.read(4096)
55
+ dst << chunk
56
+ end
57
+ end
58
+ end
59
+
60
+ puts 'Unpacking DaemonKit'
61
+ rm_rf 'daemon-kit'
62
+ `unzip daemon-kit.zip`
63
+ FileUtils.mv(Dir.glob("kennethkalmer-daemon-kit*").first, "daemon-kit")
64
+ %w(daemon-kit.zip).each do |goner|
65
+ rm_f goner
66
+ end
67
+
68
+ touch "REVISION_#{latest_revision}"
69
+ end
70
+ end
71
+
72
+ end
73
+
74
+ desc "Upgrade your local files for a daemon after upgrading daemon-kit"
75
+ task :upgrade => 'environment' do
76
+ # Run these
77
+ %w{ initializers rakefile scripts gemfile }.each do |t|
78
+ Rake::Task["daemon_kit:upgrade:#{t}"].invoke
79
+ end
80
+
81
+ puts
82
+ puts "#{DaemonKit.configuration.daemon_name} has been upgraded."
83
+ end
84
+
85
+ namespace :upgrade do
86
+ # Upgrade the initializers
87
+ task :initializers do
88
+ copy_framework_template( 'config', 'boot.rb' )
89
+
90
+ if File.directory?( File.join(DaemonKit.root, 'config', 'initializers') )
91
+ mv File.join(DaemonKit.root, 'config', 'initializers'), File.join(DAEMON_ROOT, 'config', 'pre-daemonize')
92
+ copy_framework_template( 'config', 'pre-daemonize', 'readme' )
93
+ end
94
+
95
+ unless File.directory?( File.join(DAEMON_ROOT, 'config', 'post-daemonize') )
96
+ mkdir_p File.join(DAEMON_ROOT, 'config', 'post-daemonize')
97
+ copy_framework_template( 'config', 'post-daemonize', 'readme' )
98
+ end
99
+ end
100
+
101
+ # Upgrade the Rakefile
102
+ task :rakefile do
103
+ copy_framework_template( 'Rakefile' )
104
+ end
105
+
106
+ # Upgrade the scripts
107
+ task :scripts do
108
+ %w{ console destroy generate }.each do |s|
109
+ copy_framework_template( "script", s )
110
+ end
111
+ end
112
+
113
+ # Upgrade the Gemfile
114
+ task :gemfile do
115
+ copy_framework_template( 'Gemfile' )
116
+ end
117
+ end
118
+ end
119
+
120
+ def copy_framework_template( *args )
121
+ src_dir = File.join(DaemonKit.framework_root, 'lib', 'generators', 'daemon_kit', 'app', 'templates')
122
+ cp File.join( src_dir, *args ), File.join( DaemonKit.root, *args )
123
+ end
@@ -0,0 +1,62 @@
1
+ require 'erb'
2
+
3
+ namespace :god do
4
+ desc "Generate a stub god config file template for the daemon"
5
+ task :template => 'environment' do
6
+ # Preserve local changes
7
+ if File.exists?( "#{DaemonKit.root}/config/god.erb" ) && ENV['FORCE'].nil?
8
+ puts "Template already exists, use FORCE=1 to overwrite."
9
+ exit 1
10
+ end
11
+
12
+ cp "#{DaemonKit.framework_root}/templates/god/god.erb", "#{DaemonKit.root}/config/god.erb"
13
+ end
14
+
15
+ desc "Parse the god config template into a god config file"
16
+ task :generate => 'environment' do
17
+
18
+ unless File.exists?( "#{DaemonKit.root}/config/god.erb" )
19
+ Rake::Task["god:template"].invoke
20
+ end
21
+
22
+ name = DaemonKit.configuration.daemon_name
23
+
24
+ File.open( "#{DaemonKit.root}/config/#{name}.god", "w+" ) do |f|
25
+ t = File.read( "#{DaemonKit.root}/config/god.erb" )
26
+ f.write( ERB.new( t ).result( binding ) )
27
+ end
28
+
29
+ puts "god config generated in config/#{name}.god"
30
+ end
31
+
32
+ desc "Load the god file into god"
33
+ task :load => 'environment' do
34
+ name = DaemonKit.configuration.daemon_name
35
+
36
+ sh "#{$RAKE_USE_SUDO ? 'sudo' : ''} god load #{DaemonKit.root}/config/#{name}.god"
37
+ end
38
+
39
+ desc "Refresh the god config file in the running god"
40
+ task :refresh => 'environment' do
41
+ name = DaemonKit.configuration.daemon_name
42
+
43
+ sh "#{$RAKE_USE_SUDO ? 'sudo' : ''} god unmonitor #{name}"
44
+ sh "#{$RAKE_USE_SUDO ? 'sudo' : ''} god remove #{name}"
45
+ sh "#{$RAKE_USE_SUDO ? 'sudo' : ''} god load #{DaemonKit.root}/config/#{name}.god"
46
+ sh "#{$RAKE_USE_SUDO ? 'sudo' : ''} god monitor #{name}"
47
+ end
48
+
49
+ desc "Start god monitoring of the config file"
50
+ task :monitor => 'environment' do
51
+ name = DaemonKit.configuration.daemon_name
52
+
53
+ sh "#{$RAKE_USE_SUDO ? 'sudo' : ''} god monitor #{name}"
54
+ end
55
+
56
+ desc "Stop god monitoring of the config file"
57
+ task :unmonitor => 'environment' do
58
+ name = DaemonKit.configuration.daemon_name
59
+
60
+ sh "#{$RAKE_USE_SUDO ? 'sudo' : ''} god unmonitor #{name}"
61
+ end
62
+ end