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