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,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