datacenter 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|