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,143 @@
|
|
1
|
+
module Cuboid
|
2
|
+
|
3
|
+
class System
|
4
|
+
class Slots
|
5
|
+
|
6
|
+
def initialize( system )
|
7
|
+
@system = system
|
8
|
+
@pids = Set.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def reset
|
12
|
+
@pids.clear
|
13
|
+
end
|
14
|
+
|
15
|
+
def use( pid )
|
16
|
+
@pids << pid
|
17
|
+
pid
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [Integer]
|
21
|
+
# Amount of new scans that can be safely run in parallel, currently.
|
22
|
+
# User option will override decision based on system resources.
|
23
|
+
def available
|
24
|
+
# Manual mode, user gave us a value.
|
25
|
+
if (max_slots = Options.system.max_slots)
|
26
|
+
max_slots - used
|
27
|
+
|
28
|
+
# Auto-mode, pick the safest restriction, RAM vs CPU.
|
29
|
+
else
|
30
|
+
available_auto
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Integer]
|
35
|
+
# Amount of new scans that can be safely run in parallel, currently.
|
36
|
+
# The decision is based on the available resources alone.
|
37
|
+
def available_auto
|
38
|
+
[ available_in_memory, available_in_cpu, available_in_disk ].min
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [Integer]
|
42
|
+
# Amount of instances that are currently alive.
|
43
|
+
def used
|
44
|
+
@pids.select! { |pid| Processes::Manager.alive? pid }
|
45
|
+
@pids.size
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Integer]
|
49
|
+
# Amount of scans that can be safely run in parallel, in total.
|
50
|
+
def total
|
51
|
+
used + available
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Integer]
|
55
|
+
# Amount of scans we can fit into the available memory.
|
56
|
+
#
|
57
|
+
# Works based on slots, available memory isn't currently available OS
|
58
|
+
# memory but memory that is unallocated.
|
59
|
+
def available_in_memory
|
60
|
+
return Float::INFINITY if memory_size == 0
|
61
|
+
(unallocated_memory / memory_size).to_i
|
62
|
+
end
|
63
|
+
|
64
|
+
# @return [Integer]
|
65
|
+
# Amount of CPU cores that are available.
|
66
|
+
#
|
67
|
+
# Well, they may not be really available, other stuff on the machine could
|
68
|
+
# be using them to a considerable extent, but we can only do so much.
|
69
|
+
def available_in_cpu
|
70
|
+
@system.cpu_count - used
|
71
|
+
end
|
72
|
+
|
73
|
+
# @return [Integer]
|
74
|
+
# Amount of scans we can fit into the available disk space.
|
75
|
+
#
|
76
|
+
# Works based on slots, available space isn't currently available OS
|
77
|
+
# disk space but space that is unallocated.
|
78
|
+
def available_in_disk
|
79
|
+
return Float::INFINITY if disk_space == 0
|
80
|
+
(unallocated_disk_space / disk_space).to_i
|
81
|
+
end
|
82
|
+
|
83
|
+
# @param [Integer] pid
|
84
|
+
#
|
85
|
+
# @return [Integer]
|
86
|
+
# Remaining memory for the scan, in bytes.
|
87
|
+
def remaining_memory_for( pid )
|
88
|
+
[memory_size - @system.memory_for_process_group( pid ), 0].max
|
89
|
+
end
|
90
|
+
|
91
|
+
# @return [Integer]
|
92
|
+
# Amount of memory (in bytes) available for future scans.
|
93
|
+
def unallocated_memory
|
94
|
+
# Available memory right now.
|
95
|
+
available_mem = @system.memory_free
|
96
|
+
|
97
|
+
# Remove allocated memory to figure out how much we can really spare.
|
98
|
+
@pids.each do |pid|
|
99
|
+
# Mark the remaining allocated memory as unavailable.
|
100
|
+
available_mem -= remaining_memory_for( pid )
|
101
|
+
end
|
102
|
+
|
103
|
+
available_mem
|
104
|
+
end
|
105
|
+
|
106
|
+
# @param [Integer] pid
|
107
|
+
#
|
108
|
+
# @return [Integer]
|
109
|
+
# Remaining disk space for the scan, in bytes.
|
110
|
+
def remaining_disk_space_for( pid )
|
111
|
+
[disk_space - @system.disk_space_for_process( pid ), 0].max
|
112
|
+
end
|
113
|
+
|
114
|
+
# @return [Integer]
|
115
|
+
# Amount of disk space (in bytes) available for future scans.
|
116
|
+
def unallocated_disk_space
|
117
|
+
# Available space right now.
|
118
|
+
available_space = @system.disk_space_free
|
119
|
+
|
120
|
+
# Remove allocated space to figure out how much we can really spare.
|
121
|
+
@pids.each do |pid|
|
122
|
+
# Mark the remaining allocated space as unavailable.
|
123
|
+
available_space -= remaining_disk_space_for( pid )
|
124
|
+
end
|
125
|
+
|
126
|
+
available_space
|
127
|
+
end
|
128
|
+
|
129
|
+
def disk_space
|
130
|
+
return 0 if !Cuboid::Application.application
|
131
|
+
Cuboid::Application.application.max_disk.to_i
|
132
|
+
end
|
133
|
+
|
134
|
+
# @return [Fixnum]
|
135
|
+
# Amount of memory (in bytes) to allocate to each scan.
|
136
|
+
def memory_size
|
137
|
+
return 0 if !Cuboid::Application.application
|
138
|
+
Cuboid::Application.application.max_memory.to_i
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Cuboid
|
2
|
+
module UI
|
3
|
+
|
4
|
+
# The system needs an {OutputInterface interface} as a {Cuboid::UI::Output}
|
5
|
+
# module and every UI should provide one.
|
6
|
+
#
|
7
|
+
# This one however is in case that one isn't available and it's basically
|
8
|
+
# a black hole that will only print and log errors and nothing else.
|
9
|
+
#
|
10
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
11
|
+
module Output
|
12
|
+
include OutputInterface
|
13
|
+
|
14
|
+
def print_error( message = '' )
|
15
|
+
msg = "#{caller_location} #{message}"
|
16
|
+
|
17
|
+
$stderr.puts msg
|
18
|
+
log_error msg
|
19
|
+
end
|
20
|
+
|
21
|
+
def print_bad(*)
|
22
|
+
end
|
23
|
+
|
24
|
+
def print_status(*)
|
25
|
+
end
|
26
|
+
|
27
|
+
def print_info(*)
|
28
|
+
end
|
29
|
+
|
30
|
+
def print_ok(*)
|
31
|
+
end
|
32
|
+
|
33
|
+
def print_debug(*)
|
34
|
+
end
|
35
|
+
|
36
|
+
def print_verbose(*)
|
37
|
+
end
|
38
|
+
|
39
|
+
def print_line(*)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def output_provider_file
|
45
|
+
__FILE__
|
46
|
+
end
|
47
|
+
|
48
|
+
extend self
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'cuboid/error'
|
2
|
+
|
3
|
+
module Cuboid
|
4
|
+
module UI
|
5
|
+
|
6
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
7
|
+
class Error < Cuboid::Error
|
8
|
+
end
|
9
|
+
|
10
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
11
|
+
module OutputInterface
|
12
|
+
|
13
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
14
|
+
class Error < Cuboid::UI::Error
|
15
|
+
end
|
16
|
+
|
17
|
+
require_relative 'output_interface/abstract'
|
18
|
+
require_relative 'output_interface/implemented'
|
19
|
+
|
20
|
+
require_relative 'output_interface/error_logging'
|
21
|
+
require_relative 'output_interface/controls'
|
22
|
+
require_relative 'output_interface/personalization'
|
23
|
+
|
24
|
+
# These output methods need to be implemented by the driving UI.
|
25
|
+
include Abstract
|
26
|
+
# These output method implementations depend on the Abstract ones.
|
27
|
+
include Implemented
|
28
|
+
|
29
|
+
include ErrorLogging
|
30
|
+
include Controls
|
31
|
+
include Personalization
|
32
|
+
|
33
|
+
# Must be called after the entire {Cuboid} environment has been loaded.
|
34
|
+
def self.initialize
|
35
|
+
Controls.initialize
|
36
|
+
ErrorLogging.initialize
|
37
|
+
end
|
38
|
+
|
39
|
+
extend self
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Cuboid
|
2
|
+
module UI
|
3
|
+
module OutputInterface
|
4
|
+
|
5
|
+
# These methods need to be implemented by the driving UI.
|
6
|
+
#
|
7
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
8
|
+
module Abstract
|
9
|
+
|
10
|
+
class Error < Cuboid::UI::OutputInterface::Error
|
11
|
+
|
12
|
+
# Raised when trying to use an output method that has not been implemented.
|
13
|
+
class MissingImplementation < Error
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# @abstract
|
19
|
+
def print_error( message = '' )
|
20
|
+
fail Error::MissingImplementation
|
21
|
+
end
|
22
|
+
|
23
|
+
# @abstract
|
24
|
+
def print_bad( message = '' )
|
25
|
+
fail Error::MissingImplementation
|
26
|
+
end
|
27
|
+
|
28
|
+
# @abstract
|
29
|
+
def print_status( message = '' )
|
30
|
+
fail Error::MissingImplementation
|
31
|
+
end
|
32
|
+
|
33
|
+
# @abstract
|
34
|
+
def print_info( message = '' )
|
35
|
+
fail Error::MissingImplementation
|
36
|
+
end
|
37
|
+
|
38
|
+
# @abstract
|
39
|
+
def print_ok( message = '' )
|
40
|
+
fail Error::MissingImplementation
|
41
|
+
end
|
42
|
+
|
43
|
+
# @abstract
|
44
|
+
def print_verbose( message = '' )
|
45
|
+
fail Error::MissingImplementation
|
46
|
+
end
|
47
|
+
|
48
|
+
# @abstract
|
49
|
+
def print_line( message = '' )
|
50
|
+
fail Error::MissingImplementation
|
51
|
+
end
|
52
|
+
|
53
|
+
# @abstract
|
54
|
+
def print_debug( message = '', level = 1 )
|
55
|
+
fail Error::MissingImplementation
|
56
|
+
end
|
57
|
+
|
58
|
+
# @abstract
|
59
|
+
def output_provider_file
|
60
|
+
# __FILE__
|
61
|
+
fail Error::MissingImplementation
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Cuboid
|
2
|
+
module UI
|
3
|
+
module OutputInterface
|
4
|
+
|
5
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
6
|
+
module Controls
|
7
|
+
|
8
|
+
def self.initialize
|
9
|
+
@@verbose = false
|
10
|
+
@@debug = 0
|
11
|
+
end
|
12
|
+
|
13
|
+
# Enables {#print_verbose} messages.
|
14
|
+
#
|
15
|
+
# @see #verbose?
|
16
|
+
def verbose_on
|
17
|
+
@@verbose = true
|
18
|
+
end
|
19
|
+
alias :verbose :verbose_on
|
20
|
+
|
21
|
+
# Disables {#print_verbose} messages.
|
22
|
+
#
|
23
|
+
# @see #verbose?
|
24
|
+
def verbose_off
|
25
|
+
@@verbose = false
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Bool]
|
29
|
+
def verbose?
|
30
|
+
@@verbose
|
31
|
+
end
|
32
|
+
|
33
|
+
# Enables {#print_debug} messages.
|
34
|
+
#
|
35
|
+
# @param [Integer] level
|
36
|
+
# Sets the debugging level.
|
37
|
+
#
|
38
|
+
# @see #debug?
|
39
|
+
def debug_on( level = 1 )
|
40
|
+
@@debug = level
|
41
|
+
end
|
42
|
+
alias :debug :debug_on
|
43
|
+
|
44
|
+
# Disables {#print_debug} messages.
|
45
|
+
#
|
46
|
+
# @see #debug?
|
47
|
+
def debug_off
|
48
|
+
@@debug = 0
|
49
|
+
end
|
50
|
+
|
51
|
+
# @return [Integer]
|
52
|
+
# Debugging level.
|
53
|
+
def debug_level
|
54
|
+
@@debug
|
55
|
+
end
|
56
|
+
|
57
|
+
# @param [Integer] level
|
58
|
+
# Checks against this level.
|
59
|
+
#
|
60
|
+
# @return [Bool]
|
61
|
+
#
|
62
|
+
# @see #debug
|
63
|
+
def debug?( level = 1 )
|
64
|
+
@@debug >= level
|
65
|
+
end
|
66
|
+
|
67
|
+
def debug_level_1?
|
68
|
+
debug? 1
|
69
|
+
end
|
70
|
+
def debug_level_2?
|
71
|
+
debug? 2
|
72
|
+
end
|
73
|
+
def debug_level_3?
|
74
|
+
debug? 3
|
75
|
+
end
|
76
|
+
def debug_level_4?
|
77
|
+
debug? 4
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module Cuboid
|
2
|
+
module UI
|
3
|
+
module OutputInterface
|
4
|
+
|
5
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
6
|
+
module ErrorLogging
|
7
|
+
|
8
|
+
def self.initialize
|
9
|
+
@@error_log_written_env = false
|
10
|
+
|
11
|
+
@@error_fd ||= nil
|
12
|
+
begin
|
13
|
+
@@error_fd.close if @@error_fd
|
14
|
+
rescue IOError
|
15
|
+
end
|
16
|
+
|
17
|
+
@@error_fd = nil
|
18
|
+
@@error_buffer = []
|
19
|
+
@@error_logfile = "#{Cuboid::Options.paths.logs}error-#{Process.pid}.log"
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param [String] logfile
|
23
|
+
# Location of the error log file.
|
24
|
+
def set_error_logfile( logfile )
|
25
|
+
@@error_logfile = logfile
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [String]
|
29
|
+
# Location of the error log file.
|
30
|
+
def error_logfile
|
31
|
+
@@error_logfile
|
32
|
+
end
|
33
|
+
|
34
|
+
def has_error_log?
|
35
|
+
File.exist? error_logfile
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def error_log_fd
|
41
|
+
return @@error_fd if @@error_fd
|
42
|
+
|
43
|
+
@@error_fd = File.open( error_logfile, 'a' )
|
44
|
+
@@error_fd.sync = true
|
45
|
+
|
46
|
+
Kernel.at_exit do
|
47
|
+
begin
|
48
|
+
@@error_fd.close if @@error_fd
|
49
|
+
rescue IOError
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
@@error_fd
|
54
|
+
|
55
|
+
# Errno::EMFILE (too many open files) or something, nothing we can do
|
56
|
+
# about it except catch it to avoid a crash.
|
57
|
+
rescue SystemCallError => e
|
58
|
+
$stderr.puts "[#{e.class}] #{e}"
|
59
|
+
e.backtrace.each { |line| $stderr.puts line }
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
# Logs an error message to the error log file.
|
64
|
+
#
|
65
|
+
# @param [String] str
|
66
|
+
def log_error( str = '' )
|
67
|
+
fd = error_log_fd
|
68
|
+
|
69
|
+
if !@@error_log_written_env
|
70
|
+
@@error_log_written_env = true
|
71
|
+
|
72
|
+
['', "#{Time.now} " + ( '-' * 80 )].each do |s|
|
73
|
+
|
74
|
+
if fd
|
75
|
+
fd.puts s
|
76
|
+
end
|
77
|
+
|
78
|
+
@@error_buffer << s
|
79
|
+
end
|
80
|
+
|
81
|
+
begin
|
82
|
+
h = {}
|
83
|
+
ENV.each { |k, v| h[k] = v }
|
84
|
+
|
85
|
+
options = Cuboid::Options.to_rpc_data.to_yaml
|
86
|
+
|
87
|
+
['ENV:', h.to_yaml, '-' * 80, 'OPTIONS:', options].each do |s|
|
88
|
+
|
89
|
+
if fd
|
90
|
+
fd.puts s
|
91
|
+
end
|
92
|
+
|
93
|
+
@@error_buffer += s.split("\n")
|
94
|
+
end
|
95
|
+
rescue
|
96
|
+
end
|
97
|
+
|
98
|
+
if fd
|
99
|
+
fd.puts '-' * 80
|
100
|
+
end
|
101
|
+
|
102
|
+
@@error_buffer << '-' * 80
|
103
|
+
end
|
104
|
+
|
105
|
+
msg = "[#{Time.now}] #{str}"
|
106
|
+
@@error_buffer << msg
|
107
|
+
|
108
|
+
if fd
|
109
|
+
fd.puts msg
|
110
|
+
end
|
111
|
+
|
112
|
+
nil
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|