drbqs 0.0.13 → 0.0.14
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/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
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'drbqs/utility/transfer/transfer_client'
|
|
2
|
+
|
|
3
|
+
module DRbQS
|
|
4
|
+
class Server
|
|
5
|
+
class TransferSetting
|
|
6
|
+
attr_accessor :host, :user, :directory
|
|
7
|
+
|
|
8
|
+
def initialize(host, user, directory)
|
|
9
|
+
@host = host
|
|
10
|
+
@user = user
|
|
11
|
+
@directory = directory
|
|
12
|
+
@created = false
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def create(directory, opts = {})
|
|
16
|
+
return nil if @created
|
|
17
|
+
@directory = directory || @directory
|
|
18
|
+
return nil if !@directory
|
|
19
|
+
@created = true
|
|
20
|
+
transfer_client = DRbQS::TransferClient.new(@directory)
|
|
21
|
+
transfer_client.make_directory
|
|
22
|
+
if host = opts[:host] || @host
|
|
23
|
+
user = opts[:user] || @user || ENV['USER']
|
|
24
|
+
transfer_client.set_sftp(user, host)
|
|
25
|
+
end
|
|
26
|
+
transfer_client
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module DRbQS
|
|
2
|
+
# Execute a command and transfer files if needed.
|
|
3
|
+
class CommandExecute
|
|
4
|
+
|
|
5
|
+
# :transfer String or Array
|
|
6
|
+
# :compress true or false
|
|
7
|
+
def initialize(cmd, opts = {})
|
|
8
|
+
@cmd = cmd
|
|
9
|
+
unless (Array === @cmd || String === @cmd)
|
|
10
|
+
raise ArgumentError, "Invalid command: #{@cmd.inspect}"
|
|
11
|
+
end
|
|
12
|
+
@transfer = opts[:transfer]
|
|
13
|
+
@compress = opts[:compress]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def exec
|
|
17
|
+
case @cmd
|
|
18
|
+
when Array
|
|
19
|
+
@cmd.each { |c| system(c) }
|
|
20
|
+
when String
|
|
21
|
+
system(@cmd)
|
|
22
|
+
end
|
|
23
|
+
exit_status = $?.exitstatus
|
|
24
|
+
if @transfer
|
|
25
|
+
if @transfer.respond_to?(:each)
|
|
26
|
+
@transfer.each { |path| DRbQS::FileTransfer.enqueue(path, :compress => @compress) }
|
|
27
|
+
else
|
|
28
|
+
DRbQS::FileTransfer.enqueue(@transfer, :compress => @compress)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
exit_status
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Class to define tasks such that we execute a command.
|
|
36
|
+
class CommandTask < Task
|
|
37
|
+
|
|
38
|
+
# &hook takes a server instance and exit number of command.
|
|
39
|
+
def initialize(cmd, opts = {}, &hook)
|
|
40
|
+
super(CommandExecute.new(cmd, opts), :exec, &hook)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
require 'drbqs/utility/transfer/file_transfer'
|
|
2
|
+
require 'drbqs/task/task_generator'
|
|
3
|
+
|
|
1
4
|
module DRbQS
|
|
2
5
|
|
|
3
6
|
# The tasks defined by this class are sent to nodes and
|
|
@@ -34,51 +37,22 @@ module DRbQS
|
|
|
34
37
|
@args == other.instance_variable_get(:@args)
|
|
35
38
|
end
|
|
36
39
|
|
|
37
|
-
def
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class CommandExecute
|
|
44
|
-
|
|
45
|
-
# :transfer String or Array
|
|
46
|
-
# :compress true or false
|
|
47
|
-
def initialize(cmd, opts = {})
|
|
48
|
-
@cmd = cmd
|
|
49
|
-
unless (Array === @cmd || String === @cmd)
|
|
50
|
-
raise ArgumentError, "Invalid command: #{@cmd.inspect}"
|
|
51
|
-
end
|
|
52
|
-
@transfer = opts[:transfer]
|
|
53
|
-
@compress = opts[:compress]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def exec
|
|
57
|
-
case @cmd
|
|
58
|
-
when Array
|
|
59
|
-
@cmd.each { |c| system(c) }
|
|
60
|
-
when String
|
|
61
|
-
system(@cmd)
|
|
40
|
+
def exec_hook(server, result)
|
|
41
|
+
if @hook
|
|
42
|
+
@hook.call(server, result)
|
|
43
|
+
true
|
|
44
|
+
else
|
|
45
|
+
nil
|
|
62
46
|
end
|
|
63
|
-
exit_status = $?.exitstatus
|
|
64
|
-
if @transfer
|
|
65
|
-
if Array === @transfer
|
|
66
|
-
@transfer.each { |path| DRbQS::FileTransfer.enqueue(path, @compress) }
|
|
67
|
-
else
|
|
68
|
-
DRbQS::FileTransfer.enqueue(@transfer, @compress)
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
exit_status
|
|
72
47
|
end
|
|
73
|
-
end
|
|
74
48
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
super(CommandExecute.new(cmd, {}), :exec, &hook)
|
|
49
|
+
def self.execute_task(marshal_obj, method_sym, args)
|
|
50
|
+
obj = Marshal.load(marshal_obj)
|
|
51
|
+
obj.__send__(method_sym, *args)
|
|
79
52
|
end
|
|
80
53
|
end
|
|
81
54
|
|
|
55
|
+
# Class to group a number of objects to process tasks.
|
|
82
56
|
class TaskContainer
|
|
83
57
|
def initialize(task_ary)
|
|
84
58
|
@data = task_ary.map.with_index do |task, i|
|
|
@@ -104,6 +78,8 @@ module DRbQS
|
|
|
104
78
|
end
|
|
105
79
|
end
|
|
106
80
|
|
|
81
|
+
# Task to group a number of tasks,
|
|
82
|
+
# which uses TaskContainer and manages hooks of the tasks.
|
|
107
83
|
class TaskSet < Task
|
|
108
84
|
def initialize(task_ary)
|
|
109
85
|
@original_hook = task_ary.map do |task|
|
|
@@ -118,4 +94,7 @@ module DRbQS
|
|
|
118
94
|
end
|
|
119
95
|
end
|
|
120
96
|
end
|
|
97
|
+
|
|
121
98
|
end
|
|
99
|
+
|
|
100
|
+
require 'drbqs/task/command_task'
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module DRbQS
|
|
2
|
+
module CommandLineArgument
|
|
3
|
+
def split_arguments(argv, split = '--')
|
|
4
|
+
if n = argv.index(split)
|
|
5
|
+
[argv[0..(n - 1)], argv[(n + 1)..-1]]
|
|
6
|
+
else
|
|
7
|
+
[argv, []]
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
module_function :split_arguments
|
|
11
|
+
|
|
12
|
+
def check_argument_size(argv, *args)
|
|
13
|
+
n = argv.size
|
|
14
|
+
args.each_slice(2).each do |ary|
|
|
15
|
+
if ary.size == 2
|
|
16
|
+
unless n.__send__(*ary)
|
|
17
|
+
raise "Invalid arguments number. Please refer to documents."
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
raise ArgumentError, "Invalid argument to check array size."
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
true
|
|
24
|
+
end
|
|
25
|
+
module_function :check_argument_size
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module DRbQS
|
|
2
|
+
class CommandBase
|
|
3
|
+
include DRbQS::CommandLineArgument
|
|
4
|
+
@@command_name = File.basename($PROGRAM_NAME)
|
|
5
|
+
|
|
6
|
+
def self.exec(argv)
|
|
7
|
+
obj = self.new
|
|
8
|
+
obj.parse_option(argv)
|
|
9
|
+
obj.exec
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def exit_normally
|
|
13
|
+
Kernel.exit(0)
|
|
14
|
+
end
|
|
15
|
+
private :exit_normally
|
|
16
|
+
|
|
17
|
+
def exit_unusually
|
|
18
|
+
Kernel.exit(1)
|
|
19
|
+
end
|
|
20
|
+
private :exit_unusually
|
|
21
|
+
|
|
22
|
+
def exit_invalid_option
|
|
23
|
+
Kernel.exit(2)
|
|
24
|
+
end
|
|
25
|
+
private :exit_invalid_option
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
module DRbQS
|
|
2
|
+
class CommandManage < CommandBase
|
|
3
|
+
HELP_MESSAGE =<<HELP
|
|
4
|
+
Usage: #{@@command_name} <command> [arguments ...]
|
|
5
|
+
Manage DRbQS server by sending messages.
|
|
6
|
+
<command> is 'signal', 'status', 'process', or 'initialize'.
|
|
7
|
+
|
|
8
|
+
#{@@command_name} signal <uri> server-exit
|
|
9
|
+
#{@@command_name} signal <uri> node-exit-after-task <node_number>
|
|
10
|
+
#{@@command_name} status <uri>
|
|
11
|
+
#{@@command_name} process list
|
|
12
|
+
#{@@command_name} process clear
|
|
13
|
+
#{@@command_name} initialize
|
|
14
|
+
|
|
15
|
+
HELP
|
|
16
|
+
|
|
17
|
+
def parse_option(argv)
|
|
18
|
+
begin
|
|
19
|
+
OptionParser.new(HELP_MESSAGE) do |opt|
|
|
20
|
+
opt.on('--debug', 'Set $DEBUG true.') do |v|
|
|
21
|
+
$DEBUG = true
|
|
22
|
+
end
|
|
23
|
+
opt.parse!(argv)
|
|
24
|
+
end
|
|
25
|
+
rescue OptionParser::InvalidOption
|
|
26
|
+
$stderr.print "error: Invalid Option\n\n" << HELP_MESSAGE
|
|
27
|
+
exit_invalid_option
|
|
28
|
+
rescue OptionParser::InvalidArgument
|
|
29
|
+
$stderr.print "error: Invalid Argument\n\n" << HELP_MESSAGE
|
|
30
|
+
exit_invalid_option
|
|
31
|
+
end
|
|
32
|
+
@mode = argv.shift
|
|
33
|
+
@argv = argv
|
|
34
|
+
@manage = DRbQS::Manage.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def command_initialize
|
|
38
|
+
check_argument_size(@argv, :>=, 0, :<=, 1)
|
|
39
|
+
@manage.set_home_directory(@argv[0])
|
|
40
|
+
@manage.create_config
|
|
41
|
+
exit_normally
|
|
42
|
+
end
|
|
43
|
+
private :command_initialize
|
|
44
|
+
|
|
45
|
+
def command_process
|
|
46
|
+
check_argument_size(@argv, :>=, 0, :<=, 1)
|
|
47
|
+
if @argv[0] == 'clear'
|
|
48
|
+
@manage.clear_process
|
|
49
|
+
exit_normally
|
|
50
|
+
end
|
|
51
|
+
list = @manage.list_process
|
|
52
|
+
$stdout.puts "Server"
|
|
53
|
+
list[:server].each do |uri, data|
|
|
54
|
+
$stdout.puts "#{uri}"
|
|
55
|
+
data.each do |k, v|
|
|
56
|
+
$stdout.puts sprintf(" %-10s %s", k, v)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
$stdout.puts "\nNode"
|
|
60
|
+
list[:node].each do |pid, data|
|
|
61
|
+
$stdout.puts "#{pid}"
|
|
62
|
+
data.each do |k, v|
|
|
63
|
+
$stdout.puts sprintf(" %-10s %s", k, v)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
exit_normally
|
|
67
|
+
end
|
|
68
|
+
private :command_process
|
|
69
|
+
|
|
70
|
+
def command_status
|
|
71
|
+
check_argument_size(@argv, :==, 1)
|
|
72
|
+
@manage.set_uri(@argv[0])
|
|
73
|
+
if status = @manage.get_status
|
|
74
|
+
$stdout.puts status
|
|
75
|
+
end
|
|
76
|
+
exit_normally
|
|
77
|
+
end
|
|
78
|
+
private :command_status
|
|
79
|
+
|
|
80
|
+
def command_signal
|
|
81
|
+
@manage.set_uri(@argv[0])
|
|
82
|
+
signal = @argv[1]
|
|
83
|
+
case signal
|
|
84
|
+
when 'server-exit'
|
|
85
|
+
check_argument_size(@argv, :==, 2)
|
|
86
|
+
@manage.send_exit_signal
|
|
87
|
+
exit_normally
|
|
88
|
+
when 'node-exit-after-task'
|
|
89
|
+
check_argument_size(@argv, :==, 3)
|
|
90
|
+
node_id = @argv[2].to_i
|
|
91
|
+
@manage.send_node_exit_after_task(node_id)
|
|
92
|
+
exit_normally
|
|
93
|
+
else
|
|
94
|
+
$stderr.print "error: Invalid signal '#{signal}'\n\n" << HELP_MESSAGE
|
|
95
|
+
exit_unusually
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
private :command_signal
|
|
99
|
+
|
|
100
|
+
def exec
|
|
101
|
+
case @mode
|
|
102
|
+
when 'initialize'
|
|
103
|
+
command_initialize
|
|
104
|
+
when 'process'
|
|
105
|
+
command_process
|
|
106
|
+
when 'status'
|
|
107
|
+
command_status
|
|
108
|
+
when 'signal'
|
|
109
|
+
command_signal
|
|
110
|
+
end
|
|
111
|
+
$stderr.print "error: Invalid command '#{@mode}'\n\n" << HELP_MESSAGE
|
|
112
|
+
exit_invalid_option
|
|
113
|
+
rescue DRb::DRbConnError => err
|
|
114
|
+
$stderr.puts "error: Can not connect server: #{err.to_s}"
|
|
115
|
+
exit_unusually
|
|
116
|
+
rescue => err
|
|
117
|
+
$stderr.print "error: #{err.to_s}\n" << err.backtrace.join("\n")
|
|
118
|
+
exit_unusually
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
module DRbQS
|
|
2
|
+
class CommandNode < CommandBase
|
|
3
|
+
HELP_MESSAGE =<<HELP
|
|
4
|
+
Usage: #{@@command_name} [<uri>] [<process_number>] [options ...]
|
|
5
|
+
Start DRbQS nodes connecting to <uri>.
|
|
6
|
+
|
|
7
|
+
HELP
|
|
8
|
+
|
|
9
|
+
LOG_PREFIX_DEFAULT = 'drbqs_node'
|
|
10
|
+
LOG_LEVEL_DEFAULT = Logger::ERROR
|
|
11
|
+
|
|
12
|
+
def parse_option(argv)
|
|
13
|
+
options = {
|
|
14
|
+
:log_prefix => LOG_PREFIX_DEFAULT,
|
|
15
|
+
:log_level => LOG_LEVEL_DEFAULT,
|
|
16
|
+
:load => []
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
begin
|
|
20
|
+
OptionParser.new(HELP_MESSAGE) do |opt|
|
|
21
|
+
opt.on('-l', '--load FILE', String, 'Add a file to load.') do |v|
|
|
22
|
+
options[:load] << File.expand_path(v)
|
|
23
|
+
end
|
|
24
|
+
opt.on('--log-prefix STR', String, "Set the prefix of log files. The default is '#{LOG_PREFIX_DEFAULT}'.") do |v|
|
|
25
|
+
options[:log_prefix] = v
|
|
26
|
+
end
|
|
27
|
+
opt.on('--log-level LEVEL', String,
|
|
28
|
+
"Set the log level. The value accepts 'fatal', 'error', 'warn', 'info', and 'debug'. The default is 'error'.") do |v|
|
|
29
|
+
if /^(fatal)|(error)|(warn)|(info)|(debug)$/i =~ v
|
|
30
|
+
options[:log_level] = eval("Logger::#{v.upcase}")
|
|
31
|
+
else
|
|
32
|
+
$stderr.print "error: Invalid log level.\n\n" << HELP_MESSAGE
|
|
33
|
+
exit_invalid_option
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
opt.on('--log-stdout', 'Use stdout for outputting logs. This option cancels --log-prefix.') do |v|
|
|
37
|
+
options[:log_prefix] = nil
|
|
38
|
+
end
|
|
39
|
+
opt.on('--debug', 'Set $DEBUG true.') do |v|
|
|
40
|
+
$DEBUG = true
|
|
41
|
+
end
|
|
42
|
+
opt.parse!(argv)
|
|
43
|
+
end
|
|
44
|
+
rescue OptionParser::InvalidOption
|
|
45
|
+
$stderr.print "error: Invalid Option\n\n" << HELP_MESSAGE
|
|
46
|
+
exit_invalid_option
|
|
47
|
+
rescue OptionParser::InvalidArgument
|
|
48
|
+
$stderr.print "error: Invalid Argument\n\n" << HELP_MESSAGE
|
|
49
|
+
exit_invalid_option
|
|
50
|
+
end
|
|
51
|
+
@options = options
|
|
52
|
+
@argv = argv
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def parse_argv_array
|
|
56
|
+
process_num = 1
|
|
57
|
+
uri = nil
|
|
58
|
+
@argv.each do |arg|
|
|
59
|
+
if /^\d+$/ =~ arg
|
|
60
|
+
process_num = arg.to_i
|
|
61
|
+
elsif uri
|
|
62
|
+
$stderr.print "error: More than one uris is set.\n\n" << HELP_MESSAGE
|
|
63
|
+
exit_invalid_option
|
|
64
|
+
else
|
|
65
|
+
uri = arg
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
uri ||= DRbQS::Misc.create_uri
|
|
69
|
+
[process_num, uri]
|
|
70
|
+
end
|
|
71
|
+
private :parse_argv_array
|
|
72
|
+
|
|
73
|
+
def exec
|
|
74
|
+
if @argv.size > 2
|
|
75
|
+
$stderr.print "error: Too many arguments.\n\n" << HELP_MESSAGE
|
|
76
|
+
exit_invalid_option
|
|
77
|
+
end
|
|
78
|
+
process_num, uri = parse_argv_array
|
|
79
|
+
|
|
80
|
+
@options[:load].each do |v|
|
|
81
|
+
$stdout.puts "load #{v}"
|
|
82
|
+
load v
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
$stdout.puts "Connect to #{uri}"
|
|
86
|
+
$stdout.puts "Execute #{process_num} processes"
|
|
87
|
+
|
|
88
|
+
if @options[:log_prefix]
|
|
89
|
+
if /\/$/ =~ @options[:log_prefix]
|
|
90
|
+
@options[:log_prefix] += 'out'
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
exec_node = DRbQS::ExecuteNode.new(uri, @options[:log_prefix], @options[:log_level])
|
|
95
|
+
exec_node.execute(process_num)
|
|
96
|
+
exec_node.wait
|
|
97
|
+
exit_normally
|
|
98
|
+
rescue => err
|
|
99
|
+
$stderr.print "error: #{err.to_s}\n" << err.backtrace.join("\n")
|
|
100
|
+
exit_unusually
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
module DRbQS
|
|
2
|
+
class CommandServer < CommandBase
|
|
3
|
+
@@command_name = File.basename($PROGRAM_NAME)
|
|
4
|
+
|
|
5
|
+
HELP_MESSAGE =<<HELP
|
|
6
|
+
Usage: #{@@command_name} <definition.rb> [other files ...] [options ...]
|
|
7
|
+
#{@@command_name} <definition.rb> [other files ...] [options ...] -- [server options ...]
|
|
8
|
+
Start DRbQS server of definition files.
|
|
9
|
+
|
|
10
|
+
HELP
|
|
11
|
+
|
|
12
|
+
NODE_INTERVAL_TIME = 1
|
|
13
|
+
|
|
14
|
+
def parse_option(argv)
|
|
15
|
+
@options = {
|
|
16
|
+
:log_file => STDOUT
|
|
17
|
+
}
|
|
18
|
+
@command_type = :server_start
|
|
19
|
+
|
|
20
|
+
test_opts = {}
|
|
21
|
+
@execute_node_number = nil
|
|
22
|
+
@command_argv, @server_argv = split_arguments(argv)
|
|
23
|
+
|
|
24
|
+
begin
|
|
25
|
+
OptionParser.new(HELP_MESSAGE) do |opt|
|
|
26
|
+
opt.on('-p PORT', '--port', Integer, 'Set the port number of server.') do |v|
|
|
27
|
+
@options[:port] = v
|
|
28
|
+
end
|
|
29
|
+
opt.on('-u PATH', '--unix', String, 'Set the path of unix domain socket.') do |v|
|
|
30
|
+
@options[:unix] = v
|
|
31
|
+
end
|
|
32
|
+
opt.on('--acl FILE', String, 'Set a file to define ACL.') do |v|
|
|
33
|
+
@options[:acl] = v
|
|
34
|
+
end
|
|
35
|
+
opt.on('--log-file STR', String, "Set the path of log file. If this options is not set, use STDOUT.") do |v|
|
|
36
|
+
@options[:log_file] = v
|
|
37
|
+
end
|
|
38
|
+
opt.on('--log-level LEVEL', String,
|
|
39
|
+
"Set the log level. The value accepts 'fatal', 'error', 'warn', 'info', and 'debug'. The default is 'error'.") do |v|
|
|
40
|
+
if /^(fatal)|(error)|(warn)|(info)|(debug)$/i =~ v
|
|
41
|
+
@options[:log_level] = eval("Logger::#{v.upcase}")
|
|
42
|
+
else
|
|
43
|
+
$stderr.print "error: Invalid log level.\n\n" << HELP_MESSAGE
|
|
44
|
+
exit_invalid_option
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
opt.on('--file-directory DIR', String, 'Set the file archive directory.') do |v|
|
|
48
|
+
@options[:file_directory] = v
|
|
49
|
+
end
|
|
50
|
+
opt.on('--sftp-user USER', String, 'Set the user of sftp destination.') do |v|
|
|
51
|
+
@options[:sftp_user] = v
|
|
52
|
+
end
|
|
53
|
+
opt.on('--sftp-host HOST', String, 'Set the host of sftp destination.') do |v|
|
|
54
|
+
@options[:sftp_host] = v
|
|
55
|
+
end
|
|
56
|
+
opt.on('--profile', 'Use profile for test exec.') do |v|
|
|
57
|
+
@test_opts[:profile] = true
|
|
58
|
+
end
|
|
59
|
+
opt.on('--debug', 'Set $DEBUG true.') do |v|
|
|
60
|
+
$DEBUG = true
|
|
61
|
+
end
|
|
62
|
+
opt.on('--test STR', String, 'Execute test.') do |v|
|
|
63
|
+
@command_type = "test_#{v}"
|
|
64
|
+
end
|
|
65
|
+
opt.on('--execute-node NUM', Integer, 'Execute nodes.') do |v|
|
|
66
|
+
@execute_node_number = v
|
|
67
|
+
end
|
|
68
|
+
opt.on('-h', '--help', 'Show help.') do |v|
|
|
69
|
+
$stdout.print opt
|
|
70
|
+
@command_type = :help
|
|
71
|
+
end
|
|
72
|
+
opt.parse!(@command_argv)
|
|
73
|
+
end
|
|
74
|
+
rescue OptionParser::InvalidOption
|
|
75
|
+
$stderr.print "error: Invalid Option\n\n" << HELP_MESSAGE
|
|
76
|
+
exit_invalid_option
|
|
77
|
+
rescue OptionParser::InvalidArgument
|
|
78
|
+
$stderr.print "error: Invalid Argument\n\n" << HELP_MESSAGE
|
|
79
|
+
exit_invalid_option
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def command_test
|
|
84
|
+
s = @command_type.split('_')[1].split(',')
|
|
85
|
+
type = s[0].intern
|
|
86
|
+
DRbQS.test_server(@options, type, s[1..-1], @test_opts)
|
|
87
|
+
end
|
|
88
|
+
private :command_test
|
|
89
|
+
|
|
90
|
+
def command_start_server
|
|
91
|
+
DRbQS.start_server(@options)
|
|
92
|
+
end
|
|
93
|
+
private :command_start_server
|
|
94
|
+
|
|
95
|
+
def command_server_with_nodes
|
|
96
|
+
server_pid = fork do
|
|
97
|
+
DRbQS.start_server(@options)
|
|
98
|
+
end
|
|
99
|
+
uri = DRbQS::Misc.create_uri(@options)
|
|
100
|
+
manage = DRbQS::Manage.new(:uri => uri)
|
|
101
|
+
if manage.wait_server_process(server_pid)
|
|
102
|
+
node_log_file = nil
|
|
103
|
+
unless IO === @options[:log_file]
|
|
104
|
+
node_log_file = FileName.create(@options[:log_file], :add => :always, :position => :middle, :delimiter => '', :format => "_node_%02d")
|
|
105
|
+
end
|
|
106
|
+
exec_node = DRbQS::ExecuteNode.new(uri, node_log_file, @options[:log_level])
|
|
107
|
+
exec_node.execute(@execute_node_number, NODE_INTERVAL_TIME)
|
|
108
|
+
exec_node.wait
|
|
109
|
+
else
|
|
110
|
+
$stderr.puts "error: Server has been terminated."
|
|
111
|
+
exit_unusually
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
private :command_server_with_nodes
|
|
115
|
+
|
|
116
|
+
def command_server_help
|
|
117
|
+
begin
|
|
118
|
+
@command_argv.each do |path|
|
|
119
|
+
if File.exist?(path)
|
|
120
|
+
load path
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
if mes = DRbQS.option_help_message
|
|
124
|
+
$stdout.print "\n" << mes
|
|
125
|
+
end
|
|
126
|
+
rescue => err
|
|
127
|
+
$stderr.print "error: Load invalid file.\n#{err.to_s}\n#{err.backtrace.join("\n")}"
|
|
128
|
+
exit_invalid_option
|
|
129
|
+
end
|
|
130
|
+
exit_normally
|
|
131
|
+
end
|
|
132
|
+
private :command_server_help
|
|
133
|
+
|
|
134
|
+
def exec
|
|
135
|
+
if @command_type == :help
|
|
136
|
+
command_server_help
|
|
137
|
+
end
|
|
138
|
+
if @command_argv.size == 0 || !(@command_argv.all? { |path| File.exist?(path) })
|
|
139
|
+
$stderr.print "error: There are nonexistent files.\n\n" << HELP_MESSAGE
|
|
140
|
+
exit_unusually
|
|
141
|
+
end
|
|
142
|
+
@command_argv.each do |path|
|
|
143
|
+
load path
|
|
144
|
+
end
|
|
145
|
+
unless @options[:acl]
|
|
146
|
+
@options[:acl] = DRbQS::Config.new.get_acl_file
|
|
147
|
+
end
|
|
148
|
+
DRbQS.parse_option(@server_argv)
|
|
149
|
+
case @command_type
|
|
150
|
+
when /^test/
|
|
151
|
+
command_test
|
|
152
|
+
else
|
|
153
|
+
if @execute_node_number
|
|
154
|
+
command_server_with_nodes
|
|
155
|
+
else
|
|
156
|
+
command_start_server
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
exit_normally
|
|
160
|
+
rescue => err
|
|
161
|
+
$stderr.print "error: #{err.to_s}\n" << err.backtrace.join("\n")
|
|
162
|
+
exit_unusually
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|