datacenter 0.0.1 → 0.1.0
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/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -1
- data/datacenter.gemspec +1 -1
- data/lib/datacenter/cache.rb +37 -0
- data/lib/datacenter/machine.rb +7 -7
- data/lib/datacenter/process.rb +35 -21
- data/lib/datacenter/shell.rb +34 -7
- data/lib/datacenter/version.rb +1 -1
- data/lib/datacenter.rb +1 -0
- data/spec/cache_spec.rb +29 -0
- data/spec/commands.yml +8 -6
- data/spec/coverage_helper.rb +6 -0
- data/spec/machine_spec.rb +59 -0
- data/spec/minitest_helper.rb +26 -0
- data/spec/os_spec.rb +17 -0
- data/spec/process_spec.rb +34 -0
- data/spec/shell_spec.rb +41 -0
- metadata +16 -6
- data/monitor.rb +0 -106
- data/spec/datacenter_spec.rb +0 -132
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e7f3298efa18d3e60beba75d49ed5b5c11fd916
|
4
|
+
data.tar.gz: b5a77c2d243c16dc4965df41af25d9968072b338
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cedefb6e9ba69ee5ba27f84f89131a6743eec890ccc190da20ff0b678d16ed22aa601b3cdf335995c7ad44a6e0b5d1f058920124b1b2b8225aac23d624c825b
|
7
|
+
data.tar.gz: 087dffd0ab8b836d2249c6d8141dfb793abc833d5bd9e494d15c20eb97490f9d2ecec1d9c1b19e62c0b5b76d97558065865692cb5194ada63588f044688a2052
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
datacenter
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby 2.1
|
data/.travis.yml
CHANGED
data/datacenter.gemspec
CHANGED
@@ -25,5 +25,5 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency 'minitest', '~> 4.7'
|
26
26
|
spec.add_development_dependency 'turn', '~> 0.9'
|
27
27
|
spec.add_development_dependency 'simplecov'
|
28
|
-
spec.add_development_dependency 'pry'
|
28
|
+
spec.add_development_dependency 'pry-nav'
|
29
29
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Datacenter
|
2
|
+
class Cache
|
3
|
+
|
4
|
+
def initialize(expiration_time=nil)
|
5
|
+
@expiration_time = expiration_time
|
6
|
+
@data = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def fetch(key, &block)
|
10
|
+
set key, &block if !key?(key) || expired?(key)
|
11
|
+
get key
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def get(key)
|
17
|
+
@data[key][:value]
|
18
|
+
end
|
19
|
+
|
20
|
+
def set(key, &block)
|
21
|
+
@data[key] = {
|
22
|
+
value: block.call,
|
23
|
+
fetched_at: Time.now
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def key?(key)
|
28
|
+
@data.key? key
|
29
|
+
end
|
30
|
+
|
31
|
+
def expired?(key)
|
32
|
+
return false unless @expiration_time
|
33
|
+
Time.now >= @data[key][:fetched_at] + @expiration_time
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
data/lib/datacenter/machine.rb
CHANGED
@@ -4,7 +4,7 @@ module Datacenter
|
|
4
4
|
attr_reader :shell
|
5
5
|
|
6
6
|
def initialize(shell=nil)
|
7
|
-
@shell = shell || Shell::
|
7
|
+
@shell = shell || Shell::Local.new
|
8
8
|
end
|
9
9
|
|
10
10
|
def ips
|
@@ -62,19 +62,19 @@ module Datacenter
|
|
62
62
|
command = 'ps aux'
|
63
63
|
start = 1
|
64
64
|
else
|
65
|
-
command = "ps aux | grep #{filter} | grep -v grep"
|
65
|
+
command = "ps aux | grep \"#{filter}\" | grep -v grep"
|
66
66
|
start = 0
|
67
67
|
end
|
68
68
|
shell.run(command)
|
69
69
|
.split("\n")[start..-1]
|
70
|
-
.map { |l|
|
70
|
+
.map { |l| Process.new l.split[1].to_i, shell }
|
71
71
|
end
|
72
72
|
|
73
|
-
def top(order,n=10)
|
74
|
-
mappings = {
|
73
|
+
def top(order, n=10)
|
74
|
+
mappings = {memory: 'rss', pid: 'pid', cpu: '%cpu'}
|
75
75
|
shell.run("ps aux --sort -#{mappings[order]} | head -n #{n+1}")
|
76
76
|
.split("\n")[1..-1]
|
77
|
-
.map { |l|
|
77
|
+
.map { |l| Process.new l.split[1], shell }
|
78
78
|
end
|
79
79
|
|
80
80
|
private
|
@@ -101,7 +101,7 @@ module Datacenter
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def cpuinfo
|
104
|
-
Hash[shell.run('cat /proc/cpuinfo').split("\n").select {|e| e.length>0}.map { |e| e.split(':').map(&:strip) }]
|
104
|
+
Hash[shell.run('cat /proc/cpuinfo').split("\n").select { |e| e.length > 0 }.map { |e| e.split(':').map(&:strip) }]
|
105
105
|
end
|
106
106
|
|
107
107
|
class DiskPartition
|
data/lib/datacenter/process.rb
CHANGED
@@ -13,18 +13,14 @@ module Datacenter
|
|
13
13
|
:mem_usage
|
14
14
|
]
|
15
15
|
|
16
|
-
|
16
|
+
EXPIRATION_TIME = 2
|
17
17
|
|
18
|
-
attr_reader :pid
|
18
|
+
attr_reader :pid
|
19
19
|
|
20
|
-
def initialize(pid,
|
20
|
+
def initialize(pid, shell=nil)
|
21
21
|
@pid = pid
|
22
|
-
@
|
23
|
-
@cache =
|
24
|
-
end
|
25
|
-
|
26
|
-
def alive?
|
27
|
-
!(machine.shell.run 'ls /proc').scan("\n#{pid}\n").empty?
|
22
|
+
@shell = shell || Shell::Local.new
|
23
|
+
@cache = Cache.new EXPIRATION_TIME
|
28
24
|
end
|
29
25
|
|
30
26
|
ATTRIBUTES.each do |attribute|
|
@@ -33,11 +29,34 @@ module Datacenter
|
|
33
29
|
end
|
34
30
|
end
|
35
31
|
|
32
|
+
def alive?
|
33
|
+
send_signal 0
|
34
|
+
true
|
35
|
+
rescue Errno::ESRCH
|
36
|
+
false
|
37
|
+
end
|
38
|
+
|
39
|
+
def send_signal(signal)
|
40
|
+
out = shell.run("kill -s #{signal} #{pid}")
|
41
|
+
raise Errno::ESRCH, pid.to_s if out.match 'No such process'
|
42
|
+
end
|
43
|
+
|
44
|
+
def stop
|
45
|
+
send_signal :TERM if alive?
|
46
|
+
end
|
47
|
+
|
48
|
+
def kill
|
49
|
+
send_signal :KILL if alive?
|
50
|
+
while alive?; end
|
51
|
+
end
|
52
|
+
|
36
53
|
private
|
37
54
|
|
55
|
+
attr_reader :shell
|
56
|
+
|
38
57
|
def info
|
39
|
-
|
40
|
-
ps =
|
58
|
+
@cache.fetch(:info) do
|
59
|
+
ps = shell.run('ps aux').scan(/.*#{pid}.*/)[0].split
|
41
60
|
Hash.new.tap do |info|
|
42
61
|
status = Hash[proc_file(:status).split("\n").map{ |s| s.split(':').map(&:strip) }]
|
43
62
|
info[:name] = status['Name']
|
@@ -48,20 +67,15 @@ module Datacenter
|
|
48
67
|
info[:virtual_memory] = ps[4].to_i / 1024.0
|
49
68
|
info[:memory] = ps[5].to_i / 1024.0
|
50
69
|
info[:status] = ps[7]
|
51
|
-
info[:command] = ps[10..-1].reduce {|acum,e| "#{acum} #{e}"}
|
52
|
-
@cache = {:fetched => Time.now, :content=>info}
|
70
|
+
info[:command] = ps[10..-1].reduce { |acum,e| "#{acum} #{e}" }
|
53
71
|
end
|
54
|
-
|
55
|
-
cache[:content]
|
56
|
-
end
|
72
|
+
end
|
57
73
|
end
|
58
74
|
|
59
|
-
def
|
60
|
-
|
75
|
+
def proc_file(name)
|
76
|
+
filename = File.join '/proc', pid.to_s, name.to_s
|
77
|
+
shell.run "cat #{filename}"
|
61
78
|
end
|
62
79
|
|
63
|
-
def proc_file(file)
|
64
|
-
machine.shell.run "cat #{File.join(proc_dir, file.to_s)}"
|
65
|
-
end
|
66
80
|
end
|
67
81
|
end
|
data/lib/datacenter/shell.rb
CHANGED
@@ -1,29 +1,56 @@
|
|
1
1
|
module Datacenter
|
2
2
|
module Shell
|
3
3
|
|
4
|
-
class
|
4
|
+
class Local
|
5
5
|
def run(command)
|
6
|
-
|
6
|
+
if RUBY_ENGINE == 'jruby'
|
7
|
+
run_system command
|
8
|
+
else
|
9
|
+
run_open3 command
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def run_open3(command)
|
16
|
+
i,o,e,t = Open3.popen3 command
|
17
|
+
(o.readlines.join + e.readlines.join).strip
|
18
|
+
end
|
19
|
+
|
20
|
+
def run_system(command)
|
21
|
+
$stdout = StringIO.new
|
22
|
+
$stderr = StringIO.new
|
23
|
+
|
24
|
+
system command
|
25
|
+
|
26
|
+
[$stdout, $stderr].map do |io|
|
27
|
+
io.rewind
|
28
|
+
io.readlines.join.force_encoding('UTF-8')
|
29
|
+
end.join.strip
|
30
|
+
|
31
|
+
ensure
|
32
|
+
$stdout = STDOUT
|
33
|
+
$stderr = STDERR
|
7
34
|
end
|
8
35
|
end
|
9
36
|
|
10
|
-
class
|
11
|
-
attr_reader :
|
37
|
+
class Remote
|
38
|
+
attr_reader :options
|
12
39
|
|
13
40
|
def initialize(*args)
|
14
|
-
@
|
41
|
+
@options = args
|
15
42
|
end
|
16
43
|
|
17
44
|
def run(command)
|
18
45
|
if @session
|
19
46
|
@session.exec!(command).strip
|
20
47
|
else
|
21
|
-
Net::SSH.start(
|
48
|
+
Net::SSH.start(*options) { |ssh| ssh.exec! command }.to_s.strip
|
22
49
|
end
|
23
50
|
end
|
24
51
|
|
25
52
|
def open
|
26
|
-
@session = Net::SSH.start
|
53
|
+
@session = Net::SSH.start *options unless @session
|
27
54
|
end
|
28
55
|
|
29
56
|
def close
|
data/lib/datacenter/version.rb
CHANGED
data/lib/datacenter.rb
CHANGED
data/spec/cache_spec.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
describe Datacenter::Cache do
|
4
|
+
|
5
|
+
it 'Without expiration' do
|
6
|
+
cache = Datacenter::Cache.new
|
7
|
+
i = 0
|
8
|
+
3.times do
|
9
|
+
cache.fetch(:key_1) { i += 1 }.must_equal 1
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'Cached key' do
|
14
|
+
cache = Datacenter::Cache.new 1000
|
15
|
+
i = 0
|
16
|
+
3.times do
|
17
|
+
cache.fetch(:key_1) { i += 1 }.must_equal 1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'Expired key' do
|
22
|
+
cache = Datacenter::Cache.new 0
|
23
|
+
i = 0
|
24
|
+
1.upto(3) do |n|
|
25
|
+
cache.fetch(:key_1) { i += 1 }.must_equal n
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/spec/commands.yml
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
|
1
|
+
"kill -s 0 22803": ""
|
2
|
+
|
3
|
+
"kill -s 0 -22803": "bash: kill: (-22803) - No such process"
|
4
|
+
|
5
|
+
"kill -s TERM 22803": ""
|
6
|
+
|
2
7
|
"uname -i": x86_64
|
3
8
|
|
4
9
|
"uname -r": 3.5.0-49-generic
|
@@ -120,7 +125,7 @@ ifconfig: |
|
|
120
125
|
root 8 0.0 0.0 0 0 ? S May15 0:00 [migration/1]
|
121
126
|
matias 22803 11.9 0.8 513268 33792 ? Sl 09:43 52:47 gnome-system-monitor
|
122
127
|
|
123
|
-
ps aux | grep gnome-system-monitor | grep -v grep: |
|
128
|
+
ps aux | grep "gnome-system-monitor" | grep -v grep: |
|
124
129
|
matias 22803 7.2 0.8 597980 34948 ? Sl May21 136:34 gnome-system-monitor
|
125
130
|
|
126
131
|
"cat /proc/22803/status": |
|
@@ -146,7 +151,4 @@ ps aux | grep gnome-system-monitor | grep -v grep: |
|
|
146
151
|
VmLib: 27732 kB
|
147
152
|
VmPTE: 556 kB
|
148
153
|
VmSwap: 0 kB
|
149
|
-
Threads: 4
|
150
|
-
|
151
|
-
"ls /proc": "18\n1813\n22803\n22903\n23\n2350\n23542\n2370\n246\n247\n25129\ntimer_list\nvmstat\nzoneinfo"
|
152
|
-
|
154
|
+
Threads: 4
|
data/spec/coverage_helper.rb
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
describe Datacenter::Machine do
|
4
|
+
|
5
|
+
let(:machine) { Datacenter::Machine.new mock_shell }
|
6
|
+
|
7
|
+
it ('IPs') { machine.ips.must_equal %w(192.168.50.127 127.0.0.1) }
|
8
|
+
|
9
|
+
it ('Name') { machine.name.must_equal "matias" }
|
10
|
+
|
11
|
+
it 'OS' do
|
12
|
+
machine.os.name.must_equal 'GNU/Linux'
|
13
|
+
machine.os.distribution.must_equal 'Ubuntu'
|
14
|
+
machine.os.version.must_equal '12.04'
|
15
|
+
end
|
16
|
+
|
17
|
+
it ('CPU') { machine.cpu.must_equal 'Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93GHz'}
|
18
|
+
|
19
|
+
it ('Cores') { machine.cores.must_equal 2 }
|
20
|
+
|
21
|
+
it ('Total Memory') { machine.memory.must_equal 3944.953125 }
|
22
|
+
|
23
|
+
it ('Free Memory') { machine.memory_free.must_equal 1262.95703125 }
|
24
|
+
|
25
|
+
it ('Used Memory') { machine.memory_used.must_equal 2681.99609375 }
|
26
|
+
|
27
|
+
it ('Total Swap') { machine.swap.must_equal 4084.99609375 }
|
28
|
+
|
29
|
+
it ('Free Swap') { machine.swap_free.must_equal 4084.99609375 }
|
30
|
+
|
31
|
+
it ('Used Swap') { machine.swap_used.must_equal 0.0}
|
32
|
+
|
33
|
+
it ('List of Proccess') { machine.processes.find {|p| p.pid == 22803}.command.must_equal 'gnome-system-monitor' }
|
34
|
+
|
35
|
+
it ('List of Proccess With Filter') { machine.processes('gnome-system-monitor').find {|p| p.pid == 22803}.name.must_equal 'gnome-system-mo' }
|
36
|
+
|
37
|
+
it ('Top by Memory') { machine.top(:memory)[7].command.must_equal 'gnome-system-monitor' }
|
38
|
+
|
39
|
+
it ('Top by CPU') { machine.top(:cpu)[0].command.must_equal 'gnome-system-monitor' }
|
40
|
+
|
41
|
+
|
42
|
+
describe 'Disk Paritions' do
|
43
|
+
|
44
|
+
it ('Size') { machine.disk_partitions.map(&:size).must_equal [296432.3671875, 286580.5556640625] }
|
45
|
+
|
46
|
+
it ('Available') { machine.disk_partitions.map(&:available).must_equal [276762.1953125, 203569.6171875] }
|
47
|
+
|
48
|
+
it ('Used') { machine.disk_partitions.map(&:used).must_equal [4612.2734375, 3864.20703125] }
|
49
|
+
|
50
|
+
it ('% Use') { machine.disk_partitions.map(&:used_percentage).must_equal [2, 15] }
|
51
|
+
|
52
|
+
it ('Filesystem') { machine.disk_partitions.map(&:filesystem).must_equal ["/dev/sda1", "/dev/sdb1"] }
|
53
|
+
|
54
|
+
it ('Type') { machine.disk_partitions.map(&:type).must_equal ["ext4", "ext4"] }
|
55
|
+
|
56
|
+
it ('Mounted on') { machine.disk_partitions.map(&:mounted).must_equal ["/", "/sys"] }
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
data/spec/minitest_helper.rb
CHANGED
@@ -3,6 +3,7 @@ require 'minitest/autorun'
|
|
3
3
|
require 'turn'
|
4
4
|
require 'yaml'
|
5
5
|
require 'datacenter'
|
6
|
+
require 'pry-nav'
|
6
7
|
|
7
8
|
Turn.config do |c|
|
8
9
|
c.format = :pretty
|
@@ -10,6 +11,10 @@ Turn.config do |c|
|
|
10
11
|
c.ansi = true
|
11
12
|
end
|
12
13
|
|
14
|
+
class Module
|
15
|
+
include Minitest::Spec::DSL
|
16
|
+
end
|
17
|
+
|
13
18
|
module Datacenter
|
14
19
|
module Shell
|
15
20
|
class Mock
|
@@ -32,5 +37,26 @@ module Datacenter
|
|
32
37
|
attr_reader :commands
|
33
38
|
|
34
39
|
end
|
40
|
+
|
41
|
+
class Kill
|
42
|
+
def initialize(pid)
|
43
|
+
@pid = pid
|
44
|
+
end
|
45
|
+
|
46
|
+
def run(command)
|
47
|
+
if command == "kill -s 0 #{@pid}"
|
48
|
+
''
|
49
|
+
elsif command == "kill -s KILL #{@pid}"
|
50
|
+
@pid = nil
|
51
|
+
''
|
52
|
+
else
|
53
|
+
'kill: No such process'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
35
57
|
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Minitest::Spec
|
61
|
+
let(:mock_shell) { Datacenter::Shell::Mock.new File.expand_path('../commands.yml', __FILE__) }
|
36
62
|
end
|
data/spec/os_spec.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
describe Datacenter::OS do
|
4
|
+
|
5
|
+
let(:os) { Datacenter::OS.new mock_shell }
|
6
|
+
|
7
|
+
it ('Name') { os.name.must_equal 'GNU/Linux' }
|
8
|
+
|
9
|
+
it ('Distribution') { os.distribution.must_equal 'Ubuntu' }
|
10
|
+
|
11
|
+
it ('Version') { os.version.must_equal '12.04' }
|
12
|
+
|
13
|
+
it ('Kernel') { os.kernel.must_equal '3.5.0-49-generic' }
|
14
|
+
|
15
|
+
it ('Platform') { os.platform.must_equal 'x86_64' }
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
describe Datacenter::Process do
|
4
|
+
|
5
|
+
let(:pid) { 22803 }
|
6
|
+
let(:process) { Datacenter::Process.new pid, mock_shell }
|
7
|
+
|
8
|
+
it ('Pid') { process.pid.must_equal pid }
|
9
|
+
|
10
|
+
it ('Alive') { process.must_be :alive? }
|
11
|
+
|
12
|
+
it ('Dead') { Datacenter::Process.new(-pid, mock_shell).wont_be :alive? }
|
13
|
+
|
14
|
+
it ('Stop') { process.stop }
|
15
|
+
|
16
|
+
it ('Kill') { Datacenter::Process.new(pid, Datacenter::Shell::Kill.new(pid)).kill }
|
17
|
+
|
18
|
+
it ('Name') { process.name.must_equal 'gnome-system-mo' }
|
19
|
+
|
20
|
+
it ('Command') { process.command.must_equal 'gnome-system-monitor' }
|
21
|
+
|
22
|
+
it ('Memory') { process.memory.must_equal 33.0 }
|
23
|
+
|
24
|
+
it ('Virtual Memory') { process.virtual_memory.must_equal 501.23828125 }
|
25
|
+
|
26
|
+
it ('% Memory') { process.mem_usage.must_equal 0.8 }
|
27
|
+
|
28
|
+
it ('% CPU') { process.cpu_usage.must_equal 11.9 }
|
29
|
+
|
30
|
+
it ('Status') { process.status.must_equal 'Sl' }
|
31
|
+
|
32
|
+
it ('User') { process.user.must_equal 'matias' }
|
33
|
+
|
34
|
+
end
|
data/spec/shell_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
describe Datacenter::Shell do
|
4
|
+
|
5
|
+
module SharedExpamples
|
6
|
+
it 'Success' do
|
7
|
+
filename = File.join '/tmp', Time.now.to_i.to_s
|
8
|
+
shell.run "echo \"test file\" > #{filename}"
|
9
|
+
shell.run("cat #{filename}").must_equal 'test file'
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'Error' do
|
13
|
+
filename = '/invalid_dir/invalid_file'
|
14
|
+
shell.run("cat #{filename}").must_equal "cat: #{filename}: No such file or directory"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'Local' do
|
19
|
+
|
20
|
+
let(:shell) { Datacenter::Shell::Local.new }
|
21
|
+
|
22
|
+
include SharedExpamples
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'Remote' do
|
27
|
+
|
28
|
+
let(:connection_args) { ['localhost', `whoami`.strip] }
|
29
|
+
let(:shell) { Datacenter::Shell::Remote.new *connection_args }
|
30
|
+
|
31
|
+
include SharedExpamples
|
32
|
+
|
33
|
+
it 'Block' do
|
34
|
+
Datacenter::Shell::Remote.open(*connection_args) do |shell|
|
35
|
+
shell.run('ls /').must_equal `ls /`.strip
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datacenter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Naiman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name: pry
|
98
|
+
name: pry-nav
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -117,6 +117,8 @@ extra_rdoc_files: []
|
|
117
117
|
files:
|
118
118
|
- ".coveralls.yml"
|
119
119
|
- ".gitignore"
|
120
|
+
- ".ruby-gemset"
|
121
|
+
- ".ruby-version"
|
120
122
|
- ".travis.yml"
|
121
123
|
- Gemfile
|
122
124
|
- LICENSE.txt
|
@@ -124,16 +126,20 @@ files:
|
|
124
126
|
- Rakefile
|
125
127
|
- datacenter.gemspec
|
126
128
|
- lib/datacenter.rb
|
129
|
+
- lib/datacenter/cache.rb
|
127
130
|
- lib/datacenter/machine.rb
|
128
131
|
- lib/datacenter/os.rb
|
129
132
|
- lib/datacenter/process.rb
|
130
133
|
- lib/datacenter/shell.rb
|
131
134
|
- lib/datacenter/version.rb
|
132
|
-
-
|
135
|
+
- spec/cache_spec.rb
|
133
136
|
- spec/commands.yml
|
134
137
|
- spec/coverage_helper.rb
|
135
|
-
- spec/
|
138
|
+
- spec/machine_spec.rb
|
136
139
|
- spec/minitest_helper.rb
|
140
|
+
- spec/os_spec.rb
|
141
|
+
- spec/process_spec.rb
|
142
|
+
- spec/shell_spec.rb
|
137
143
|
homepage: https://github.com/gabynaiman/datacenter
|
138
144
|
licenses:
|
139
145
|
- MIT
|
@@ -159,7 +165,11 @@ signing_key:
|
|
159
165
|
specification_version: 4
|
160
166
|
summary: Manage and monitor servers and processes
|
161
167
|
test_files:
|
168
|
+
- spec/cache_spec.rb
|
162
169
|
- spec/commands.yml
|
163
170
|
- spec/coverage_helper.rb
|
164
|
-
- spec/
|
171
|
+
- spec/machine_spec.rb
|
165
172
|
- spec/minitest_helper.rb
|
173
|
+
- spec/os_spec.rb
|
174
|
+
- spec/process_spec.rb
|
175
|
+
- spec/shell_spec.rb
|
data/monitor.rb
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
require_relative 'lib/datacenter.rb'
|
2
|
-
require 'hirb'
|
3
|
-
require 'benchmark'
|
4
|
-
extend Hirb::Console
|
5
|
-
|
6
|
-
## Set up
|
7
|
-
server = ARGV[0]
|
8
|
-
user = ARGV[1]
|
9
|
-
|
10
|
-
shell = Datacenter::Shell::Ssh.new server,user
|
11
|
-
shell.open
|
12
|
-
machine = Datacenter::Machine.new shell
|
13
|
-
|
14
|
-
## General Information
|
15
|
-
puts "General Information \n\n"
|
16
|
-
|
17
|
-
# Server name
|
18
|
-
server = [{:value=>"Server : #{server} \n", :level=>0}]
|
19
|
-
# Operating System
|
20
|
-
os = [{:value=>"Operating System", :level=>0}]
|
21
|
-
os << {:value=>"#{machine.os.name} #{machine.os.distribution}" "#{machine.os.version}", :level=>3}
|
22
|
-
os << {:value=>"Kernel #{machine.os.kernel} #{machine.os.platform}", :level=>3}
|
23
|
-
# Hardware
|
24
|
-
hw = [{:value=>"Hardware", :level=>0}]
|
25
|
-
hw << {:value=>"Memory: #{machine.memory.to_i} MB", :level=>3}
|
26
|
-
hw << {:value=>"Processor: #{machine.cpu} x #{machine.cores}", :level=>3}
|
27
|
-
# Status
|
28
|
-
st = [{:value=>"Status", :level=>0}]
|
29
|
-
st += machine.disk_partition.map { |p| Hash[:value => "Partition #{p.filesystem}: #{p.available.to_i} MB available", :level=>3] }
|
30
|
-
st << {:value=>"Memory Free: #{machine.memory_free.to_i} MB", :level=>3}
|
31
|
-
st << {:value=>"Swap Free: #{machine.swap_free.to_i} MB", :level=>3}
|
32
|
-
|
33
|
-
info_machine = server + os + hw + st
|
34
|
-
puts "#{Hirb::Helpers::Tree.render(info_machine)} \n"
|
35
|
-
|
36
|
-
## Detailed Information
|
37
|
-
puts "\n\nDetailed Information \n\n"
|
38
|
-
|
39
|
-
filter_size = Proc.new{|e| "#{e.to_i} MB"}
|
40
|
-
filter_perc = Proc.new{|e| "#{e} %"}
|
41
|
-
|
42
|
-
puts 'Operating System'
|
43
|
-
os_fields = [:name, :distribution, :platform, :kernel, :version]
|
44
|
-
table machine.os, :fields=>os_fields
|
45
|
-
|
46
|
-
puts 'Hardware'
|
47
|
-
|
48
|
-
hw_fields = [:cpu, :cores, :memory]
|
49
|
-
table machine, :fields=>hw_fields, :filters=>{:memory=>filter_size}
|
50
|
-
|
51
|
-
puts 'Processes With Filter'
|
52
|
-
pr_fields = [:name, :mem_usage, :cpu_usage, :command, :status, :user]
|
53
|
-
puts "Time: #{Benchmark.measure { table machine.processes('ruby'), :fields=>pr_fields,
|
54
|
-
:filters=>{:mem_usage=>filter_perc,
|
55
|
-
:cpu_usage=>filter_perc}}.real }"
|
56
|
-
|
57
|
-
puts 'Top Processes by Memory Usage'
|
58
|
-
pr_fields = [:name, :mem_usage, :cpu_usage, :command, :status, :user]
|
59
|
-
puts "Time: #{Benchmark.measure { table machine.top(:memory), :fields=>pr_fields,
|
60
|
-
:filters=>{:mem_usage=>filter_perc,
|
61
|
-
:cpu_usage=>filter_perc}}.real }"
|
62
|
-
|
63
|
-
puts 'Top Processes by CPU Usage'
|
64
|
-
puts "Time: #{Benchmark.measure { table machine.top(:cpu), :fields=>pr_fields,
|
65
|
-
:filters=>{:mem_usage=>filter_perc,
|
66
|
-
:cpu_usage=>filter_perc} }.real}"
|
67
|
-
|
68
|
-
puts 'Filesystems'
|
69
|
-
bench = Benchmark.measure do
|
70
|
-
hdd_fields = [:filesystem, :type, :size, :used, :available, :p_use, :mounted]
|
71
|
-
table machine.disk_partition, :fields=>hdd_fields, :filters=>{:size=>filter_size,
|
72
|
-
:used=>filter_size,
|
73
|
-
:available=>filter_size,
|
74
|
-
:p_use=>filter_perc}
|
75
|
-
end
|
76
|
-
puts "Time: #{bench.real}"
|
77
|
-
|
78
|
-
puts 'Memory'
|
79
|
-
bench = Benchmark.measure do
|
80
|
-
mem_fields = [:memory, :memory_free, :memory_used, :swap, :swap_used, :swap_free]
|
81
|
-
table machine, :fields=>mem_fields, :filters=> Hash.new.tap { |f| mem_fields.map { |e| f[e]=filter_size } }
|
82
|
-
end
|
83
|
-
puts "Time #{bench.real}"
|
84
|
-
|
85
|
-
## Menu: TODO: Hay que definir como usarlo, es para verlo
|
86
|
-
class InfoMachineType
|
87
|
-
attr_reader :description
|
88
|
-
|
89
|
-
def initialize(description, detail)
|
90
|
-
@description = description
|
91
|
-
@detail = detail
|
92
|
-
end
|
93
|
-
|
94
|
-
def detail
|
95
|
-
Hirb::Helpers::Tree.render(@detail)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
type_gen = InfoMachineType.new 'Informacion General', info_machine
|
100
|
-
type_det = InfoMachineType.new 'Info Detallada', info_machine
|
101
|
-
|
102
|
-
puts menu [type_gen, type_det], :prompt=> "Elegir opción: ",
|
103
|
-
:fields => [:description],
|
104
|
-
:default_field=>
|
105
|
-
:detail,
|
106
|
-
:two_d=>true
|
data/spec/datacenter_spec.rb
DELETED
@@ -1,132 +0,0 @@
|
|
1
|
-
require 'minitest_helper'
|
2
|
-
|
3
|
-
describe Datacenter do
|
4
|
-
|
5
|
-
COMMANDS_FILE = File.join(File.dirname(__FILE__), 'commands.yml')
|
6
|
-
|
7
|
-
describe Datacenter::OS do
|
8
|
-
|
9
|
-
let(:shell) { Datacenter::Shell::Mock.new COMMANDS_FILE }
|
10
|
-
let(:os) { Datacenter::OS.new shell }
|
11
|
-
|
12
|
-
it ('Name') { os.name.must_equal 'GNU/Linux' }
|
13
|
-
|
14
|
-
it ('Distribution') { os.distribution.must_equal 'Ubuntu' }
|
15
|
-
|
16
|
-
it ('Version') { os.version.must_equal '12.04' }
|
17
|
-
|
18
|
-
it ('Kernel') { os.kernel.must_equal '3.5.0-49-generic' }
|
19
|
-
|
20
|
-
it ('Platform') { os.platform.must_equal 'x86_64' }
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
describe Datacenter::Machine do
|
25
|
-
|
26
|
-
describe 'Local' do
|
27
|
-
|
28
|
-
let(:shell) { Datacenter::Shell::Mock.new COMMANDS_FILE }
|
29
|
-
let(:machine) { Datacenter::Machine.new shell}
|
30
|
-
|
31
|
-
it ('IPs') { machine.ips.must_equal %w(192.168.50.127 127.0.0.1) }
|
32
|
-
|
33
|
-
it ('Name') { machine.name.must_equal "matias" }
|
34
|
-
|
35
|
-
it 'OS' do
|
36
|
-
machine.os.name.must_equal 'GNU/Linux'
|
37
|
-
machine.os.distribution.must_equal 'Ubuntu'
|
38
|
-
machine.os.version.must_equal '12.04'
|
39
|
-
end
|
40
|
-
|
41
|
-
it ('CPU') { machine.cpu.must_equal 'Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93GHz'}
|
42
|
-
|
43
|
-
it ('Cores') { machine.cores.must_equal 2 }
|
44
|
-
|
45
|
-
it ('Total Memory') { machine.memory.must_equal 3944.953125 }
|
46
|
-
|
47
|
-
it ('Free Memory') { machine.memory_free.must_equal 1262.95703125 }
|
48
|
-
|
49
|
-
it ('Used Memory') { machine.memory_used.must_equal 2681.99609375 }
|
50
|
-
|
51
|
-
it ('Total Swap') { machine.swap.must_equal 4084.99609375 }
|
52
|
-
|
53
|
-
it ('Free Swap') { machine.swap_free.must_equal 4084.99609375 }
|
54
|
-
|
55
|
-
it ('Used Swap') { machine.swap_used.must_equal 0.0}
|
56
|
-
|
57
|
-
it ('List of Proccess') { machine.processes.find {|p| p.pid=="22803"}.command.must_equal 'gnome-system-monitor' }
|
58
|
-
|
59
|
-
it ('List of Proccess With Filter') { machine.processes('gnome-system-monitor').find {|p| p.pid=="22803"}.name.must_equal 'gnome-system-mo' }
|
60
|
-
|
61
|
-
it ('Top by Memory') { machine.top(:memory)[7].command.must_equal 'gnome-system-monitor' }
|
62
|
-
|
63
|
-
it ('Top by CPU') { machine.top(:cpu)[0].command.must_equal 'gnome-system-monitor' }
|
64
|
-
|
65
|
-
describe 'Disk Paritions' do
|
66
|
-
|
67
|
-
it ('Size') { machine.disk_partitions.map(&:size).must_equal [296432.3671875, 286580.5556640625] }
|
68
|
-
|
69
|
-
it ('Available') { machine.disk_partitions.map(&:available).must_equal [276762.1953125, 203569.6171875] }
|
70
|
-
|
71
|
-
it ('Used') { machine.disk_partitions.map(&:used).must_equal [4612.2734375, 3864.20703125] }
|
72
|
-
|
73
|
-
it ('% Use') { machine.disk_partitions.map(&:used_percentage).must_equal [2, 15] }
|
74
|
-
|
75
|
-
it ('Filesystem') { machine.disk_partitions.map(&:filesystem).must_equal ["/dev/sda1", "/dev/sdb1"] }
|
76
|
-
|
77
|
-
it ('Type') { machine.disk_partitions.map(&:type).must_equal ["ext4", "ext4"] }
|
78
|
-
|
79
|
-
it ('Mounted on') { machine.disk_partitions.map(&:mounted).must_equal ["/", "/sys"] }
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
describe Datacenter::Process do
|
85
|
-
|
86
|
-
let(:pid) { 22803 }
|
87
|
-
let(:shell) { Datacenter::Shell::Mock.new COMMANDS_FILE }
|
88
|
-
let(:machine) { Datacenter::Machine.new shell}
|
89
|
-
let(:process) { Datacenter::Process.new pid,machine }
|
90
|
-
|
91
|
-
it ('Pid') { process.pid.must_equal pid }
|
92
|
-
|
93
|
-
it ('Alive') { process.alive?.must_equal true }
|
94
|
-
|
95
|
-
it 'Dead' do
|
96
|
-
process = Datacenter::Process.new -1,machine
|
97
|
-
process.alive?.must_equal false
|
98
|
-
end
|
99
|
-
|
100
|
-
it ('Name') { process.name.must_equal 'gnome-system-mo' }
|
101
|
-
|
102
|
-
it ('Command') { process.command.must_equal 'gnome-system-monitor' }
|
103
|
-
|
104
|
-
it ('Memory') { process.memory.must_equal 33.0 }
|
105
|
-
|
106
|
-
it ('Virtual Memory') { process.virtual_memory.must_equal 501.23828125 }
|
107
|
-
|
108
|
-
it ('% Memory') { process.mem_usage.must_equal 0.8}
|
109
|
-
|
110
|
-
it ('% CPU') { process.cpu_usage.must_equal 11.9 }
|
111
|
-
|
112
|
-
it ('Status') { process.status.must_equal 'Sl' }
|
113
|
-
|
114
|
-
it ('User') { process.user.must_equal 'matias' }
|
115
|
-
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
|
120
|
-
describe Datacenter::Shell::Ssh do
|
121
|
-
|
122
|
-
let(:shell) { Datacenter::Shell::Ssh.new 'localhost', `whoami`.strip }
|
123
|
-
|
124
|
-
before { shell.open }
|
125
|
-
after { shell.close }
|
126
|
-
|
127
|
-
it 'Run' do
|
128
|
-
shell.run('ls /').must_equal `ls /`.strip
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|