ohai 7.2.0.alpha.0 → 7.2.0.rc.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/lib/ohai/dsl/plugin.rb +5 -3
- data/lib/ohai/hints.rb +4 -2
- data/lib/ohai/mixin/ec2_metadata.rb +60 -36
- data/lib/ohai/mixin/gce_metadata.rb +5 -5
- data/lib/ohai/plugins/darwin/memory.rb +63 -0
- data/lib/ohai/plugins/joyent.rb +82 -0
- data/lib/ohai/plugins/linux/filesystem.rb +17 -0
- data/lib/ohai/plugins/network.rb +1 -1
- data/lib/ohai/plugins/rackspace.rb +8 -5
- data/lib/ohai/plugins/root_group.rb +4 -4
- data/lib/ohai/plugins/solaris2/virtualization.rb +7 -0
- data/lib/ohai/system.rb +3 -3
- data/lib/ohai/util/win32.rb +46 -0
- data/lib/ohai/util/win32/group_helper.rb +76 -0
- data/lib/ohai/version.rb +1 -1
- data/spec/functional/plugins/root_group_spec.rb +41 -0
- data/spec/spec_helper.rb +13 -1
- data/spec/unit/dsl/plugin_spec.rb +3 -3
- data/spec/unit/plugins/darwin/memory_spec.rb +64 -0
- data/spec/unit/plugins/ec2_spec.rb +22 -1
- data/spec/unit/plugins/gce_spec.rb +1 -1
- data/spec/unit/plugins/joyent_spec.rb +74 -0
- data/spec/unit/plugins/linux/filesystem_spec.rb +29 -2
- data/spec/unit/plugins/network_spec.rb +48 -31
- data/spec/unit/plugins/root_group_spec.rb +8 -8
- data/spec/unit/runner_spec.rb +7 -7
- data/spec/unit/system_spec.rb +5 -5
- data/spec/unit/util/file_helper_spec.rb +1 -1
- metadata +52 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 937d95d7e6b646e0028a39cc285b62c97cb05719
|
4
|
+
data.tar.gz: b0327a0a4bb11c90cf3d4f9b352b4bcb7be21e68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e58ecebbe4efa2e3774e692e70a48214985dab83c27c7364f091e82f8c576f43b457b9c45e6dab14a56665183b88d3ee6f534bee48124bb153982eae0d764404
|
7
|
+
data.tar.gz: 4e4b8b1afa20f3f84293731020e5ec3378749cd2c8bb7b10c7232959758f70ad8961f73fc0acf62635811f672fd674d92b5e3f00aae7a8465ab475b1d680d210
|
data/lib/ohai/dsl/plugin.rb
CHANGED
@@ -121,16 +121,18 @@ module Ohai
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
|
-
def
|
124
|
+
def has_key?(name)
|
125
125
|
@data.has_key?(name)
|
126
126
|
end
|
127
127
|
|
128
|
+
alias :attribute? :has_key?
|
129
|
+
|
128
130
|
def set(name, *value)
|
129
131
|
set_attribute(name, *value)
|
130
132
|
end
|
131
133
|
|
132
134
|
def from(cmd)
|
133
|
-
|
135
|
+
_status, stdout, _stderr = run_command(:command => cmd)
|
134
136
|
return "" if stdout.nil? || stdout.empty?
|
135
137
|
stdout.strip
|
136
138
|
end
|
@@ -140,7 +142,7 @@ module Ohai
|
|
140
142
|
# the value.
|
141
143
|
def from_with_regex(cmd, *regex_list)
|
142
144
|
regex_list.flatten.each do |regex|
|
143
|
-
|
145
|
+
_status, stdout, _stderr = run_command(:command => cmd)
|
144
146
|
return "" if stdout.nil? || stdout.empty?
|
145
147
|
stdout.chomp!.strip
|
146
148
|
md = stdout.match(regex)
|
data/lib/ohai/hints.rb
CHANGED
@@ -17,6 +17,8 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
#
|
19
19
|
|
20
|
+
require 'ffi_yajl'
|
21
|
+
|
20
22
|
module Ohai
|
21
23
|
module Hints
|
22
24
|
def self.refresh_hints
|
@@ -31,12 +33,12 @@ module Ohai
|
|
31
33
|
filename = File.join(path, "#{name}.json")
|
32
34
|
if File.exist?(filename)
|
33
35
|
begin
|
34
|
-
json_parser =
|
36
|
+
json_parser = FFI_Yajl::Parser.new
|
35
37
|
hash = json_parser.parse(File.read(filename))
|
36
38
|
@hints[name] = hash || Hash.new # hint
|
37
39
|
# should exist because the file did, even if it didn't
|
38
40
|
# contain anything
|
39
|
-
rescue
|
41
|
+
rescue FFI_Yajl::ParseError => e
|
40
42
|
Ohai::Log.error("Could not parse hint file at #{filename}: #{e.message}")
|
41
43
|
end
|
42
44
|
end
|
@@ -98,70 +98,94 @@ module Ohai
|
|
98
98
|
Net::HTTP.start(EC2_METADATA_ADDR).tap {|h| h.read_timeout = 600}
|
99
99
|
end
|
100
100
|
|
101
|
+
# Get metadata for a given path and API version
|
102
|
+
#
|
103
|
+
# @details
|
104
|
+
# Typically, a 200 response is expected for valid metadata.
|
105
|
+
# On certain instance types, traversing the provided metadata path
|
106
|
+
# produces a 404 for some unknown reason. In that event, return
|
107
|
+
# `nil` and continue the run instead of failing it.
|
101
108
|
def metadata_get(id, api_version)
|
102
109
|
path = "/#{api_version}/meta-data/#{id}"
|
103
110
|
response = http_client.get(path)
|
104
|
-
|
111
|
+
case response.code
|
112
|
+
when '200'
|
113
|
+
response.body
|
114
|
+
when '404'
|
115
|
+
Ohai::Log.debug("Encountered 404 response retreiving EC2 metadata path: #{path} ; continuing.")
|
116
|
+
nil
|
117
|
+
else
|
105
118
|
raise "Encountered error retrieving EC2 metadata (#{path} returned #{response.code} response)"
|
106
119
|
end
|
107
|
-
response
|
108
120
|
end
|
109
121
|
|
110
122
|
def fetch_metadata(id='', api_version=nil)
|
111
123
|
api_version ||= best_api_version
|
112
124
|
return Hash.new if api_version.nil?
|
113
125
|
metadata = Hash.new
|
114
|
-
metadata_get(id, api_version)
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
126
|
+
retrieved_metadata = metadata_get(id, api_version)
|
127
|
+
if retrieved_metadata
|
128
|
+
retrieved_metadata.split("\n").each do |o|
|
129
|
+
key = expand_path("#{id}#{o}")
|
130
|
+
if key[-1..-1] != '/'
|
131
|
+
metadata[metadata_key(key)] =
|
132
|
+
if EC2_ARRAY_VALUES.include? key
|
133
|
+
retr_meta = metadata_get(key, api_version)
|
134
|
+
retr_meta ? retr_meta.split("\n") : retr_meta
|
135
|
+
else
|
136
|
+
metadata_get(key, api_version)
|
137
|
+
end
|
138
|
+
elsif not key.eql?(id) and not key.eql?('/')
|
139
|
+
name = key[0..-2]
|
140
|
+
sym = metadata_key(name)
|
141
|
+
if EC2_ARRAY_DIR.include?(name)
|
142
|
+
metadata[sym] = fetch_dir_metadata(key, api_version)
|
143
|
+
elsif EC2_JSON_DIR.include?(name)
|
144
|
+
metadata[sym] = fetch_json_dir_metadata(key, api_version)
|
120
145
|
else
|
121
|
-
|
146
|
+
fetch_metadata(key, api_version).each{|k,v| metadata[k] = v}
|
122
147
|
end
|
123
|
-
elsif not key.eql?(id) and not key.eql?('/')
|
124
|
-
name = key[0..-2]
|
125
|
-
sym = metadata_key(name)
|
126
|
-
if EC2_ARRAY_DIR.include?(name)
|
127
|
-
metadata[sym] = fetch_dir_metadata(key, api_version)
|
128
|
-
elsif EC2_JSON_DIR.include?(name)
|
129
|
-
metadata[sym] = fetch_json_dir_metadata(key, api_version)
|
130
|
-
else
|
131
|
-
fetch_metadata(key, api_version).each{|k,v| metadata[k] = v}
|
132
148
|
end
|
133
149
|
end
|
150
|
+
metadata
|
134
151
|
end
|
135
|
-
metadata
|
136
152
|
end
|
137
153
|
|
138
154
|
def fetch_dir_metadata(id, api_version)
|
139
155
|
metadata = Hash.new
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
156
|
+
retrieved_metadata = metadata_get(id, api_version)
|
157
|
+
if retrieved_metadata
|
158
|
+
retrieved_metadata.split("\n").each do |o|
|
159
|
+
key = expand_path(o)
|
160
|
+
if key[-1..-1] != '/'
|
161
|
+
retr_meta = metadata_get("#{id}#{key}", api_version)
|
162
|
+
metadata[metadata_key(key)] = retr_meta ? retr_meta : ''
|
163
|
+
elsif not key.eql?('/')
|
164
|
+
metadata[key[0..-2]] = fetch_dir_metadata("#{id}#{key}", api_version)
|
165
|
+
end
|
146
166
|
end
|
167
|
+
metadata
|
147
168
|
end
|
148
|
-
metadata
|
149
169
|
end
|
150
170
|
|
151
171
|
def fetch_json_dir_metadata(id, api_version)
|
152
172
|
metadata = Hash.new
|
153
|
-
metadata_get(id, api_version)
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
173
|
+
retrieved_metadata = metadata_get(id, api_version)
|
174
|
+
if retrieved_metadata
|
175
|
+
retrieved_metadata.split("\n").each do |o|
|
176
|
+
key = expand_path(o)
|
177
|
+
if key[-1..-1] != '/'
|
178
|
+
retr_meta = metadata_get("#{id}#{key}", api_version)
|
179
|
+
data = retr_meta ? retr_meta : ''
|
180
|
+
json = StringIO.new(data)
|
181
|
+
parser = FFI_Yajl::Parser.new
|
182
|
+
metadata[metadata_key(key)] = parser.parse(json)
|
183
|
+
elsif not key.eql?('/')
|
184
|
+
metadata[key[0..-2]] = fetch_json_dir_metadata("#{id}#{key}", api_version)
|
185
|
+
end
|
162
186
|
end
|
187
|
+
metadata
|
163
188
|
end
|
164
|
-
metadata
|
165
189
|
end
|
166
190
|
|
167
191
|
def fetch_userdata()
|
@@ -58,10 +58,10 @@ module Ohai
|
|
58
58
|
uri = "#{GCE_METADATA_URL}/#{id}"
|
59
59
|
response = http_client.get(uri)
|
60
60
|
return nil unless response.code == "200"
|
61
|
-
|
61
|
+
|
62
62
|
if json?(response.body)
|
63
63
|
data = StringIO.new(response.body)
|
64
|
-
parser =
|
64
|
+
parser = FFI_Yajl::Parser.new
|
65
65
|
parser.parse(data)
|
66
66
|
elsif has_trailing_slash?(id) or (id == '')
|
67
67
|
temp={}
|
@@ -76,15 +76,15 @@ module Ohai
|
|
76
76
|
|
77
77
|
def json?(data)
|
78
78
|
data = StringIO.new(data)
|
79
|
-
parser =
|
79
|
+
parser = FFI_Yajl::Parser.new
|
80
80
|
begin
|
81
81
|
parser.parse(data)
|
82
82
|
true
|
83
|
-
rescue
|
83
|
+
rescue FFI_Yajl::ParseError
|
84
84
|
false
|
85
85
|
end
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
def multiline?(data)
|
89
89
|
data.lines.to_a.size > 1
|
90
90
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Patrick Collins (<pat@burned.com>)
|
3
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
Ohai.plugin(:Memory) do
|
20
|
+
provides 'memory'
|
21
|
+
|
22
|
+
collect_data(:darwin) do
|
23
|
+
memory Mash.new
|
24
|
+
|
25
|
+
installed_memory = shell_out("sysctl -n hw.memsize").stdout.to_i / 1024 / 1024.0
|
26
|
+
memory[:total] = "#{installed_memory.to_i}MB"
|
27
|
+
|
28
|
+
total_consumed = 0
|
29
|
+
active = 0
|
30
|
+
inactive = 0
|
31
|
+
vm_stat = shell_out("vm_stat").stdout
|
32
|
+
vm_stat_match = /page size of (\d+) bytes/.match(vm_stat)
|
33
|
+
page_size = if vm_stat_match and vm_stat_match[1]
|
34
|
+
vm_stat_match[1].to_i
|
35
|
+
else
|
36
|
+
4096
|
37
|
+
end
|
38
|
+
vm_stat.split("\n").each do |line|
|
39
|
+
['wired down', 'active', 'inactive'].each do |match|
|
40
|
+
unless line.index("Pages #{match}:").nil?
|
41
|
+
pages = line.split.last.to_i
|
42
|
+
megabyte_val = (pages * page_size) / 1024 / 1024.0
|
43
|
+
total_consumed += megabyte_val
|
44
|
+
case match
|
45
|
+
when 'wired down'
|
46
|
+
active += megabyte_val.to_i
|
47
|
+
when 'active'
|
48
|
+
active += megabyte_val.to_i
|
49
|
+
when 'inactive'
|
50
|
+
inactive += megabyte_val.to_i
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
memory[:active] = "#{active}MB" if active > 0
|
57
|
+
memory[:inactive] = "#{inactive}MB" if inactive > 0
|
58
|
+
|
59
|
+
free_memory = installed_memory - total_consumed
|
60
|
+
memory[:free] = "#{free_memory.to_i}MB" if total_consumed > 0
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#
|
2
|
+
# Author: sawanoboriyu@higanworks.com
|
3
|
+
# Copyright (C) 2014 HiganWorks LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
#
|
19
|
+
|
20
|
+
# Reference from: sm-summary command
|
21
|
+
|
22
|
+
Ohai.plugin(:Joyent) do
|
23
|
+
provides 'joyent'
|
24
|
+
provides 'virtualization/guest_id'
|
25
|
+
depends 'os', 'platform', 'virtualization'
|
26
|
+
|
27
|
+
def collect_product_file
|
28
|
+
lines = []
|
29
|
+
if ::File.exists?("/etc/product")
|
30
|
+
::File.open("/etc/product") do |file|
|
31
|
+
while line = file.gets
|
32
|
+
lines << line
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
lines
|
37
|
+
end
|
38
|
+
|
39
|
+
def collect_pkgsrc
|
40
|
+
if File.exist?('/opt/local/etc/pkg_install.conf')
|
41
|
+
sm_pkgsrc = ::File.read("/opt/local/etc/pkg_install.conf").split("=")
|
42
|
+
sm_pkgsrc[1].chomp
|
43
|
+
else
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def is_smartos?
|
49
|
+
platform == 'smartos'
|
50
|
+
end
|
51
|
+
|
52
|
+
collect_data do
|
53
|
+
if is_smartos?
|
54
|
+
joyent Mash.new
|
55
|
+
|
56
|
+
# copy uuid
|
57
|
+
joyent[:sm_uuid] = virtualization[:guest_uuid]
|
58
|
+
|
59
|
+
# get zone id unless globalzone
|
60
|
+
unless joyent[:sm_uuid] == "global"
|
61
|
+
joyent[:sm_id] = virtualization[:guest_id]
|
62
|
+
end
|
63
|
+
|
64
|
+
# retrieve image name and pkgsrc
|
65
|
+
collect_product_file.each do |line|
|
66
|
+
case line
|
67
|
+
when /^Image/
|
68
|
+
sm_image = line.split(" ")
|
69
|
+
joyent[:sm_image_id] = sm_image[1]
|
70
|
+
joyent[:sm_image_ver] = sm_image[2]
|
71
|
+
when /^Base Image/
|
72
|
+
sm_baseimage = line.split(" ")
|
73
|
+
joyent[:sm_baseimage_id] = sm_baseimage[2]
|
74
|
+
joyent[:sm_baseimage_ver] = sm_baseimage[3]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
## retrieve pkgsrc
|
79
|
+
joyent[:sm_pkgsrc] = collect_pkgsrc if collect_pkgsrc
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -38,6 +38,23 @@ Ohai.plugin(:Filesystem) do
|
|
38
38
|
fs[filesystem][:mount] = $6
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
# Grab filesystem inode data from df
|
43
|
+
so = shell_out("df -i")
|
44
|
+
so.stdout.lines do |line|
|
45
|
+
case line
|
46
|
+
when /^Filesystem\s+Inodes/
|
47
|
+
next
|
48
|
+
when /^(.+?)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\%)\s+(.+)$/
|
49
|
+
filesystem = $1
|
50
|
+
fs[filesystem] ||= Mash.new
|
51
|
+
fs[filesystem][:total_inodes] = $2
|
52
|
+
fs[filesystem][:inodes_used] = $3
|
53
|
+
fs[filesystem][:inodes_available] = $4
|
54
|
+
fs[filesystem][:inodes_percent_used] = $5
|
55
|
+
fs[filesystem][:mount] = $6
|
56
|
+
end
|
57
|
+
end
|
41
58
|
|
42
59
|
# Grab mount information from /bin/mount
|
43
60
|
so = shell_out("mount")
|
data/lib/ohai/plugins/network.rb
CHANGED
@@ -90,7 +90,7 @@ Ohai.plugin(:NetworkAddresses) do
|
|
90
90
|
end.first
|
91
91
|
if r.nil?
|
92
92
|
r = gw_if_ips.first
|
93
|
-
Ohai::Log.
|
93
|
+
Ohai::Log.debug("[#{family}] no ipaddress/mask on #{network[int_attr]} matching the gateway #{network[gw_attr]}, picking #{r[:ipaddress]}")
|
94
94
|
else
|
95
95
|
Ohai::Log.debug("[#{family}] Using default interface #{network[int_attr]} and default gateway #{network[gw_attr]} to set the default ip to #{r[:ipaddress]}")
|
96
96
|
end
|
@@ -38,7 +38,7 @@ Ohai.plugin(:Rackspace) do
|
|
38
38
|
if so.exitstatus == 0
|
39
39
|
so.stdout.strip.downcase == 'rackspace'
|
40
40
|
end
|
41
|
-
rescue
|
41
|
+
rescue Errno::ENOENT
|
42
42
|
false
|
43
43
|
end
|
44
44
|
|
@@ -89,8 +89,9 @@ Ohai.plugin(:Rackspace) do
|
|
89
89
|
rackspace[:region] = line.split[2].delete('\"') if line =~ /^region/
|
90
90
|
end
|
91
91
|
end
|
92
|
-
rescue
|
92
|
+
rescue Errno::ENOENT
|
93
93
|
Ohai::Log.debug("Unable to find xenstore-ls, cannot capture region information for Rackspace cloud")
|
94
|
+
nil
|
94
95
|
end
|
95
96
|
|
96
97
|
# Get the rackspace private networks
|
@@ -102,17 +103,19 @@ Ohai.plugin(:Rackspace) do
|
|
102
103
|
so.stdout.split("\n").map{|l| l.split('=').first.strip }.map do |item|
|
103
104
|
_so = shell_out("xenstore-read vm-data/networking/#{item}")
|
104
105
|
if _so.exitstatus == 0
|
105
|
-
networks.push(
|
106
|
+
networks.push(FFI_Yajl::Parser.new.parse(_so.stdout))
|
106
107
|
else
|
107
|
-
|
108
|
+
Ohai::Log.debug('Unable to capture custom private networking information for Rackspace cloud')
|
109
|
+
return false
|
108
110
|
end
|
109
111
|
end
|
110
112
|
# these networks are already known to ohai, and are not 'private networks'
|
111
113
|
networks.delete_if { |hash| hash['label'] == 'private' }
|
112
114
|
networks.delete_if { |hash| hash['label'] == 'public' }
|
113
115
|
end
|
114
|
-
rescue
|
116
|
+
rescue Errno::ENOENT
|
115
117
|
Ohai::Log.debug('Unable to capture custom private networking information for Rackspace cloud')
|
118
|
+
nil
|
116
119
|
end
|
117
120
|
|
118
121
|
collect_data do
|