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
data/lib/drbqs/message.rb
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
require 'drbqs/node_list'
|
|
2
|
-
|
|
3
|
-
module DRbQS
|
|
4
|
-
class MessageServer
|
|
5
|
-
include HistoryUtils
|
|
6
|
-
|
|
7
|
-
def initialize(message, logger = nil)
|
|
8
|
-
@message = message
|
|
9
|
-
@node_list = NodeList.new
|
|
10
|
-
@logger = logger
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def get_message
|
|
14
|
-
begin
|
|
15
|
-
mes = @message.take([:server, Symbol, nil], 0)
|
|
16
|
-
manage_message(*mes[1..2])
|
|
17
|
-
rescue Rinda::RequestExpiredError
|
|
18
|
-
nil
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def manage_message(mes, arg)
|
|
23
|
-
@logger.info("Get message") { [mes, arg] } if @logger
|
|
24
|
-
case mes
|
|
25
|
-
when :connect
|
|
26
|
-
a = [arg, @node_list.get_new_id(arg)]
|
|
27
|
-
@logger.info("New node") { a } if @logger
|
|
28
|
-
@message.write(a)
|
|
29
|
-
when :alive
|
|
30
|
-
@node_list.set_alive(arg)
|
|
31
|
-
when :exit_server
|
|
32
|
-
@logger.info("Get exit message from #{arg.to_s}") if @logger
|
|
33
|
-
when :request_status
|
|
34
|
-
@logger.info("Get status request from #{arg.to_s}") if @logger
|
|
35
|
-
when :node_error
|
|
36
|
-
@node_list.delete(arg[0])
|
|
37
|
-
@logger.info("Node Error (#{arg[0]})") { arg[1] } if @logger
|
|
38
|
-
return [mes, arg[0]]
|
|
39
|
-
else
|
|
40
|
-
@logger.error("Invalid message from #{arg.to_s}") if @logger
|
|
41
|
-
return nil
|
|
42
|
-
end
|
|
43
|
-
return [mes]
|
|
44
|
-
end
|
|
45
|
-
private :manage_message
|
|
46
|
-
|
|
47
|
-
def check_connection
|
|
48
|
-
deleted = @node_list.delete_not_alive
|
|
49
|
-
@logger.info("IDs of deleted nodes") { deleted } if deleted.size > 0 && @logger
|
|
50
|
-
@node_list.each do |id, str|
|
|
51
|
-
@message.write([id, :alive_p])
|
|
52
|
-
end
|
|
53
|
-
@node_list.set_check_connection
|
|
54
|
-
deleted
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def send_signal_to_all_nodes(signal)
|
|
58
|
-
@node_list.each do |node_id, id_str|
|
|
59
|
-
@message.write([node_id, signal])
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
private :send_signal_to_all_nodes
|
|
63
|
-
|
|
64
|
-
def send_exit
|
|
65
|
-
send_signal_to_all_nodes(:exit)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def send_finalization(task)
|
|
69
|
-
set_finalization(task)
|
|
70
|
-
send_signal_to_all_nodes(:finalize)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def send_status(calculating_task_id)
|
|
74
|
-
s = ''
|
|
75
|
-
@node_list.history.each do |node_id, events|
|
|
76
|
-
if events.size == 0 || events.size > 2
|
|
77
|
-
raise "Invalid history of nodes: #{events.inspect}"
|
|
78
|
-
end
|
|
79
|
-
connect = events[0]
|
|
80
|
-
s << sprintf("%4d %s\t", node_id, connect[2])
|
|
81
|
-
if disconnect = events[1]
|
|
82
|
-
s << "disconnected: (#{time_to_string(connect[0])} - #{time_to_string(disconnect[0])})\n"
|
|
83
|
-
else
|
|
84
|
-
task_ids = calculating_task_id[node_id]
|
|
85
|
-
s << "task: #{task_ids.map { |num| num.to_s }.join(', ')} (#{time_to_string(connect[0])})\n"
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
begin
|
|
89
|
-
@message.take([:status, nil], 0)
|
|
90
|
-
rescue Rinda::RequestExpiredError
|
|
91
|
-
end
|
|
92
|
-
@message.write([:status, s])
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def node_not_exist?
|
|
96
|
-
@node_list.empty?
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def set_special_task(label, task)
|
|
100
|
-
begin
|
|
101
|
-
@message.take([label, nil, Symbol, nil], 0)
|
|
102
|
-
rescue Rinda::RequestExpiredError
|
|
103
|
-
end
|
|
104
|
-
@message.write(task.drb_args(label))
|
|
105
|
-
end
|
|
106
|
-
private :set_special_task
|
|
107
|
-
|
|
108
|
-
# If the task has already set,
|
|
109
|
-
# the method overwrite old task of initialization by new task.
|
|
110
|
-
def set_initialization(task)
|
|
111
|
-
set_special_task(:initialize, task)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def set_finalization(task)
|
|
115
|
-
set_special_task(:finalization, task)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
end
|
data/lib/drbqs/node_list.rb
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
require 'drbqs/history'
|
|
2
|
-
|
|
3
|
-
module DRbQS
|
|
4
|
-
class NodeList
|
|
5
|
-
attr_reader :history
|
|
6
|
-
|
|
7
|
-
def initialize
|
|
8
|
-
@id = 0
|
|
9
|
-
@list = {}
|
|
10
|
-
@check = []
|
|
11
|
-
@history = History.new
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def get_new_id(id_str)
|
|
15
|
-
@id += 1
|
|
16
|
-
@list[@id] = id_str
|
|
17
|
-
@history.set(@id, :connect, @list[@id])
|
|
18
|
-
@id
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def each(&block)
|
|
22
|
-
@list.each(&block)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def set_check_connection
|
|
26
|
-
@check = @list.keys
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def delete(id)
|
|
30
|
-
@list.delete(id)
|
|
31
|
-
@history.set(id, :disconnect)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def delete_not_alive
|
|
35
|
-
@check.each do |id|
|
|
36
|
-
delete(id)
|
|
37
|
-
end
|
|
38
|
-
deleted = @check
|
|
39
|
-
@check = []
|
|
40
|
-
deleted
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def set_alive(id)
|
|
44
|
-
@check.delete(id)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def empty?
|
|
48
|
-
@list.size == 0
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
end
|
data/lib/drbqs/queue.rb
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
require 'drbqs/history'
|
|
2
|
-
|
|
3
|
-
module DRbQS
|
|
4
|
-
|
|
5
|
-
class QueueServer
|
|
6
|
-
include HistoryUtils
|
|
7
|
-
|
|
8
|
-
attr_reader :calculating, :history
|
|
9
|
-
|
|
10
|
-
def initialize(queue, result, logger = nil)
|
|
11
|
-
@queue = queue
|
|
12
|
-
@result = result
|
|
13
|
-
@task_id = 0
|
|
14
|
-
@cache = {}
|
|
15
|
-
@calculating = Hash.new { |hash, key| hash[key] = Array.new }
|
|
16
|
-
@history = DRbQS::History.new
|
|
17
|
-
@logger = logger
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def queue_task(task_id)
|
|
21
|
-
@queue.write(@cache[task_id].drb_args(task_id))
|
|
22
|
-
end
|
|
23
|
-
private :queue_task
|
|
24
|
-
|
|
25
|
-
# &hook take two arguments: a QueueServer object and a result of task.
|
|
26
|
-
# Return task ID (for debug).
|
|
27
|
-
def add(task)
|
|
28
|
-
@task_id += 1
|
|
29
|
-
@logger.info("New task: #{@task_id}") if @logger
|
|
30
|
-
@cache[@task_id] = task
|
|
31
|
-
queue_task(@task_id)
|
|
32
|
-
@history.set(@task_id, :add)
|
|
33
|
-
@task_id
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def get_accept_signal
|
|
37
|
-
count = 0
|
|
38
|
-
begin
|
|
39
|
-
loop do
|
|
40
|
-
sym, task_id, node_id = @result.take([:accept, Fixnum, Fixnum], 0)
|
|
41
|
-
count += 1
|
|
42
|
-
@calculating[node_id] << task_id
|
|
43
|
-
@history.set(task_id, :calculate, node_id)
|
|
44
|
-
@logger.info("Accept: task #{task_id} by node #{node_id}.") if @logger
|
|
45
|
-
end
|
|
46
|
-
rescue Rinda::RequestExpiredError
|
|
47
|
-
@logger.debug("Accept: #{count} signals.") if @logger
|
|
48
|
-
end
|
|
49
|
-
count
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def requeue_for_deleted_node_id(deleted)
|
|
53
|
-
deleted.each do |node_id|
|
|
54
|
-
if task_id_ary = @calculating[node_id]
|
|
55
|
-
task_id_ary.each do |task_id|
|
|
56
|
-
queue_task(task_id)
|
|
57
|
-
@history.set(task_id, :requeue)
|
|
58
|
-
@logger.info("Requeue: task #{task_id}.") if @logger
|
|
59
|
-
end
|
|
60
|
-
@calculating.delete(node_id)
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def delete_task_id(node_id, task_id)
|
|
66
|
-
unless @calculating[node_id].delete(task_id)
|
|
67
|
-
@logger.error("Task #{task_id} does not exist in list of calculating tasks.") if @logger
|
|
68
|
-
end
|
|
69
|
-
if ary = @calculating.find { |k, v| v.include?(task_id) }
|
|
70
|
-
@logger.error("Node #{ary[0]} is calculating task #{task_id}, too.") if @logger
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
private :delete_task_id
|
|
74
|
-
|
|
75
|
-
def exec_task_hook(main_server, task_id, result)
|
|
76
|
-
if task = @cache.delete(task_id)
|
|
77
|
-
if hook = task.hook
|
|
78
|
-
@history.set(task_id, :hook)
|
|
79
|
-
hook.call(main_server, result)
|
|
80
|
-
end
|
|
81
|
-
else
|
|
82
|
-
@logger.error("Task #{task_id} is not cached.") if @logger
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def get_result(main_server)
|
|
87
|
-
count = 0
|
|
88
|
-
begin
|
|
89
|
-
loop do
|
|
90
|
-
get_accept_signal
|
|
91
|
-
sym, task_id, node_id, result = @result.take([:result, Fixnum, Fixnum, nil], 0)
|
|
92
|
-
count += 1
|
|
93
|
-
@history.set(task_id, :result, node_id)
|
|
94
|
-
@logger.info("Get: result of #{task_id} from node #{node_id}.") if @logger
|
|
95
|
-
delete_task_id(node_id, task_id)
|
|
96
|
-
exec_task_hook(main_server, task_id, result)
|
|
97
|
-
end
|
|
98
|
-
rescue Rinda::RequestExpiredError
|
|
99
|
-
@logger.debug("Get: #{count} results.") if @logger
|
|
100
|
-
end
|
|
101
|
-
count
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def calculating_task_number
|
|
105
|
-
@calculating.inject(0) { |s, key_val| s + key_val[1].size }
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# If queue is empty, return true. Otherwise, false.
|
|
109
|
-
# Even if there are calculating tasks,
|
|
110
|
-
# the method can return true.
|
|
111
|
-
def empty?
|
|
112
|
-
@cache.size - calculating_task_number == 0
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# If there are no tasks in queue and calculating,
|
|
116
|
-
# return true. Otherwise, false.
|
|
117
|
-
def finished?
|
|
118
|
-
@cache.size == 0
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def all_logs
|
|
122
|
-
s = ''
|
|
123
|
-
@history.each do |task_id, events|
|
|
124
|
-
s << "Task #{task_id}\n"
|
|
125
|
-
events.each do |ev|
|
|
126
|
-
case ev[1]
|
|
127
|
-
when :add, :requeue, :hook
|
|
128
|
-
s << " #{time_to_string(ev[0])}\t#{ev[1]}\n"
|
|
129
|
-
when :calculate, :result
|
|
130
|
-
s << " #{time_to_string(ev[0])}\t#{ev[1]} (node #{ev[2]})\n"
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
s
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
end
|
data/lib/drbqs/server_hook.rb
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
module DRbQS
|
|
2
|
-
class ServerHook
|
|
3
|
-
def initialize
|
|
4
|
-
@hook = Hash.new { |h, k| h[k] = Array.new }
|
|
5
|
-
@argument_number = {}
|
|
6
|
-
@finish_exit = nil
|
|
7
|
-
set_argument_number(:empty_queue, 1)
|
|
8
|
-
set_argument_number(:finish, 1)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def set_argument_number(key, num)
|
|
12
|
-
@argument_number[key] = num
|
|
13
|
-
end
|
|
14
|
-
private :set_argument_number
|
|
15
|
-
|
|
16
|
-
def create_proc_name(key)
|
|
17
|
-
name = "#{key.to_s}#{rand(1000)}"
|
|
18
|
-
if @hook.has_key?(name)
|
|
19
|
-
create_proc_name(key)
|
|
20
|
-
else
|
|
21
|
-
name
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
private :create_proc_name
|
|
25
|
-
|
|
26
|
-
def add(key, name = nil, &block)
|
|
27
|
-
if (n = @argument_number[key]) && (block.arity != n)
|
|
28
|
-
raise ArgumentError, "Invalid argument number of hook of #{key.inspect}."
|
|
29
|
-
end
|
|
30
|
-
name ||= create_proc_name(key)
|
|
31
|
-
@hook[key] << [name, block]
|
|
32
|
-
name
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def delete(key, name = nil)
|
|
36
|
-
if name
|
|
37
|
-
@hook[key].delete_if { |ary| ary[0] == name }
|
|
38
|
-
else
|
|
39
|
-
@hook[key].clear
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def specific_proc(key)
|
|
44
|
-
case key
|
|
45
|
-
when :finish
|
|
46
|
-
@finish_exit.call if @finish_exit
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
private :specific_proc
|
|
50
|
-
|
|
51
|
-
def hook_names(key)
|
|
52
|
-
@hook[key].map { |a| a[0] }
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def exec(key, *args)
|
|
56
|
-
@hook[key].each do |ary|
|
|
57
|
-
ary[1].call(*args)
|
|
58
|
-
end
|
|
59
|
-
specific_proc(key)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def set_finish_exit(&block)
|
|
63
|
-
@finish_exit = block
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
end
|
data/lib/drbqs/ssh/host.rb
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
require 'yaml'
|
|
2
|
-
require 'drbqs/config'
|
|
3
|
-
|
|
4
|
-
module DRbQS
|
|
5
|
-
class SSHHost
|
|
6
|
-
def initialize
|
|
7
|
-
@dir = DRbQS::Config.get_host_file_directory
|
|
8
|
-
@host_files = (Dir.glob("#{@dir}/*.yaml") + Dir.glob("#{@dir}/*.yml")).map { |s| File.basename(s) }
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def get(name)
|
|
12
|
-
if (name.size > 0) && (host = @host_files.find { |s| /^#{name}/ =~ s })
|
|
13
|
-
return File.join(@dir, host)
|
|
14
|
-
end
|
|
15
|
-
return nil
|
|
16
|
-
end
|
|
17
|
-
private :get
|
|
18
|
-
|
|
19
|
-
def get_options(name)
|
|
20
|
-
if path = get(name)
|
|
21
|
-
return [path, YAML.load_file(path)]
|
|
22
|
-
end
|
|
23
|
-
return [nil, {}]
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
data/lib/drbqs/ssh/shell.rb
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
require 'net/ssh'
|
|
2
|
-
require 'net/ssh/shell'
|
|
3
|
-
|
|
4
|
-
module DRbQS
|
|
5
|
-
|
|
6
|
-
# Requirements:
|
|
7
|
-
# bash
|
|
8
|
-
# nohup
|
|
9
|
-
class SSHShell
|
|
10
|
-
class GetInvalidExitStatus < StandardError
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
attr_reader :user, :host, :directory, :port
|
|
14
|
-
|
|
15
|
-
DEFAULT_RVM_SCRIPT = '$HOME/.rvm/scripts/rvm'
|
|
16
|
-
DEFAULT_OUTPUT_FILE = 'drbqs_nohup.log'
|
|
17
|
-
|
|
18
|
-
# :shell shell to use
|
|
19
|
-
# :dir base directory of ssh server
|
|
20
|
-
# :rvm version of ruby on rvm
|
|
21
|
-
# :rvm_init path of script to initialize rvm
|
|
22
|
-
# :output file to output of stdout and stderr
|
|
23
|
-
def initialize(dest, opts = {})
|
|
24
|
-
@user, @host, @port = split_destination(dest)
|
|
25
|
-
if !(@host && @user)
|
|
26
|
-
raise "Invalid destination of ssh server."
|
|
27
|
-
end
|
|
28
|
-
@shell = opts[:shell] || 'bash'
|
|
29
|
-
@rvm = opts[:rvm]
|
|
30
|
-
@rvm_init = opts[:rvm_init]
|
|
31
|
-
if (@rvm || @rvm_init) && !(String === @rvm_init)
|
|
32
|
-
@rvm_init = DEFAULT_RVM_SCRIPT
|
|
33
|
-
end
|
|
34
|
-
@nohup_output = opts[:output] || DEFAULT_OUTPUT_FILE
|
|
35
|
-
@directory = opts[:dir]
|
|
36
|
-
@out = $stdout
|
|
37
|
-
@nice = opts[:nice]
|
|
38
|
-
@nohup = opts[:nohup]
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def split_destination(dest)
|
|
42
|
-
if (n = dest.index("@")) && n > 0
|
|
43
|
-
user = dest[0..(n - 1)]
|
|
44
|
-
host_dir = dest[(n + 1)..-1]
|
|
45
|
-
else
|
|
46
|
-
raise "Not include '@': #{dest}"
|
|
47
|
-
end
|
|
48
|
-
if n = host_dir.index(':')
|
|
49
|
-
host = host_dir[0..(n - 1)]
|
|
50
|
-
port = host_dir[(n + 1)..-1]
|
|
51
|
-
else
|
|
52
|
-
host = host_dir
|
|
53
|
-
port = nil
|
|
54
|
-
end
|
|
55
|
-
[user && user.size > 0 ? user : nil,
|
|
56
|
-
host && host.size > 0 ? host : nil,
|
|
57
|
-
port && port.size > 0 ? port.to_i : nil]
|
|
58
|
-
end
|
|
59
|
-
private :split_destination
|
|
60
|
-
|
|
61
|
-
def output_command(cmd, result)
|
|
62
|
-
@out.puts "#{@user}@#{@host}$ #{cmd}" if @out
|
|
63
|
-
@out.print result
|
|
64
|
-
end
|
|
65
|
-
private :output_command
|
|
66
|
-
|
|
67
|
-
def shell_exec_get_output(sh, cmd)
|
|
68
|
-
result = ''
|
|
69
|
-
pr_cmd = sh.execute!(cmd) do |sh_proc|
|
|
70
|
-
sh_proc.on_output do |pr, data|
|
|
71
|
-
result << data
|
|
72
|
-
end
|
|
73
|
-
sh_proc.on_error_output do |pr, data|
|
|
74
|
-
result << data
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
[pr_cmd, result]
|
|
78
|
-
end
|
|
79
|
-
private :shell_exec_get_output
|
|
80
|
-
|
|
81
|
-
def shell_exec(sh, cmd)
|
|
82
|
-
ary = shell_exec_get_output(sh, cmd)
|
|
83
|
-
output_command(cmd, ary[1])
|
|
84
|
-
ary
|
|
85
|
-
end
|
|
86
|
-
private :shell_exec
|
|
87
|
-
|
|
88
|
-
def shell_exec_check(sh, cmd)
|
|
89
|
-
ary = shell_exec(sh, cmd)
|
|
90
|
-
if ary[0].exit_status != 0
|
|
91
|
-
raise GetInvalidExitStatus, "Can not execute '#{cmd}' on #{@host} properly."
|
|
92
|
-
end
|
|
93
|
-
ary
|
|
94
|
-
end
|
|
95
|
-
private :shell_exec_check
|
|
96
|
-
|
|
97
|
-
def execute_command(&block)
|
|
98
|
-
Net::SSH.start(@host, @user, :port => @port) do |ssh|
|
|
99
|
-
ssh.shell(@shell) do |sh|
|
|
100
|
-
shell_exec_check(sh, "cd #{@directory}") if @directory
|
|
101
|
-
shell_exec_check(sh, "source #{@rvm_init}") if @rvm_init
|
|
102
|
-
shell_exec_check(sh, "rvm use #{@rvm}") if @rvm
|
|
103
|
-
yield(sh)
|
|
104
|
-
shell_exec(sh, "exit")
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
private :execute_command
|
|
109
|
-
|
|
110
|
-
def get_environment
|
|
111
|
-
execute_command do |sh|
|
|
112
|
-
['echo "directory: " `pwd`',
|
|
113
|
-
'echo "files:"',
|
|
114
|
-
'ls',
|
|
115
|
-
'if which rvm > /dev/null; then rvm info; else ruby -v; fi'].each do |cmd|
|
|
116
|
-
shell_exec(sh, cmd)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def start(*args)
|
|
122
|
-
cmd = args.join(' ')
|
|
123
|
-
if @nice
|
|
124
|
-
if Integer === @nice
|
|
125
|
-
cmd = "nice -n #{@nice.to_s} " + cmd
|
|
126
|
-
else
|
|
127
|
-
cmd = "nice " + cmd
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
execute_command do |sh|
|
|
131
|
-
if @nohup
|
|
132
|
-
pr, path = shell_exec_check(sh, "filename-create new -p middle -D parent -t time #{@nohup_output}")
|
|
133
|
-
cmd = "nohup #{cmd} > #{path.strip} 2>&1 &"
|
|
134
|
-
end
|
|
135
|
-
shell_exec(sh, cmd)
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
end
|
data/lib/drbqs/task_client.rb
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
module DRbQS
|
|
2
|
-
class TaskClient
|
|
3
|
-
attr_reader :node_id, :calculating_task
|
|
4
|
-
|
|
5
|
-
def initialize(node_id, queue, result, logger = nil)
|
|
6
|
-
@node_id = node_id
|
|
7
|
-
@queue = queue
|
|
8
|
-
@result = result
|
|
9
|
-
@calculating_task = nil
|
|
10
|
-
@task_queue = Queue.new
|
|
11
|
-
@result_queue = Queue.new
|
|
12
|
-
@logger = logger
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def calculating?
|
|
16
|
-
!!@calculating_task
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def task_empty?
|
|
20
|
-
@task_queue.empty?
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def result_empty?
|
|
24
|
-
@result_queue.empty?
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def dequeue_result
|
|
28
|
-
@result_queue.deq
|
|
29
|
-
end
|
|
30
|
-
private :dequeue_result
|
|
31
|
-
|
|
32
|
-
def queue_task(task_id, ary)
|
|
33
|
-
@calculating_task = task_id
|
|
34
|
-
@task_queue.enq(ary)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def dequeue_task
|
|
38
|
-
@task_queue.deq
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def get_task
|
|
42
|
-
begin
|
|
43
|
-
@queue.take([Fixnum, nil, Symbol, nil], 0)
|
|
44
|
-
rescue Rinda::RequestExpiredError
|
|
45
|
-
nil
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def add_new_task
|
|
50
|
-
unless @calculating_task
|
|
51
|
-
if ary = get_task
|
|
52
|
-
task_id, obj, method_sym, args = ary
|
|
53
|
-
@logger.info("Send accept signal: node #{@node_id} caluclating #{task_id}") if @logger
|
|
54
|
-
@result.write([:accept, task_id, @node_id])
|
|
55
|
-
queue_task(task_id, [obj, method_sym, args])
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def send_result
|
|
61
|
-
if !result_empty?
|
|
62
|
-
result = dequeue_result
|
|
63
|
-
@logger.info("Send result: #{@calculating_task}") { result.inspect } if @logger
|
|
64
|
-
@result.write([:result, @calculating_task, @node_id, result])
|
|
65
|
-
@calculating_task = nil
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def queue_result(result)
|
|
70
|
-
@result_queue.enq(result)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def dump_result_queue
|
|
74
|
-
results = []
|
|
75
|
-
while !result_empty?
|
|
76
|
-
results << dequeue_result
|
|
77
|
-
end
|
|
78
|
-
if results.size > 0
|
|
79
|
-
Marshal.dump(results)
|
|
80
|
-
else
|
|
81
|
-
nil
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
end
|
data/lib/drbqs/utils.rb
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
module DRbQS
|
|
2
|
-
module Utils
|
|
3
|
-
def create_logger(log_file, log_level)
|
|
4
|
-
if log_file
|
|
5
|
-
if IO === log_file
|
|
6
|
-
log_output = log_file
|
|
7
|
-
else
|
|
8
|
-
log_output = FileName.create(log_file, :position => :middle, :directory => :parent, :type => :number)
|
|
9
|
-
end
|
|
10
|
-
logger = Logger.new(log_output)
|
|
11
|
-
logger.level = log_level || Logger::ERROR
|
|
12
|
-
return logger
|
|
13
|
-
end
|
|
14
|
-
return nil
|
|
15
|
-
end
|
|
16
|
-
module_function :create_logger
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
end
|
data/spec/acl_file_spec.rb
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
|
-
require 'drbqs/acl_file'
|
|
3
|
-
|
|
4
|
-
describe DRbQS::ACLFile do
|
|
5
|
-
it "should return an ACL object" do
|
|
6
|
-
acl = DRbQS::ACLFile.load(File.dirname(__FILE__) + '/data/acl.txt')
|
|
7
|
-
acl.should be_an_instance_of ACL
|
|
8
|
-
end
|
|
9
|
-
end
|
data/spec/config_spec.rb
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
|
-
|
|
3
|
-
describe DRbQS::Config do
|
|
4
|
-
it "should return nil" do
|
|
5
|
-
DRbQS::Config.set_directory(File.dirname(__FILE__) + '/not_exist_path')
|
|
6
|
-
DRbQS::Config.get_acl_file.should be_nil
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
it "should return existing path" do
|
|
10
|
-
path = File.dirname(__FILE__) + '/data'
|
|
11
|
-
DRbQS::Config.set_directory(path)
|
|
12
|
-
DRbQS::Config.get_acl_file.should == File.join(path, 'acl.txt')
|
|
13
|
-
end
|
|
14
|
-
end
|