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.
- data/.gitignore +5 -0
- data/Configuration.txt +110 -0
- data/Deployment.txt +113 -0
- data/History.txt +124 -0
- data/Logging.txt +96 -0
- data/PostInstall.txt +6 -0
- data/README.rdoc +128 -0
- data/Rakefile +29 -0
- data/RuoteParticipants.txt +113 -0
- data/TODO.txt +27 -0
- data/bin/daemon-kit +18 -0
- data/config/website.yml +2 -0
- data/daemon-kit.gemspec +265 -0
- data/lib/daemon_kit/abstract_logger.rb +249 -0
- data/lib/daemon_kit/amqp.rb +39 -0
- data/lib/daemon_kit/application.rb +230 -0
- data/lib/daemon_kit/arguments.rb +165 -0
- data/lib/daemon_kit/commands/console.rb +38 -0
- data/lib/daemon_kit/commands/destroy.rb +10 -0
- data/lib/daemon_kit/commands/generate.rb +10 -0
- data/lib/daemon_kit/config.rb +113 -0
- data/lib/daemon_kit/console_daemon.rb +2 -0
- data/lib/daemon_kit/core_ext/configurable.rb +96 -0
- data/lib/daemon_kit/core_ext/string.rb +22 -0
- data/lib/daemon_kit/core_ext.rb +1 -0
- data/lib/daemon_kit/cron.rb +48 -0
- data/lib/daemon_kit/cucumber/world.rb +38 -0
- data/lib/daemon_kit/deployment/capistrano.rb +516 -0
- data/lib/daemon_kit/em.rb +43 -0
- data/lib/daemon_kit/error_handlers/base.rb +32 -0
- data/lib/daemon_kit/error_handlers/hoptoad.rb +180 -0
- data/lib/daemon_kit/exceptions.rb +15 -0
- data/lib/daemon_kit/generators/base.rb +60 -0
- data/lib/daemon_kit/generators.rb +67 -0
- data/lib/daemon_kit/initializer.rb +453 -0
- data/lib/daemon_kit/jabber.rb +171 -0
- data/lib/daemon_kit/nanite/agent.rb +77 -0
- data/lib/daemon_kit/nanite.rb +7 -0
- data/lib/daemon_kit/pid_file.rb +61 -0
- data/lib/daemon_kit/ruote_participants.rb +125 -0
- data/lib/daemon_kit/ruote_pseudo_participant.rb +68 -0
- data/lib/daemon_kit/ruote_workitem.rb +187 -0
- data/lib/daemon_kit/safety.rb +84 -0
- data/lib/daemon_kit/tasks/environment.rake +10 -0
- data/lib/daemon_kit/tasks/framework.rake +123 -0
- data/lib/daemon_kit/tasks/god.rake +62 -0
- data/lib/daemon_kit/tasks/log.rake +8 -0
- data/lib/daemon_kit/tasks/monit.rake +29 -0
- data/lib/daemon_kit/tasks.rb +2 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/CHANGELOG.rdoc +89 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/LICENSE +20 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/README.rdoc +297 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/Thorfile +69 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/create_file.rb +103 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/directory.rb +91 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/empty_directory.rb +134 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/file_manipulation.rb +223 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions/inject_into_file.rb +104 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/actions.rb +296 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/base.rb +540 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/core_ext/file_binary_read.rb +9 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/core_ext/ordered_hash.rb +100 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/error.rb +30 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/group.rb +271 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/invocation.rb +180 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser/argument.rb +67 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser/arguments.rb +150 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser/option.rb +128 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser/options.rb +169 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/parser.rb +4 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/rake_compat.rb +66 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/runner.rb +314 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/shell/basic.rb +239 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/shell/color.rb +108 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/shell.rb +83 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/task.rb +102 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/util.rb +224 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/version.rb +3 -0
- data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor.rb +244 -0
- data/lib/daemon_kit/xmpp.rb +100 -0
- data/lib/daemon_kit.rb +59 -0
- data/lib/generators/daemon_kit/amqp/USAGE +5 -0
- data/lib/generators/daemon_kit/amqp/amqp_generator.rb +24 -0
- data/lib/generators/daemon_kit/amqp/templates/config/amqp.yml +28 -0
- data/lib/generators/daemon_kit/amqp/templates/config/pre-daemonize/amqp.rb +7 -0
- data/lib/generators/daemon_kit/amqp/templates/libexec/%app_name%-daemon.rb +37 -0
- data/lib/generators/daemon_kit/app/USAGE +7 -0
- data/lib/generators/daemon_kit/app/app_generator.rb +140 -0
- data/lib/generators/daemon_kit/app/templates/Gemfile +8 -0
- data/lib/generators/daemon_kit/app/templates/README.tt +58 -0
- data/lib/generators/daemon_kit/app/templates/Rakefile +6 -0
- data/lib/generators/daemon_kit/app/templates/bin/daemon.tt +7 -0
- data/lib/generators/daemon_kit/app/templates/config/arguments.rb +12 -0
- data/lib/generators/daemon_kit/app/templates/config/boot.rb +70 -0
- data/lib/generators/daemon_kit/app/templates/config/environment.rb.tt +26 -0
- data/lib/generators/daemon_kit/app/templates/config/environments/development.rb +2 -0
- data/lib/generators/daemon_kit/app/templates/config/environments/production.rb +5 -0
- data/lib/generators/daemon_kit/app/templates/config/environments/test.rb +2 -0
- data/lib/generators/daemon_kit/app/templates/config/post-daemonize/readme +5 -0
- data/lib/generators/daemon_kit/app/templates/config/pre-daemonize/readme +12 -0
- data/lib/generators/daemon_kit/app/templates/lib/%app_name%.rb +2 -0
- data/lib/generators/daemon_kit/app/templates/libexec/%app_name%-daemon.rb +18 -0
- data/lib/generators/daemon_kit/app/templates/script/console +3 -0
- data/lib/generators/daemon_kit/app/templates/script/destroy +3 -0
- data/lib/generators/daemon_kit/app/templates/script/generate +3 -0
- data/lib/generators/daemon_kit/capistrano/capistrano_generator.rb +26 -0
- data/lib/generators/daemon_kit/capistrano/templates/Capfile +10 -0
- data/lib/generators/daemon_kit/capistrano/templates/USAGE +10 -0
- data/lib/generators/daemon_kit/capistrano/templates/config/deploy/logrotate.erb +13 -0
- data/lib/generators/daemon_kit/capistrano/templates/config/deploy/production.rb.tt +6 -0
- data/lib/generators/daemon_kit/capistrano/templates/config/deploy/staging.rb.tt +6 -0
- data/lib/generators/daemon_kit/capistrano/templates/config/deploy.rb.tt +67 -0
- data/lib/generators/daemon_kit/capistrano/templates/config/environments/staging.rb +0 -0
- data/lib/generators/daemon_kit/cron/USAGE +5 -0
- data/lib/generators/daemon_kit/cron/cron_generator.rb +24 -0
- data/lib/generators/daemon_kit/cron/templates/config/pre-daemonize/cron.rb +11 -0
- data/lib/generators/daemon_kit/cron/templates/libexec/%app_name%-daemon.rb +43 -0
- data/lib/generators/daemon_kit/cucumber/USAGE +11 -0
- data/lib/generators/daemon_kit/cucumber/cucumber_generator.rb +45 -0
- data/lib/generators/daemon_kit/cucumber/templates/config/environments/cucumber.rb +2 -0
- data/lib/generators/daemon_kit/cucumber/templates/features/step_definitions/.empty_directory +0 -0
- data/lib/generators/daemon_kit/cucumber/templates/features/support/env.rb +7 -0
- data/lib/generators/daemon_kit/cucumber/templates/script/cucumber +7 -0
- data/lib/generators/daemon_kit/cucumber/templates/tasks/cucumber.rake +13 -0
- data/lib/generators/daemon_kit/nanite_agent/USAGE +5 -0
- data/lib/generators/daemon_kit/nanite_agent/nanite_agent_generator.rb +29 -0
- data/lib/generators/daemon_kit/nanite_agent/templates/config/nanite.yml +35 -0
- data/lib/generators/daemon_kit/nanite_agent/templates/config/pre-daemonize/nanite_agent.rb +6 -0
- data/lib/generators/daemon_kit/nanite_agent/templates/lib/actors/sample.rb +11 -0
- data/lib/generators/daemon_kit/nanite_agent/templates/libexec/%app_name%-daemon.rb +31 -0
- data/lib/generators/daemon_kit/rspec/USAGE +5 -0
- data/lib/generators/daemon_kit/rspec/rspec_generator.rb +20 -0
- data/lib/generators/daemon_kit/rspec/templates/spec/%app_name%_spec.rb +11 -0
- data/lib/generators/daemon_kit/rspec/templates/spec/spec.opts +1 -0
- data/lib/generators/daemon_kit/rspec/templates/spec/spec_helper.rb +23 -0
- data/lib/generators/daemon_kit/rspec/templates/tasks/rspec.rake +19 -0
- data/lib/generators/daemon_kit/ruote/USAGE +5 -0
- data/lib/generators/daemon_kit/ruote/ruote_generator.rb +29 -0
- data/lib/generators/daemon_kit/ruote/templates/config/amqp.yml +30 -0
- data/lib/generators/daemon_kit/ruote/templates/config/pre-daemonize/ruote.rb +13 -0
- data/lib/generators/daemon_kit/ruote/templates/config/ruote.yml +23 -0
- data/lib/generators/daemon_kit/ruote/templates/lib/%app_name%.rb +4 -0
- data/lib/generators/daemon_kit/ruote/templates/lib/sample.rb +26 -0
- data/lib/generators/daemon_kit/ruote/templates/libexec/%app_name%-daemon.rb +33 -0
- data/lib/generators/daemon_kit/test_unit/USAGE +5 -0
- data/lib/generators/daemon_kit/test_unit/templates/tasks/test_unit.rake +7 -0
- data/lib/generators/daemon_kit/test_unit/templates/test/%app_name%_test.rb.tt +9 -0
- data/lib/generators/daemon_kit/test_unit/templates/test/test_helper.rb +6 -0
- data/lib/generators/daemon_kit/test_unit/test_unit_generator.rb +20 -0
- data/lib/generators/daemon_kit/xmpp/templates/config/pre-daemonize/xmpp.rb +6 -0
- data/lib/generators/daemon_kit/xmpp/templates/config/xmpp.yml +29 -0
- data/lib/generators/daemon_kit/xmpp/templates/libexec/%app_name%-daemon.rb +27 -0
- data/lib/generators/daemon_kit/xmpp/xmpp_generator.rb +24 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +71 -0
- data/spec/abstract_logger_spec.rb +126 -0
- data/spec/argument_spec.rb +70 -0
- data/spec/config_spec.rb +83 -0
- data/spec/configurable_spec.rb +56 -0
- data/spec/daemon_kit_spec.rb +7 -0
- data/spec/error_handlers_spec.rb +23 -0
- data/spec/fixtures/env.yml +15 -0
- data/spec/fixtures/noenv.yml +4 -0
- data/spec/initializer_spec.rb +26 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +27 -0
- data/tasks/cucumber.rake +13 -0
- data/tasks/rspec.rake +21 -0
- data/tasks/tests.rake +6 -0
- data/templates/god/god.erb +69 -0
- data/templates/monit/monit.erb +14 -0
- data/test/test_amqp_generator.rb +48 -0
- data/test/test_cron_generator.rb +45 -0
- data/test/test_daemon-kit_generator.rb +84 -0
- data/test/test_daemon_kit_config.rb +28 -0
- data/test/test_deploy_capistrano_generator.rb +48 -0
- data/test/test_generator_helper.rb +29 -0
- data/test/test_helper.rb +7 -0
- data/test/test_nanite_agent_generator.rb +49 -0
- data/test/test_ruote_generator.rb +51 -0
- data/test/test_test_unit_generator.rb +46 -0
- metadata +325 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require 'blather/client/client'
|
|
2
|
+
require 'blather/client/dsl'
|
|
3
|
+
|
|
4
|
+
module DaemonKit
|
|
5
|
+
# Thin wrapper around the blather DSL
|
|
6
|
+
class XMPP
|
|
7
|
+
include ::Blather::DSL
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
|
|
11
|
+
def run( &block )
|
|
12
|
+
DaemonKit.trap('INT') { ::EM.stop }
|
|
13
|
+
DaemonKit.trap('TERM') { ::EM.stop }
|
|
14
|
+
|
|
15
|
+
DaemonKit::EM.run {
|
|
16
|
+
|
|
17
|
+
xmpp = new
|
|
18
|
+
xmpp.instance_eval( &block )
|
|
19
|
+
xmpp.run
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def initialize
|
|
25
|
+
@config = DaemonKit::Config.load('xmpp')
|
|
26
|
+
|
|
27
|
+
if @config.enable_logging
|
|
28
|
+
Blather.logger = DaemonKit.logger
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
jid = if @config.resource
|
|
32
|
+
"#{@config.jabber_id}/#{@config.resource}"
|
|
33
|
+
else
|
|
34
|
+
@config.jabber_id
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
setup jid, @config.password
|
|
38
|
+
|
|
39
|
+
when_ready do
|
|
40
|
+
configure_roster!
|
|
41
|
+
become_available
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
return if @config['require_master'] == false
|
|
45
|
+
|
|
46
|
+
message do |m|
|
|
47
|
+
trusted?( m ) ? pass : halt
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def configure_roster!
|
|
52
|
+
DaemonKit.logger.debug 'Configuring roster'
|
|
53
|
+
|
|
54
|
+
my_roster.each do |(jid, item)|
|
|
55
|
+
unless contacts.include?( jid )
|
|
56
|
+
DaemonKit.logger.debug "Removing #{jid} from roster"
|
|
57
|
+
|
|
58
|
+
my_roster.delete( item.jid )
|
|
59
|
+
next
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
contacts.each do |jid|
|
|
64
|
+
DaemonKit.logger.debug "Adding #{jid} to roster"
|
|
65
|
+
|
|
66
|
+
my_roster.add( Blather::JID.new( jid ) )
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
my_roster.each do |(jid,item)|
|
|
70
|
+
item.subscription = :both
|
|
71
|
+
item.ask = :subscribe
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def become_available
|
|
76
|
+
set_status( :chat, "#{DaemonKit.configuration.daemon_name} is available" )
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def trusted?( message )
|
|
80
|
+
@config.masters.include?( message.from.stripped.to_s )
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def contacts
|
|
84
|
+
@config.masters + @config.supporters
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def run
|
|
88
|
+
client.run
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def busy( message = nil, &block )
|
|
92
|
+
set_status( :dnd, message )
|
|
93
|
+
|
|
94
|
+
block.call
|
|
95
|
+
|
|
96
|
+
become_available
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
end
|
|
100
|
+
end
|
data/lib/daemon_kit.rb
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Seems we need to load openssl before em or there are failures all around.
|
|
2
|
+
# But we need to consider that people might not have ssl in the first place.
|
|
3
|
+
begin
|
|
4
|
+
require 'openssl'
|
|
5
|
+
rescue LoadError
|
|
6
|
+
end
|
|
7
|
+
require 'eventmachine'
|
|
8
|
+
|
|
9
|
+
require File.dirname(__FILE__) + '/daemon_kit/core_ext'
|
|
10
|
+
require File.dirname(__FILE__) + '/daemon_kit/exceptions'
|
|
11
|
+
|
|
12
|
+
$:.unshift( File.dirname(__FILE__).to_absolute_path ) unless
|
|
13
|
+
$:.include?( File.dirname(__FILE__).to_absolute_path )
|
|
14
|
+
|
|
15
|
+
module DaemonKit
|
|
16
|
+
VERSION = '0.1.8rc3'
|
|
17
|
+
|
|
18
|
+
autoload :Initializer, 'daemon_kit/initializer'
|
|
19
|
+
autoload :Application, 'daemon_kit/application'
|
|
20
|
+
autoload :Arguments, 'daemon_kit/arguments'
|
|
21
|
+
autoload :Config, 'daemon_kit/config'
|
|
22
|
+
autoload :Safety, 'daemon_kit/safety'
|
|
23
|
+
autoload :PidFile, 'daemon_kit/pid_file'
|
|
24
|
+
autoload :AbstractLogger, 'daemon_kit/abstract_logger'
|
|
25
|
+
autoload :EM, 'daemon_kit/em'
|
|
26
|
+
autoload :Configurable, 'daemon_kit/core_ext/configurable'
|
|
27
|
+
autoload :Generators, 'daemon_kit/generators'
|
|
28
|
+
|
|
29
|
+
autoload :Cron, 'daemon_kit/cron'
|
|
30
|
+
autoload :Jabber, 'daemon_kit/jabber'
|
|
31
|
+
autoload :AMQP, 'daemon_kit/amqp'
|
|
32
|
+
autoload :Nanite, 'daemon_kit/nanite'
|
|
33
|
+
autoload :RuoteParticipants, 'daemon_kit/ruote_participants'
|
|
34
|
+
autoload :RuoteWorkitem, 'daemon_kit/ruote_workitem'
|
|
35
|
+
autoload :RuotePseudoParticipant, 'daemon_kit/ruote_pseudo_participant'
|
|
36
|
+
autoload :XMPP, 'daemon_kit/xmpp'
|
|
37
|
+
|
|
38
|
+
class << self
|
|
39
|
+
def logger
|
|
40
|
+
@logger
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def logger=( logger )
|
|
44
|
+
@logger = logger
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def root
|
|
48
|
+
DAEMON_ROOT
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def env
|
|
52
|
+
DAEMON_ENV
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def framework_root
|
|
56
|
+
@framework_root ||= File.join( File.dirname(__FILE__), '..' ).to_absolute_path
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module DaemonKit
|
|
2
|
+
module Generators
|
|
3
|
+
class AmqpGenerator < Base
|
|
4
|
+
|
|
5
|
+
def update_gemfile
|
|
6
|
+
append_file 'Gemfile', "gem 'amqp'\n"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def create_config_files
|
|
10
|
+
directory 'config'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def create_daemon
|
|
14
|
+
directory 'libexec'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
|
|
19
|
+
def self.source_root
|
|
20
|
+
File.expand_path( File.join( File.dirname(__FILE__), 'templates') )
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# AMQP client configuration file
|
|
2
|
+
|
|
3
|
+
# These values will be used to configure the ampq gem, any values
|
|
4
|
+
# omitted will let the gem use it's own defaults.
|
|
5
|
+
|
|
6
|
+
# The configuration specifies the following keys:
|
|
7
|
+
# * user - Username for the broker
|
|
8
|
+
# * pass - Password for the broker
|
|
9
|
+
# * host - Hostname where the broker is running
|
|
10
|
+
# * vhost - Vhost to connect to
|
|
11
|
+
# * port - Port where the broker is running
|
|
12
|
+
# * ssl - Use ssl or not
|
|
13
|
+
# * timeout - Timeout
|
|
14
|
+
|
|
15
|
+
defaults: &defaults
|
|
16
|
+
user: guest
|
|
17
|
+
pass: guest
|
|
18
|
+
host: localhost
|
|
19
|
+
vhost: /
|
|
20
|
+
|
|
21
|
+
development:
|
|
22
|
+
<<: *defaults
|
|
23
|
+
|
|
24
|
+
test:
|
|
25
|
+
<<: *defaults
|
|
26
|
+
|
|
27
|
+
production:
|
|
28
|
+
<<: *defaults
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Generated amqp daemon
|
|
2
|
+
|
|
3
|
+
# Do your post daemonization configuration here
|
|
4
|
+
# At minimum you need just the first line (without the block), or a lot
|
|
5
|
+
# of strange things might start happening...
|
|
6
|
+
DaemonKit::Application.running! do |config|
|
|
7
|
+
# Trap signals with blocks or procs
|
|
8
|
+
# config.trap( 'INT' ) do
|
|
9
|
+
# # do something clever
|
|
10
|
+
# end
|
|
11
|
+
# config.trap( 'TERM', Proc.new { puts 'Going down' } )
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# IMPORTANT CONFIGURATION NOTE
|
|
15
|
+
#
|
|
16
|
+
# Please review and update 'config/amqp.yml' accordingly or this
|
|
17
|
+
# daemon won't work as advertised.
|
|
18
|
+
|
|
19
|
+
# Run an event-loop for processing
|
|
20
|
+
DaemonKit::AMQP.run do
|
|
21
|
+
# Inside this block we're running inside the reactor setup by the
|
|
22
|
+
# amqp gem. Any code in the examples (from the gem) would work just
|
|
23
|
+
# fine here.
|
|
24
|
+
|
|
25
|
+
# Uncomment this for connection keep-alive
|
|
26
|
+
# AMQP.conn.connection_status do |status|
|
|
27
|
+
# DaemonKit.logger.debug("AMQP connection status changed: #{status}")
|
|
28
|
+
# if status == :disconnected
|
|
29
|
+
# AMQP.conn.reconnect(true)
|
|
30
|
+
# end
|
|
31
|
+
# end
|
|
32
|
+
|
|
33
|
+
amq = ::MQ.new
|
|
34
|
+
amq.queue('test').subscribe do |msg|
|
|
35
|
+
DaemonKit.logger.debug "Received message: #{msg.inspect}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
This generator creates a new skeleton project suitable for easy
|
|
3
|
+
Ruby daemon development. The generated project is preconfigured
|
|
4
|
+
and just requires your task specific code.
|
|
5
|
+
|
|
6
|
+
Use one of the provided generators to stub out even more
|
|
7
|
+
functionality for common daemon patterns.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
module DaemonKit
|
|
2
|
+
module Generators
|
|
3
|
+
class AppGenerator < Base
|
|
4
|
+
INSTALLERS = %w( default amqp cron nanite_agent ruote xmpp )
|
|
5
|
+
DEPLOYERS = %w( capistrano )
|
|
6
|
+
TEST_FRAMEWORKS = %w( none rspec test_unit )
|
|
7
|
+
add_shebang_option!
|
|
8
|
+
|
|
9
|
+
argument :app_path, :type => :string
|
|
10
|
+
|
|
11
|
+
class_option :installer, :type => :string, :aliases => '-i', :default => 'default',
|
|
12
|
+
:desc => "Pre-configured daemon to generate (options: #{INSTALLERS.join(', ')})"
|
|
13
|
+
|
|
14
|
+
class_option :deployer, :type => :string, :aliases => '-d',
|
|
15
|
+
:desc => "Select an optional deployment mechanism (options: #{DEPLOYERS.join(', ')})"
|
|
16
|
+
|
|
17
|
+
class_option :test_framework, :type => :string, :aliases => '-t', :default => 'rspec',
|
|
18
|
+
:desc => "Select your prefered test framework (options: #{TEST_FRAMEWORKS.join(', ')})"
|
|
19
|
+
|
|
20
|
+
class_option :cucumber, :type => :boolean, :aliases => '-c', :default => false,
|
|
21
|
+
:desc => "Install cucumber support"
|
|
22
|
+
|
|
23
|
+
def initialize( *args )
|
|
24
|
+
super
|
|
25
|
+
|
|
26
|
+
unless INSTALLERS.include?( options[:installer] )
|
|
27
|
+
raise Error, "Invalid value for --installer option. Supported installers are: #{INSTALLERS.join(', ')}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
if options[:deployer] && !DEPLOYERS.include?( options[:deployer] )
|
|
31
|
+
raise Error, "Invalid value for --deployer option. Supported deployers are: #{DEPLOYERS.join(', ')}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
unless TEST_FRAMEWORKS.include?( options[:test_framework] )
|
|
35
|
+
raise Error, "Invalid value for --test_framework option. Supported frameworks are: #{TEST_FRAMEWORKS.join(', ')}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def create_root
|
|
40
|
+
self.destination_root = File.expand_path( app_path, destination_root )
|
|
41
|
+
empty_directory('.')
|
|
42
|
+
FileUtils.cd( destination_root )
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def create_root_files
|
|
46
|
+
template 'README.tt', 'README'
|
|
47
|
+
copy_file 'Rakefile'
|
|
48
|
+
copy_file 'Gemfile'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def create_bin_files
|
|
52
|
+
empty_directory 'bin'
|
|
53
|
+
template 'bin/daemon.tt', "bin/#{app_name}" do |content|
|
|
54
|
+
"#{shebang}\n" + content
|
|
55
|
+
end
|
|
56
|
+
chmod "bin", 0755, :verbose => false
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def create_config_files
|
|
60
|
+
directory 'config'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def create_script_files
|
|
64
|
+
directory 'script' do |content|
|
|
65
|
+
"#{shebang}\n" + content
|
|
66
|
+
end
|
|
67
|
+
chmod 'script', 0755, :verbose => false
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def create_task_directory
|
|
71
|
+
empty_directory 'tasks'
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def create_log_directory
|
|
75
|
+
empty_directory 'log'
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def create_tmp_directory
|
|
79
|
+
empty_directory 'tmp'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def create_vendor_directory
|
|
83
|
+
empty_directory 'vendor'
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def create_lib_files
|
|
87
|
+
directory 'lib'
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def create_lib_exec
|
|
91
|
+
case options[:installer]
|
|
92
|
+
when 'default'
|
|
93
|
+
directory 'libexec'
|
|
94
|
+
when 'amqp'
|
|
95
|
+
invoke DaemonKit::Generators::AmqpGenerator
|
|
96
|
+
when 'cron'
|
|
97
|
+
invoke DaemonKit::Generators::CronGenerator
|
|
98
|
+
when 'nanite_agent'
|
|
99
|
+
invoke DaemonKit::Generators::NaniteAgentGenerator
|
|
100
|
+
when 'ruote'
|
|
101
|
+
invoke DaemonKit::Generators::RuoteGenerator
|
|
102
|
+
when 'xmpp'
|
|
103
|
+
invoke DaemonKit::Generators::XmppGenerator
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def create_deployment_config
|
|
108
|
+
return unless options[:deployer]
|
|
109
|
+
|
|
110
|
+
case options[:deployer]
|
|
111
|
+
when 'capistrano'
|
|
112
|
+
invoke DaemonKit::Generators::CapistranoGenerator
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def create_test_environment
|
|
117
|
+
return if options[:test_framework] == 'none'
|
|
118
|
+
|
|
119
|
+
case options[:test_framework]
|
|
120
|
+
when 'rspec'
|
|
121
|
+
invoke DaemonKit::Generators::SpecGenerator
|
|
122
|
+
when 'test_unit'
|
|
123
|
+
invoke DaemonKit::Generators::TestUnitGenerator
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def create_cucumber
|
|
128
|
+
return unless options.cucumber?
|
|
129
|
+
invoke DaemonKit::Generators::CucumberGenerator
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
protected
|
|
133
|
+
|
|
134
|
+
def self.source_root
|
|
135
|
+
File.expand_path( File.join( File.dirname(__FILE__), 'templates') )
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# If you need to 'vendor your gems' for deploying your daemons, bundler is a
|
|
2
|
+
# great option. Update this Gemfile with any additional dependencies and run
|
|
3
|
+
# 'gem bundle' to get them all unpacked in vendor/gems.
|
|
4
|
+
|
|
5
|
+
# daemon-kit
|
|
6
|
+
gem 'daemon-kit'
|
|
7
|
+
|
|
8
|
+
# For more information on bundler, please visit http://github.com/carlhuda/bundler
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
daemon-kit README
|
|
2
|
+
================
|
|
3
|
+
|
|
4
|
+
daemon-kit has generated a skeleton Ruby daemon for you to build on. Please read
|
|
5
|
+
through this file to ensure you get going quickly.
|
|
6
|
+
|
|
7
|
+
Directories
|
|
8
|
+
===========
|
|
9
|
+
|
|
10
|
+
bin/
|
|
11
|
+
<%= app_name %> - Stub executable to control your daemon with
|
|
12
|
+
|
|
13
|
+
config/
|
|
14
|
+
Environment configuration files
|
|
15
|
+
|
|
16
|
+
lib/
|
|
17
|
+
Place for your libraries
|
|
18
|
+
|
|
19
|
+
libexec/
|
|
20
|
+
<%= app_name %>.rb - Your daemon code
|
|
21
|
+
|
|
22
|
+
log/
|
|
23
|
+
Log files based on the environment name
|
|
24
|
+
|
|
25
|
+
spec/
|
|
26
|
+
rspec's home
|
|
27
|
+
|
|
28
|
+
tasks/
|
|
29
|
+
Place for rake tasks
|
|
30
|
+
|
|
31
|
+
vendor/
|
|
32
|
+
Place for unpacked gems and DaemonKit
|
|
33
|
+
|
|
34
|
+
tmp/
|
|
35
|
+
Scratch folder
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
Logging
|
|
39
|
+
=======
|
|
40
|
+
|
|
41
|
+
One of the biggest issues with writing daemons are getting insight into what your
|
|
42
|
+
daemons are doing. Logging with daemon-kit is simplified as DaemonKit creates log
|
|
43
|
+
files per environment in log.
|
|
44
|
+
|
|
45
|
+
On all environments except production the log level is set to DEBUG, but you can
|
|
46
|
+
toggle the log level by sending the running daemon SIGUSR1 and SIGUSR2 signals.
|
|
47
|
+
SIGUSR1 will toggle between DEBUG and INFO levels, SIGUSR2 will blatantly set the
|
|
48
|
+
level to DEBUG.
|
|
49
|
+
|
|
50
|
+
Bundler
|
|
51
|
+
=======
|
|
52
|
+
|
|
53
|
+
daemon-kit uses bundler to ease the nightmare of dependency loading in Ruby
|
|
54
|
+
projects. daemon-kit and its generators all create/update the Gemfile in the
|
|
55
|
+
root of the daemon. You can satisfy the project's dependencies by running
|
|
56
|
+
`bundle install` from within the project root.
|
|
57
|
+
|
|
58
|
+
For more information on bundler, please see http://github.com/carlhuda/bundler
|