daemon-kit 0.1.3 → 0.1.5.1
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/History.txt +5 -0
- data/Manifest.txt +13 -0
- data/TODO.txt +8 -1
- data/app_generators/daemon_kit/daemon_kit_generator.rb +9 -8
- data/app_generators/daemon_kit/templates/bin/daemon.erb +1 -1
- data/app_generators/daemon_kit/templates/lib/daemon.rb +1 -0
- data/daemon_generators/nanite_agent/USAGE +5 -0
- data/daemon_generators/nanite_agent/nanite_agent_generator.rb +68 -0
- data/daemon_generators/nanite_agent/templates/config/initializers/nanite_agent.rb +6 -0
- data/daemon_generators/nanite_agent/templates/config/nanite.yml +35 -0
- data/daemon_generators/nanite_agent/templates/lib/actors/sample.rb +11 -0
- data/daemon_generators/nanite_agent/templates/libexec/daemon.rb +31 -0
- data/lib/daemon_kit.rb +4 -2
- data/lib/daemon_kit/amqp.rb +2 -6
- data/lib/daemon_kit/config.rb +64 -0
- data/lib/daemon_kit/jabber.rb +16 -18
- data/lib/daemon_kit/nanite.rb +7 -0
- data/lib/daemon_kit/nanite/agent.rb +56 -0
- data/rubygems_generators/install_rspec/templates/spec/spec_helper.rb +11 -0
- data/test/test_daemon-kit_generator.rb +2 -1
- data/test/test_daemon_kit_config.rb +28 -0
- data/test/test_helper.rb +7 -0
- data/test/test_nanite_agent_generator.rb +49 -0
- metadata +19 -3
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -15,6 +15,7 @@ app_generators/daemon_kit/templates/config/environments/development.rb
|
|
15
15
|
app_generators/daemon_kit/templates/config/environments/production.rb
|
16
16
|
app_generators/daemon_kit/templates/config/environments/test.rb
|
17
17
|
app_generators/daemon_kit/templates/config/initializers/readme
|
18
|
+
app_generators/daemon_kit/templates/lib/daemon.rb
|
18
19
|
app_generators/daemon_kit/templates/libexec/daemon.erb
|
19
20
|
bin/daemon_kit
|
20
21
|
daemon_generators/amqp/USAGE
|
@@ -31,12 +32,21 @@ daemon_generators/jabber/jabber_generator.rb
|
|
31
32
|
daemon_generators/jabber/templates/config/initializers/jabber.rb
|
32
33
|
daemon_generators/jabber/templates/config/jabber.yml
|
33
34
|
daemon_generators/jabber/templates/libexec/daemon.rb
|
35
|
+
daemon_generators/nanite_agent/USAGE
|
36
|
+
daemon_generators/nanite_agent/nanite_agent_generator.rb
|
37
|
+
daemon_generators/nanite_agent/templates/config/initializers/nanite_agent.rb
|
38
|
+
daemon_generators/nanite_agent/templates/config/nanite.yml
|
39
|
+
daemon_generators/nanite_agent/templates/lib/actors/sample.rb
|
40
|
+
daemon_generators/nanite_agent/templates/libexec/daemon.rb
|
34
41
|
lib/daemon_kit.rb
|
35
42
|
lib/daemon_kit/amqp.rb
|
36
43
|
lib/daemon_kit/application.rb
|
44
|
+
lib/daemon_kit/config.rb
|
37
45
|
lib/daemon_kit/cron.rb
|
38
46
|
lib/daemon_kit/initializer.rb
|
39
47
|
lib/daemon_kit/jabber.rb
|
48
|
+
lib/daemon_kit/nanite.rb
|
49
|
+
lib/daemon_kit/nanite/agent.rb
|
40
50
|
lib/daemon_kit/patches/force_kill_wait.rb
|
41
51
|
lib/daemon_kit/tasks.rb
|
42
52
|
lib/daemon_kit/tasks/framework.rake
|
@@ -58,5 +68,8 @@ tasks/rspec.rake
|
|
58
68
|
test/test_amqp_generator.rb
|
59
69
|
test/test_cron_generator.rb
|
60
70
|
test/test_daemon-kit_generator.rb
|
71
|
+
test/test_daemon_kit_config.rb
|
61
72
|
test/test_generator_helper.rb
|
73
|
+
test/test_helper.rb
|
62
74
|
test/test_jabber_generator.rb
|
75
|
+
test/test_nanite_agent_generator.rb
|
data/TODO.txt
CHANGED
@@ -3,7 +3,7 @@ DaemonKit TODO List
|
|
3
3
|
|
4
4
|
This is purely a drop in the bucket of what has to come...
|
5
5
|
|
6
|
-
* [DONE] Easy way to trap signals
|
6
|
+
* [DONE] Easy way to trap signals
|
7
7
|
* Error handling to the degree Rails does
|
8
8
|
* Easy configuration of an ORM of choice, including patching it if needed (ActiveRecord *cough*)
|
9
9
|
* Improved generators for creating skeleton daemons:
|
@@ -20,5 +20,12 @@ This is purely a drop in the bucket of what has to come...
|
|
20
20
|
* Improved and cleaned up logging
|
21
21
|
* Plenty of docs, seriously a lot of docs
|
22
22
|
* Specs & features, tons of them too
|
23
|
+
* Integration tests for the specific daemons
|
23
24
|
* Some level of thread safety, or mechanisms to ease thread safety
|
25
|
+
* Built in utilities:
|
26
|
+
* Thread pool for 1.8
|
27
|
+
* Fibre pool for 1.9
|
28
|
+
* Some activesupport-esque functions until activesupport 3.0 hits the streets
|
29
|
+
* DRY up the following:
|
30
|
+
* Loading configuration files for the daemons
|
24
31
|
* DON'T FORGET 1.9 SUPPORT
|
@@ -3,8 +3,8 @@ class DaemonKitGenerator < RubiGen::Base
|
|
3
3
|
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
4
4
|
Config::CONFIG['ruby_install_name'])
|
5
5
|
|
6
|
-
VALID_GENERATORS = ['default', 'jabber', 'cron', 'amqp']
|
7
|
-
|
6
|
+
VALID_GENERATORS = ['default', 'jabber', 'cron', 'amqp', 'nanite_agent']
|
7
|
+
|
8
8
|
default_options :shebang => DEFAULT_SHEBANG, :author => nil
|
9
9
|
|
10
10
|
attr_reader :daemon_name
|
@@ -25,9 +25,9 @@ class DaemonKitGenerator < RubiGen::Base
|
|
25
25
|
$stderr.puts "Valid generators are: #{VALID_GENERATORS.join(', ')}"
|
26
26
|
exit 1
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
script_options = { :chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang] }
|
30
|
-
|
30
|
+
|
31
31
|
record do |m|
|
32
32
|
# Ensure appropriate folder(s) exists
|
33
33
|
m.directory ''
|
@@ -37,11 +37,11 @@ class DaemonKitGenerator < RubiGen::Base
|
|
37
37
|
# m.template_copy_each ["template.rb", "template2.rb"]
|
38
38
|
# m.file "file", "some_file_copied"
|
39
39
|
# m.file_copy_each ["path/to/file", "path/to/file2"]
|
40
|
-
|
40
|
+
|
41
41
|
# Readme
|
42
42
|
m.template "README", "README"
|
43
43
|
m.template "Rakefile", "Rakefile"
|
44
|
-
|
44
|
+
|
45
45
|
# Executable
|
46
46
|
m.directory "bin"
|
47
47
|
m.template "bin/daemon.erb", "bin/#{daemon_name}", script_options
|
@@ -49,7 +49,7 @@ class DaemonKitGenerator < RubiGen::Base
|
|
49
49
|
# Generator
|
50
50
|
if installer == "default"
|
51
51
|
m.directory "libexec"
|
52
|
-
m.template "libexec/daemon.erb", "libexec/#{daemon_name}.rb"
|
52
|
+
m.template "libexec/daemon.erb", "libexec/#{daemon_name}-daemon.rb"
|
53
53
|
else
|
54
54
|
m.dependency installer, [daemon_name], :destination => destination_root, :collision => :force
|
55
55
|
end
|
@@ -65,7 +65,8 @@ class DaemonKitGenerator < RubiGen::Base
|
|
65
65
|
|
66
66
|
# Libraries
|
67
67
|
m.directory "lib"
|
68
|
-
|
68
|
+
m.file "lib/daemon.rb", "lib/#{daemon_name}.rb"
|
69
|
+
|
69
70
|
# Tests
|
70
71
|
m.directory "tasks"
|
71
72
|
m.dependency "install_rspec", [daemon_name], :destination => destination_root, :collision => :force
|
@@ -0,0 +1 @@
|
|
1
|
+
# Your starting point for daemon specific classes
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class NaniteAgentGenerator < RubiGen::Base
|
2
|
+
|
3
|
+
default_options :author => nil
|
4
|
+
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
def initialize(runtime_args, runtime_options = {})
|
8
|
+
super
|
9
|
+
usage if args.empty?
|
10
|
+
@name = args.shift
|
11
|
+
extract_options
|
12
|
+
end
|
13
|
+
|
14
|
+
def manifest
|
15
|
+
record do |m|
|
16
|
+
# Ensure appropriate folder(s) exists
|
17
|
+
m.directory ''
|
18
|
+
|
19
|
+
# Create stubs
|
20
|
+
# m.template "template.rb.erb", "some_file_after_erb.rb"
|
21
|
+
# m.template_copy_each ["template.rb", "template2.rb"]
|
22
|
+
# m.template_copy_each ["template.rb", "template2.rb"], "some/path"
|
23
|
+
# m.file "file", "some_file_copied"
|
24
|
+
# m.file_copy_each ["path/to/file", "path/to/file2"]
|
25
|
+
# m.file_copy_each ["path/to/file", "path/to/file2"], "some/path"
|
26
|
+
|
27
|
+
# Copy over our configs
|
28
|
+
m.directory 'lib'
|
29
|
+
m.directory 'lib/actors'
|
30
|
+
m.file 'lib/actors/sample.rb', 'lib/actors/sample.rb'
|
31
|
+
m.directory 'config'
|
32
|
+
m.template 'config/nanite.yml', 'config/nanite.yml'
|
33
|
+
m.directory 'config/initializers'
|
34
|
+
m.template 'config/initializers/nanite_agent.rb', "config/initializers/#{name}.rb"
|
35
|
+
|
36
|
+
# Copy over our daemon
|
37
|
+
m.directory 'libexec'
|
38
|
+
m.template 'libexec/daemon.rb', "libexec/#{name}.rb"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
def banner
|
44
|
+
<<-EOS
|
45
|
+
Creates a ...
|
46
|
+
|
47
|
+
USAGE: #{$0} #{spec.name} name
|
48
|
+
EOS
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_options!(opts)
|
52
|
+
# opts.separator ''
|
53
|
+
# opts.separator 'Options:'
|
54
|
+
# For each option below, place the default
|
55
|
+
# at the top of the file next to "default_options"
|
56
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
57
|
+
# "Some comment about this option",
|
58
|
+
# "Default: none") { |o| options[:author] = o }
|
59
|
+
# opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
60
|
+
end
|
61
|
+
|
62
|
+
def extract_options
|
63
|
+
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
64
|
+
# Templates can access these value via the attr_reader-generated methods, but not the
|
65
|
+
# raw instance variable value.
|
66
|
+
# @author = options[:author]
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Nanite agent configuration file
|
2
|
+
|
3
|
+
# These values will be used to configure the nanite agent, any values
|
4
|
+
# omitted will let the gem use it's own defaults.
|
5
|
+
|
6
|
+
# The configuration specifies the following keys:
|
7
|
+
# * user - Specify the rabbitmq username
|
8
|
+
# * pass - Specify the rabbitmq password
|
9
|
+
# * host - Specify the rabbitmq hostname
|
10
|
+
# * vhost - Specify the rabbitmq vhost
|
11
|
+
# * port - Specify the rabbitmq PORT, default 5672
|
12
|
+
# * token - Specify the agent identity
|
13
|
+
# * security - Use Security features of rabbitmq to restrict nanites to themselves
|
14
|
+
# * format - The serialization type to use for transfering data. Can be marshal, json or yaml. Default is marshal
|
15
|
+
# * tag - YAML array of tags
|
16
|
+
# * ping-time - Specify how often the agents contacts the mapper
|
17
|
+
# * actors - Comma separated list of actors to load (all ruby files in actors directory by default)
|
18
|
+
|
19
|
+
defaults: &defaults
|
20
|
+
username: nanite
|
21
|
+
password: testing
|
22
|
+
host: localhost
|
23
|
+
vhost: /nanite
|
24
|
+
# tag:
|
25
|
+
# - foo
|
26
|
+
# - bar
|
27
|
+
|
28
|
+
development:
|
29
|
+
<<: *defaults
|
30
|
+
|
31
|
+
test:
|
32
|
+
<<: *defaults
|
33
|
+
|
34
|
+
production:
|
35
|
+
<<: *defaults
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Generated nanite agent 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/nanite.yml' accordingly or this
|
17
|
+
# daemon won't work as advertised.
|
18
|
+
#
|
19
|
+
# Your actors live in DAEMON_ROOT/lib/actors
|
20
|
+
|
21
|
+
# Run the agent, and get the running agent.
|
22
|
+
DaemonKit::Nanite::Agent.run do |agent|
|
23
|
+
# Use the yielded agent instance to register your actors:
|
24
|
+
agent.register Sample.new
|
25
|
+
|
26
|
+
# This block can used to make your agent perform other tasks as
|
27
|
+
# well. Remember that you have access to a running EventMachine
|
28
|
+
# reactor since the AMQP gem used by nanite uses it. Other than that
|
29
|
+
# you can mostly leave this file alone and concentrate on developing
|
30
|
+
# your actors in the lib/actors/ directory of the project.
|
31
|
+
end
|
data/lib/daemon_kit.rb
CHANGED
@@ -4,11 +4,13 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
4
4
|
require 'rubygems'
|
5
5
|
|
6
6
|
module DaemonKit
|
7
|
-
VERSION = '0.1.
|
8
|
-
|
7
|
+
VERSION = '0.1.5.1'
|
8
|
+
|
9
9
|
autoload :Initializer, 'daemon_kit/initializer'
|
10
10
|
autoload :Application, 'daemon_kit/application'
|
11
|
+
autoload :Config, 'daemon_kit/config'
|
11
12
|
autoload :Cron, 'daemon_kit/cron'
|
12
13
|
autoload :Jabber, 'daemon_kit/jabber'
|
13
14
|
autoload :AMQP, 'daemon_kit/amqp'
|
15
|
+
autoload :Nanite, 'daemon_kit/nanite'
|
14
16
|
end
|
data/lib/daemon_kit/amqp.rb
CHANGED
@@ -11,11 +11,7 @@ module DaemonKit
|
|
11
11
|
class << self
|
12
12
|
|
13
13
|
def instance
|
14
|
-
@instance ||=
|
15
|
-
config = YAML.load_file( "#{DAEMON_ROOT}/config/amqp.yml" )[DAEMON_ENV]
|
16
|
-
raise ArgumentError, "Missing AMQP configuration for #{DAEMON_ENV} environment" if config.nil?
|
17
|
-
new( config )
|
18
|
-
)
|
14
|
+
@instance ||= new
|
19
15
|
end
|
20
16
|
|
21
17
|
private :new
|
@@ -26,7 +22,7 @@ module DaemonKit
|
|
26
22
|
end
|
27
23
|
|
28
24
|
def initialize( config = {} )
|
29
|
-
@config =
|
25
|
+
@config = DaemonKit::Config.load('amqp').to_h( true )
|
30
26
|
end
|
31
27
|
|
32
28
|
def run(&block)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module DaemonKit
|
2
|
+
|
3
|
+
# Simplify simple config file loading for daemons. Assumes the
|
4
|
+
# config files all live in DAEMON_ROOT/config and are YAML
|
5
|
+
# files. Loaded configs are accessed like a hash with string
|
6
|
+
# keys.
|
7
|
+
#
|
8
|
+
# Config files can either be keyed by environment (default behavior)
|
9
|
+
# or be a normal hash.
|
10
|
+
#
|
11
|
+
# Load a config by passing the filename (with or without the .yml
|
12
|
+
# extension) to #load.
|
13
|
+
#
|
14
|
+
# At this stage the configs are read-only.
|
15
|
+
#
|
16
|
+
# Any of the keys can be called as methods as well.
|
17
|
+
class Config
|
18
|
+
|
19
|
+
class << self
|
20
|
+
|
21
|
+
# Load the +config+.yml file from DAEMON_ROOT/config
|
22
|
+
def load( config )
|
23
|
+
config += '.yml' unless config =~ /\.yml$/
|
24
|
+
|
25
|
+
path = File.join( DAEMON_ROOT, 'config', config )
|
26
|
+
|
27
|
+
raise ArgumentError, "Can't find #{path}" unless File.exists?( path )
|
28
|
+
|
29
|
+
new( YAML.load_file( path ) )
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
# Expects a hash, looks for DAEMON_ENV key
|
35
|
+
def initialize( config_data ) #:nodoc:
|
36
|
+
if config_data.has_key?( DAEMON_ENV )
|
37
|
+
@data = config_data[ DAEMON_ENV ]
|
38
|
+
else
|
39
|
+
@data = config_data
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Pick out a config by name
|
44
|
+
def []( key )
|
45
|
+
@data[ key.to_s ]
|
46
|
+
end
|
47
|
+
|
48
|
+
# Return the internal hash structure used, optionally symbolizing
|
49
|
+
# the first level of keys in the hash
|
50
|
+
def to_h( symbolize = false )
|
51
|
+
symbolize ? @data.inject({}) { |m,c| m[c[0].to_sym] = c[1]; m } : @data
|
52
|
+
end
|
53
|
+
|
54
|
+
def method_missing( method_name, *args ) #:nodoc:
|
55
|
+
# don't match setters
|
56
|
+
unless method_name.to_s =~ /[\w_]+=$/
|
57
|
+
# pick a key if we have it
|
58
|
+
return @data[ method_name.to_s ] if @data.keys.include?( method_name.to_s )
|
59
|
+
end
|
60
|
+
|
61
|
+
super
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/daemon_kit/jabber.rb
CHANGED
@@ -12,28 +12,24 @@ module DaemonKit
|
|
12
12
|
@@message_handler = nil
|
13
13
|
@@presence_handler = nil
|
14
14
|
@@subscription_handler = nil
|
15
|
-
|
15
|
+
|
16
16
|
class << self
|
17
17
|
|
18
18
|
# Deliver a message to the specified jid.
|
19
19
|
def deliver( jid, message )
|
20
20
|
instance.connection.deliver( jid, message )
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
# Use this instead of initializing, keeps it singleton
|
24
24
|
def instance
|
25
|
-
@instance ||=
|
26
|
-
config = YAML.load_file( "#{DAEMON_ROOT}/config/jabber.yml" )[DAEMON_ENV]
|
27
|
-
raise ArgumentError, "Missing Jabber configuration for #{DAEMON_ENV} environment" if config.nil?
|
28
|
-
new( config )
|
29
|
-
)
|
25
|
+
@instance ||= new
|
30
26
|
@instance.startup!
|
31
27
|
end
|
32
28
|
private :new
|
33
29
|
|
34
30
|
def run
|
35
31
|
DaemonKit.logger.info "Starting jabber loop"
|
36
|
-
|
32
|
+
|
37
33
|
loop do
|
38
34
|
process_messages
|
39
35
|
process_updates
|
@@ -47,7 +43,7 @@ module DaemonKit
|
|
47
43
|
end
|
48
44
|
end
|
49
45
|
end
|
50
|
-
|
46
|
+
|
51
47
|
def process_messages
|
52
48
|
@message_handler ||= Proc.new { |m| DaemonKit.logger.info "Received message from #{m.from}: #{m.body}" }
|
53
49
|
|
@@ -62,7 +58,7 @@ module DaemonKit
|
|
62
58
|
instance.connection.presence_updates { |friend, old_presence, new_presence|
|
63
59
|
@presence_handler.call(friend, old_presence, new_presence)
|
64
60
|
}
|
65
|
-
|
61
|
+
|
66
62
|
end
|
67
63
|
|
68
64
|
def process_subscriptions
|
@@ -70,11 +66,11 @@ module DaemonKit
|
|
70
66
|
|
71
67
|
instance.connection.subscription_requests { |friend,presence| @subscription_handler.call(friend,presence) }
|
72
68
|
end
|
73
|
-
|
69
|
+
|
74
70
|
def received_messages(&block)
|
75
71
|
@message_handler = block
|
76
72
|
end
|
77
|
-
|
73
|
+
|
78
74
|
def presence_updates(&block)
|
79
75
|
@presence_handler = block
|
80
76
|
end
|
@@ -82,10 +78,12 @@ module DaemonKit
|
|
82
78
|
def subscription_requests(&block)
|
83
79
|
@subscription_handler = block
|
84
80
|
end
|
85
|
-
|
81
|
+
|
86
82
|
end
|
87
83
|
|
88
|
-
def initialize
|
84
|
+
def initialize
|
85
|
+
options = DaemonKit::Config.load( 'jabber' )
|
86
|
+
|
89
87
|
@jabber_id = options.delete("jabber_id")
|
90
88
|
@password = options.delete("password")
|
91
89
|
@resource = options.delete("resource") || 'daemon_kit'
|
@@ -103,7 +101,7 @@ module DaemonKit
|
|
103
101
|
|
104
102
|
DaemonKit.trap( 'INT', Proc.new { self.shutdown! } )
|
105
103
|
DaemonKit.trap( 'TERM', Proc.new { self.shutdown! } )
|
106
|
-
|
104
|
+
|
107
105
|
@booted = true
|
108
106
|
|
109
107
|
self
|
@@ -141,9 +139,9 @@ module DaemonKit
|
|
141
139
|
def status_line
|
142
140
|
"#{DaemonKit.configuration.daemon_name} ready for instructions"
|
143
141
|
end
|
144
|
-
|
142
|
+
|
145
143
|
private
|
146
|
-
|
144
|
+
|
147
145
|
def connect!
|
148
146
|
jid = @jabber_id + '/' + @resource
|
149
147
|
|
@@ -167,6 +165,6 @@ module DaemonKit
|
|
167
165
|
end
|
168
166
|
end
|
169
167
|
end
|
170
|
-
|
168
|
+
|
171
169
|
end
|
172
170
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module DaemonKit
|
2
|
+
module Nanite
|
3
|
+
# Pull support into a daemon for being a nanite agent.
|
4
|
+
class Agent
|
5
|
+
|
6
|
+
@@instance = nil
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def instance
|
11
|
+
@instance ||= new
|
12
|
+
end
|
13
|
+
|
14
|
+
private :new
|
15
|
+
|
16
|
+
def run(&block)
|
17
|
+
instance.run(&block)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@config = DaemonKit::Config.load( 'nanite' )
|
24
|
+
|
25
|
+
config_agent
|
26
|
+
end
|
27
|
+
|
28
|
+
def run(&block)
|
29
|
+
# Ensure graceful shutdown of the connection to the broker
|
30
|
+
DaemonKit.trap('INT') { ::EM.stop }
|
31
|
+
DaemonKit.trap('TERM') { ::EM.stop }
|
32
|
+
|
33
|
+
# Start our mapper
|
34
|
+
mapper_thread = Thread.new do
|
35
|
+
EM.run do
|
36
|
+
agent = ::Nanite.start_agent( @config.to_h( true ) )
|
37
|
+
block.call( agent ) if block
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
#block.call if block
|
42
|
+
|
43
|
+
mapper_thread.join
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
# Make sure to fine tune the agent config to be DK friendly
|
49
|
+
def config_agent
|
50
|
+
@config[:root] = DAEMON_ROOT
|
51
|
+
@config[:daemonize] = false
|
52
|
+
@config[:actors_dir] = File.join(DAEMON_ROOT, 'lib', 'actors')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -8,3 +8,14 @@ end
|
|
8
8
|
|
9
9
|
require File.dirname(__FILE__) + '/../config/boot'
|
10
10
|
require '<%= gem_name %>'
|
11
|
+
|
12
|
+
Spec::Runner.configure do |config|
|
13
|
+
# == Mock Framework
|
14
|
+
#
|
15
|
+
# RSpec uses it's own mocking framework by default. If you prefer to
|
16
|
+
# use mocha, flexmock or RR, uncomment the appropriate line:
|
17
|
+
#
|
18
|
+
config.mock_with :mocha
|
19
|
+
# config.mock_with :flexmock
|
20
|
+
# config.mock_with :rr
|
21
|
+
end
|
@@ -43,8 +43,9 @@ class TestDaemonKitGenerator < Test::Unit::TestCase
|
|
43
43
|
assert_directory_exists "config/initializers"
|
44
44
|
assert_generated_file "config/initializers/readme"
|
45
45
|
assert_directory_exists "lib"
|
46
|
+
assert_generated_file "lib/#{daemon_name}.rb"
|
46
47
|
assert_directory_exists "libexec"
|
47
|
-
assert_generated_file "libexec/#{daemon_name}.rb"
|
48
|
+
assert_generated_file "libexec/#{daemon_name}-daemon.rb"
|
48
49
|
assert_directory_exists "log"
|
49
50
|
assert_directory_exists "spec"
|
50
51
|
assert_directory_exists "tasks"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
2
|
+
|
3
|
+
class TestDaemonKitConfig < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_initialize_with_env_hash
|
6
|
+
data = {
|
7
|
+
'test' => {
|
8
|
+
'foo' => 'bar'
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
config = DaemonKit::Config.new( data )
|
13
|
+
|
14
|
+
assert_equal config['foo'], 'bar'
|
15
|
+
assert_equal config.foo, 'bar'
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initialize_without_env_hash
|
19
|
+
data = {
|
20
|
+
'foo' => 'bar'
|
21
|
+
}
|
22
|
+
|
23
|
+
config = DaemonKit::Config.new( data )
|
24
|
+
|
25
|
+
assert_equal config['foo'], 'bar'
|
26
|
+
assert_equal config.foo, 'bar'
|
27
|
+
end
|
28
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
|
2
|
+
|
3
|
+
|
4
|
+
class TestNaniteAgentGenerator < Test::Unit::TestCase
|
5
|
+
include RubiGen::GeneratorTestHelper
|
6
|
+
|
7
|
+
def setup
|
8
|
+
bare_setup
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
bare_teardown
|
13
|
+
end
|
14
|
+
|
15
|
+
# Some generator-related assertions:
|
16
|
+
# assert_generated_file(name, &block) # block passed the file contents
|
17
|
+
# assert_directory_exists(name)
|
18
|
+
# assert_generated_class(name, &block)
|
19
|
+
# assert_generated_module(name, &block)
|
20
|
+
# assert_generated_test_for(name, &block)
|
21
|
+
# The assert_generated_(class|module|test_for) &block is passed the body of the class/module within the file
|
22
|
+
# assert_has_method(body, *methods) # check that the body has a list of methods (methods with parentheses not supported yet)
|
23
|
+
#
|
24
|
+
# Other helper methods are:
|
25
|
+
# app_root_files - put this in teardown to show files generated by the test method (e.g. p app_root_files)
|
26
|
+
# bare_setup - place this in setup method to create the APP_ROOT folder for each test
|
27
|
+
# bare_teardown - place this in teardown method to destroy the TMP_ROOT or APP_ROOT folder after each test
|
28
|
+
|
29
|
+
def test_generator_without_options
|
30
|
+
name = "myapp"
|
31
|
+
run_generator('nanite_agent', [name], sources)
|
32
|
+
assert_directory_exists "lib/actors"
|
33
|
+
assert_generated_file "lib/actors/sample.rb"
|
34
|
+
assert_directory_exists "config"
|
35
|
+
assert_generated_file "config/nanite.yml"
|
36
|
+
assert_directory_exists "config/initializers"
|
37
|
+
assert_generated_file "config/initializers/myapp.rb"
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def sources
|
42
|
+
[RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", generator_path))
|
43
|
+
]
|
44
|
+
end
|
45
|
+
|
46
|
+
def generator_path
|
47
|
+
"daemon_generators"
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: daemon-kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenneth Kalmer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-08 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- app_generators/daemon_kit/templates/config/environments/production.rb
|
83
83
|
- app_generators/daemon_kit/templates/config/environments/test.rb
|
84
84
|
- app_generators/daemon_kit/templates/config/initializers/readme
|
85
|
+
- app_generators/daemon_kit/templates/lib/daemon.rb
|
85
86
|
- app_generators/daemon_kit/templates/libexec/daemon.erb
|
86
87
|
- bin/daemon_kit
|
87
88
|
- daemon_generators/amqp/USAGE
|
@@ -98,12 +99,21 @@ files:
|
|
98
99
|
- daemon_generators/jabber/templates/config/initializers/jabber.rb
|
99
100
|
- daemon_generators/jabber/templates/config/jabber.yml
|
100
101
|
- daemon_generators/jabber/templates/libexec/daemon.rb
|
102
|
+
- daemon_generators/nanite_agent/USAGE
|
103
|
+
- daemon_generators/nanite_agent/nanite_agent_generator.rb
|
104
|
+
- daemon_generators/nanite_agent/templates/config/initializers/nanite_agent.rb
|
105
|
+
- daemon_generators/nanite_agent/templates/config/nanite.yml
|
106
|
+
- daemon_generators/nanite_agent/templates/lib/actors/sample.rb
|
107
|
+
- daemon_generators/nanite_agent/templates/libexec/daemon.rb
|
101
108
|
- lib/daemon_kit.rb
|
102
109
|
- lib/daemon_kit/amqp.rb
|
103
110
|
- lib/daemon_kit/application.rb
|
111
|
+
- lib/daemon_kit/config.rb
|
104
112
|
- lib/daemon_kit/cron.rb
|
105
113
|
- lib/daemon_kit/initializer.rb
|
106
114
|
- lib/daemon_kit/jabber.rb
|
115
|
+
- lib/daemon_kit/nanite.rb
|
116
|
+
- lib/daemon_kit/nanite/agent.rb
|
107
117
|
- lib/daemon_kit/patches/force_kill_wait.rb
|
108
118
|
- lib/daemon_kit/tasks.rb
|
109
119
|
- lib/daemon_kit/tasks/framework.rake
|
@@ -125,8 +135,11 @@ files:
|
|
125
135
|
- test/test_amqp_generator.rb
|
126
136
|
- test/test_cron_generator.rb
|
127
137
|
- test/test_daemon-kit_generator.rb
|
138
|
+
- test/test_daemon_kit_config.rb
|
128
139
|
- test/test_generator_helper.rb
|
140
|
+
- test/test_helper.rb
|
129
141
|
- test/test_jabber_generator.rb
|
142
|
+
- test/test_nanite_agent_generator.rb
|
130
143
|
has_rdoc: true
|
131
144
|
homepage:
|
132
145
|
post_install_message: |+
|
@@ -161,8 +174,11 @@ signing_key:
|
|
161
174
|
specification_version: 2
|
162
175
|
summary: Daemon Kit aims to simplify creating Ruby daemons by providing a sound application skeleton (through a generator), task specific generators (jabber bot, etc) and robust environment management code.
|
163
176
|
test_files:
|
164
|
-
- test/test_daemon-kit_generator.rb
|
165
177
|
- test/test_generator_helper.rb
|
166
178
|
- test/test_jabber_generator.rb
|
167
179
|
- test/test_cron_generator.rb
|
168
180
|
- test/test_amqp_generator.rb
|
181
|
+
- test/test_nanite_agent_generator.rb
|
182
|
+
- test/test_daemon-kit_generator.rb
|
183
|
+
- test/test_daemon_kit_config.rb
|
184
|
+
- test/test_helper.rb
|