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,57 @@
1
+ require 'io/console'
2
+
3
+ module Cuboid
4
+ module Support
5
+ module Mixins
6
+
7
+ # Terminal manipulation methods.
8
+ module Terminal
9
+
10
+ # Clears the line before printing using `puts`.
11
+ #
12
+ # @param [String] str
13
+ # String to output
14
+ def reputs( str = '' )
15
+ reprint str + "\n"
16
+ end
17
+
18
+ # Clears the line before printing.
19
+ #
20
+ # @param [String] str
21
+ # String to output.
22
+ def reprint( str = '' )
23
+ print restr( str )
24
+ end
25
+
26
+ def restr( str = '' )
27
+ "\e[0K" + str
28
+ end
29
+
30
+ # Clear the bottom of the screen
31
+ def clear_screen
32
+ print "\e[2J"
33
+ end
34
+
35
+ def empty_screen
36
+ move_to_home
37
+ rows, cols = $stdin.winsize
38
+ (rows - 1).times{ puts ' ' * cols }
39
+ move_to_home
40
+ end
41
+
42
+ # Moves cursor top left to its home
43
+ def move_to_home
44
+ print "\e[H"
45
+ end
46
+
47
+ # Flushes the STDOUT buffer
48
+ def flush
49
+ $stdout.flush
50
+ end
51
+
52
+ extend self
53
+ end
54
+
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,119 @@
1
+ require_relative 'system/slots'
2
+
3
+ module Cuboid
4
+
5
+ class System
6
+ include Singleton
7
+
8
+ # @return [Array<Platforms::Base>]
9
+ attr_reader :platforms
10
+
11
+ # @return [Slots]
12
+ attr_reader :slots
13
+
14
+ def initialize
15
+ @platforms = []
16
+ @slots = Slots.new( self )
17
+ end
18
+
19
+ # @return [Float]
20
+ # System utilization based on slots.
21
+ #
22
+ # * `0.0` => No utilization.
23
+ # * `1.0` => Max utilization.
24
+ def utilization
25
+ total_slots = System.slots.total
26
+ return 1.0 if total_slots == 0
27
+
28
+ System.slots.used / Float( total_slots )
29
+ end
30
+
31
+ # @return [Bool]
32
+ def max_utilization?
33
+ utilization == 1
34
+ end
35
+
36
+ # @return [Integer]
37
+ # Amount of free RAM in bytes.
38
+ def memory_free
39
+ platform.memory_free
40
+ end
41
+
42
+ # @param [Integer] pgid
43
+ # Process group ID.
44
+ #
45
+ # @return [Integer]
46
+ # Amount of RAM in bytes used by the given GPID.
47
+ def memory_for_process_group( pgid )
48
+ platform.memory_for_process_group( pgid )
49
+ end
50
+
51
+ # @return [Integer]
52
+ # Amount of free disk space in bytes.
53
+ def disk_space_free
54
+ platform.disk_space_free
55
+ end
56
+
57
+ # @return [String
58
+ # Location for temporary file storage.
59
+ def disk_directory
60
+ platform.disk_directory
61
+ end
62
+
63
+ # @param [Integer] pid
64
+ # Process ID.
65
+ #
66
+ # @return [Integer]
67
+ # Amount of disk space in bytes used by the given PID.
68
+ def disk_space_for_process( pid )
69
+ platform.disk_space_for_process( pid )
70
+ end
71
+
72
+ # @return [Integer]
73
+ # Amount of CPU cores.
74
+ def cpu_count
75
+ @cpu_count ||= platform.cpu_count
76
+ end
77
+
78
+ # @return [Platforms::Base]
79
+ def platform
80
+ return @platform if @platform
81
+
82
+ platforms.each do |klass|
83
+ next if !klass.current?
84
+
85
+ return @platform = klass.new
86
+ end
87
+
88
+ raise "Unsupported platform: #{RUBY_PLATFORM}"
89
+ end
90
+
91
+ # @private
92
+ def register_platform( platform )
93
+ platforms << platform
94
+ end
95
+
96
+ # @private
97
+ def reset
98
+ @cpu_count = nil
99
+ @platform = nil
100
+ end
101
+
102
+ class <<self
103
+ def method_missing( sym, *args, &block )
104
+ if instance.respond_to?( sym )
105
+ instance.send( sym, *args, &block )
106
+ else
107
+ super( sym, *args, &block )
108
+ end
109
+ end
110
+
111
+ def respond_to?( *args )
112
+ super || instance.respond_to?( *args )
113
+ end
114
+ end
115
+
116
+ end
117
+ end
118
+
119
+ require_relative 'system/platforms'
@@ -0,0 +1,84 @@
1
+ module Cuboid
2
+
3
+ class System
4
+ module Platforms
5
+
6
+ class Base
7
+ class <<self
8
+
9
+ # @private
10
+ def inherited( platform )
11
+ System.register_platform platform
12
+ end
13
+
14
+ # @return [Bool]
15
+ # `true` if it's the current platform, `false` otherwise.
16
+ #
17
+ # @abstract
18
+ def current?
19
+ raise 'Missing implementation'
20
+ end
21
+ end
22
+
23
+ # @return [Integer]
24
+ # Amount of free RAM in bytes.
25
+ #
26
+ # @abstract
27
+ def memory_free
28
+ raise 'Missing implementation'
29
+ end
30
+
31
+ # @param [Integer] pgid
32
+ # Process group ID.
33
+ #
34
+ # @return [Integer]
35
+ # Amount of RAM in bytes used by the given GPID.
36
+ #
37
+ # @abstract
38
+ def memory_for_process_group( pgid )
39
+ raise 'Missing implementation'
40
+ end
41
+
42
+ # @return [Integer]
43
+ # Amount of free disk in bytes.
44
+ #
45
+ # @abstract
46
+ def disk_space_free
47
+ raise 'Missing implementation'
48
+ end
49
+
50
+ # @return [String
51
+ # Location for temporary file storage.
52
+ def disk_directory
53
+ Options.paths.os_tmpdir
54
+ end
55
+
56
+ # @param [Integer] pid
57
+ # Process ID.
58
+ #
59
+ # @return [Integer]
60
+ # Amount of disk in bytes used by the given PID.
61
+ def disk_space_for_process( pid )
62
+ Support::Database::Base.disk_space_for( pid )
63
+ end
64
+
65
+ # @return [Integer]
66
+ # Amount of CPU cores.
67
+ def cpu_count
68
+ Concurrent.processor_count
69
+ end
70
+
71
+ # @private
72
+ def _exec( cmd )
73
+ %x(#{cmd})
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+
82
+ Dir.glob( "#{File.dirname(__FILE__)}/**/*.rb" ).each do |platform|
83
+ require platform
84
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'mixins/unix'
2
+
3
+ module Cuboid
4
+
5
+ class System
6
+ module Platforms
7
+ class Linux < Base
8
+ include Mixins::Unix
9
+
10
+ # @return [Integer]
11
+ # Amount of free RAM in bytes.
12
+ def memory_free
13
+ memory.available_bytes
14
+ end
15
+
16
+ class <<self
17
+ def current?
18
+ Cuboid.linux?
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,46 @@
1
+ require 'vmstat'
2
+
3
+ module Cuboid
4
+ class System
5
+ module Platforms
6
+ module Mixins
7
+
8
+ module Unix
9
+
10
+ # @param [Integer] pgid
11
+ # Process group ID.
12
+ #
13
+ # @return [Integer]
14
+ # Amount of RAM in bytes used by the given GPID.
15
+ def memory_for_process_group( pgid )
16
+ rss = 0
17
+
18
+ _exec( "ps -o rss -g #{pgid}" ).split("\n")[1..-1].each do |rss_string|
19
+ rss += rss_string.to_i
20
+ end
21
+
22
+ rss * pagesize
23
+ end
24
+
25
+ # @return [Integer]
26
+ # Amount of free disk in bytes.
27
+ def disk_space_free
28
+ Vmstat.disk( disk_directory ).available_bytes
29
+ end
30
+
31
+ private
32
+
33
+ def pagesize
34
+ @pagesize ||= memory.pagesize
35
+ end
36
+
37
+ def memory
38
+ Vmstat.memory
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'mixins/unix'
2
+
3
+ module Cuboid
4
+
5
+ class System
6
+ module Platforms
7
+ class OSX < Base
8
+ include Mixins::Unix
9
+
10
+ # @return [Integer]
11
+ # Amount of free RAM in bytes.
12
+ def memory_free
13
+ pagesize * memory.free
14
+ end
15
+
16
+ class <<self
17
+ def current?
18
+ Cuboid.mac?
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,81 @@
1
+ module Cuboid
2
+
3
+ class System
4
+ module Platforms
5
+
6
+ class Windows < Base
7
+
8
+ class <<self
9
+ def current?
10
+ Cuboid.windows?
11
+ end
12
+ end
13
+
14
+ # @return [Integer]
15
+ # Amount of free RAM in bytes.
16
+ def memory_free
17
+ result = wmi.ExecQuery(
18
+ 'select AvailableBytes from Win32_PerfFormattedData_PerfOS_Memory'
19
+ )
20
+
21
+ memory = nil
22
+ result.each do |e|
23
+ memory = e.availableBytes.to_i
24
+ e.ole_free
25
+ end
26
+ result.ole_free
27
+
28
+ memory
29
+ end
30
+
31
+ # @param [Integer] pgid
32
+ # Process group ID.
33
+ #
34
+ # @return [Integer]
35
+ # Amount of RAM in bytes used by the given GPID.
36
+ def memory_for_process_group( pgid )
37
+ processes = wmi.ExecQuery(
38
+ "select PrivatePageCount from win32_process where ProcessID='#{pgid}' or ParentProcessID='#{pgid}'"
39
+ )
40
+
41
+ memory = 0
42
+ processes.each do |process|
43
+ # Not actually pages but bytes, no idea why.
44
+ memory += process.privatePageCount.to_i
45
+ process.ole_free
46
+ end
47
+ processes.ole_free
48
+
49
+ memory
50
+ end
51
+
52
+ # @return [Integer]
53
+ # Amount of free disk in bytes.
54
+ def disk_space_free
55
+ device_id = disk_directory.split( '/' ).first
56
+
57
+ drives = wmi.ExecQuery(
58
+ "select FreeSpace from win32_LogicalDisk where DeviceID='#{device_id}'"
59
+ )
60
+
61
+ space = nil
62
+ drives.each do |drive|
63
+ space = drive.freeSpace.to_i
64
+ drive.ole_free
65
+ end
66
+ drives.ole_free
67
+
68
+ space
69
+ end
70
+
71
+ private
72
+
73
+ def wmi
74
+ @wmi ||= WIN32OLE.connect( 'winmgmts://' )
75
+ end
76
+
77
+ end
78
+ end
79
+ end
80
+
81
+ end