-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathecc_check.rb
More file actions
executable file
·138 lines (107 loc) · 2.64 KB
/
ecc_check.rb
File metadata and controls
executable file
·138 lines (107 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env ruby
#encoding: utf-8
#frozen_string_literal: true
require 'json'
require 'logger'
require 'net/ssh'
require 'optparse'
#
# Parse Options
#
options = {
delay: 60,
host: nil,
username: nil
}
OptionParser.new do |opts|
opts.banner = 'Usage: ecc_check.rb [options]'
opts.on('-dDELAY', '--delay=DELAY', 'Time in seconds between connection attempts') do |d|
options[:delay] = d.to_i
end
opts.on('-rHOST', '--remote=HOST', 'Remote host to use instead of localhost') do |h|
options[:host] = h
end
opts.on('-uUSERNAME', '--username=USERNAME', 'Username for the remote host') do |u|
options[:username] = u
end
end.parse!
#
# Validate Options
#
if options[:delay] <= 0
raise 'Delay must be greater than 0'
end
#
# Run & Report
#
class Runner
def initialize(options)
@options = options
@logger = Logger.new(STDOUT)
end
def run
loop do
data = capture
parse(data) unless data.nil?
sleep @options[:delay]
end
end
private
def capture
# Get the data
data = nil
if @options[:host].nil?
data = `system_profiler -json SPMemoryDataType`
else
begin
Net::SSH.start @options[:host], @options[:username] do |ssh|
data = ssh.exec!('system_profiler -json SPMemoryDataType')
end
rescue
@logger.error 'Remote host is not available'
end
end
data
end
def parse(data)
begin
parsed_data = JSON.parse data
rescue
@logger.error 'Invalid captured data'
return
end
root = parsed_data['SPMemoryDataType']
if root.nil?
@logger.error 'Invalid root'
return
elsif !root.is_a?(Array)
@logger.error 'Invalid root object'
return
end
root.each_with_index do |memory_data, idx|
group_name = memory_data['_name'] || 'Unknown'
memory_data_items = memory_data['_items']
if memory_data_items.nil?
@logger.error "Invalid group \"#{group_name}\""
elsif !memory_data_items.is_a?(Array)
@logger.error "Invalid group object \"#{group_name}\""
else
statuses = []
has_error = false
memory_data_items.each_with_index do |dimm_data, idx|
name = dimm_data['_name'] || "Unknown #{idx}"
status = dimm_data['dimm_status'] || 'Unknown'
statuses << "#{name}: #{status}"
unless status == 'ok'
has_error = true
end
end
message = "#{group_name}: #{statuses.join(', ')}"
log_level = has_error ? Logger::ERROR : Logger::INFO
@logger.log log_level, message
end
end
end
end
runner = Runner.new options
runner.run