cuboid 0.0.0 → 0.0.1alpha
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -0
- data/Gemfile +20 -5
- data/LICENSE.md +22 -0
- data/README.md +158 -19
- data/Rakefile +56 -3
- data/config/paths.yml +15 -0
- data/cuboid.gemspec +61 -23
- data/lib/cuboid.rb +96 -4
- data/lib/cuboid/application.rb +326 -0
- data/lib/cuboid/application/parts/data.rb +18 -0
- data/lib/cuboid/application/parts/report.rb +29 -0
- data/lib/cuboid/application/parts/state.rb +274 -0
- data/lib/cuboid/application/runtime.rb +25 -0
- data/lib/cuboid/banner.rb +13 -0
- data/lib/cuboid/data.rb +86 -0
- data/lib/cuboid/data/application.rb +52 -0
- data/lib/cuboid/error.rb +9 -0
- data/lib/cuboid/option_group.rb +129 -0
- data/lib/cuboid/option_groups.rb +8 -0
- data/lib/cuboid/option_groups/datastore.rb +23 -0
- data/lib/cuboid/option_groups/dispatcher.rb +38 -0
- data/lib/cuboid/option_groups/output.rb +14 -0
- data/lib/cuboid/option_groups/paths.rb +184 -0
- data/lib/cuboid/option_groups/report.rb +39 -0
- data/lib/cuboid/option_groups/rpc.rb +105 -0
- data/lib/cuboid/option_groups/scheduler.rb +27 -0
- data/lib/cuboid/option_groups/snapshot.rb +13 -0
- data/lib/cuboid/option_groups/system.rb +10 -0
- data/lib/cuboid/options.rb +254 -0
- data/lib/cuboid/processes.rb +13 -0
- data/lib/cuboid/processes/dispatchers.rb +140 -0
- data/lib/cuboid/processes/executables/base.rb +54 -0
- data/lib/cuboid/processes/executables/dispatcher.rb +5 -0
- data/lib/cuboid/processes/executables/instance.rb +12 -0
- data/lib/cuboid/processes/executables/rest_service.rb +13 -0
- data/lib/cuboid/processes/executables/scheduler.rb +5 -0
- data/lib/cuboid/processes/helpers.rb +4 -0
- data/lib/cuboid/processes/helpers/dispatchers.rb +23 -0
- data/lib/cuboid/processes/helpers/instances.rb +39 -0
- data/lib/cuboid/processes/helpers/processes.rb +23 -0
- data/lib/cuboid/processes/helpers/schedulers.rb +23 -0
- data/lib/cuboid/processes/instances.rb +203 -0
- data/lib/cuboid/processes/manager.rb +262 -0
- data/lib/cuboid/processes/schedulers.rb +128 -0
- data/lib/cuboid/report.rb +220 -0
- data/lib/cuboid/rest/server.rb +165 -0
- data/lib/cuboid/rest/server/instance_helpers.rb +99 -0
- data/lib/cuboid/rest/server/routes/dispatcher.rb +41 -0
- data/lib/cuboid/rest/server/routes/grid.rb +41 -0
- data/lib/cuboid/rest/server/routes/instances.rb +131 -0
- data/lib/cuboid/rest/server/routes/scheduler.rb +140 -0
- data/lib/cuboid/rpc/client.rb +3 -0
- data/lib/cuboid/rpc/client/base.rb +58 -0
- data/lib/cuboid/rpc/client/dispatcher.rb +58 -0
- data/lib/cuboid/rpc/client/instance.rb +100 -0
- data/lib/cuboid/rpc/client/instance/service.rb +37 -0
- data/lib/cuboid/rpc/client/scheduler.rb +46 -0
- data/lib/cuboid/rpc/serializer.rb +92 -0
- data/lib/cuboid/rpc/server/active_options.rb +38 -0
- data/lib/cuboid/rpc/server/application_wrapper.rb +138 -0
- data/lib/cuboid/rpc/server/base.rb +63 -0
- data/lib/cuboid/rpc/server/dispatcher.rb +317 -0
- data/lib/cuboid/rpc/server/dispatcher/node.rb +247 -0
- data/lib/cuboid/rpc/server/dispatcher/service.rb +145 -0
- data/lib/cuboid/rpc/server/instance.rb +338 -0
- data/lib/cuboid/rpc/server/output.rb +92 -0
- data/lib/cuboid/rpc/server/scheduler.rb +482 -0
- data/lib/cuboid/ruby.rb +4 -0
- data/lib/cuboid/ruby/array.rb +17 -0
- data/lib/cuboid/ruby/hash.rb +41 -0
- data/lib/cuboid/ruby/object.rb +32 -0
- data/lib/cuboid/snapshot.rb +186 -0
- data/lib/cuboid/state.rb +94 -0
- data/lib/cuboid/state/application.rb +309 -0
- data/lib/cuboid/state/options.rb +27 -0
- data/lib/cuboid/support.rb +11 -0
- data/lib/cuboid/support/buffer.rb +3 -0
- data/lib/cuboid/support/buffer/autoflush.rb +61 -0
- data/lib/cuboid/support/buffer/base.rb +91 -0
- data/lib/cuboid/support/cache.rb +7 -0
- data/lib/cuboid/support/cache/base.rb +226 -0
- data/lib/cuboid/support/cache/least_cost_replacement.rb +77 -0
- data/lib/cuboid/support/cache/least_recently_pushed.rb +21 -0
- data/lib/cuboid/support/cache/least_recently_used.rb +31 -0
- data/lib/cuboid/support/cache/preference.rb +31 -0
- data/lib/cuboid/support/cache/random_replacement.rb +20 -0
- data/lib/cuboid/support/crypto.rb +2 -0
- data/lib/cuboid/support/crypto/rsa_aes_cbc.rb +86 -0
- data/lib/cuboid/support/database.rb +5 -0
- data/lib/cuboid/support/database/base.rb +177 -0
- data/lib/cuboid/support/database/categorized_queue.rb +195 -0
- data/lib/cuboid/support/database/hash.rb +300 -0
- data/lib/cuboid/support/database/queue.rb +149 -0
- data/lib/cuboid/support/filter.rb +3 -0
- data/lib/cuboid/support/filter/base.rb +110 -0
- data/lib/cuboid/support/filter/set.rb +29 -0
- data/lib/cuboid/support/glob.rb +27 -0
- data/lib/cuboid/support/mixins.rb +8 -0
- data/lib/cuboid/support/mixins/observable.rb +99 -0
- data/lib/cuboid/support/mixins/parts.rb +20 -0
- data/lib/cuboid/support/mixins/profiler.rb +93 -0
- data/lib/cuboid/support/mixins/spec_instances.rb +65 -0
- data/lib/cuboid/support/mixins/terminal.rb +57 -0
- data/lib/cuboid/system.rb +119 -0
- data/lib/cuboid/system/platforms.rb +84 -0
- data/lib/cuboid/system/platforms/linux.rb +26 -0
- data/lib/cuboid/system/platforms/mixins/unix.rb +46 -0
- data/lib/cuboid/system/platforms/osx.rb +25 -0
- data/lib/cuboid/system/platforms/windows.rb +81 -0
- data/lib/cuboid/system/slots.rb +143 -0
- data/lib/cuboid/ui/output.rb +52 -0
- data/lib/cuboid/ui/output_interface.rb +43 -0
- data/lib/cuboid/ui/output_interface/abstract.rb +68 -0
- data/lib/cuboid/ui/output_interface/controls.rb +84 -0
- data/lib/cuboid/ui/output_interface/error_logging.rb +119 -0
- data/lib/cuboid/ui/output_interface/implemented.rb +58 -0
- data/lib/cuboid/ui/output_interface/personalization.rb +62 -0
- data/lib/cuboid/utilities.rb +155 -0
- data/lib/cuboid/version.rb +4 -3
- data/lib/version +1 -0
- data/logs/placeholder +0 -0
- data/spec/cuboid/application/parts/data_spec.rb +12 -0
- data/spec/cuboid/application/parts/report_spec.rb +6 -0
- data/spec/cuboid/application/parts/state_spec.rb +192 -0
- data/spec/cuboid/application/runtime_spec.rb +21 -0
- data/spec/cuboid/application_spec.rb +37 -0
- data/spec/cuboid/data/application_spec.rb +22 -0
- data/spec/cuboid/data_spec.rb +47 -0
- data/spec/cuboid/error_spec.rb +23 -0
- data/spec/cuboid/option_groups/datastore_spec.rb +54 -0
- data/spec/cuboid/option_groups/dispatcher_spec.rb +12 -0
- data/spec/cuboid/option_groups/output_spec.rb +11 -0
- data/spec/cuboid/option_groups/paths_spec.rb +184 -0
- data/spec/cuboid/option_groups/report_spec.rb +26 -0
- data/spec/cuboid/option_groups/rpc_spec.rb +53 -0
- data/spec/cuboid/option_groups/snapshot_spec.rb +26 -0
- data/spec/cuboid/option_groups/system.rb +12 -0
- data/spec/cuboid/options_spec.rb +218 -0
- data/spec/cuboid/report_spec.rb +221 -0
- data/spec/cuboid/rest/server_spec.rb +1205 -0
- data/spec/cuboid/rpc/client/base_spec.rb +151 -0
- data/spec/cuboid/rpc/client/dispatcher_spec.rb +13 -0
- data/spec/cuboid/rpc/client/instance_spec.rb +38 -0
- data/spec/cuboid/rpc/server/active_options_spec.rb +21 -0
- data/spec/cuboid/rpc/server/base_spec.rb +60 -0
- data/spec/cuboid/rpc/server/dispatcher/node_spec.rb +222 -0
- data/spec/cuboid/rpc/server/dispatcher/service_spec.rb +112 -0
- data/spec/cuboid/rpc/server/dispatcher_spec.rb +317 -0
- data/spec/cuboid/rpc/server/instance_spec.rb +307 -0
- data/spec/cuboid/rpc/server/output_spec.rb +32 -0
- data/spec/cuboid/rpc/server/scheduler_spec.rb +400 -0
- data/spec/cuboid/ruby/array_spec.rb +77 -0
- data/spec/cuboid/ruby/hash_spec.rb +63 -0
- data/spec/cuboid/ruby/object_spec.rb +22 -0
- data/spec/cuboid/snapshot_spec.rb +123 -0
- data/spec/cuboid/state/application_spec.rb +538 -0
- data/spec/cuboid/state/options_spec.rb +37 -0
- data/spec/cuboid/state_spec.rb +53 -0
- data/spec/cuboid/support/buffer/autoflush_spec.rb +78 -0
- data/spec/cuboid/support/buffer/base_spec.rb +193 -0
- data/spec/cuboid/support/cache/least_cost_replacement_spec.rb +61 -0
- data/spec/cuboid/support/cache/least_recently_pushed_spec.rb +90 -0
- data/spec/cuboid/support/cache/least_recently_used_spec.rb +80 -0
- data/spec/cuboid/support/cache/preference_spec.rb +37 -0
- data/spec/cuboid/support/cache/random_replacement_spec.rb +42 -0
- data/spec/cuboid/support/crypto/rsa_aes_cbc_spec.rb +28 -0
- data/spec/cuboid/support/database/categorized_queue_spec.rb +327 -0
- data/spec/cuboid/support/database/hash_spec.rb +204 -0
- data/spec/cuboid/support/database/scheduler_spec.rb +325 -0
- data/spec/cuboid/support/filter/set_spec.rb +19 -0
- data/spec/cuboid/support/glob_spec.rb +75 -0
- data/spec/cuboid/support/mixins/observable_spec.rb +95 -0
- data/spec/cuboid/system/platforms/linux_spec.rb +31 -0
- data/spec/cuboid/system/platforms/osx_spec.rb +32 -0
- data/spec/cuboid/system/platforms/windows_spec.rb +41 -0
- data/spec/cuboid/system/slots_spec.rb +202 -0
- data/spec/cuboid/system_spec.rb +105 -0
- data/spec/cuboid/utilities_spec.rb +131 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/factories/placeholder +0 -0
- data/spec/support/factories/scan_report.rb +18 -0
- data/spec/support/fixtures/empty/placeholder +0 -0
- data/spec/support/fixtures/executables/node.rb +50 -0
- data/spec/support/fixtures/mock_app.rb +61 -0
- data/spec/support/fixtures/mock_app/test_service.rb +64 -0
- data/spec/support/fixtures/services/echo.rb +64 -0
- data/spec/support/helpers/framework.rb +3 -0
- data/spec/support/helpers/matchers.rb +5 -0
- data/spec/support/helpers/misc.rb +3 -0
- data/spec/support/helpers/paths.rb +15 -0
- data/spec/support/helpers/request_helpers.rb +38 -0
- data/spec/support/helpers/requires.rb +8 -0
- data/spec/support/helpers/resets.rb +52 -0
- data/spec/support/helpers/web_server.rb +15 -0
- data/spec/support/lib/factory.rb +107 -0
- data/spec/support/lib/web_server_client.rb +41 -0
- data/spec/support/lib/web_server_dispatcher.rb +25 -0
- data/spec/support/lib/web_server_manager.rb +118 -0
- data/spec/support/logs/placeholder +0 -0
- data/spec/support/pems/cacert.pem +37 -0
- data/spec/support/pems/client/cert.pem +37 -0
- data/spec/support/pems/client/foo-cert.pem +39 -0
- data/spec/support/pems/client/foo-key.pem +51 -0
- data/spec/support/pems/client/key.pem +51 -0
- data/spec/support/pems/server/cert.pem +37 -0
- data/spec/support/pems/server/key.pem +51 -0
- data/spec/support/reports/placeholder +0 -0
- data/spec/support/shared/application.rb +10 -0
- data/spec/support/shared/component.rb +31 -0
- data/spec/support/shared/component/options/base.rb +187 -0
- data/spec/support/shared/option_group.rb +98 -0
- data/spec/support/shared/support/cache.rb +419 -0
- data/spec/support/shared/support/filter.rb +143 -0
- data/spec/support/shared/system/platforms/base.rb +25 -0
- data/spec/support/shared/system/platforms/mixins/unix.rb +37 -0
- data/spec/support/snapshots/placeholder +0 -0
- metadata +566 -21
- data/.gitignore +0 -8
- data/bin/console +0 -15
- data/bin/setup +0 -8
@@ -0,0 +1,140 @@
|
|
1
|
+
module Cuboid
|
2
|
+
module Rest
|
3
|
+
class Server
|
4
|
+
module Routes
|
5
|
+
|
6
|
+
module Scheduler
|
7
|
+
|
8
|
+
def self.registered( app )
|
9
|
+
|
10
|
+
app.get '/scheduler' do
|
11
|
+
ensure_scheduler!
|
12
|
+
|
13
|
+
handle_error do
|
14
|
+
json scheduler.list
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
app.get '/scheduler/url' do
|
19
|
+
ensure_scheduler!
|
20
|
+
|
21
|
+
handle_error do
|
22
|
+
json Options.scheduler.url
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
app.put '/scheduler/url' do
|
27
|
+
url = ::JSON.load( request.body.read ) || {}
|
28
|
+
|
29
|
+
handle_error do
|
30
|
+
connect_to_scheduler( url ).alive?
|
31
|
+
|
32
|
+
@scheduler = nil
|
33
|
+
Options.scheduler.url = url
|
34
|
+
json nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
app.delete '/scheduler/url' do
|
39
|
+
ensure_scheduler!
|
40
|
+
|
41
|
+
json @scheduler = Options.scheduler.url = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
app.get '/scheduler/running' do
|
45
|
+
ensure_scheduler!
|
46
|
+
|
47
|
+
handle_error do
|
48
|
+
json scheduler.running
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
app.get '/scheduler/completed' do
|
53
|
+
ensure_scheduler!
|
54
|
+
|
55
|
+
handle_error do
|
56
|
+
json scheduler.completed
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
app.get '/scheduler/failed' do
|
61
|
+
ensure_scheduler!
|
62
|
+
|
63
|
+
handle_error do
|
64
|
+
json scheduler.failed
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
app.get '/scheduler/size' do
|
69
|
+
ensure_scheduler!
|
70
|
+
|
71
|
+
handle_error do
|
72
|
+
json scheduler.size
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
app.delete '/scheduler' do
|
77
|
+
ensure_scheduler!
|
78
|
+
|
79
|
+
handle_error do
|
80
|
+
json scheduler.clear
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
app.post '/scheduler' do
|
85
|
+
ensure_scheduler!
|
86
|
+
|
87
|
+
handle_error do
|
88
|
+
json id: scheduler.push( *[::JSON.load( request.body.read )].flatten )
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
app.get '/scheduler/:instance' do |instance|
|
93
|
+
ensure_scheduler!
|
94
|
+
|
95
|
+
handle_error do
|
96
|
+
instance = scheduler.get( instance )
|
97
|
+
if !instance
|
98
|
+
halt 404, json( 'Instance not in Scheduler.' )
|
99
|
+
end
|
100
|
+
|
101
|
+
json instance
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
app.put '/scheduler/:instance/detach' do |instance|
|
106
|
+
ensure_scheduler!
|
107
|
+
|
108
|
+
handle_error do
|
109
|
+
info = scheduler.detach( instance )
|
110
|
+
|
111
|
+
if !info
|
112
|
+
halt 404, json( 'Instance not in Scheduler.' )
|
113
|
+
end
|
114
|
+
|
115
|
+
instances[instance] ||= connect_to_instance( info['url'], info['token'] )
|
116
|
+
end
|
117
|
+
|
118
|
+
json nil
|
119
|
+
end
|
120
|
+
|
121
|
+
app.delete '/scheduler/:instance' do |instance|
|
122
|
+
ensure_scheduler!
|
123
|
+
|
124
|
+
handle_error do
|
125
|
+
if scheduler.remove( instance )
|
126
|
+
json nil
|
127
|
+
else
|
128
|
+
halt 404, json( 'Instance not in Scheduler.' )
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'arachni/rpc'
|
2
|
+
require_relative '../serializer'
|
3
|
+
|
4
|
+
module Cuboid
|
5
|
+
module RPC
|
6
|
+
class Client
|
7
|
+
|
8
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
9
|
+
class Base < Arachni::RPC::Client
|
10
|
+
attr_reader :url
|
11
|
+
|
12
|
+
# @param [String] url
|
13
|
+
# Server URL in `address:port` format.
|
14
|
+
# @param [String] token
|
15
|
+
# Optional authentication token.
|
16
|
+
# @param [Hash] options
|
17
|
+
# @option options [Integer] :connection_pool_size
|
18
|
+
# @option options [Integer] :max_retries
|
19
|
+
# @option options [Integer] :ssl_ca
|
20
|
+
# @option options [Integer] :ssl_pkey
|
21
|
+
# @option options [Integer] :ssl_cert
|
22
|
+
def initialize( url, token = nil, options = nil )
|
23
|
+
@url = url
|
24
|
+
|
25
|
+
socket, host, port = nil
|
26
|
+
if url.include? ':'
|
27
|
+
host, port = url.split( ':' )
|
28
|
+
else
|
29
|
+
socket = url
|
30
|
+
end
|
31
|
+
|
32
|
+
@address = host
|
33
|
+
@port = port
|
34
|
+
|
35
|
+
# If given nil use the global defaults.
|
36
|
+
options ||= Options.rpc.to_client_options
|
37
|
+
|
38
|
+
super( options.merge(
|
39
|
+
serializer: Serializer,
|
40
|
+
host: host,
|
41
|
+
port: port.to_i,
|
42
|
+
socket: socket,
|
43
|
+
token: token
|
44
|
+
))
|
45
|
+
end
|
46
|
+
|
47
|
+
def address
|
48
|
+
@address
|
49
|
+
end
|
50
|
+
|
51
|
+
def port
|
52
|
+
@port
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Cuboid
|
2
|
+
|
3
|
+
require Options.paths.lib + 'rpc/client/base'
|
4
|
+
|
5
|
+
module RPC
|
6
|
+
class Client
|
7
|
+
|
8
|
+
# RPC Dispatcher client
|
9
|
+
#
|
10
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
11
|
+
class Dispatcher
|
12
|
+
# Not always available, set by the parent.
|
13
|
+
attr_accessor :pid
|
14
|
+
|
15
|
+
attr_reader :node
|
16
|
+
|
17
|
+
def initialize( url, options = nil )
|
18
|
+
@client = Base.new( url, nil, options )
|
19
|
+
@node = Arachni::RPC::Proxy.new( @client, 'node' )
|
20
|
+
|
21
|
+
Cuboid::Application.application.dispatcher_services.keys.each do |name|
|
22
|
+
self.class.send( :attr_reader, name.to_sym )
|
23
|
+
|
24
|
+
instance_variable_set(
|
25
|
+
"@#{name}".to_sym,
|
26
|
+
Arachni::RPC::Proxy.new( @client, name )
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def url
|
32
|
+
@client.url
|
33
|
+
end
|
34
|
+
|
35
|
+
def address
|
36
|
+
@client.address
|
37
|
+
end
|
38
|
+
|
39
|
+
def port
|
40
|
+
@client.port
|
41
|
+
end
|
42
|
+
|
43
|
+
def close
|
44
|
+
@client.close
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
# Used to provide the illusion of locality for remote methods
|
50
|
+
def method_missing( sym, *args, &block )
|
51
|
+
@client.call( "dispatcher.#{sym.to_s}", *args, &block )
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module Cuboid
|
2
|
+
|
3
|
+
require Options.paths.lib + 'rpc/client/base'
|
4
|
+
|
5
|
+
module RPC
|
6
|
+
class Client
|
7
|
+
|
8
|
+
# RPC client for remote instances spawned by a remote dispatcher
|
9
|
+
#
|
10
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
11
|
+
class Instance
|
12
|
+
# Not always available, set by the parent.
|
13
|
+
attr_accessor :pid
|
14
|
+
attr_reader :options
|
15
|
+
|
16
|
+
require_relative 'instance/service'
|
17
|
+
|
18
|
+
class <<self
|
19
|
+
|
20
|
+
def when_ready( url, token, &block )
|
21
|
+
options = Cuboid::Options.rpc.to_client_options.merge(
|
22
|
+
client_max_retries: 0,
|
23
|
+
connection_pool_size: 1
|
24
|
+
)
|
25
|
+
|
26
|
+
client = new( url, token, options )
|
27
|
+
Arachni::Reactor.global.delay( 0.1 ) do |task|
|
28
|
+
client.alive? do |r|
|
29
|
+
if r.rpc_exception?
|
30
|
+
Arachni::Reactor.global.delay( 0.1, &task )
|
31
|
+
next
|
32
|
+
end
|
33
|
+
|
34
|
+
client.close
|
35
|
+
|
36
|
+
block.call
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize( url, token = nil, options = nil )
|
44
|
+
@token = token
|
45
|
+
@client = Base.new( url, token, options )
|
46
|
+
|
47
|
+
@instance = Proxy.new( @client )
|
48
|
+
@options = Arachni::RPC::Proxy.new( @client, 'options' )
|
49
|
+
|
50
|
+
# map Dispatcher handlers
|
51
|
+
Cuboid::Application.application.instance_services.keys.each do |name|
|
52
|
+
self.class.send( :attr_reader, name.to_sym )
|
53
|
+
|
54
|
+
instance_variable_set(
|
55
|
+
"@#{name}".to_sym,
|
56
|
+
Arachni::RPC::Proxy.new( @client, name )
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def when_ready( &block )
|
62
|
+
self.class.when_ready( url, token, &block )
|
63
|
+
end
|
64
|
+
|
65
|
+
def token
|
66
|
+
@token
|
67
|
+
end
|
68
|
+
|
69
|
+
def client
|
70
|
+
@client
|
71
|
+
end
|
72
|
+
|
73
|
+
def close
|
74
|
+
@client.close
|
75
|
+
end
|
76
|
+
|
77
|
+
def url
|
78
|
+
@client.url
|
79
|
+
end
|
80
|
+
|
81
|
+
def address
|
82
|
+
@client.address
|
83
|
+
end
|
84
|
+
|
85
|
+
def port
|
86
|
+
@client.port
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
# Used to provide the illusion of locality for remote methods
|
92
|
+
def method_missing( sym, *args, &block )
|
93
|
+
@instance.send( sym, *args, &block )
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Cuboid
|
2
|
+
|
3
|
+
module RPC
|
4
|
+
class Client
|
5
|
+
class Instance
|
6
|
+
|
7
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
8
|
+
class Proxy < Arachni::RPC::Proxy
|
9
|
+
|
10
|
+
def initialize( client )
|
11
|
+
super client, 'instance'
|
12
|
+
end
|
13
|
+
|
14
|
+
translate :status do |status|
|
15
|
+
status.to_sym if status
|
16
|
+
end
|
17
|
+
|
18
|
+
translate :progress do |data|
|
19
|
+
data = data.my_symbolize_keys
|
20
|
+
data[:status] = data[:status].to_sym
|
21
|
+
data
|
22
|
+
end
|
23
|
+
|
24
|
+
translate :abort_and_generate_report do |data|
|
25
|
+
Report.from_rpc_data data
|
26
|
+
end
|
27
|
+
|
28
|
+
translate :generate_report do |data|
|
29
|
+
Report.from_rpc_data data
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Cuboid
|
2
|
+
|
3
|
+
require Options.paths.lib + 'rpc/client/base'
|
4
|
+
|
5
|
+
module RPC
|
6
|
+
class Client
|
7
|
+
|
8
|
+
# RPC Scheduler client
|
9
|
+
#
|
10
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
11
|
+
class Scheduler
|
12
|
+
# Not always available, set by the parent.
|
13
|
+
attr_accessor :pid
|
14
|
+
|
15
|
+
def initialize( url, options = nil )
|
16
|
+
@client = Base.new( url, nil, options )
|
17
|
+
end
|
18
|
+
|
19
|
+
def url
|
20
|
+
@client.url
|
21
|
+
end
|
22
|
+
|
23
|
+
def address
|
24
|
+
@client.address
|
25
|
+
end
|
26
|
+
|
27
|
+
def port
|
28
|
+
@client.port
|
29
|
+
end
|
30
|
+
|
31
|
+
def close
|
32
|
+
@client.close
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# Used to provide the illusion of locality for remote methods
|
38
|
+
def method_missing( sym, *args, &block )
|
39
|
+
@client.call( "scheduler.#{sym.to_s}", *args, &block )
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|