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
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'date'
|
|
5
5
|
require 'spec/rake/spectask'
|
6
6
|
|
7
7
|
GEM = "ohai"
|
8
|
-
GEM_VERSION = "0.
|
8
|
+
GEM_VERSION = "0.4.0"
|
9
9
|
AUTHOR = "Adam Jacob"
|
10
10
|
EMAIL = "adam@opscode.com"
|
11
11
|
HOMEPAGE = "http://wiki.opscode.com/display/ohai"
|
@@ -21,7 +21,8 @@ spec = Gem::Specification.new do |s|
|
|
21
21
|
s.author = AUTHOR
|
22
22
|
s.email = EMAIL
|
23
23
|
s.homepage = HOMEPAGE
|
24
|
-
|
24
|
+
|
25
|
+
s.add_dependency "json"
|
25
26
|
s.add_dependency "extlib"
|
26
27
|
s.add_dependency "systemu"
|
27
28
|
s.add_dependency "mixlib-cli"
|
@@ -50,7 +51,7 @@ end
|
|
50
51
|
|
51
52
|
desc "install the gem locally"
|
52
53
|
task :install => [:package] do
|
53
|
-
sh %{
|
54
|
+
sh %{gem install pkg/#{GEM}-#{GEM_VERSION}}
|
54
55
|
end
|
55
56
|
|
56
57
|
desc "create a gemspec file"
|
data/bin/ohai
CHANGED
@@ -19,6 +19,22 @@
|
|
19
19
|
# limitations under the License.
|
20
20
|
#
|
21
21
|
|
22
|
+
require 'rubygems'
|
23
|
+
|
22
24
|
$: << File.join(File.dirname(__FILE__), "..", "lib")
|
23
|
-
|
25
|
+
begin
|
26
|
+
require 'rubygems'
|
27
|
+
rescue LoadError
|
28
|
+
# must be debian! ;)
|
29
|
+
missing_rubygems = true
|
30
|
+
end
|
31
|
+
begin
|
32
|
+
require 'ohai/application'
|
33
|
+
rescue LoadError
|
34
|
+
if missing_rubygems
|
35
|
+
STDERR.puts "rubygems previously failed to load - is it installed?"
|
36
|
+
end
|
37
|
+
|
38
|
+
raise
|
39
|
+
end
|
24
40
|
Ohai::Application.new.run
|
data/lib/ohai.rb
CHANGED
data/lib/ohai/application.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.
|
@@ -21,7 +21,7 @@ require 'mixlib/cli'
|
|
21
21
|
|
22
22
|
class Ohai::Application
|
23
23
|
include Mixlib::CLI
|
24
|
-
|
24
|
+
|
25
25
|
option :directory,
|
26
26
|
:short => "-d DIRECTORY",
|
27
27
|
:long => "--directory DIRECTORY",
|
@@ -31,8 +31,8 @@ class Ohai::Application
|
|
31
31
|
:short => "-f FILE",
|
32
32
|
:long => "--file FILE",
|
33
33
|
:description => "A file to run Ohai against"
|
34
|
-
|
35
|
-
option :log_level,
|
34
|
+
|
35
|
+
option :log_level,
|
36
36
|
:short => "-l LEVEL",
|
37
37
|
:long => "--log_level LEVEL",
|
38
38
|
:description => "Set the log level (debug, info, warn, error, fatal)",
|
@@ -43,7 +43,7 @@ class Ohai::Application
|
|
43
43
|
:long => "--logfile LOGLOCATION",
|
44
44
|
:description => "Set the log file location, defaults to STDOUT - recommended for daemonizing",
|
45
45
|
:proc => nil
|
46
|
-
|
46
|
+
|
47
47
|
option :help,
|
48
48
|
:short => "-h",
|
49
49
|
:long => "--help",
|
@@ -75,10 +75,10 @@ class Ohai::Application
|
|
75
75
|
Ohai::Config[:plugin_path] << Ohai::Config[:directory]
|
76
76
|
end
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
def configure_logging
|
80
80
|
Ohai::Log.init(Ohai::Config[:log_location])
|
81
|
-
Ohai::Log.level
|
81
|
+
Ohai::Log.level = Ohai::Config[:log_level]
|
82
82
|
end
|
83
83
|
|
84
84
|
def run_application
|
@@ -89,8 +89,8 @@ class Ohai::Application
|
|
89
89
|
ohai.all_plugins
|
90
90
|
end
|
91
91
|
if @attributes.length > 0
|
92
|
-
@attributes.each do |a|
|
93
|
-
puts ohai.attributes_print(a)
|
92
|
+
@attributes.each do |a|
|
93
|
+
puts ohai.attributes_print(a)
|
94
94
|
end
|
95
95
|
else
|
96
96
|
puts ohai.json_pretty_print
|
data/lib/ohai/log.rb
CHANGED
data/lib/ohai/mixin/command.rb
CHANGED
@@ -1,22 +1,19 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
3
|
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
-
# License::
|
4
|
+
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
|
-
#
|
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
|
7
9
|
#
|
8
|
-
#
|
9
|
-
# it under the terms of the GNU General Public License as published by
|
10
|
-
# the Free Software Foundation, either version 3 of the License, or
|
11
|
-
# (at your option) any later version.
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
11
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# You should have received a copy of the GNU General Public License
|
19
|
-
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
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.
|
20
17
|
#
|
21
18
|
|
22
19
|
require 'ohai/exception'
|
@@ -0,0 +1,80 @@
|
|
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
|
+
provides "cloud"
|
18
|
+
|
19
|
+
require_plugin "ec2"
|
20
|
+
require_plugin "rackspace"
|
21
|
+
|
22
|
+
# Make top-level cloud hashes
|
23
|
+
#
|
24
|
+
def create_objects
|
25
|
+
cloud Mash.new
|
26
|
+
cloud[:public_ips] = Array.new
|
27
|
+
cloud[:private_ips] = Array.new
|
28
|
+
end
|
29
|
+
|
30
|
+
# ----------------------------------------
|
31
|
+
# ec2
|
32
|
+
# ----------------------------------------
|
33
|
+
|
34
|
+
# Is current cloud ec2?
|
35
|
+
#
|
36
|
+
# === Return
|
37
|
+
# true:: If ec2 Hash is defined
|
38
|
+
# false:: Otherwise
|
39
|
+
def on_ec2?
|
40
|
+
ec2 != nil
|
41
|
+
end
|
42
|
+
|
43
|
+
# Fill cloud hash with ec2 values
|
44
|
+
def get_ec2_values
|
45
|
+
cloud[:public_ips] << ec2['public_ipv4']
|
46
|
+
cloud[:private_ips] << ec2['local_ipv4']
|
47
|
+
cloud[:provider] = "ec2"
|
48
|
+
end
|
49
|
+
|
50
|
+
# setup ec2 cloud
|
51
|
+
if on_ec2?
|
52
|
+
create_objects
|
53
|
+
get_ec2_values
|
54
|
+
end
|
55
|
+
|
56
|
+
# ----------------------------------------
|
57
|
+
# rackspace
|
58
|
+
# ----------------------------------------
|
59
|
+
|
60
|
+
# Is current cloud rackspace?
|
61
|
+
#
|
62
|
+
# === Return
|
63
|
+
# true:: If rackspace Hash is defined
|
64
|
+
# false:: Otherwise
|
65
|
+
def on_rackspace?
|
66
|
+
rackspace != nil
|
67
|
+
end
|
68
|
+
|
69
|
+
# Fill cloud hash with rackspace values
|
70
|
+
def get_rackspace_values
|
71
|
+
cloud[:public_ips] << rackspace['public_ip']
|
72
|
+
cloud[:private_ips] << rackspace['private_ip']
|
73
|
+
cloud[:provider] = "rackspace"
|
74
|
+
end
|
75
|
+
|
76
|
+
# setup rackspace cloud
|
77
|
+
if on_rackspace?
|
78
|
+
create_objects
|
79
|
+
get_rackspace_values
|
80
|
+
end
|
@@ -15,6 +15,13 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
|
+
def get_redhatish_platform(contents)
|
19
|
+
contents[/^Red Hat/i] ? "redhat" : contents[/(\w+)/i, 1].downcase
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_redhatish_version(contents)
|
23
|
+
contents[/Rawhide/i] ? contents[/((\d+) \(Rawhide\))/i, 1].downcase : contents[/release ([\d\.]+)/, 1]
|
24
|
+
end
|
18
25
|
|
19
26
|
provides "platform", "platform_version"
|
20
27
|
|
@@ -27,17 +34,17 @@ elsif File.exists?("/etc/debian_version")
|
|
27
34
|
platform "debian"
|
28
35
|
platform_version File.read("/etc/debian_version").chomp
|
29
36
|
elsif File.exists?("/etc/redhat-release")
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
case line
|
34
|
-
when /\(Rawhide\)/
|
35
|
-
platform_version "rawhide"
|
36
|
-
when /release ([\d\.]+)/
|
37
|
-
platform_version $1
|
38
|
-
end
|
39
|
-
end
|
37
|
+
contents = File.read("/etc/redhat-release").chomp
|
38
|
+
platform get_redhatish_platform(contents)
|
39
|
+
platform_version get_redhatish_version(contents)
|
40
40
|
elsif File.exists?('/etc/gentoo-release')
|
41
41
|
platform "gentoo"
|
42
42
|
platform_version IO.read('/etc/gentoo-release').scan(/(\d+|\.+)/).join
|
43
|
+
elsif File.exists?('/etc/SuSE-release')
|
44
|
+
platform "suse"
|
45
|
+
platform_version IO.read('/etc/SuSE-release').scan(/\d+\.\d+/)[0]
|
46
|
+
elsif File.exists?('/etc/arch-release')
|
47
|
+
platform "arch"
|
48
|
+
# no way to determine platform_version in a rolling release distribution
|
49
|
+
# kernel release will be used - ex. 2.6.32-ARCH
|
43
50
|
end
|
@@ -54,24 +54,21 @@ end
|
|
54
54
|
if File.exists?("/usr/sbin/dmidecode")
|
55
55
|
popen4("dmidecode") do |pid, stdin, stdout, stderr|
|
56
56
|
stdin.close
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
found_virt_manufacturer = "vmware"
|
69
|
-
when /Product Name: VMware Virtual Platform/
|
70
|
-
if found_virt_manufacturer == "vmware"
|
71
|
-
virtualization[:emulator] = "vmware"
|
72
|
-
virtualization[:role] = "guest"
|
73
|
-
end
|
57
|
+
dmi_info = stdout.string
|
58
|
+
case dmi_info
|
59
|
+
when /Manufacturer: Microsoft/
|
60
|
+
if dmi_info =~ /Product Name: Virtual Machine/
|
61
|
+
virtualization[:emulator] = "virtualpc"
|
62
|
+
virtualization[:role] = "guest"
|
63
|
+
end
|
64
|
+
when /Manufacturer: VMware/
|
65
|
+
if dmi_info =~ /Product Name: VMware Virtual Platform/
|
66
|
+
virtualization[:emulator] = "vmware"
|
67
|
+
virtualization[:role] = "guest"
|
74
68
|
end
|
69
|
+
else
|
70
|
+
nil
|
75
71
|
end
|
72
|
+
|
76
73
|
end
|
77
74
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
provides 'etc', 'current_user'
|
2
|
+
|
3
|
+
require 'etc'
|
4
|
+
|
5
|
+
unless etc
|
6
|
+
etc Mash.new
|
7
|
+
|
8
|
+
etc[:passwd] = Mash.new
|
9
|
+
etc[:group] = Mash.new
|
10
|
+
|
11
|
+
Etc.passwd do |entry|
|
12
|
+
etc[:passwd][entry.name] = Mash.new(:dir => entry.dir, :gid => entry.gid, :uid => entry.uid, :shell => entry.shell, :gecos => entry.gecos)
|
13
|
+
end
|
14
|
+
|
15
|
+
Etc.group do |entry|
|
16
|
+
etc[:group][entry.name] = Mash.new(:gid => entry.gid, :members => entry.mem)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
unless current_user
|
21
|
+
current_user Etc.getlogin
|
22
|
+
end
|
@@ -0,0 +1,60 @@
|
|
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
|
+
provides "rackspace"
|
18
|
+
|
19
|
+
require_plugin "network"
|
20
|
+
|
21
|
+
# Checks for matching rackspace arp mac
|
22
|
+
#
|
23
|
+
# === Return
|
24
|
+
# true:: If mac address matches
|
25
|
+
# false:: Otherwise
|
26
|
+
def has_rackspace_mac?
|
27
|
+
network[:interfaces].values.each do |iface|
|
28
|
+
unless iface[:arp].nil?
|
29
|
+
return true if iface[:arp].value?("00:00:0c:07:ac:01")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
false
|
33
|
+
end
|
34
|
+
|
35
|
+
# Identifies the rackspace cloud
|
36
|
+
#
|
37
|
+
# === Return
|
38
|
+
# true:: If the rackspace cloud can be identified
|
39
|
+
# false:: Otherwise
|
40
|
+
def looks_like_rackspace?
|
41
|
+
has_rackspace_mac?
|
42
|
+
end
|
43
|
+
|
44
|
+
# Names rackspace ip address
|
45
|
+
#
|
46
|
+
# === Parameters
|
47
|
+
# name<Symbol>:: Use :public_ip or :private_ip
|
48
|
+
# eth<Symbol>:: Interface name of public or private ip
|
49
|
+
def get_ip_address(name, eth)
|
50
|
+
network[:interfaces][eth][:addresses].each do |key, info|
|
51
|
+
rackspace[name] = key if info['family'] == 'inet'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Adds rackspace Mash
|
56
|
+
if looks_like_rackspace?
|
57
|
+
rackspace Mash.new
|
58
|
+
get_ip_address(:public_ip, :eth0)
|
59
|
+
get_ip_address(:private_ip, :eth1)
|
60
|
+
end
|
data/lib/ohai/plugins/ruby.rb
CHANGED
@@ -20,20 +20,49 @@ provides "languages/ruby"
|
|
20
20
|
|
21
21
|
require_plugin "languages"
|
22
22
|
|
23
|
+
|
24
|
+
def run_ruby(command)
|
25
|
+
cmd = "ruby -e \"require 'rbconfig'; #{command}\""
|
26
|
+
status, stdout, stderr = run_command(:no_status_check => true, :command => cmd)
|
27
|
+
stdout.strip
|
28
|
+
end
|
29
|
+
|
30
|
+
|
23
31
|
languages[:ruby] = Mash.new
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
values = {
|
34
|
+
:platform => "RUBY_PLATFORM",
|
35
|
+
:version => "RUBY_VERSION",
|
36
|
+
:release_date => "RUBY_RELEASE_DATE",
|
37
|
+
:target => "::Config::CONFIG['target']",
|
38
|
+
:target_cpu => "::Config::CONFIG['target_cpu']",
|
39
|
+
:target_vendor => "::Config::CONFIG['target_vendor']",
|
40
|
+
:target_os => "::Config::CONFIG['target_os']",
|
41
|
+
:host => "::Config::CONFIG['host']",
|
42
|
+
:host_cpu => "::Config::CONFIG['host_cpu']",
|
43
|
+
:host_os => "::Config::CONFIG['host_os']",
|
44
|
+
:host_vendor => "::Config::CONFIG['host_vendor']",
|
45
|
+
:bin_dir => "::Config::CONFIG['bindir']",
|
46
|
+
:ruby_bin => "::File.join(::Config::CONFIG['bindir'], ::Config::CONFIG['ruby_install_name'])"
|
47
|
+
}
|
48
|
+
|
49
|
+
# Create a query string from above hash
|
50
|
+
env_string = ""
|
51
|
+
values.keys.each do |v|
|
52
|
+
env_string << "#{v}:\#{#{values[v]}},"
|
53
|
+
end
|
54
|
+
|
55
|
+
# Query the system ruby
|
56
|
+
result = run_ruby "puts \\\"#{env_string}\\\""
|
57
|
+
|
58
|
+
# Parse results to plugin hash
|
59
|
+
result.split(',').each do |entry|
|
60
|
+
key, value = entry.split(':')
|
61
|
+
languages[:ruby][key.to_sym] = value
|
62
|
+
end
|
63
|
+
|
64
|
+
# Perform one more (conditional) query
|
65
|
+
bin_dir = languages[:ruby][:bin_dir]
|
66
|
+
if File.exist?("#{bin_dir}\/gem")
|
67
|
+
languages[:ruby][:gems_dir] = run_ruby "puts %x{#{bin_dir}\/gem env gemdir}.chomp!"
|
38
68
|
end
|
39
|
-
languages[:ruby][:ruby_bin] = File.join(::Config::CONFIG['bindir'], ::Config::CONFIG['ruby_install_name'])
|