drbqs 0.0.13 → 0.0.14
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +10 -7
- data/README.md +52 -11
- data/Rakefile +32 -10
- data/VERSION +1 -1
- data/bin/drbqs-manage +3 -93
- data/bin/drbqs-node +3 -89
- data/bin/drbqs-server +3 -117
- data/bin/drbqs-ssh +6 -0
- data/drbqs.gemspec +118 -97
- data/example/README.md +2 -2
- data/lib/drbqs/config/config.rb +88 -0
- data/lib/drbqs/config/process_list.rb +194 -0
- data/lib/drbqs/config/ssh_host.rb +41 -0
- data/lib/drbqs/{execute_node.rb → manage/execute_node.rb} +6 -4
- data/lib/drbqs/manage/manage.rb +100 -0
- data/lib/drbqs/manage/send_signal.rb +45 -0
- data/lib/drbqs/manage/ssh_execute.rb +23 -0
- data/lib/drbqs/manage/ssh_shell.rb +143 -0
- data/lib/drbqs/node/connection.rb +69 -0
- data/lib/drbqs/{client.rb → node/node.rb} +48 -18
- data/lib/drbqs/node/task_client.rb +94 -0
- data/lib/drbqs/server/acl_file.rb +15 -0
- data/lib/drbqs/server/check_alive.rb +23 -0
- data/lib/drbqs/server/history.rb +49 -0
- data/lib/drbqs/server/message.rb +142 -0
- data/lib/drbqs/server/node_list.rb +59 -0
- data/lib/drbqs/server/queue.rb +128 -0
- data/lib/drbqs/{server.rb → server/server.rb} +66 -74
- data/lib/drbqs/server/server_hook.rb +72 -0
- data/lib/drbqs/server/transfer_setting.rb +30 -0
- data/lib/drbqs/task/command_task.rb +43 -0
- data/lib/drbqs/{task.rb → task/task.rb} +18 -39
- data/lib/drbqs/{task_generator.rb → task/task_generator.rb} +2 -0
- data/lib/drbqs/utility/argument.rb +27 -0
- data/lib/drbqs/utility/command_line/command_base.rb +27 -0
- data/lib/drbqs/utility/command_line/command_manage.rb +121 -0
- data/lib/drbqs/utility/command_line/command_node.rb +103 -0
- data/lib/drbqs/utility/command_line/command_server.rb +165 -0
- data/lib/drbqs/utility/command_line/command_ssh.rb +126 -0
- data/lib/drbqs/utility/command_line.rb +15 -0
- data/lib/drbqs/utility/misc.rb +72 -0
- data/lib/drbqs/{server_define.rb → utility/server_define.rb} +23 -8
- data/lib/drbqs/utility/temporary.rb +49 -0
- data/lib/drbqs/{ssh/transfer.rb → utility/transfer/file_transfer.rb} +18 -58
- data/lib/drbqs/utility/transfer/transfer_client.rb +90 -0
- data/lib/drbqs.rb +10 -22
- data/spec/config/config_spec.rb +84 -0
- data/spec/config/process_list_spec.rb +149 -0
- data/spec/config/ssh_host_spec.rb +81 -0
- data/spec/integration_test/01_basic_usage_spec.rb +54 -0
- data/spec/integration_test/02_use_generator_spec.rb +53 -0
- data/spec/integration_test/03_use_temporary_file_spec.rb +26 -0
- data/spec/integration_test/04_use_unix_domain_spec.rb +34 -0
- data/spec/integration_test/05_server_exit_signal_spec.rb +23 -0
- data/spec/integration_test/06_node_exit_after_task_spec.rb +42 -0
- data/spec/integration_test/07_command_server_with_node_spec.rb +44 -0
- data/spec/integration_test/definition/server01.rb +20 -0
- data/spec/integration_test/definition/server02.rb +16 -0
- data/spec/integration_test/definition/task_obj_definition.rb +49 -0
- data/spec/manage/manage_spec.rb +33 -0
- data/spec/manage/send_signal_spec.rb +39 -0
- data/spec/{ssh_shell_spec.rb → manage/ssh_shell_spec.rb} +8 -8
- data/spec/node/connection_spec.rb +66 -0
- data/spec/node/task_client_spec.rb +212 -0
- data/spec/server/acl_file_spec.rb +9 -0
- data/spec/{server_check_alive_spec.rb → server/check_alive_spec.rb} +15 -11
- data/spec/{data → server/data}/acl.txt +0 -0
- data/spec/{history_spec.rb → server/history_spec.rb} +9 -5
- data/spec/server/message_spec.rb +195 -0
- data/spec/server/node_list_spec.rb +111 -0
- data/spec/server/queue_spec.rb +239 -0
- data/spec/{server_hook_spec.rb → server/server_hook_spec.rb} +23 -17
- data/spec/server/server_spec.rb +89 -0
- data/spec/server/transfer_setting_spec.rb +37 -0
- data/spec/spec_helper.rb +65 -0
- data/spec/task/file_transfer_spec.rb +107 -0
- data/spec/{task_generator_spec.rb → task/task_generator_spec.rb} +2 -2
- data/spec/{task_spec.rb → task/task_spec.rb} +3 -1
- data/spec/utility/argument_spec.rb +39 -0
- data/spec/utility/command_line/command_base_spec.rb +33 -0
- data/spec/utility/command_line/commands_spec.rb +15 -0
- data/spec/utility/misc_spec.rb +77 -0
- data/spec/utility/server_define_spec.rb +59 -0
- data/spec/utility/temporary_spec.rb +39 -0
- metadata +158 -93
- data/example/drbqs-manage-test.rb +0 -3
- data/example/drbqs-node-test.rb +0 -3
- data/example/drbqs-server-test.rb +0 -3
- data/lib/drbqs/acl_file.rb +0 -13
- data/lib/drbqs/config.rb +0 -98
- data/lib/drbqs/connection.rb +0 -67
- data/lib/drbqs/history.rb +0 -34
- data/lib/drbqs/manage.rb +0 -84
- data/lib/drbqs/message.rb +0 -119
- data/lib/drbqs/node_list.rb +0 -52
- data/lib/drbqs/queue.rb +0 -138
- data/lib/drbqs/server_hook.rb +0 -67
- data/lib/drbqs/ssh/host.rb +0 -26
- data/lib/drbqs/ssh/shell.rb +0 -139
- data/lib/drbqs/task_client.rb +0 -86
- data/lib/drbqs/utils.rb +0 -19
- data/spec/acl_file_spec.rb +0 -9
- data/spec/config_spec.rb +0 -14
- data/spec/connection_spec.rb +0 -49
- data/spec/manage_spec.rb +0 -57
- data/spec/message_spec.rb +0 -81
- data/spec/node_list_spec.rb +0 -68
- data/spec/queue_spec.rb +0 -59
- data/spec/server_define_spec.rb +0 -45
- data/spec/server_spec.rb +0 -56
- data/spec/task_client_spec.rb +0 -53
- data/spec/test/test1.rb +0 -13
- data/spec/test1_spec.rb +0 -80
- data/spec/test2_spec.rb +0 -69
- data/spec/transfer_spec.rb +0 -13
data/Gemfile
CHANGED
@@ -6,12 +6,15 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
-
gem "rspec", ">= 2.
|
10
|
-
gem "yard", "
|
11
|
-
gem "bundler", "
|
12
|
-
gem "jeweler", "
|
9
|
+
gem "rspec", ">= 2.6.0"
|
10
|
+
gem "yard", ">= 0.7.2"
|
11
|
+
gem "bundler", ">= 1.0.15"
|
12
|
+
gem "jeweler", ">= 1.6.2"
|
13
13
|
gem "rcov", ">= 0"
|
14
|
-
gem "filename", ">= 0.0
|
15
|
-
gem "
|
16
|
-
gem "net-ssh
|
14
|
+
gem "filename", ">= 0.1.0"
|
15
|
+
gem "user_config", ">= 0.0.1"
|
16
|
+
gem "net-ssh", ">= 2.1.4"
|
17
|
+
gem "net-ssh-shell", ">= 0.2.0"
|
18
|
+
gem "net-sftp", ">= 2.0.5"
|
19
|
+
gem "sys-proctable"
|
17
20
|
end
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ and connect the nodes to the server.
|
|
12
12
|
The behavior of nodes requests tasks, gets tasks from a server, processes the tasks,
|
13
13
|
and sends results of the tasks to the server.
|
14
14
|
The nodes work repeatedly until they get exit signal from server.
|
15
|
-
The server prepares tasks and
|
15
|
+
The server prepares tasks and signals to check that nodes are alive.
|
16
16
|
If the server does not communicate with the nodes unexpectedly,
|
17
17
|
the server deletes the nodes from node list and
|
18
18
|
requeues their calculating tasks.
|
@@ -23,7 +23,7 @@ after the server accepts them from nodes.
|
|
23
23
|
The tasks are made from objects, an instance method of them, and its arguments.
|
24
24
|
Because we use Marshal.dump and Marshal.load for communication of a server and nodes,
|
25
25
|
the objects and the arguments must be marshalized.
|
26
|
-
And also we tell the server and the nodes the
|
26
|
+
And also we tell the server and the nodes the definition of class of the objects and the arguments.
|
27
27
|
|
28
28
|
## Requirements
|
29
29
|
|
@@ -37,7 +37,7 @@ And we use net-ssh and net-ssh-shell to execute servers and nodes over ssh.
|
|
37
37
|
We prepare a class to send tasks over network,
|
38
38
|
which has data and a method to deal with tasks.
|
39
39
|
|
40
|
-
|
40
|
+
For example, we make sum.rb as the following.
|
41
41
|
|
42
42
|
class Sum
|
43
43
|
def initialize(start_num, end_num)
|
@@ -92,7 +92,8 @@ when task queue is empty.
|
|
92
92
|
|
93
93
|
### Task generator
|
94
94
|
|
95
|
-
Arguments of DRbQS::TaskGenerator.new define instance variables
|
95
|
+
Arguments of DRbQS::TaskGenerator.new define instance variables,
|
96
|
+
which is implemented by Fiber and is executed by server's requests.
|
96
97
|
|
97
98
|
task_generator = DRbQS::TaskGenerator.new(:abc => 'ABC', :def => 123, :data => [1, 2, 3])
|
98
99
|
|
@@ -104,7 +105,7 @@ The above example defines the following instance variables.
|
|
104
105
|
|
105
106
|
Then, DRbQS::TaskGenerator#set method defines generation of tasks.
|
106
107
|
The block of the method is evaluated in the context of task_generator.
|
107
|
-
|
108
|
+
We can use @abc, @def, and @data on the above example.
|
108
109
|
|
109
110
|
task_generator.set do
|
110
111
|
@data.each do |i|
|
@@ -112,8 +113,8 @@ For the above example we can use @abc, @def, and @data.
|
|
112
113
|
end
|
113
114
|
end
|
114
115
|
|
115
|
-
DRbQS::TaskGenerator#create_add_task
|
116
|
-
and
|
116
|
+
DRbQS::TaskGenerator#create_add_task set a task
|
117
|
+
and DRbQS::TaskGenerator#new_tasks actually creates the task.
|
117
118
|
The arguments of DRbQS::TaskGenerator#create_add_task is
|
118
119
|
the same as DRbQS::Task.new.
|
119
120
|
|
@@ -122,18 +123,58 @@ we set the generator by DRbQS::Server#add_task_generator.
|
|
122
123
|
|
123
124
|
### Start node and connect server
|
124
125
|
|
125
|
-
Because nodes
|
126
|
+
Because nodes need class Sum,
|
126
127
|
the nodes load sum.rb when they starts.
|
127
|
-
Then, we
|
128
|
+
Then, we use '-l' option for command 'drbqs-node'.
|
129
|
+
That is, we type in terminal.
|
128
130
|
|
129
131
|
drbqs-node druby://localhost:13500/ -l sum.rb
|
130
132
|
|
131
|
-
|
133
|
+
We execute two processes to use two CPU cores.
|
132
134
|
|
133
135
|
drbqs-node 2 druby://localhost:13500/ -l sum.rb
|
134
136
|
|
135
137
|
Then, if it succeeds, the calculation starts.
|
136
|
-
If it finishes, the server and node
|
138
|
+
If it finishes, the server and node end.
|
139
|
+
|
140
|
+
## Provided task
|
141
|
+
|
142
|
+
### DRbQS::Task
|
143
|
+
|
144
|
+
DRbQS::Task is the basic class to define tasks of DRbQS,
|
145
|
+
whose objects are consisted of a object having method to process a task
|
146
|
+
and hook for returned result.
|
147
|
+
Basically, we define objects of DRbQS::Task and
|
148
|
+
give the objects to a server.
|
149
|
+
|
150
|
+
### DRbQS::TaskSet
|
151
|
+
|
152
|
+
DRbQS::TaskSet is a child class of DRbQS::Task and consists of group a number of tasks.
|
153
|
+
Objects of the class are generated when we set the option :collect to DRbQS::TaskGenerator#set
|
154
|
+
and therefore we are unaware of the objects of DRbQS::TaskSet
|
155
|
+
in many cases.
|
156
|
+
|
157
|
+
### DRbQS::CommandTask
|
158
|
+
|
159
|
+
DRbQS::CommandTask is a class to create tasks to execute some command.
|
160
|
+
|
161
|
+
## Temporary file
|
162
|
+
|
163
|
+
We can use temporary directories and files on nodes.
|
164
|
+
In methods to calculate tasks,
|
165
|
+
DRbQS::Temporary.file returns a name of temporary file and
|
166
|
+
DRbQS::Temporary.directory returns a name of temporary directory.
|
167
|
+
These temporary files and directories are deleted
|
168
|
+
after the task is completed.
|
169
|
+
|
170
|
+
## File transfer
|
171
|
+
|
172
|
+
When a task is finished on a node,
|
173
|
+
we can transfer files from a server to a client.
|
174
|
+
To be more precise, we enqueue a file by DRbQS::FileTransfer.enqueue
|
175
|
+
in methods to calculate tasks and
|
176
|
+
files in the queue are automatically transferred.
|
177
|
+
Then, original files on nodes are deleted after transferring.
|
137
178
|
|
138
179
|
## Contributing to drbqs
|
139
180
|
|
data/Rakefile
CHANGED
@@ -21,29 +21,43 @@ Jeweler::Tasks.new do |gem|
|
|
21
21
|
gem.authors = ["Takayuki YAMAGUCHI"]
|
22
22
|
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
23
23
|
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
24
|
+
gem.add_runtime_dependency 'filename', '>= 0.1.0'
|
25
|
+
gem.add_runtime_dependency "user_config", ">= 0.0.2"
|
24
26
|
gem.add_runtime_dependency 'net-ssh', '>= 2.1.3'
|
25
27
|
gem.add_runtime_dependency 'net-ssh-shell', '>= 0.1.0'
|
26
|
-
gem.add_runtime_dependency
|
27
|
-
gem.
|
28
|
+
gem.add_runtime_dependency "net-sftp", ">= 2.0.5"
|
29
|
+
gem.add_runtime_dependency "sys-proctable"
|
28
30
|
end
|
29
31
|
Jeweler::RubygemsDotOrgTasks.new
|
30
32
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
desc "Run all specs"
|
34
|
+
task 'spec:all' => ['spec:unit', 'spec:integration']
|
35
|
+
|
36
|
+
desc "Run specs of unit test"
|
37
|
+
task 'spec:unit' do
|
38
|
+
filelist = FileList['spec/**/*_spec.rb'].delete_if do |path|
|
39
|
+
/integration_test/ =~ path
|
40
|
+
end
|
41
|
+
filelist.each do |path|
|
42
|
+
sh "rspec #{path}"
|
43
|
+
end
|
44
|
+
Rake::Task['clean:temporary'].execute
|
35
45
|
end
|
36
46
|
|
37
|
-
|
38
|
-
|
39
|
-
spec.
|
47
|
+
desc "Run specs of integration test"
|
48
|
+
task 'spec:integration' do
|
49
|
+
FileList['spec/integration_test/**/*_spec.rb'].sort.each do |path|
|
50
|
+
sh "rspec #{path}"
|
51
|
+
end
|
52
|
+
Rake::Task['clean:temporary'].execute
|
40
53
|
end
|
41
54
|
|
42
|
-
task :default => :
|
55
|
+
task :default => 'spec:all'
|
43
56
|
|
44
57
|
require 'yard'
|
45
58
|
YARD::Rake::YardocTask.new
|
46
59
|
|
60
|
+
desc "Update version of drbqs.rb"
|
47
61
|
task "version:constant" do
|
48
62
|
dir = File.dirname(__FILE__)
|
49
63
|
path = File.join(dir, 'lib/drbqs.rb')
|
@@ -53,3 +67,11 @@ task "version:constant" do
|
|
53
67
|
f.print data.sub(/^ VERSION = '.*'$/, " VERSION = '#{version}'")
|
54
68
|
end
|
55
69
|
end
|
70
|
+
|
71
|
+
desc "Remove temporary home directory for specs."
|
72
|
+
task "clean:temporary" do
|
73
|
+
dir = File.join(File.dirname(__FILE__), 'spec', 'home_for_spec')
|
74
|
+
if File.exist?(dir)
|
75
|
+
FileUtils.rm_r(dir)
|
76
|
+
end
|
77
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.14
|
data/bin/drbqs-manage
CHANGED
@@ -1,96 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
require '
|
3
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
4
|
+
require 'drbqs/utility/command_line'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
help_message =<<HELP
|
9
|
-
Usage: #{File.basename(__FILE__)} <command> [arguments ...]
|
10
|
-
Manage DRbQS server by sending messages.
|
11
|
-
<command> is 'exit-signal', 'initialize', or 'ssh'.
|
12
|
-
|
13
|
-
HELP
|
14
|
-
|
15
|
-
def check_argument_size(argv, check_method, n)
|
16
|
-
unless argv.size.__send__(check_method, n)
|
17
|
-
raise "Invalid arguments number. Please refer '#{File.basename(__FILE__)} -h'."
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
command = ARGV[0]
|
22
|
-
argv, command_args = DRbQS::Manage.split_arguments(ARGV)
|
23
|
-
|
24
|
-
options = {}
|
25
|
-
if /^ssh/ =~ command
|
26
|
-
check_argument_size(argv, :>=, 2)
|
27
|
-
ssh_host =DRbQS::SSHHost.new
|
28
|
-
path, options = ssh_host.get_options(argv[1])
|
29
|
-
$stdout.puts "Use configuration: #{path}" if path
|
30
|
-
argv[1] = options[:dest] if options[:dest]
|
31
|
-
end
|
32
|
-
|
33
|
-
begin
|
34
|
-
OptionParser.new(help_message) do |opt|
|
35
|
-
opt.on('--debug', 'Set $DEBUG true.') do |v|
|
36
|
-
$DEBUG = true
|
37
|
-
end
|
38
|
-
opt.on('--dir DIR', String, 'Set the base directory over ssh.') do |v|
|
39
|
-
options[:dir] = v
|
40
|
-
end
|
41
|
-
opt.on('--shell STR', String, 'Set the shell over ssh') do |v|
|
42
|
-
options[:shell] = v
|
43
|
-
end
|
44
|
-
opt.on('--rvm STR', String, 'Ruby version to use on RVM over ssh.') do |v|
|
45
|
-
options[:rvm] = v
|
46
|
-
end
|
47
|
-
opt.on('--rvm-init PATH', String, 'Path of script to initialize RVM over ssh.') do |v|
|
48
|
-
options[:rvm_init] = v
|
49
|
-
end
|
50
|
-
opt.on('--output PATH', String, 'File path that stdout and stderr are output to over ssh.') do |v|
|
51
|
-
options[:output] = v
|
52
|
-
end
|
53
|
-
opt.on('--nice NUM', Integer, 'Set the value for nice command.') do |v|
|
54
|
-
options[:nice] = v
|
55
|
-
end
|
56
|
-
opt.on('--nohup', 'Use nohup command.') do |v|
|
57
|
-
options[:nohup] = true
|
58
|
-
end
|
59
|
-
opt.parse!(argv)
|
60
|
-
end
|
61
|
-
rescue OptionParser::InvalidOption
|
62
|
-
$stderr.print <<MES
|
63
|
-
error: Invalid Option
|
64
|
-
#{help_message}
|
65
|
-
MES
|
66
|
-
exit(2)
|
67
|
-
rescue OptionParser::InvalidArgument
|
68
|
-
$stderr.print <<MES
|
69
|
-
error: Invalid Argument
|
70
|
-
#{help_message}
|
71
|
-
MES
|
72
|
-
exit(2)
|
73
|
-
end
|
74
|
-
|
75
|
-
manage = DRbQS::Manage.new
|
76
|
-
|
77
|
-
case command
|
78
|
-
when 'exit-signal'
|
79
|
-
check_argument_size(argv, :==, 2)
|
80
|
-
uri = argv[1]
|
81
|
-
manage.send_exit_signal(uri)
|
82
|
-
when 'status'
|
83
|
-
check_argument_size(argv, :==, 2)
|
84
|
-
uri = argv[1]
|
85
|
-
if status = manage.get_status(uri)
|
86
|
-
$stdout.puts status
|
87
|
-
end
|
88
|
-
when 'initialize'
|
89
|
-
check_argument_size(argv, :==, 1)
|
90
|
-
manage.create_config
|
91
|
-
when 'ssh'
|
92
|
-
dest = argv[1]
|
93
|
-
manage.execute_over_ssh(dest, options, command_args)
|
94
|
-
else
|
95
|
-
raise "Invalid command: #{command}"
|
96
|
-
end
|
6
|
+
DRbQS::CommandManage.exec(ARGV)
|
data/bin/drbqs-node
CHANGED
@@ -1,92 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
require '
|
3
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
4
|
+
require 'drbqs/utility/command_line'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
help_message =<<HELP
|
9
|
-
Usage: #{File.basename(__FILE__)} [<uri>] [<process_number>] [options ...]
|
10
|
-
Start DRbQS nodes connecting to <uri>.
|
11
|
-
|
12
|
-
HELP
|
13
|
-
|
14
|
-
LOG_PREFIX_DEFAULT = 'drbqs_node'
|
15
|
-
LOG_LEVEL_DEFAULT = Logger::ERROR
|
16
|
-
|
17
|
-
options = {
|
18
|
-
:log_prefix => LOG_PREFIX_DEFAULT,
|
19
|
-
:log_level => LOG_LEVEL_DEFAULT,
|
20
|
-
:load => []
|
21
|
-
}
|
22
|
-
|
23
|
-
begin
|
24
|
-
OptionParser.new(help_message) do |opt|
|
25
|
-
opt.on('-l', '--load FILE', String, 'Add a file to load.') do |v|
|
26
|
-
options[:load] << File.expand_path(v)
|
27
|
-
end
|
28
|
-
opt.on('--log-prefix STR', String, "Set the prefix of log files. The default is '#{LOG_PREFIX_DEFAULT}'.") do |v|
|
29
|
-
options[:log_prefix] = v
|
30
|
-
end
|
31
|
-
opt.on('--log-level LEVEL', String,
|
32
|
-
"Set the log level. The value accepts 'fatal', 'error', 'warn', 'info', and 'debug'. The default is 'error'.") do |v|
|
33
|
-
if /^(fatal)|(error)|(warn)|(info)|(debug)$/i =~ v
|
34
|
-
options[:log_level] = eval("Logger::#{v.upcase}")
|
35
|
-
else
|
36
|
-
raise "Invalid log level."
|
37
|
-
end
|
38
|
-
end
|
39
|
-
opt.on('--log-stdout', 'Use stdout for outputting logs. This option cancels --log-prefix.') do |v|
|
40
|
-
options[:log_prefix] = nil
|
41
|
-
end
|
42
|
-
opt.on('--debug', 'Set $DEBUG true.') do |v|
|
43
|
-
$DEBUG = true
|
44
|
-
end
|
45
|
-
opt.parse!(ARGV)
|
46
|
-
end
|
47
|
-
rescue OptionParser::InvalidOption
|
48
|
-
$stderr.print <<MES
|
49
|
-
error: Invalid Option
|
50
|
-
#{help_message}
|
51
|
-
MES
|
52
|
-
exit(2)
|
53
|
-
rescue OptionParser::InvalidArgument
|
54
|
-
$stderr.print <<MES
|
55
|
-
error: Invalid Argument
|
56
|
-
#{help_message}
|
57
|
-
MES
|
58
|
-
exit(2)
|
59
|
-
end
|
60
|
-
|
61
|
-
if ARGV.size > 2
|
62
|
-
raise "Too many arguments. Please refer '#{File.basename(__FILE__)} -h'."
|
63
|
-
end
|
64
|
-
|
65
|
-
process_num = 1
|
66
|
-
uri = "druby://localhost:#{DRbQS::ROOT_DEFAULT_PORT}"
|
67
|
-
|
68
|
-
ARGV.each do |arg|
|
69
|
-
if /^\d+$/ =~ arg
|
70
|
-
process_num = arg.to_i
|
71
|
-
else
|
72
|
-
uri = arg
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
options[:load].each do |v|
|
77
|
-
puts "load #{v}"
|
78
|
-
load v
|
79
|
-
end
|
80
|
-
|
81
|
-
puts "Connect to #{uri}"
|
82
|
-
puts "Execute #{process_num} processes"
|
83
|
-
|
84
|
-
if options[:log_prefix]
|
85
|
-
if /\/$/ =~ options[:log_prefix]
|
86
|
-
options[:log_prefix] += 'out'
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
exec_node = DRbQS::ExecuteNode.new(uri, options[:log_prefix], options[:log_level])
|
91
|
-
exec_node.execute(process_num)
|
92
|
-
exec_node.wait
|
6
|
+
DRbQS::CommandNode.exec(ARGV)
|
data/bin/drbqs-server
CHANGED
@@ -1,120 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
require '
|
3
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
4
|
+
require 'drbqs/utility/command_line'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
help_message =<<HELP
|
9
|
-
Usage: #{File.basename(__FILE__)} <definition.rb> [other files ...] [options ...]
|
10
|
-
#{File.basename(__FILE__)} <definition.rb> [other files ...] [options ...] -- [server options ...]
|
11
|
-
Start DRbQS server of definition files.
|
12
|
-
|
13
|
-
HELP
|
14
|
-
|
15
|
-
options = {
|
16
|
-
:log_file => STDOUT,
|
17
|
-
:command_type => :server_start,
|
18
|
-
:acl => DRbQS::Config.get_acl_file
|
19
|
-
}
|
20
|
-
|
21
|
-
test_opts = {}
|
22
|
-
execute_node_number = nil
|
23
|
-
|
24
|
-
command_argv, server_argv = DRbQS::Manage.split_arguments(ARGV)
|
25
|
-
|
26
|
-
begin
|
27
|
-
OptionParser.new(help_message) do |opt|
|
28
|
-
opt.on('-p PORT', '--port', Integer, 'Set the port number of server.') do |v|
|
29
|
-
options[:port] = v
|
30
|
-
end
|
31
|
-
opt.on('--acl FILE', String, 'Set a file to define ACL.') do |v|
|
32
|
-
options[:acl] = v
|
33
|
-
end
|
34
|
-
opt.on('--log-file STR', String, "Set the path of log file. If this options is not set, use STDOUT.") do |v|
|
35
|
-
options[:log_file] = v
|
36
|
-
end
|
37
|
-
opt.on('--log-level LEVEL', String,
|
38
|
-
"Set the log level. The value accepts 'fatal', 'error', 'warn', 'info', and 'debug'. The default is 'error'.") do |v|
|
39
|
-
if /^(fatal)|(error)|(warn)|(info)|(debug)$/i =~ v
|
40
|
-
options[:log_level] = eval("Logger::#{v.upcase}")
|
41
|
-
else
|
42
|
-
raise "Invalid log level."
|
43
|
-
end
|
44
|
-
end
|
45
|
-
opt.on('--file-directory DIR', String, 'Set the file archive directory.') do |v|
|
46
|
-
options[:file_directory] = v
|
47
|
-
end
|
48
|
-
opt.on('--scp-user USER', String, 'Set the user of scp destination.') do |v|
|
49
|
-
options[:scp_user] = v
|
50
|
-
end
|
51
|
-
opt.on('--scp-host HOST', String, 'Set the host of scp destination.') do |v|
|
52
|
-
options[:scp_host] = v
|
53
|
-
end
|
54
|
-
opt.on('--profile', 'Use profile for test exec.') do |v|
|
55
|
-
test_opts[:profile] = true
|
56
|
-
end
|
57
|
-
opt.on('--debug', 'Set $DEBUG true.') do |v|
|
58
|
-
$DEBUG = true
|
59
|
-
end
|
60
|
-
opt.on('--test STR', String, 'Execute test.') do |v|
|
61
|
-
options[:command_type] = "test_#{v}"
|
62
|
-
end
|
63
|
-
opt.on('--execute-node NUM', Integer, 'Execute nodes.') do |v|
|
64
|
-
execute_node_number = v
|
65
|
-
end
|
66
|
-
opt.parse!(command_argv)
|
67
|
-
end
|
68
|
-
rescue OptionParser::InvalidOption
|
69
|
-
$stderr.print <<MES
|
70
|
-
error: Invalid Option
|
71
|
-
#{help_message}
|
72
|
-
MES
|
73
|
-
exit(2)
|
74
|
-
rescue OptionParser::InvalidArgument
|
75
|
-
$stderr.print <<MES
|
76
|
-
error: Invalid Argument
|
77
|
-
#{help_message}
|
78
|
-
MES
|
79
|
-
exit(2)
|
80
|
-
end
|
81
|
-
|
82
|
-
if command_argv.size == 0 || !File.exist?(command_argv[0])
|
83
|
-
raise "Invalid arguments. Please refer '#{File.basename(__FILE__)} -h'."
|
84
|
-
end
|
85
|
-
|
86
|
-
command_argv.each do |path|
|
87
|
-
puts "load #{path}"
|
88
|
-
load path
|
89
|
-
end
|
90
|
-
|
91
|
-
WAIT_SERVER_TIME = 0.3
|
92
|
-
NODE_INTERVAL_TIME = 1
|
93
|
-
|
94
|
-
DRbQS.parse_option(server_argv)
|
95
|
-
case options[:command_type]
|
96
|
-
when /^test/
|
97
|
-
s = options[:command_type].split('_')[1].split(',')
|
98
|
-
type = s[0].intern
|
99
|
-
DRbQS.test_server(options, type, s[1..-1], test_opts)
|
100
|
-
else
|
101
|
-
if execute_node_number
|
102
|
-
fork do
|
103
|
-
DRbQS.start_server(options)
|
104
|
-
end
|
105
|
-
uri = "druby://:#{options[:port] || DRbQS::ROOT_DEFAULT_PORT}"
|
106
|
-
manage = DRbQS::Manage.new
|
107
|
-
begin
|
108
|
-
sleep(WAIT_SERVER_TIME)
|
109
|
-
end while !manage.get_status(uri)
|
110
|
-
node_log_file = nil
|
111
|
-
unless IO === options[:log_file]
|
112
|
-
node_log_file = FileName.create(options[:log_file], :add => :always, :position => :middle, :delimiter => '', :format => "_node_%02d")
|
113
|
-
end
|
114
|
-
exec_node = DRbQS::ExecuteNode.new(uri, node_log_file, options[:log_level])
|
115
|
-
exec_node.execute(execute_node_number, NODE_INTERVAL_TIME)
|
116
|
-
exec_node.wait
|
117
|
-
else
|
118
|
-
DRbQS.start_server(options)
|
119
|
-
end
|
120
|
-
end
|
6
|
+
DRbQS::CommandServer.exec(ARGV)
|