royw-drbman 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +6 -0
- data/LICENSE +20 -0
- data/README.rdoc +14 -0
- data/Rakefile +54 -0
- data/VERSION +1 -0
- data/bin/drbman +7 -0
- data/drbman.gemspec +91 -0
- data/examples/primes/VERSION +1 -0
- data/examples/primes/bin/primes +7 -0
- data/examples/primes/lib/drb_server/prime_helper.rb +34 -0
- data/examples/primes/lib/primes/cli.rb +81 -0
- data/examples/primes/lib/primes/kernel_extensions.rb +12 -0
- data/examples/primes/lib/primes/primes.rb +19 -0
- data/examples/primes/lib/primes/sieve_of_eratosthenes.rb +80 -0
- data/examples/primes/lib/primes.rb +29 -0
- data/examples/primes/spec/primes_spec.rb +24 -0
- data/examples/primes/spec/spec_helper.rb +8 -0
- data/lib/drbman/cli.rb +85 -0
- data/lib/drbman/drb_pool.rb +111 -0
- data/lib/drbman/drbman.rb +229 -0
- data/lib/drbman/host_machine.rb +216 -0
- data/lib/drbman.rb +28 -0
- data/spec/drbman_spec.rb +7 -0
- data/spec/host_machine_spec.rb +45 -0
- data/spec/spec_helper.rb +9 -0
- metadata +148 -0
data/.document
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Roy Wright
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
= drbman
|
2
|
+
|
3
|
+
Support for running ruby tasks via drb (druby) on multiple cores and/or systems.
|
4
|
+
|
5
|
+
Drbman provides:
|
6
|
+
* the infrastructure for pushing ruby code to remote systems,
|
7
|
+
* installing remote gems
|
8
|
+
* starting and stopping the remote drb server(s)
|
9
|
+
* cleaning up the remote system by removing any artifacts used
|
10
|
+
|
11
|
+
|
12
|
+
== Copyright
|
13
|
+
|
14
|
+
Copyright (c) 2009 Roy Wright. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "drbman"
|
8
|
+
gem.summary = 'Support for running ruby tasks via drb (druby) on multiple cores and/or systems.'
|
9
|
+
gem.email = "roy@wright.org"
|
10
|
+
gem.homepage = "http://github.com/royw/drbman"
|
11
|
+
gem.authors = ["Roy Wright"]
|
12
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
13
|
+
gem.add_dependency('log4r', '>=1.0.5')
|
14
|
+
gem.add_dependency('user-choices', '>=1.1.6')
|
15
|
+
gem.add_dependency('extlib', '>=0.9.12')
|
16
|
+
gem.add_dependency('versionomy', '>=0.0.4')
|
17
|
+
gem.add_dependency('net-ssh', '>=2.0.11')
|
18
|
+
gem.add_dependency('net-scp', '>=1.0.2')
|
19
|
+
end
|
20
|
+
|
21
|
+
rescue LoadError
|
22
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
23
|
+
end
|
24
|
+
|
25
|
+
require 'spec/rake/spectask'
|
26
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
27
|
+
spec.libs << 'lib' << 'spec'
|
28
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
29
|
+
end
|
30
|
+
|
31
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
32
|
+
spec.libs << 'lib' << 'spec'
|
33
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
34
|
+
spec.rcov = true
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
task :default => :spec
|
39
|
+
|
40
|
+
require 'rake/rdoctask'
|
41
|
+
Rake::RDocTask.new do |rdoc|
|
42
|
+
if File.exist?('VERSION.yml')
|
43
|
+
config = YAML.load(File.read('VERSION.yml'))
|
44
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
45
|
+
else
|
46
|
+
version = ""
|
47
|
+
end
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "drbman #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
54
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/bin/drbman
ADDED
data/drbman.gemspec
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{drbman}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Roy Wright"]
|
9
|
+
s.date = %q{2009-07-14}
|
10
|
+
s.default_executable = %q{drbman}
|
11
|
+
s.email = %q{roy@wright.org}
|
12
|
+
s.executables = ["drbman"]
|
13
|
+
s.extra_rdoc_files = [
|
14
|
+
"LICENSE",
|
15
|
+
"README.rdoc"
|
16
|
+
]
|
17
|
+
s.files = [
|
18
|
+
".document",
|
19
|
+
".gitignore",
|
20
|
+
"LICENSE",
|
21
|
+
"README.rdoc",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"bin/drbman",
|
25
|
+
"drbman.gemspec",
|
26
|
+
"examples/primes/VERSION",
|
27
|
+
"examples/primes/bin/primes",
|
28
|
+
"examples/primes/lib/drb_server/prime_helper.rb",
|
29
|
+
"examples/primes/lib/primes.rb",
|
30
|
+
"examples/primes/lib/primes/cli.rb",
|
31
|
+
"examples/primes/lib/primes/kernel_extensions.rb",
|
32
|
+
"examples/primes/lib/primes/primes.rb",
|
33
|
+
"examples/primes/lib/primes/sieve_of_eratosthenes.rb",
|
34
|
+
"examples/primes/spec/primes_spec.rb",
|
35
|
+
"examples/primes/spec/spec_helper.rb",
|
36
|
+
"lib/drbman.rb",
|
37
|
+
"lib/drbman/cli.rb",
|
38
|
+
"lib/drbman/drb_pool.rb",
|
39
|
+
"lib/drbman/drbman.rb",
|
40
|
+
"lib/drbman/host_machine.rb",
|
41
|
+
"spec/drbman_spec.rb",
|
42
|
+
"spec/host_machine_spec.rb",
|
43
|
+
"spec/spec_helper.rb"
|
44
|
+
]
|
45
|
+
s.homepage = %q{http://github.com/royw/drbman}
|
46
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
47
|
+
s.require_paths = ["lib"]
|
48
|
+
s.rubygems_version = %q{1.3.4}
|
49
|
+
s.summary = %q{Support for running ruby tasks via drb (druby) on multiple cores and/or systems.}
|
50
|
+
s.test_files = [
|
51
|
+
"spec/drbman_spec.rb",
|
52
|
+
"spec/host_machine_spec.rb",
|
53
|
+
"spec/spec_helper.rb",
|
54
|
+
"examples/primes/lib/drb_server/prime_helper.rb",
|
55
|
+
"examples/primes/lib/primes/cli.rb",
|
56
|
+
"examples/primes/lib/primes/kernel_extensions.rb",
|
57
|
+
"examples/primes/lib/primes/primes.rb",
|
58
|
+
"examples/primes/lib/primes/sieve_of_eratosthenes.rb",
|
59
|
+
"examples/primes/lib/primes.rb",
|
60
|
+
"examples/primes/spec/primes_spec.rb",
|
61
|
+
"examples/primes/spec/spec_helper.rb"
|
62
|
+
]
|
63
|
+
|
64
|
+
if s.respond_to? :specification_version then
|
65
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
66
|
+
s.specification_version = 3
|
67
|
+
|
68
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
69
|
+
s.add_runtime_dependency(%q<log4r>, [">= 1.0.5"])
|
70
|
+
s.add_runtime_dependency(%q<user-choices>, [">= 1.1.6"])
|
71
|
+
s.add_runtime_dependency(%q<extlib>, [">= 0.9.12"])
|
72
|
+
s.add_runtime_dependency(%q<versionomy>, [">= 0.0.4"])
|
73
|
+
s.add_runtime_dependency(%q<net-ssh>, [">= 2.0.11"])
|
74
|
+
s.add_runtime_dependency(%q<net-scp>, [">= 1.0.2"])
|
75
|
+
else
|
76
|
+
s.add_dependency(%q<log4r>, [">= 1.0.5"])
|
77
|
+
s.add_dependency(%q<user-choices>, [">= 1.1.6"])
|
78
|
+
s.add_dependency(%q<extlib>, [">= 0.9.12"])
|
79
|
+
s.add_dependency(%q<versionomy>, [">= 0.0.4"])
|
80
|
+
s.add_dependency(%q<net-ssh>, [">= 2.0.11"])
|
81
|
+
s.add_dependency(%q<net-scp>, [">= 1.0.2"])
|
82
|
+
end
|
83
|
+
else
|
84
|
+
s.add_dependency(%q<log4r>, [">= 1.0.5"])
|
85
|
+
s.add_dependency(%q<user-choices>, [">= 1.1.6"])
|
86
|
+
s.add_dependency(%q<extlib>, [">= 0.9.12"])
|
87
|
+
s.add_dependency(%q<versionomy>, [">= 0.0.4"])
|
88
|
+
s.add_dependency(%q<net-ssh>, [">= 2.0.11"])
|
89
|
+
s.add_dependency(%q<net-scp>, [">= 1.0.2"])
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'drb'
|
2
|
+
require 'log4r'
|
3
|
+
|
4
|
+
class PrimeHelper
|
5
|
+
attr_accessor :name
|
6
|
+
def non_primes(ip, n)
|
7
|
+
a = []
|
8
|
+
2.upto((n - 1) / ip) { |i| a << (i * ip) }
|
9
|
+
a
|
10
|
+
end
|
11
|
+
def stop_service
|
12
|
+
DRb.stop_service
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
logger = Log4r::Logger.new('prime_helper')
|
17
|
+
logger.outputters = Log4r::FileOutputter.new(:console, :filename => File.join(File.dirname(__FILE__), '../prime_helper.log'))
|
18
|
+
Log4r::Outputter[:console].formatter = Log4r::PatternFormatter.new(:pattern => "%m")
|
19
|
+
logger.level = Log4r::INFO
|
20
|
+
|
21
|
+
machine = 'localhost'
|
22
|
+
machine = ARGV[0] unless ARGV.length < 1
|
23
|
+
port = 9000
|
24
|
+
port = ARGV[1] unless ARGV.length < 2
|
25
|
+
service = "druby://#{machine}:#{port}"
|
26
|
+
logger.info { "ARGV => #{ARGV.inspect}" }
|
27
|
+
logger.info { "machine => #{machine}" }
|
28
|
+
logger.info { "port => #{port}" }
|
29
|
+
logger.info { "drb service => #{service}" }
|
30
|
+
server = PrimeHelper.new
|
31
|
+
server.name = service
|
32
|
+
DRb.start_service(service, server)
|
33
|
+
DRb.thread.join
|
34
|
+
logger.info { "finished" }
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class CLI < UserChoices::Command
|
2
|
+
include UserChoices
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
# The CLI class uses the command design pattern.
|
6
|
+
# This is a class accessor helper
|
7
|
+
# @example
|
8
|
+
# CLI.execute
|
9
|
+
def self.execute
|
10
|
+
instance.execute
|
11
|
+
end
|
12
|
+
|
13
|
+
# The CLI class uses the command design pattern
|
14
|
+
# This is the main entry point
|
15
|
+
def execute
|
16
|
+
if @user_choices[:version]
|
17
|
+
puts IO.read(File.join(File.dirname(__FILE__), '../../VERSION')).strip
|
18
|
+
else
|
19
|
+
logger = setup_logger
|
20
|
+
begin
|
21
|
+
# @user_choices[:hosts] << @user_choices[:host] unless @user_choices[:host].blank?
|
22
|
+
raise Exception.new('Missing maximum integer argument') if @user_choices[:max_integer].nil?
|
23
|
+
elapse_time = elapse do
|
24
|
+
app = Primes.new(logger, @user_choices)
|
25
|
+
primes = app.execute
|
26
|
+
logger.info { "#{primes.length} primes found" }
|
27
|
+
logger.info { "calculation elapsed time: #{app.primes_elapse_time}" }
|
28
|
+
end
|
29
|
+
logger.info { "total elapsed time: #{elapse_time}" }
|
30
|
+
rescue Exception => e
|
31
|
+
logger.error { e.to_s }
|
32
|
+
logger.debug { e.backtrace.join("\n") }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
# @param builder (see UserChoices::Command#add_sources)
|
40
|
+
def add_sources(builder)
|
41
|
+
builder.add_source(CommandLineSource, :usage, "Usage #{$0} [options] INTEGER\nwhere INTEGER is the number to find all of the primes below.")
|
42
|
+
builder.add_source(EnvironmentSource, :with_prefix, "primes_")
|
43
|
+
builder.add_source(YamlConfigFileSource, :from_file, ".primes-config.yaml")
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param builder (see UserChoices::Command#add_choices)
|
47
|
+
def add_choices(builder)
|
48
|
+
# don't need to explicitly declare help argument
|
49
|
+
builder.add_choice(:version, :type => :boolean, :default => false) do |command_line|
|
50
|
+
command_line.uses_switch('-V', '--version', 'The version of primes')
|
51
|
+
end
|
52
|
+
builder.add_choice(:quiet, :type => :boolean, :default => false) do |command_line|
|
53
|
+
command_line.uses_switch('-q', '--quiet', 'Display error messages only')
|
54
|
+
end
|
55
|
+
builder.add_choice(:debug, :type => :boolean, :default => false) do |command_line|
|
56
|
+
command_line.uses_switch('-v', '--verbose', 'Display debug messages')
|
57
|
+
end
|
58
|
+
builder.add_choice(:hosts, :type => [:string], :default => []) do |command_line|
|
59
|
+
command_line.uses_option('-H', '--hosts "HOST,HOST"', 'Comma separated host machines, ex: "machine1{,machine2{,...}}"')
|
60
|
+
end
|
61
|
+
builder.add_choice(:port, :type => :integer, :default => 9000) do |command_line|
|
62
|
+
command_line.uses_option('-p', '--port PORT', "The starting port number to assign to the hosts.")
|
63
|
+
end
|
64
|
+
builder.add_choice(:max_integer) do |command_line|
|
65
|
+
command_line.uses_optional_arg
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Initial setup of logger
|
70
|
+
# @return [Logger] the logger to use
|
71
|
+
def setup_logger
|
72
|
+
logger = Log4r::Logger.new('primes')
|
73
|
+
logger.outputters = Log4r::StdoutOutputter.new(:console)
|
74
|
+
Log4r::Outputter[:console].formatter = Log4r::PatternFormatter.new(:pattern => "%m")
|
75
|
+
logger.level = Log4r::INFO
|
76
|
+
logger.level = Log4r::WARN if @user_choices[:quiet]
|
77
|
+
logger.level = Log4r::DEBUG if @user_choices[:debug]
|
78
|
+
# logger.trace = true
|
79
|
+
logger
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
class Primes
|
3
|
+
attr_reader :primes_elapse_time
|
4
|
+
|
5
|
+
def initialize(logger, choices)
|
6
|
+
@logger = logger
|
7
|
+
@user_choices = choices
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute
|
11
|
+
@logger.debug { @user_choices.pretty_inspect }
|
12
|
+
sieve = SieveOfEratosthenes.new(@user_choices[:max_integer], @user_choices, @logger)
|
13
|
+
result = sieve.execute
|
14
|
+
@primes_elapse_time = sieve.primes_elapse_time
|
15
|
+
result
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Command design pattern
|
2
|
+
class SieveOfEratosthenes
|
3
|
+
attr_reader :primes_elapse_time
|
4
|
+
def initialize(n, choices, logger)
|
5
|
+
@n = n.to_i
|
6
|
+
@choices = choices
|
7
|
+
@logger = logger
|
8
|
+
|
9
|
+
# we need at least one host that has a drb server running
|
10
|
+
@choices[:hosts] = ['localhost'] if @choices[:hosts].blank?
|
11
|
+
|
12
|
+
# set the file to be ran that contains the drb server
|
13
|
+
@choices[:run] = 'drb_server/prime_helper.rb' if @choices[:run].blank?
|
14
|
+
@choices[:gems] = ['log4r']
|
15
|
+
|
16
|
+
# specify the directories to copy to the host machine
|
17
|
+
@choices[:dirs] = [File.join(File.dirname(__FILE__), '../drb_server')]
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute
|
21
|
+
result = []
|
22
|
+
@logger.debug { @choices.pretty_inspect }
|
23
|
+
|
24
|
+
Drbman.new(@logger, @choices) do |drbman|
|
25
|
+
@primes_elapse_time = elapse do
|
26
|
+
result = primes(@n, drbman)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
result
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def primes(n, drbman)
|
35
|
+
indices = []
|
36
|
+
if n > 2
|
37
|
+
composites = calc_composites(n, drbman)
|
38
|
+
flat_comps = composites.flatten.uniq
|
39
|
+
indices = calc_indices(flat_comps, n)
|
40
|
+
end
|
41
|
+
indices
|
42
|
+
end
|
43
|
+
|
44
|
+
# when n = 20
|
45
|
+
# sqr_primes = [2,3]
|
46
|
+
# composites = [[2*2, 2*3, 2*4,...,2*9], [3*2, 3*3, 3*4,...,3*6]]
|
47
|
+
# returns Array
|
48
|
+
def calc_composites(n, drbman)
|
49
|
+
sqr_primes = primes(Math.sqrt(n).to_i, drbman)
|
50
|
+
composites = []
|
51
|
+
threads = []
|
52
|
+
mutex = Mutex.new
|
53
|
+
sqr_primes.each do |ip|
|
54
|
+
# parallelize via threads
|
55
|
+
# then use the drb object within the thread
|
56
|
+
threads << Thread.new(ip, n) do |value, max|
|
57
|
+
# @logger.debug { "thread(#{ip}, #{n})" }
|
58
|
+
drbman.get_object do |prime_helper|
|
59
|
+
# @logger.debug { "prime_helper.name => #{prime_helper.name}" }
|
60
|
+
non_primes = prime_helper.non_primes(value, max)
|
61
|
+
mutex.synchronize do
|
62
|
+
composites << non_primes
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
threads.each {|thrd| thrd.join}
|
68
|
+
composites
|
69
|
+
end
|
70
|
+
|
71
|
+
def calc_indices(flat_comps, n)
|
72
|
+
indices = []
|
73
|
+
flags = Array.new(n, true)
|
74
|
+
flat_comps.each {|i| flags[i] = false}
|
75
|
+
flags.each_index {|i| indices << i if flags[i] }
|
76
|
+
indices.shift(2)
|
77
|
+
indices
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) ||
|
3
|
+
$:.include?(File.expand_path(File.dirname(__FILE__)))
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
|
7
|
+
# gem 'ruby-debug', '>=0.10.3'
|
8
|
+
gem 'log4r', '>=1.0.5'
|
9
|
+
gem 'user-choices', '>=1.1.6'
|
10
|
+
gem 'fizx-thread_pool', '>=0.3.1'
|
11
|
+
gem 'extlib', '>=0.9.12'
|
12
|
+
gem 'daemons', '>=1.0.10'
|
13
|
+
|
14
|
+
require 'drb'
|
15
|
+
require 'log4r'
|
16
|
+
require 'user-choices'
|
17
|
+
require 'thread_pool'
|
18
|
+
require 'extlib'
|
19
|
+
require 'daemons'
|
20
|
+
|
21
|
+
require 'drbman'
|
22
|
+
|
23
|
+
# require 'ruby-debug'
|
24
|
+
|
25
|
+
include FileUtils::Verbose
|
26
|
+
|
27
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'primes/**/*.rb')).each do |name|
|
28
|
+
require name
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'primes'
|
3
|
+
|
4
|
+
|
5
|
+
describe('SieveOfEratosthenes') do
|
6
|
+
before(:each) do
|
7
|
+
@choices = {}
|
8
|
+
@logger = Log4r::Logger.new('primes_spec')
|
9
|
+
@logger.level = Log4r::DEBUG
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should find [2,3,5,7,11,13,17,19] for n=20' do
|
13
|
+
@choices[:max_integer] = 20
|
14
|
+
sieve = Primes.new(@logger, @choices)
|
15
|
+
sieve.execute.should == [2,3,5,7,11,13,17,19]
|
16
|
+
end
|
17
|
+
it 'should take a while' do
|
18
|
+
sieve = SieveOfEratosthenes.new(10000000, @choices, @logger)
|
19
|
+
primes = sieve.execute
|
20
|
+
puts "#{primes.length} primes found"
|
21
|
+
primes.length.should == 664579
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
data/lib/drbman/cli.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# require 'commandline/optionparser'
|
2
|
+
|
3
|
+
# == Synopsis
|
4
|
+
# The Command Line Interface
|
5
|
+
class CLI < UserChoices::Command
|
6
|
+
include UserChoices
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
# The CLI class uses the command design pattern.
|
10
|
+
# This is a class accessor helper
|
11
|
+
# @example
|
12
|
+
# CLI.execute
|
13
|
+
def self.execute
|
14
|
+
instance.execute
|
15
|
+
end
|
16
|
+
|
17
|
+
# The CLI class uses the command design pattern
|
18
|
+
# This is the main entry point
|
19
|
+
def execute
|
20
|
+
if @user_choices[:version]
|
21
|
+
puts IO.read(File.join(File.dirname(__FILE__), '../../VERSION')).strip
|
22
|
+
else
|
23
|
+
logger = setup_logger
|
24
|
+
begin
|
25
|
+
app = Drbman.new(logger, @user_choices)
|
26
|
+
app.execute
|
27
|
+
rescue Exception => e
|
28
|
+
logger.error { e.to_s }
|
29
|
+
logger.debug { e.backtrace.join("\n") }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
# @param builder (see UserChoices::Command#add_sources)
|
37
|
+
def add_sources(builder)
|
38
|
+
builder.add_source(CommandLineSource, :usage, "Usage #{$0} [options]")
|
39
|
+
builder.add_source(EnvironmentSource, :with_prefix, "drbman_")
|
40
|
+
builder.add_source(YamlConfigFileSource, :from_file, ".drbman-config.yaml")
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param builder (see UserChoices::Command#add_choices)
|
44
|
+
def add_choices(builder)
|
45
|
+
# don't need to explicitly declare help argument
|
46
|
+
builder.add_choice(:version, :type => :boolean, :default => false) do |command_line|
|
47
|
+
command_line.uses_switch('-V', '--version', 'The version of drbman')
|
48
|
+
end
|
49
|
+
builder.add_choice(:quiet, :type => :boolean, :default => false) do |command_line|
|
50
|
+
command_line.uses_switch('-q', '--quiet', 'Display error messages only')
|
51
|
+
end
|
52
|
+
builder.add_choice(:debug, :type => :boolean, :default => false) do |command_line|
|
53
|
+
command_line.uses_switch('-v', '--verbose', 'Display debug messages')
|
54
|
+
end
|
55
|
+
builder.add_choice(:run, :type => :string, :default => nil) do |command_line|
|
56
|
+
command_line.uses_option('-r', '--run "COMMAND"', "The ruby file that starts the drb server")
|
57
|
+
end
|
58
|
+
builder.add_choice(:hosts, :type => [:string], :default => []) do |command_line|
|
59
|
+
command_line.uses_option('-H', '--hosts "HOST,HOST"', 'Comma separated account URLs, ex: "{user{:pass}@}machine1{,{user{:pass}@}machine2}"')
|
60
|
+
end
|
61
|
+
builder.add_choice(:dirs, :type => [:string], :default => []) do |command_line|
|
62
|
+
command_line.uses_option('-d', '--dirs "PATH,PATH"', "Comma separated paths to directories to copy to the host machine(s)")
|
63
|
+
end
|
64
|
+
builder.add_choice(:gems, :type => [:string], :default => []) do |command_line|
|
65
|
+
command_line.uses_option('-g', '--gems "GEM,GEM"', "Comma separated list of gems that have to be installed on the host machine")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Initial setup of logger
|
70
|
+
# @return [Logger] the logger to use
|
71
|
+
def setup_logger
|
72
|
+
logger = Log4r::Logger.new('drbman')
|
73
|
+
logger.outputters = Log4r::StdoutOutputter.new(:console)
|
74
|
+
Log4r::Outputter[:console].formatter = Log4r::PatternFormatter.new(:pattern => "%m")
|
75
|
+
logger.level = Log4r::DEBUG
|
76
|
+
logger.level = Log4r::INFO
|
77
|
+
logger.level = Log4r::WARN if @user_choices[:quiet]
|
78
|
+
logger.level = Log4r::DEBUG if @user_choices[:debug]
|
79
|
+
# logger.trace = true
|
80
|
+
logger
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
|