ohai 0.3.6 → 0.4.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.
- data/Rakefile +4 -3
- data/bin/ohai +17 -1
- data/lib/ohai.rb +1 -1
- data/lib/ohai/application.rb +10 -10
- data/lib/ohai/log.rb +4 -0
- data/lib/ohai/mixin/command.rb +10 -13
- data/lib/ohai/plugins/cloud.rb +80 -0
- data/lib/ohai/plugins/linux/platform.rb +17 -10
- data/lib/ohai/plugins/linux/virtualization.rb +14 -17
- data/lib/ohai/plugins/passwd.rb +22 -0
- data/lib/ohai/plugins/rackspace.rb +60 -0
- data/lib/ohai/plugins/ruby.rb +43 -14
- data/lib/ohai/plugins/solaris2/network.rb +18 -5
- data/lib/ohai/system.rb +50 -42
- data/spec/ohai/plugins/cloud_spec.rb +87 -0
- data/spec/ohai/plugins/linux/platform_spec.rb +69 -2
- data/spec/ohai/plugins/linux/virtualization_spec.rb +23 -6
- data/spec/ohai/plugins/passwd_spec.rb +32 -0
- data/spec/ohai/plugins/rackspace_spec.rb +115 -0
- data/spec/ohai/plugins/solaris2/network_spec.rb +135 -0
- metadata +61 -25
@@ -124,18 +124,31 @@ iface.keys.each do |ifn|
|
|
124
124
|
iaddr = nil
|
125
125
|
if iface[ifn][:encapsulation].eql?("Ethernet")
|
126
126
|
iface[ifn][:addresses].keys.each do |addr|
|
127
|
-
if [ifn][:addresses][addr]["family"].eql?("inet")
|
127
|
+
if iface[ifn][:addresses][addr]["family"].eql?("inet")
|
128
128
|
iaddr = addr
|
129
129
|
break
|
130
130
|
end
|
131
131
|
end
|
132
|
-
iface[ifn][:arp]
|
133
|
-
|
134
|
-
|
135
|
-
|
132
|
+
if iface[ifn][:arp]
|
133
|
+
iface[ifn][:arp].keys.each do |addr|
|
134
|
+
if addr.eql?(iaddr)
|
135
|
+
iface[ifn][:addresses][iface[ifn][:arp][iaddr]] = { "family" => "lladdr" }
|
136
|
+
break
|
137
|
+
end
|
136
138
|
end
|
137
139
|
end
|
138
140
|
end
|
139
141
|
end
|
140
142
|
|
141
143
|
network[:interfaces] = iface
|
144
|
+
|
145
|
+
popen4("route get default") do |pid, stdin, stdout, stderr|
|
146
|
+
stdin.close
|
147
|
+
route_get = stdout.string
|
148
|
+
matches = /interface: (\S+)/.match(route_get)
|
149
|
+
if matches
|
150
|
+
Ohai::Log.debug("found gateway device: #{$1}")
|
151
|
+
network[:default_interface] = matches[1]
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
data/lib/ohai/system.rb
CHANGED
@@ -6,9 +6,9 @@
|
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
8
8
|
# You may obtain a copy of the License at
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
11
|
+
#
|
12
12
|
# Unless required by applicable law or agreed to in writing, software
|
13
13
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
14
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
@@ -37,46 +37,45 @@ end
|
|
37
37
|
module Ohai
|
38
38
|
class System
|
39
39
|
attr_accessor :data, :seen_plugins
|
40
|
-
|
40
|
+
|
41
41
|
include Ohai::Mixin::FromFile
|
42
42
|
include Ohai::Mixin::Command
|
43
|
-
|
43
|
+
|
44
44
|
def initialize
|
45
45
|
@data = Mash.new
|
46
46
|
@seen_plugins = Hash.new
|
47
47
|
@providers = Mash.new
|
48
48
|
@plugin_path = ""
|
49
|
-
Ohai::Log.level(Ohai::Config.log_level)
|
50
49
|
end
|
51
|
-
|
50
|
+
|
52
51
|
def [](key)
|
53
52
|
@data[key]
|
54
53
|
end
|
55
|
-
|
54
|
+
|
56
55
|
def []=(key, value)
|
57
56
|
@data[key] = value
|
58
57
|
end
|
59
|
-
|
58
|
+
|
60
59
|
def each(&block)
|
61
60
|
@data.each do |key, value|
|
62
61
|
block.call(key, value)
|
63
62
|
end
|
64
63
|
end
|
65
|
-
|
64
|
+
|
66
65
|
def attribute?(name)
|
67
|
-
@data.has_key?(name)
|
66
|
+
@data.has_key?(name)
|
68
67
|
end
|
69
|
-
|
68
|
+
|
70
69
|
def set(name, *value)
|
71
70
|
set_attribute(name, *value)
|
72
71
|
end
|
73
|
-
|
72
|
+
|
74
73
|
def from(cmd)
|
75
74
|
status, stdout, stderr = run_command(:command => cmd)
|
76
|
-
return "" if stdout.nil?
|
75
|
+
return "" if stdout.nil? || stdout.empty?
|
77
76
|
stdout.chomp!.strip
|
78
77
|
end
|
79
|
-
|
78
|
+
|
80
79
|
def provides(*paths)
|
81
80
|
paths.each do |path|
|
82
81
|
parts = path.split('/')
|
@@ -92,34 +91,34 @@ module Ohai
|
|
92
91
|
h[:_providers] << @plugin_path
|
93
92
|
end
|
94
93
|
end
|
95
|
-
|
94
|
+
|
96
95
|
# Set the value equal to the stdout of the command, plus run through a regex - the first piece of match data is the value.
|
97
96
|
def from_with_regex(cmd, *regex_list)
|
98
97
|
regex_list.flatten.each do |regex|
|
99
98
|
status, stdout, stderr = run_command(:command => cmd)
|
100
|
-
return "" if stdout.nil?
|
99
|
+
return "" if stdout.nil? || stdout.empty?
|
101
100
|
stdout.chomp!.strip
|
102
101
|
md = stdout.match(regex)
|
103
102
|
return md[1]
|
104
103
|
end
|
105
104
|
end
|
106
|
-
|
105
|
+
|
107
106
|
def set_attribute(name, *value)
|
108
107
|
@data[name] = *value
|
109
108
|
@data[name]
|
110
109
|
end
|
111
|
-
|
110
|
+
|
112
111
|
def get_attribute(name)
|
113
112
|
@data[name]
|
114
113
|
end
|
115
|
-
|
114
|
+
|
116
115
|
def all_plugins
|
117
116
|
require_plugin('os')
|
118
|
-
|
117
|
+
|
119
118
|
Ohai::Config[:plugin_path].each do |path|
|
120
|
-
[
|
121
|
-
Dir[File.join(path, '*')],
|
122
|
-
Dir[File.join(path, @data[:os], '**', '*')]
|
119
|
+
[
|
120
|
+
Dir[File.join(path, '*')],
|
121
|
+
Dir[File.join(path, @data[:os], '**', '*')]
|
123
122
|
].flatten.each do |file|
|
124
123
|
file_regex = Regexp.new("#{path}#{File::SEPARATOR}(.+).rb$")
|
125
124
|
md = file_regex.match(file)
|
@@ -146,7 +145,7 @@ module Ohai
|
|
146
145
|
end
|
147
146
|
refreshments.flatten.uniq
|
148
147
|
end
|
149
|
-
|
148
|
+
|
150
149
|
def refresh_plugins(path = '/')
|
151
150
|
parts = path.split('/')
|
152
151
|
if parts.length == 0
|
@@ -162,24 +161,24 @@ module Ohai
|
|
162
161
|
|
163
162
|
refreshments = collect_providers(h)
|
164
163
|
Ohai::Log.debug("Refreshing plugins: #{refreshments.join(", ")}")
|
165
|
-
|
164
|
+
|
166
165
|
refreshments.each do |r|
|
167
166
|
@seen_plugins.delete(r) if @seen_plugins.has_key?(r)
|
168
167
|
end
|
169
168
|
refreshments.each do |r|
|
170
|
-
require_plugin(r) unless @seen_plugins.has_key?(r)
|
169
|
+
require_plugin(r) unless @seen_plugins.has_key?(r)
|
171
170
|
end
|
172
171
|
end
|
173
|
-
|
172
|
+
|
174
173
|
def require_plugin(plugin_name, force=false)
|
175
174
|
unless force
|
176
175
|
return true if @seen_plugins[plugin_name]
|
177
176
|
end
|
178
|
-
|
177
|
+
|
179
178
|
@plugin_path = plugin_name
|
180
|
-
|
179
|
+
|
181
180
|
filename = "#{plugin_name.gsub("::", File::SEPARATOR)}.rb"
|
182
|
-
|
181
|
+
|
183
182
|
Ohai::Config[:plugin_path].each do |path|
|
184
183
|
check_path = File.expand_path(File.join(path, filename))
|
185
184
|
begin
|
@@ -194,26 +193,35 @@ module Ohai
|
|
194
193
|
end
|
195
194
|
end
|
196
195
|
end
|
197
|
-
|
196
|
+
|
198
197
|
# Sneaky! Lets us stub out require_plugin when testing plugins, but still
|
199
198
|
# call the real require_plugin to kick the whole thing off.
|
200
199
|
alias :_require_plugin :require_plugin
|
201
|
-
|
202
|
-
# Serialize this object as a hash
|
200
|
+
|
201
|
+
# Serialize this object as a hash
|
203
202
|
def to_json(*a)
|
204
203
|
output = @data.clone
|
205
204
|
output["json_class"] = self.class.name
|
206
205
|
output.to_json(*a)
|
207
206
|
end
|
208
|
-
|
209
|
-
# Pretty Print this object as JSON
|
207
|
+
|
208
|
+
# Pretty Print this object as JSON
|
210
209
|
def json_pretty_print
|
211
210
|
JSON.pretty_generate(@data)
|
212
211
|
end
|
213
|
-
|
212
|
+
|
214
213
|
def attributes_print(a)
|
215
|
-
|
214
|
+
raise ArgumentError, "I cannot find an attribute named #{a}!" unless @data.has_key?(a)
|
215
|
+
case a
|
216
|
+
when Hash,Mash,Array
|
217
|
+
JSON.pretty_generate(@data[a])
|
218
|
+
when String
|
219
|
+
JSON.pretty_generate(@data[a].to_a)
|
220
|
+
else
|
221
|
+
raise ArgumentError, "I can only generate JSON for Hashes, Mashes, Arrays and Strings. You fed me a #{@data[a].class}!"
|
222
|
+
end
|
216
223
|
end
|
224
|
+
|
217
225
|
# Create an Ohai::System from JSON
|
218
226
|
def self.json_create(o)
|
219
227
|
ohai = new
|
@@ -222,16 +230,16 @@ module Ohai
|
|
222
230
|
end
|
223
231
|
ohai
|
224
232
|
end
|
225
|
-
|
233
|
+
|
226
234
|
def method_missing(name, *args)
|
227
|
-
return get_attribute(name) if args.length == 0
|
228
|
-
|
235
|
+
return get_attribute(name) if args.length == 0
|
236
|
+
|
229
237
|
set_attribute(name, *args)
|
230
238
|
end
|
231
|
-
|
239
|
+
|
232
240
|
private
|
233
241
|
def load_plugin_file
|
234
|
-
|
242
|
+
|
235
243
|
end
|
236
244
|
end
|
237
245
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Cary Penniman (<cary@rightscale.com>)
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require File.join(File.dirname(__FILE__), '..', '..', '/spec_helper.rb')
|
19
|
+
|
20
|
+
describe Ohai::System, "plugin cloud" do
|
21
|
+
before(:each) do
|
22
|
+
@ohai = Ohai::System.new
|
23
|
+
@ohai.stub!(:require_plugin).and_return(true)
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "no cloud" do
|
27
|
+
it "should NOT populate the cloud data" do
|
28
|
+
@ohai[:ec2] = nil
|
29
|
+
@ohai[:rackspace] = nil
|
30
|
+
@ohai._require_plugin("cloud")
|
31
|
+
@ohai[:cloud].should be_nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "with EC2" do
|
36
|
+
before(:each) do
|
37
|
+
@ohai[:ec2] = Mash.new()
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should populate cloud public ip" do
|
41
|
+
@ohai[:ec2]['public_ipv4'] = "174.129.150.8"
|
42
|
+
@ohai._require_plugin("cloud")
|
43
|
+
@ohai[:cloud][:public_ips][0].should == @ohai[:ec2]['public_ipv4']
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should populate cloud private ip" do
|
47
|
+
@ohai[:ec2]['local_ipv4'] = "10.252.42.149"
|
48
|
+
@ohai._require_plugin("cloud")
|
49
|
+
@ohai[:cloud][:private_ips][0].should == @ohai[:ec2]['local_ipv4']
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should populate cloud provider" do
|
53
|
+
@ohai._require_plugin("cloud")
|
54
|
+
@ohai[:cloud][:provider].should == "ec2"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "with rackspace" do
|
59
|
+
before(:each) do
|
60
|
+
@ohai[:rackspace] = Mash.new()
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should populate cloud public ip" do
|
64
|
+
@ohai[:rackspace]['public_ip'] = "174.129.150.8"
|
65
|
+
@ohai._require_plugin("cloud")
|
66
|
+
@ohai[:cloud][:public_ips][0].should == @ohai[:rackspace][:public_ip]
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should populate cloud private ip" do
|
70
|
+
@ohai[:rackspace]['private_ip'] = "10.252.42.149"
|
71
|
+
@ohai._require_plugin("cloud")
|
72
|
+
@ohai[:cloud][:private_ips][0].should == @ohai[:rackspace][:private_ip]
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should populate first cloud public ip" do
|
76
|
+
@ohai[:rackspace]['public_ip'] = "174.129.150.8"
|
77
|
+
@ohai._require_plugin("cloud")
|
78
|
+
@ohai[:cloud][:public_ips].first.should == @ohai[:rackspace][:public_ip]
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should populate cloud provider" do
|
82
|
+
@ohai._require_plugin("cloud")
|
83
|
+
@ohai[:cloud][:provider].should == "rackspace"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -29,6 +29,9 @@ describe Ohai::System, "Linux plugin platform" do
|
|
29
29
|
File.stub!(:exists?).with("/etc/debian_version").and_return(false)
|
30
30
|
File.stub!(:exists?).with("/etc/redhat-release").and_return(false)
|
31
31
|
File.stub!(:exists?).with("/etc/gentoo-release").and_return(false)
|
32
|
+
File.stub!(:exists?).with("/etc/SuSE-release").and_return(false)
|
33
|
+
File.stub!(:exists?).with("/etc/arch-release").and_return(false)
|
34
|
+
File.stub!(:exists?).with("/etc/fedora-release").and_return(false)
|
32
35
|
end
|
33
36
|
|
34
37
|
it "should require the lsb plugin" do
|
@@ -77,5 +80,69 @@ describe Ohai::System, "Linux plugin platform" do
|
|
77
80
|
|
78
81
|
end
|
79
82
|
|
80
|
-
|
81
|
-
|
83
|
+
describe "on arch" do
|
84
|
+
before(:each) do
|
85
|
+
@ohai.lsb = nil
|
86
|
+
File.should_receive(:exists?).with("/etc/arch-release").and_return(true)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should set platform to arch" do
|
90
|
+
@ohai._require_plugin("linux::platform")
|
91
|
+
@ohai[:platform].should == "arch"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "on redhat breeds" do
|
96
|
+
before(:each) do
|
97
|
+
@ohai.lsb = nil
|
98
|
+
File.should_receive(:exists?).with("/etc/redhat-release").and_return(true)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should check for the existance of redhat-release" do
|
102
|
+
@ohai._require_plugin("linux::platform")
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should read the platform as centos and version as 5.3" do
|
106
|
+
File.should_receive(:read).with("/etc/redhat-release").and_return("CentOS release 5.3")
|
107
|
+
@ohai._require_plugin("linux::platform")
|
108
|
+
@ohai[:platform].should == "centos"
|
109
|
+
end
|
110
|
+
|
111
|
+
it "may be that someone munged Red Hat to be RedHat" do
|
112
|
+
File.should_receive(:read).with("/etc/redhat-release").and_return("RedHat release 5.3")
|
113
|
+
@ohai._require_plugin("linux::platform")
|
114
|
+
@ohai[:platform].should == "redhat"
|
115
|
+
@ohai[:platform_version].should == "5.3"
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should read the platform as redhat and version as 5.3" do
|
119
|
+
File.should_receive(:read).with("/etc/redhat-release").and_return("Red Hat release 5.3")
|
120
|
+
@ohai._require_plugin("linux::platform")
|
121
|
+
@ohai[:platform].should == "redhat"
|
122
|
+
@ohai[:platform_version].should == "5.3"
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should read the platform as fedora and version as 13 (rawhide)" do
|
126
|
+
File.should_receive(:read).with("/etc/redhat-release").and_return("Fedora release 13 (Rawhide)")
|
127
|
+
@ohai._require_plugin("linux::platform")
|
128
|
+
@ohai[:platform].should == "fedora"
|
129
|
+
@ohai[:platform_version].should == "13 (rawhide)"
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should read the platform as fedora and version as 10" do
|
133
|
+
File.should_receive(:read).with("/etc/redhat-release").and_return("Fedora release 10")
|
134
|
+
@ohai._require_plugin("linux::platform")
|
135
|
+
@ohai[:platform].should == "fedora"
|
136
|
+
@ohai[:platform_version].should == "10"
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should read the platform as fedora and version as 13 using to_i" do
|
140
|
+
File.should_receive(:read).with("/etc/redhat-release").and_return("Fedora release 13 (Rawhide)")
|
141
|
+
@ohai._require_plugin("linux::platform")
|
142
|
+
@ohai[:platform].should == "fedora"
|
143
|
+
@ohai[:platform_version].to_i.should == 13
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
@@ -96,9 +96,17 @@ describe Ohai::System, "Linux virtualization platform" do
|
|
96
96
|
end
|
97
97
|
|
98
98
|
it "should set virtualpc guest if dmidecode detects Microsoft Virtual Machine" do
|
99
|
-
|
100
|
-
|
101
|
-
|
99
|
+
ms_vpc_dmidecode=<<-MSVPC
|
100
|
+
System Information
|
101
|
+
Manufacturer: Microsoft Corporation
|
102
|
+
Product Name: Virtual Machine
|
103
|
+
Version: VS2005R2
|
104
|
+
Serial Number: 1688-7189-5337-7903-2297-1012-52
|
105
|
+
UUID: D29974A4-BE51-044C-BDC6-EFBC4B87A8E9
|
106
|
+
Wake-up Type: Power Switch
|
107
|
+
MSVPC
|
108
|
+
@stdout.stub!(:string).and_return(ms_vpc_dmidecode)
|
109
|
+
|
102
110
|
@ohai.stub!(:popen4).with("dmidecode").and_yield(@pid, @stdin, @stdout, @stderr).and_return(@status)
|
103
111
|
@ohai._require_plugin("linux::virtualization")
|
104
112
|
@ohai[:virtualization][:emulator].should == "virtualpc"
|
@@ -106,9 +114,18 @@ describe Ohai::System, "Linux virtualization platform" do
|
|
106
114
|
end
|
107
115
|
|
108
116
|
it "should set vmware guest if dmidecode detects VMware Virtual Platform" do
|
109
|
-
|
110
|
-
|
111
|
-
|
117
|
+
vmware_dmidecode=<<-VMWARE
|
118
|
+
System Information
|
119
|
+
Manufacturer: VMware, Inc.
|
120
|
+
Product Name: VMware Virtual Platform
|
121
|
+
Version: None
|
122
|
+
Serial Number: VMware-50 3f f7 14 42 d1 f1 da-3b 46 27 d0 29 b4 74 1d
|
123
|
+
UUID: a86cc405-e1b9-447b-ad05-6f8db39d876a
|
124
|
+
Wake-up Type: Power Switch
|
125
|
+
SKU Number: Not Specified
|
126
|
+
Family: Not Specified
|
127
|
+
VMWARE
|
128
|
+
@stdout.stub!(:string).and_return(vmware_dmidecode)
|
112
129
|
@ohai.stub!(:popen4).with("dmidecode").and_yield(@pid, @stdin, @stdout, @stderr).and_return(@status)
|
113
130
|
@ohai._require_plugin("linux::virtualization")
|
114
131
|
@ohai[:virtualization][:emulator].should == "vmware"
|