diskmon 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/diskmon +1 -11
- data/diskmon.gemspec +2 -5
- data/lib/diskmon.rb +3 -30
- data/lib/diskmon/{client/collector.rb → collector.rb} +0 -0
- data/lib/diskmon/{client/config.rb → config.rb} +0 -0
- data/lib/diskmon/{client/harddisk.rb → harddisk.rb} +1 -1
- data/lib/diskmon/{client/raidcontroller.rb → raidcontroller.rb} +52 -20
- data/lib/diskmon/{client/solarismapdev.rb → solarismapdev.rb} +0 -0
- data/lib/diskmon/version.rb +1 -1
- data/lib/diskmon/{client/zpoolstree.rb → zpoolstree.rb} +0 -0
- metadata +9 -60
- data/lib/diskmon/server/harddisk.rb +0 -19
- data/lib/diskmon/server/harddiskreport.rb +0 -50
- data/lib/diskmon/server/serverapp.rb +0 -28
data/bin/diskmon
CHANGED
@@ -1,16 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require "rubygems"
|
3
3
|
require "diskmon"
|
4
|
-
require "optparse"
|
5
4
|
|
6
|
-
|
7
|
-
opt.separator ""
|
8
|
-
opt.separator "Options:"
|
9
|
-
opt.separator "-------------"
|
10
|
-
opt.on('-a', '--agent', 'Agent mode') { Diskmon::Runner.agent }
|
11
|
-
opt.on('-s', '--server', 'Server mode') { Diskmon::Runner.server }
|
12
|
-
opt.separator ""
|
13
|
-
opt.on_tail('-h', '--help') { puts opt; exit }
|
5
|
+
Diskmon::Runner.agent
|
14
6
|
|
15
|
-
opt.parse!
|
16
|
-
end
|
data/diskmon.gemspec
CHANGED
@@ -8,14 +8,11 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.summary = %q{Gem for collect statistic from disks}
|
9
9
|
gem.homepage = ""
|
10
10
|
|
11
|
-
gem.files = ["Gemfile", "LICENSE", "README.md", "Rakefile", "bin/diskmon", "diskmon.gemspec", "lib/diskmon.rb", "lib/diskmon/
|
11
|
+
gem.files = ["Gemfile", "LICENSE", "README.md", "Rakefile", "bin/diskmon", "diskmon.gemspec", "lib/diskmon.rb", "lib/diskmon/collector.rb", "lib/diskmon/config.rb", "lib/diskmon/harddisk.rb", "lib/diskmon/raidcontroller.rb", "lib/diskmon/solarismapdev.rb", "lib/diskmon/zpoolstree.rb", "lib/diskmon/version.rb"]
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
13
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
14
|
gem.name = "diskmon"
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Diskmon::VERSION
|
17
|
-
|
18
|
-
gem.add_runtime_dependency 'sinatra'
|
19
|
-
# gem.add_runtime_dependency 'thin'
|
20
|
-
gem.add_runtime_dependency 'dm-sqlite-adapter'
|
17
|
+
|
21
18
|
end
|
data/lib/diskmon.rb
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
require "diskmon/version"
|
2
|
-
require "diskmon/
|
3
|
-
require "diskmon/
|
4
|
-
require "diskmon/
|
5
|
-
|
6
|
-
require 'sinatra'
|
7
|
-
require "thin"
|
8
|
-
require 'data_mapper'
|
9
|
-
require 'dm-validations'
|
10
|
-
require 'pp'
|
11
|
-
require "diskmon/server/harddiskreport"
|
12
|
-
require "diskmon/server/serverapp"
|
2
|
+
require "diskmon/config"
|
3
|
+
require "diskmon/raidcontroller"
|
4
|
+
require "diskmon/collector"
|
13
5
|
|
14
6
|
module Diskmon
|
15
7
|
|
@@ -34,24 +26,5 @@ module Diskmon
|
|
34
26
|
send_result = coll.send_report(cfg.collector_url, cfg.collector_login, cfg.collector_password, m)
|
35
27
|
p send_result
|
36
28
|
end
|
37
|
-
|
38
|
-
################################################################################
|
39
|
-
# Server mode
|
40
|
-
################################################################################
|
41
|
-
|
42
|
-
def self.server
|
43
|
-
set :port, 7777
|
44
|
-
|
45
|
-
DataMapper::Logger.new($stdout, :debug)
|
46
|
-
DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/reports.db")
|
47
|
-
|
48
|
-
$DEBUG = true
|
49
|
-
|
50
|
-
DataMapper.finalize
|
51
|
-
|
52
|
-
Diskmon::HardDiskReport.auto_upgrade!
|
53
|
-
|
54
|
-
Diskmon::ServerApp.run!
|
55
|
-
end
|
56
29
|
end
|
57
30
|
end
|
File without changes
|
File without changes
|
@@ -12,7 +12,7 @@ module Diskmon
|
|
12
12
|
attr_accessor :port
|
13
13
|
attr_accessor :status
|
14
14
|
attr_accessor :unit
|
15
|
-
attr_accessor :type # sata or sas
|
15
|
+
attr_accessor :type # sata or sas or jbod
|
16
16
|
attr_accessor :vendor_model
|
17
17
|
attr_accessor :smart_status_raw # array of hex numbers
|
18
18
|
attr_accessor :smart_status
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require "diskmon/
|
2
|
-
require "diskmon/
|
3
|
-
require "diskmon/
|
1
|
+
require "diskmon/solarismapdev"
|
2
|
+
require "diskmon/harddisk"
|
3
|
+
require "diskmon/zpoolstree"
|
4
4
|
|
5
5
|
module Diskmon
|
6
6
|
|
@@ -12,7 +12,7 @@ module Diskmon
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def get_vendor
|
15
|
-
v = `scanpci |
|
15
|
+
v = `scanpci | egrep -i '(Adaptec|3ware)'`
|
16
16
|
|
17
17
|
case v.downcase
|
18
18
|
when /3ware/ then return :threeware
|
@@ -66,21 +66,6 @@ module Diskmon
|
|
66
66
|
|
67
67
|
d.dri = "disk://" + Diskmon::Server.get_id + "/" + d.ctl_id + "/" + d.port
|
68
68
|
|
69
|
-
# IO.popen("tw_cli /#{ctl_id}/#{d.port} show smart") do |tw_cli_show_smart_io|
|
70
|
-
|
71
|
-
# d.smart_status_raw = []
|
72
|
-
|
73
|
-
# tw_cli_show_smart_io.each_line do |l|
|
74
|
-
# s = l.split
|
75
|
-
# d.smart_status_raw.push(s) if l[0,1] =~ /[0-9]/ and not s.empty?
|
76
|
-
# end
|
77
|
-
|
78
|
-
# d.smart_status = parse_smart_status(d.smart_status_raw.flatten!)
|
79
|
-
|
80
|
-
# end # show smart
|
81
|
-
|
82
|
-
# full stats
|
83
|
-
#
|
84
69
|
IO.popen("tw_cli /c#{d.ctl_id}/p#{d.port} show all | grep '^/c#{d.ctl_id}/p#{d.port}'") do |tw_cli_show_all_io|
|
85
70
|
|
86
71
|
tw_cli_show_all_io.each_line do |l|
|
@@ -98,7 +83,7 @@ module Diskmon
|
|
98
83
|
|
99
84
|
end # show all
|
100
85
|
|
101
|
-
d.system_device = "c#{d.ctl_id}t#{d.
|
86
|
+
d.system_device = "c#{d.ctl_id}t#{d.port}d0"
|
102
87
|
d.short_device = mapdev.to_short(d.system_device)
|
103
88
|
|
104
89
|
yield d
|
@@ -106,7 +91,54 @@ module Diskmon
|
|
106
91
|
end
|
107
92
|
|
108
93
|
when :adaptec
|
94
|
+
mapdev = Diskmon::SolarisMapDev.new
|
95
|
+
|
96
|
+
# disks overview
|
97
|
+
#
|
98
|
+
arcconf_num_drives = `arcconf getconfig #{ctl_id} | grep 'Device #' | wc -l`.chomp.to_i
|
99
|
+
|
100
|
+
0.upto(arcconf_num_drives - 2) do |num|
|
101
|
+
disk = get_hash_of_disk(ctl_id, num)
|
102
|
+
|
103
|
+
d = Diskmon::HardDisk.new
|
104
|
+
|
105
|
+
d.ctl_id = ctl_id
|
106
|
+
d.port = disk["ReportedLocation"].split("Slot")[1]
|
107
|
+
d.status = disk["State"]
|
108
|
+
d.size = disk["Size"]
|
109
|
+
d.type = disk["TransferSpeed"]
|
110
|
+
d.vendor_model = disk["Model"]
|
111
|
+
d.serial = disk["Serialnumber"]
|
112
|
+
|
113
|
+
d.dri = "disk://" + Diskmon::Server.get_id + "/" + d.ctl_id + "/" + d.port
|
114
|
+
|
115
|
+
# TODO smart status
|
116
|
+
if `iostat -En | ggrep #{d.serial} -B1`.split[0]
|
117
|
+
d.system_device = `iostat -En | ggrep #{d.serial} -B1`.split[0]
|
118
|
+
else
|
119
|
+
d.system_device = "c0t#{d.port}d0"
|
120
|
+
end
|
121
|
+
|
122
|
+
d.short_device = mapdev.to_short(d.system_device)
|
123
|
+
|
124
|
+
yield d
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def get_hash_of_disk(ctl_id, num)
|
130
|
+
disk_info = []
|
131
|
+
d = []
|
132
|
+
get_config = `arcconf getconfig #{ctl_id} | ggrep -m 1 'Device ##{num}' -A 22`
|
133
|
+
get_config.split(/\n/).each do |e|
|
134
|
+
disk_info << e.split(' :')
|
135
|
+
end
|
136
|
+
disk_info.slice!(0,2)
|
137
|
+
disk_info.flatten!
|
138
|
+
disk_info.each do |e|
|
139
|
+
d << e.split(" ").join
|
109
140
|
end
|
141
|
+
disk_hash = Hash[*d]
|
110
142
|
end
|
111
143
|
|
112
144
|
def get_all_stats
|
File without changes
|
data/lib/diskmon/version.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: diskmon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,56 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
13
|
-
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: data_mapper
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: sinatra
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
38
|
-
type: :runtime
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: dm-sqlite-adapter
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
12
|
+
date: 2012-07-25 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
62
14
|
description: Gem for collect statistic from disks
|
63
15
|
email:
|
64
16
|
- morion.estariol@gmail.com
|
@@ -74,15 +26,12 @@ files:
|
|
74
26
|
- bin/diskmon
|
75
27
|
- diskmon.gemspec
|
76
28
|
- lib/diskmon.rb
|
77
|
-
- lib/diskmon/
|
78
|
-
- lib/diskmon/
|
79
|
-
- lib/diskmon/
|
80
|
-
- lib/diskmon/
|
81
|
-
- lib/diskmon/
|
82
|
-
- lib/diskmon/
|
83
|
-
- lib/diskmon/server/harddisk.rb
|
84
|
-
- lib/diskmon/server/serverapp.rb
|
85
|
-
- lib/diskmon/server/harddiskreport.rb
|
29
|
+
- lib/diskmon/collector.rb
|
30
|
+
- lib/diskmon/config.rb
|
31
|
+
- lib/diskmon/harddisk.rb
|
32
|
+
- lib/diskmon/raidcontroller.rb
|
33
|
+
- lib/diskmon/solarismapdev.rb
|
34
|
+
- lib/diskmon/zpoolstree.rb
|
86
35
|
- lib/diskmon/version.rb
|
87
36
|
homepage: ''
|
88
37
|
licenses: []
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'digest'
|
2
|
-
|
3
|
-
module Diskmon
|
4
|
-
|
5
|
-
class HardDisk
|
6
|
-
|
7
|
-
# credit: http://stackoverflow.com/a/5031637
|
8
|
-
def to_hash
|
9
|
-
Hash[instance_variables.map { |var| [var[1..-1].to_sym, instance_variable_get(var)] }]
|
10
|
-
end
|
11
|
-
|
12
|
-
def checksum
|
13
|
-
as_str = ''
|
14
|
-
instance_variables.sort.map { |k| as_str << "#{k}=#{instance_variable_get(k)};" }
|
15
|
-
p as_str if $DEBUG
|
16
|
-
Digest::MD5.hexdigest(as_str)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require "data_mapper"
|
2
|
-
|
3
|
-
module Diskmon
|
4
|
-
|
5
|
-
class HardDiskReport
|
6
|
-
include DataMapper::Resource
|
7
|
-
|
8
|
-
property :dri , String
|
9
|
-
property :ctl_id , String
|
10
|
-
property :port , String
|
11
|
-
property :status , String
|
12
|
-
property :unit , String
|
13
|
-
property :type , String
|
14
|
-
property :vendor_model , String
|
15
|
-
property :smart_status_raw , String
|
16
|
-
property :smart_status , String
|
17
|
-
property :size , String
|
18
|
-
property :reallocs , String
|
19
|
-
property :age_hours , String
|
20
|
-
property :temperature , String
|
21
|
-
property :serial , String
|
22
|
-
property :spindle_speed , String
|
23
|
-
property :error_events , String
|
24
|
-
property :member_of_zpool , String
|
25
|
-
property :disk_space_used , String
|
26
|
-
|
27
|
-
property :error_events , String
|
28
|
-
|
29
|
-
property :member_of_zpool , String
|
30
|
-
property :read_errors , String
|
31
|
-
property :write_errors , String
|
32
|
-
property :checksum_errors , String
|
33
|
-
|
34
|
-
property :zpool_health , String
|
35
|
-
property :zpool_last_command , String
|
36
|
-
property :zpool_total_space , String
|
37
|
-
property :zpool_free_space , String
|
38
|
-
|
39
|
-
property :system_device , String
|
40
|
-
property :short_device , String
|
41
|
-
|
42
|
-
property :created_at , EpochTime
|
43
|
-
property :checksum , String, :key => true, :unique => true
|
44
|
-
|
45
|
-
def print
|
46
|
-
instance_variables.sort.map { |k| printf( "%-20s => %s\n", k, instance_variable_get(k) ) }
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require "sinatra/base"
|
2
|
-
require "diskmon/server/harddisk"
|
3
|
-
|
4
|
-
module Diskmon
|
5
|
-
class ServerApp < Sinatra::Base
|
6
|
-
|
7
|
-
set :port, 7777
|
8
|
-
|
9
|
-
post '/report/new' do
|
10
|
-
data = request.body.read
|
11
|
-
|
12
|
-
Kernel.puts "// Report from #{request.env['REMOTE_ADDR']}" if $DEBUG
|
13
|
-
|
14
|
-
@m = Marshal.load(data)
|
15
|
-
|
16
|
-
@m.each do |disk|
|
17
|
-
report = Diskmon::HardDiskReport.create(disk.to_hash)
|
18
|
-
report.checksum = disk.checksum
|
19
|
-
|
20
|
-
report.print if $DEBUG
|
21
|
-
|
22
|
-
report.save
|
23
|
-
end
|
24
|
-
|
25
|
-
"OK"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|