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.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -0
  3. data/Gemfile +20 -5
  4. data/LICENSE.md +22 -0
  5. data/README.md +158 -19
  6. data/Rakefile +56 -3
  7. data/config/paths.yml +15 -0
  8. data/cuboid.gemspec +61 -23
  9. data/lib/cuboid.rb +96 -4
  10. data/lib/cuboid/application.rb +326 -0
  11. data/lib/cuboid/application/parts/data.rb +18 -0
  12. data/lib/cuboid/application/parts/report.rb +29 -0
  13. data/lib/cuboid/application/parts/state.rb +274 -0
  14. data/lib/cuboid/application/runtime.rb +25 -0
  15. data/lib/cuboid/banner.rb +13 -0
  16. data/lib/cuboid/data.rb +86 -0
  17. data/lib/cuboid/data/application.rb +52 -0
  18. data/lib/cuboid/error.rb +9 -0
  19. data/lib/cuboid/option_group.rb +129 -0
  20. data/lib/cuboid/option_groups.rb +8 -0
  21. data/lib/cuboid/option_groups/datastore.rb +23 -0
  22. data/lib/cuboid/option_groups/dispatcher.rb +38 -0
  23. data/lib/cuboid/option_groups/output.rb +14 -0
  24. data/lib/cuboid/option_groups/paths.rb +184 -0
  25. data/lib/cuboid/option_groups/report.rb +39 -0
  26. data/lib/cuboid/option_groups/rpc.rb +105 -0
  27. data/lib/cuboid/option_groups/scheduler.rb +27 -0
  28. data/lib/cuboid/option_groups/snapshot.rb +13 -0
  29. data/lib/cuboid/option_groups/system.rb +10 -0
  30. data/lib/cuboid/options.rb +254 -0
  31. data/lib/cuboid/processes.rb +13 -0
  32. data/lib/cuboid/processes/dispatchers.rb +140 -0
  33. data/lib/cuboid/processes/executables/base.rb +54 -0
  34. data/lib/cuboid/processes/executables/dispatcher.rb +5 -0
  35. data/lib/cuboid/processes/executables/instance.rb +12 -0
  36. data/lib/cuboid/processes/executables/rest_service.rb +13 -0
  37. data/lib/cuboid/processes/executables/scheduler.rb +5 -0
  38. data/lib/cuboid/processes/helpers.rb +4 -0
  39. data/lib/cuboid/processes/helpers/dispatchers.rb +23 -0
  40. data/lib/cuboid/processes/helpers/instances.rb +39 -0
  41. data/lib/cuboid/processes/helpers/processes.rb +23 -0
  42. data/lib/cuboid/processes/helpers/schedulers.rb +23 -0
  43. data/lib/cuboid/processes/instances.rb +203 -0
  44. data/lib/cuboid/processes/manager.rb +262 -0
  45. data/lib/cuboid/processes/schedulers.rb +128 -0
  46. data/lib/cuboid/report.rb +220 -0
  47. data/lib/cuboid/rest/server.rb +165 -0
  48. data/lib/cuboid/rest/server/instance_helpers.rb +99 -0
  49. data/lib/cuboid/rest/server/routes/dispatcher.rb +41 -0
  50. data/lib/cuboid/rest/server/routes/grid.rb +41 -0
  51. data/lib/cuboid/rest/server/routes/instances.rb +131 -0
  52. data/lib/cuboid/rest/server/routes/scheduler.rb +140 -0
  53. data/lib/cuboid/rpc/client.rb +3 -0
  54. data/lib/cuboid/rpc/client/base.rb +58 -0
  55. data/lib/cuboid/rpc/client/dispatcher.rb +58 -0
  56. data/lib/cuboid/rpc/client/instance.rb +100 -0
  57. data/lib/cuboid/rpc/client/instance/service.rb +37 -0
  58. data/lib/cuboid/rpc/client/scheduler.rb +46 -0
  59. data/lib/cuboid/rpc/serializer.rb +92 -0
  60. data/lib/cuboid/rpc/server/active_options.rb +38 -0
  61. data/lib/cuboid/rpc/server/application_wrapper.rb +138 -0
  62. data/lib/cuboid/rpc/server/base.rb +63 -0
  63. data/lib/cuboid/rpc/server/dispatcher.rb +317 -0
  64. data/lib/cuboid/rpc/server/dispatcher/node.rb +247 -0
  65. data/lib/cuboid/rpc/server/dispatcher/service.rb +145 -0
  66. data/lib/cuboid/rpc/server/instance.rb +338 -0
  67. data/lib/cuboid/rpc/server/output.rb +92 -0
  68. data/lib/cuboid/rpc/server/scheduler.rb +482 -0
  69. data/lib/cuboid/ruby.rb +4 -0
  70. data/lib/cuboid/ruby/array.rb +17 -0
  71. data/lib/cuboid/ruby/hash.rb +41 -0
  72. data/lib/cuboid/ruby/object.rb +32 -0
  73. data/lib/cuboid/snapshot.rb +186 -0
  74. data/lib/cuboid/state.rb +94 -0
  75. data/lib/cuboid/state/application.rb +309 -0
  76. data/lib/cuboid/state/options.rb +27 -0
  77. data/lib/cuboid/support.rb +11 -0
  78. data/lib/cuboid/support/buffer.rb +3 -0
  79. data/lib/cuboid/support/buffer/autoflush.rb +61 -0
  80. data/lib/cuboid/support/buffer/base.rb +91 -0
  81. data/lib/cuboid/support/cache.rb +7 -0
  82. data/lib/cuboid/support/cache/base.rb +226 -0
  83. data/lib/cuboid/support/cache/least_cost_replacement.rb +77 -0
  84. data/lib/cuboid/support/cache/least_recently_pushed.rb +21 -0
  85. data/lib/cuboid/support/cache/least_recently_used.rb +31 -0
  86. data/lib/cuboid/support/cache/preference.rb +31 -0
  87. data/lib/cuboid/support/cache/random_replacement.rb +20 -0
  88. data/lib/cuboid/support/crypto.rb +2 -0
  89. data/lib/cuboid/support/crypto/rsa_aes_cbc.rb +86 -0
  90. data/lib/cuboid/support/database.rb +5 -0
  91. data/lib/cuboid/support/database/base.rb +177 -0
  92. data/lib/cuboid/support/database/categorized_queue.rb +195 -0
  93. data/lib/cuboid/support/database/hash.rb +300 -0
  94. data/lib/cuboid/support/database/queue.rb +149 -0
  95. data/lib/cuboid/support/filter.rb +3 -0
  96. data/lib/cuboid/support/filter/base.rb +110 -0
  97. data/lib/cuboid/support/filter/set.rb +29 -0
  98. data/lib/cuboid/support/glob.rb +27 -0
  99. data/lib/cuboid/support/mixins.rb +8 -0
  100. data/lib/cuboid/support/mixins/observable.rb +99 -0
  101. data/lib/cuboid/support/mixins/parts.rb +20 -0
  102. data/lib/cuboid/support/mixins/profiler.rb +93 -0
  103. data/lib/cuboid/support/mixins/spec_instances.rb +65 -0
  104. data/lib/cuboid/support/mixins/terminal.rb +57 -0
  105. data/lib/cuboid/system.rb +119 -0
  106. data/lib/cuboid/system/platforms.rb +84 -0
  107. data/lib/cuboid/system/platforms/linux.rb +26 -0
  108. data/lib/cuboid/system/platforms/mixins/unix.rb +46 -0
  109. data/lib/cuboid/system/platforms/osx.rb +25 -0
  110. data/lib/cuboid/system/platforms/windows.rb +81 -0
  111. data/lib/cuboid/system/slots.rb +143 -0
  112. data/lib/cuboid/ui/output.rb +52 -0
  113. data/lib/cuboid/ui/output_interface.rb +43 -0
  114. data/lib/cuboid/ui/output_interface/abstract.rb +68 -0
  115. data/lib/cuboid/ui/output_interface/controls.rb +84 -0
  116. data/lib/cuboid/ui/output_interface/error_logging.rb +119 -0
  117. data/lib/cuboid/ui/output_interface/implemented.rb +58 -0
  118. data/lib/cuboid/ui/output_interface/personalization.rb +62 -0
  119. data/lib/cuboid/utilities.rb +155 -0
  120. data/lib/cuboid/version.rb +4 -3
  121. data/lib/version +1 -0
  122. data/logs/placeholder +0 -0
  123. data/spec/cuboid/application/parts/data_spec.rb +12 -0
  124. data/spec/cuboid/application/parts/report_spec.rb +6 -0
  125. data/spec/cuboid/application/parts/state_spec.rb +192 -0
  126. data/spec/cuboid/application/runtime_spec.rb +21 -0
  127. data/spec/cuboid/application_spec.rb +37 -0
  128. data/spec/cuboid/data/application_spec.rb +22 -0
  129. data/spec/cuboid/data_spec.rb +47 -0
  130. data/spec/cuboid/error_spec.rb +23 -0
  131. data/spec/cuboid/option_groups/datastore_spec.rb +54 -0
  132. data/spec/cuboid/option_groups/dispatcher_spec.rb +12 -0
  133. data/spec/cuboid/option_groups/output_spec.rb +11 -0
  134. data/spec/cuboid/option_groups/paths_spec.rb +184 -0
  135. data/spec/cuboid/option_groups/report_spec.rb +26 -0
  136. data/spec/cuboid/option_groups/rpc_spec.rb +53 -0
  137. data/spec/cuboid/option_groups/snapshot_spec.rb +26 -0
  138. data/spec/cuboid/option_groups/system.rb +12 -0
  139. data/spec/cuboid/options_spec.rb +218 -0
  140. data/spec/cuboid/report_spec.rb +221 -0
  141. data/spec/cuboid/rest/server_spec.rb +1205 -0
  142. data/spec/cuboid/rpc/client/base_spec.rb +151 -0
  143. data/spec/cuboid/rpc/client/dispatcher_spec.rb +13 -0
  144. data/spec/cuboid/rpc/client/instance_spec.rb +38 -0
  145. data/spec/cuboid/rpc/server/active_options_spec.rb +21 -0
  146. data/spec/cuboid/rpc/server/base_spec.rb +60 -0
  147. data/spec/cuboid/rpc/server/dispatcher/node_spec.rb +222 -0
  148. data/spec/cuboid/rpc/server/dispatcher/service_spec.rb +112 -0
  149. data/spec/cuboid/rpc/server/dispatcher_spec.rb +317 -0
  150. data/spec/cuboid/rpc/server/instance_spec.rb +307 -0
  151. data/spec/cuboid/rpc/server/output_spec.rb +32 -0
  152. data/spec/cuboid/rpc/server/scheduler_spec.rb +400 -0
  153. data/spec/cuboid/ruby/array_spec.rb +77 -0
  154. data/spec/cuboid/ruby/hash_spec.rb +63 -0
  155. data/spec/cuboid/ruby/object_spec.rb +22 -0
  156. data/spec/cuboid/snapshot_spec.rb +123 -0
  157. data/spec/cuboid/state/application_spec.rb +538 -0
  158. data/spec/cuboid/state/options_spec.rb +37 -0
  159. data/spec/cuboid/state_spec.rb +53 -0
  160. data/spec/cuboid/support/buffer/autoflush_spec.rb +78 -0
  161. data/spec/cuboid/support/buffer/base_spec.rb +193 -0
  162. data/spec/cuboid/support/cache/least_cost_replacement_spec.rb +61 -0
  163. data/spec/cuboid/support/cache/least_recently_pushed_spec.rb +90 -0
  164. data/spec/cuboid/support/cache/least_recently_used_spec.rb +80 -0
  165. data/spec/cuboid/support/cache/preference_spec.rb +37 -0
  166. data/spec/cuboid/support/cache/random_replacement_spec.rb +42 -0
  167. data/spec/cuboid/support/crypto/rsa_aes_cbc_spec.rb +28 -0
  168. data/spec/cuboid/support/database/categorized_queue_spec.rb +327 -0
  169. data/spec/cuboid/support/database/hash_spec.rb +204 -0
  170. data/spec/cuboid/support/database/scheduler_spec.rb +325 -0
  171. data/spec/cuboid/support/filter/set_spec.rb +19 -0
  172. data/spec/cuboid/support/glob_spec.rb +75 -0
  173. data/spec/cuboid/support/mixins/observable_spec.rb +95 -0
  174. data/spec/cuboid/system/platforms/linux_spec.rb +31 -0
  175. data/spec/cuboid/system/platforms/osx_spec.rb +32 -0
  176. data/spec/cuboid/system/platforms/windows_spec.rb +41 -0
  177. data/spec/cuboid/system/slots_spec.rb +202 -0
  178. data/spec/cuboid/system_spec.rb +105 -0
  179. data/spec/cuboid/utilities_spec.rb +131 -0
  180. data/spec/spec_helper.rb +46 -0
  181. data/spec/support/factories/placeholder +0 -0
  182. data/spec/support/factories/scan_report.rb +18 -0
  183. data/spec/support/fixtures/empty/placeholder +0 -0
  184. data/spec/support/fixtures/executables/node.rb +50 -0
  185. data/spec/support/fixtures/mock_app.rb +61 -0
  186. data/spec/support/fixtures/mock_app/test_service.rb +64 -0
  187. data/spec/support/fixtures/services/echo.rb +64 -0
  188. data/spec/support/helpers/framework.rb +3 -0
  189. data/spec/support/helpers/matchers.rb +5 -0
  190. data/spec/support/helpers/misc.rb +3 -0
  191. data/spec/support/helpers/paths.rb +15 -0
  192. data/spec/support/helpers/request_helpers.rb +38 -0
  193. data/spec/support/helpers/requires.rb +8 -0
  194. data/spec/support/helpers/resets.rb +52 -0
  195. data/spec/support/helpers/web_server.rb +15 -0
  196. data/spec/support/lib/factory.rb +107 -0
  197. data/spec/support/lib/web_server_client.rb +41 -0
  198. data/spec/support/lib/web_server_dispatcher.rb +25 -0
  199. data/spec/support/lib/web_server_manager.rb +118 -0
  200. data/spec/support/logs/placeholder +0 -0
  201. data/spec/support/pems/cacert.pem +37 -0
  202. data/spec/support/pems/client/cert.pem +37 -0
  203. data/spec/support/pems/client/foo-cert.pem +39 -0
  204. data/spec/support/pems/client/foo-key.pem +51 -0
  205. data/spec/support/pems/client/key.pem +51 -0
  206. data/spec/support/pems/server/cert.pem +37 -0
  207. data/spec/support/pems/server/key.pem +51 -0
  208. data/spec/support/reports/placeholder +0 -0
  209. data/spec/support/shared/application.rb +10 -0
  210. data/spec/support/shared/component.rb +31 -0
  211. data/spec/support/shared/component/options/base.rb +187 -0
  212. data/spec/support/shared/option_group.rb +98 -0
  213. data/spec/support/shared/support/cache.rb +419 -0
  214. data/spec/support/shared/support/filter.rb +143 -0
  215. data/spec/support/shared/system/platforms/base.rb +25 -0
  216. data/spec/support/shared/system/platforms/mixins/unix.rb +37 -0
  217. data/spec/support/snapshots/placeholder +0 -0
  218. metadata +566 -21
  219. data/.gitignore +0 -8
  220. data/bin/console +0 -15
  221. 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,3 @@
1
+ require_relative 'client/instance'
2
+ require_relative 'client/dispatcher'
3
+ require_relative 'client/scheduler'
@@ -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