ohai 14.4.2 → 14.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa2998db0ed97fe69f873899ea65c666badc17e7365c34592f539ee628299d7e
4
- data.tar.gz: 26d01af9bf5ba6d2e874ed050b4a54ae167d4d7fcfeb5262eb6a9fa8438cff9a
3
+ metadata.gz: a51cf17407e9d91624a5fa169e8057d15a75eac70805fc38a4fcbf928141121b
4
+ data.tar.gz: 69c101063af73a9b0aba3f0956e57ce9c488607e76f605d1425e0d40951bcb38
5
5
  SHA512:
6
- metadata.gz: 6b9c7a7d84321fcc138c270d6bc06055d2bc3f2cbb49043e1462261d9fe44a5c07049d0bc2c304d47808d383b99ae78c21b01ab2b8a34ad6094678d9cd0e2ebd
7
- data.tar.gz: 3eef3a40fbae42dd73cde34434ecfaef6798873655a228465d86c6ec98c1607feb58baea8f7b16037ae7a04100b9b374cb0d58a4bc52bdf4f1bff8ff4937dbbe
6
+ metadata.gz: 354f6a0bd33873e3d8b124eeb23bfd111bd8b6cf46642fd119c3dd5cfd82666629ccff70fad44b08ac4a7fb2900a566cc0639558b0b5b2d10b95cec4d2e5a052
7
+ data.tar.gz: 67bdf1bfc49797e0f61d95c96e2ad769c124ea19dc682358ae5fc27042cd8cdc4e08ea3f831a05c5b5edf3e1dd495579e90e9ac1321d7d678db41f58f167b4b9
data/Gemfile CHANGED
@@ -17,6 +17,19 @@ group :ci do
17
17
  gem "rspec_junit_formatter"
18
18
  end
19
19
 
20
+ group :docs do
21
+ gem "yard"
22
+ gem "redcarpet"
23
+ gem "github-markup"
24
+ end
25
+
26
+ group :debug do
27
+ gem "pry"
28
+ gem "pry-byebug"
29
+ gem "pry-stack_explorer"
30
+ gem "rb-readline"
31
+ end
32
+
20
33
  instance_eval(ENV["GEMFILE_MOD"]) if ENV["GEMFILE_MOD"]
21
34
 
22
35
  # If you want to load debugging tools into the bundle exec sandbox,
data/README.md CHANGED
@@ -11,7 +11,7 @@ Ohai will print out a JSON data blob for all the known data about your system. W
11
11
  Chef distributes ohai as a RubyGem. This README is for developers who want to modify the Ohai source code. For users who want to write plugins for Ohai, see the docs:
12
12
 
13
13
  - General documentation: <https://docs.chef.io/ohai.html>
14
- - Custom plugin documentation: <https://docs.chef.io/ohai_custom.html>
14
+ - Writing Ohai Plugins documentation: <https://docs.chef.io/ohai_custom.html>
15
15
 
16
16
  ## Development Environment:
17
17
 
@@ -37,11 +37,16 @@ Ohai has some Rake tasks for doing various things.
37
37
 
38
38
  ```
39
39
  rake -T
40
- rake build # Build the gem file ohai-$VERSION.gem
41
- rake install # install the gem locally
42
- rake install:local # install the gem locally without network access
43
- rake release # Create tag $VERSION, build gem, and push to Rubygems
44
- rake spec # Run RSpec tests
40
+ rake build # Build ohai-$VERSION.gem into the pkg directory
41
+ rake clean # Remove any temporary products
42
+ rake clobber # Remove any generated files
43
+ rake docs # Generate YARD Documentation
44
+ rake install # Build and install ohai-$VERSION.gem into system gems
45
+ rake install:local # Build and install ohai-$VERSION.gem into system gems without network access
46
+ rake release[remote] # Create tag $VERSION and build and push ohai-$VERSION.gem to rubygems.org
47
+ rake spec # Run RSpec code examples
48
+ rake style # Run Chefstyle tests
49
+ rake style:auto_correct # Auto-correct RuboCop offenses
45
50
 
46
51
  ($VERSION is the current version, from the GemSpec in Rakefile)
47
52
  ```
@@ -65,7 +70,7 @@ For information on contributing to this project see <https://github.com/chef/che
65
70
  Ohai - system information application
66
71
 
67
72
  - Author:: Adam Jacob ([adam@chef.io](mailto:adam@chef.io))
68
- - Copyright:: Copyright (c) 2008-2016 Chef Software, Inc.
73
+ - Copyright:: Copyright (c) 2008-2018 Chef Software, Inc.
69
74
  - License:: Apache License, Version 2.0
70
75
 
71
76
  ```text
data/Rakefile CHANGED
@@ -1,6 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
- require "date"
3
- require "ohai/version"
4
2
 
5
3
  begin
6
4
  require "rspec/core/rake_task"
@@ -11,14 +9,34 @@ begin
11
9
  rescue LoadError
12
10
  desc "rspec is not installed, this task is disabled"
13
11
  task :spec do
14
- abort "rspec is not installed. `(sudo) gem install rspec` to run unit tests"
12
+ abort "rspec is not installed. bundle install first to make sure all dependencies are installed."
15
13
  end
16
14
  end
17
15
 
18
- task default: :spec
16
+ begin
17
+ require "chefstyle"
18
+ require "rubocop/rake_task"
19
+ desc "Run Chefstyle tests"
20
+ RuboCop::RakeTask.new(:style) do |task|
21
+ task.options += ["--display-cop-names", "--no-color"]
22
+ end
23
+ rescue LoadError
24
+ puts "chefstyle gem is not installed. bundle install first to make sure all dependencies are installed."
25
+ end
19
26
 
20
- require "chefstyle"
21
- require "rubocop/rake_task"
22
- RuboCop::RakeTask.new(:style) do |task|
23
- task.options += ["--display-cop-names", "--no-color"]
27
+ begin
28
+ require "yard"
29
+ YARD::Rake::YardocTask.new(:docs)
30
+ rescue LoadError
31
+ puts "yard is not available. bundle install first to make sure all dependencies are installed."
32
+ end
33
+
34
+ task :console do
35
+ require "irb"
36
+ require "irb/completion"
37
+ require "ohai"
38
+ ARGV.clear
39
+ IRB.start
24
40
  end
41
+
42
+ task default: [:style, :spec]
@@ -69,14 +69,6 @@ class Ohai::Application
69
69
  proc: lambda { |v| puts "Ohai: #{::Ohai::VERSION}" },
70
70
  exit: 0
71
71
 
72
- def initialize
73
- super
74
-
75
- # Always switch to a readable directory. Keeps subsequent Dir.chdir() {}
76
- # from failing due to permissions when launched as a less privileged user.
77
- Dir.chdir("/")
78
- end
79
-
80
72
  def run
81
73
  elapsed = Benchmark.measure do
82
74
  configure_ohai
@@ -95,6 +87,10 @@ class Ohai::Application
95
87
  end
96
88
 
97
89
  def run_application
90
+ # Always switch to a readable directory. Keeps subsequent Dir.chdir() {}
91
+ # from failing due to permissions when launched as a less privileged user.
92
+ Dir.chdir("/")
93
+
98
94
  config[:invoked_from_cli] = true
99
95
  config[:logger] = Ohai::Log.with_child
100
96
  ohai = Ohai::System.new(config)
@@ -64,8 +64,10 @@ Ohai.plugin(:Openstack) do
64
64
  openstack Mash.new
65
65
  openstack[:provider] = openstack_provider
66
66
 
67
+ timeout = Ohai::Config.ohai[:openstack_metadata_timeout] || 2
68
+
67
69
  # fetch the metadata if we can do a simple socket connect first
68
- if can_socket_connect?(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80)
70
+ if can_socket_connect?(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80, timeout)
69
71
  fetch_metadata.each do |k, v|
70
72
  openstack[k] = v
71
73
  end
@@ -19,8 +19,19 @@ Ohai.plugin(:RootGroup) do
19
19
  provides "root_group"
20
20
 
21
21
  collect_data(:windows) do
22
- require "ohai/util/win32/group_helper"
23
- root_group Ohai::Util::Win32::GroupHelper.windows_root_group_name
22
+ require "wmi-lite/wmi"
23
+
24
+ wmi = WmiLite::Wmi.new
25
+ # Per http://support.microsoft.com/kb/243330 SID: S-1-5-32-544 is the
26
+ # internal name for the Administrators group, which lets us work
27
+ # properly in environments with a renamed or localized name for the
28
+ # Administrators group.
29
+ # Use LocalAccount=True because otherwise WMI will attempt to include
30
+ # (unneeded) Active Directory groups by querying AD, which is a performance
31
+ # and reliability issue since AD might not be reachable.
32
+ groups = wmi.query("select * from Win32_Group where sid like 'S-1-5-32-544' and LocalAccount=True")
33
+ windows_root_group_name = groups[0]["name"]
34
+ root_group windows_root_group_name
24
35
  end
25
36
 
26
37
  collect_data(:default) do
@@ -19,36 +19,129 @@
19
19
  Ohai.plugin(:Filesystem) do
20
20
  provides "filesystem"
21
21
 
22
- collect_data(:windows) do
22
+ # Volume encryption or decryption status
23
+ #
24
+ # @see https://docs.microsoft.com/en-us/windows/desktop/SecProv/getconversionstatus-win32-encryptablevolume#parameters
25
+ #
26
+ CONVERSION_STATUS = %w{FullyDecrypted FullyEncrypted EncryptionInProgress
27
+ DecryptionInProgress EncryptionPaused DecryptionPaused}.freeze
23
28
 
24
- require "wmi-lite/wmi"
29
+ # Returns a Mash loaded with logical details
30
+ #
31
+ # Uses Win32_LogicalDisk and logical_properties to return encryption details of volumes.
32
+ #
33
+ # Returns an empty Mash in case of any WMI exception.
34
+ #
35
+ # @see https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-logicaldisk
36
+ #
37
+ # @return [Mash]
38
+ #
39
+ def logical_info
40
+ wmi = WmiLite::Wmi.new("Root\\CIMV2")
25
41
 
26
- fs = Mash.new
27
- ld_info = Mash.new
42
+ # Note: we should really be parsing Win32_Volume and Win32_Mapped drive.
43
+ disks = wmi.instances_of("Win32_LogicalDisk")
44
+ logical_properties(disks)
45
+ rescue WmiLite::WmiException
46
+ Ohai::Log.debug("Unable to access Win32_LogicalDisk. Skipping logical details")
47
+ Mash.new
48
+ end
28
49
 
29
- wmi = WmiLite::Wmi.new
50
+ # Returns a Mash loaded with encryption details
51
+ #
52
+ # Uses Win32_EncryptableVolume and encryption_properties to return encryption details of volumes.
53
+ #
54
+ # Returns an empty Mash in case of any WMI exception.
55
+ #
56
+ # @note We are fetching Encryption Status only as of now
57
+ #
58
+ # @see https://msdn.microsoft.com/en-us/library/windows/desktop/aa376483(v=vs.85).aspx
59
+ #
60
+ # @return [Mash]
61
+ #
62
+ def encryptable_info
63
+ wmi = WmiLite::Wmi.new("Root\\CIMV2\\Security\\MicrosoftVolumeEncryption")
64
+ disks = wmi.instances_of("Win32_EncryptableVolume")
65
+ encryption_properties(disks)
66
+ rescue WmiLite::WmiException
67
+ Ohai::Log.debug("Unable to access Win32_EncryptableVolume. Skipping encryptable details")
68
+ Mash.new
69
+ end
30
70
 
31
- # Grab filesystem data from WMI
32
- # Note: we should really be parsing Win32_Volume and Win32_Mapped drive
33
- disks = wmi.instances_of("Win32_LogicalDisk")
71
+ # Refines and calculates logical properties out of given instances
72
+ #
73
+ # @param [WmiLite::Wmi::Instance] disks
74
+ #
75
+ # @return [Mash] Each drive containing following properties:
76
+ #
77
+ # * :kb_size (Integer)
78
+ # * :kb_available (Integer)
79
+ # * :kb_used (Integer)
80
+ # * :percent_used (Integer)
81
+ # * :mount (String)
82
+ # * :fs_type (String)
83
+ # * :volume_name (String)
84
+ #
85
+ def logical_properties(disks)
86
+ properties = Mash.new
87
+ disks.each do |disk|
88
+ property = Mash.new
89
+ drive = disk["deviceid"]
90
+ property[:kb_size] = disk["size"].to_i / 1000
91
+ property[:kb_available] = disk["freespace"].to_i / 1000
92
+ property[:kb_used] = property[:kb_size] - property[:kb_available]
93
+ property[:percent_used] = (property[:kb_size] == 0 ? 0 : (property[:kb_used] * 100 / property[:kb_size]))
94
+ property[:mount] = disk["name"]
95
+ property[:fs_type] = disk["filesystem"].to_s.downcase
96
+ property[:volume_name] = disk["volumename"].to_s.downcase
97
+ properties[drive] = property
98
+ end
99
+ properties
100
+ end
34
101
 
102
+ # Refines and calculates encryption properties out of given instances
103
+ #
104
+ # @param [WmiLite::Wmi::Instance] disks
105
+ #
106
+ # @return [Mash] Each drive containing following properties:
107
+ #
108
+ # * :encryption_status (String)
109
+ #
110
+ def encryption_properties(disks)
111
+ properties = Mash.new
35
112
  disks.each do |disk|
36
- filesystem = disk["deviceid"]
37
- fs[filesystem] = Mash.new
38
- ld_info[filesystem] = Mash.new
39
- disk.wmi_ole_object.properties_.each do |p|
40
- ld_info[filesystem][p.name.wmi_underscore.to_sym] = disk[p.name.downcase]
113
+ drive = disk["driveletter"]
114
+ property = Mash.new
115
+ property[:encryption_status] = disk["conversionstatus"] ? CONVERSION_STATUS[disk["conversionstatus"]] : ""
116
+ properties[drive] = property
117
+ end
118
+ properties
119
+ end
120
+
121
+ # Merges all the various properties of filesystems
122
+ #
123
+ # @param [Array<Mash>] disks_info
124
+ # Array of the Mashes containing disk properties
125
+ #
126
+ # @return [Mash]
127
+ #
128
+ def merge_info(disks_info)
129
+ fs = Mash.new
130
+ disks_info.each do |info|
131
+ info.each do |disk, data|
132
+ if fs[disk]
133
+ fs[disk].merge!(data)
134
+ else
135
+ fs[disk] = data.dup
136
+ end
41
137
  end
42
- fs[filesystem][:kb_size] = ld_info[filesystem][:size].to_i / 1000
43
- fs[filesystem][:kb_available] = ld_info[filesystem][:free_space].to_i / 1000
44
- fs[filesystem][:kb_used] = fs[filesystem][:kb_size].to_i - fs[filesystem][:kb_available].to_i
45
- fs[filesystem][:percent_used] = (fs[filesystem][:kb_size].to_i != 0 ? fs[filesystem][:kb_used].to_i * 100 / fs[filesystem][:kb_size].to_i : 0)
46
- fs[filesystem][:mount] = ld_info[filesystem][:name]
47
- fs[filesystem][:fs_type] = ld_info[filesystem][:file_system].downcase unless ld_info[filesystem][:file_system].nil?
48
- fs[filesystem][:volume_name] = ld_info[filesystem][:volume_name]
49
138
  end
139
+ fs
140
+ end
50
141
 
51
- # Set the filesystem data
52
- filesystem fs
142
+ collect_data(:windows) do
143
+ require "wmi-lite/wmi"
144
+ filesystem merge_info([logical_info,
145
+ encryptable_info])
53
146
  end
54
147
  end
@@ -21,6 +21,7 @@ require "ohai/util/win32"
21
21
  module Ohai
22
22
  module Util
23
23
  class Win32::GroupHelper
24
+ # @deprecated
24
25
 
25
26
  # Per http://support.microsoft.com/kb/243330 SID: S-1-5-32-544 is the
26
27
  # internal name for the Administrators group, which lets us work
@@ -29,6 +30,8 @@ module Ohai
29
30
  BUILTIN_ADMINISTRATORS_SID = "S-1-5-32-544".freeze
30
31
 
31
32
  def self.windows_root_group_name
33
+ warn "The 'windows_root_group_name' helper is deprecated and will be removed in Ohai 15. Please update your plugins to remove this helper method."
34
+
32
35
  administrators_sid_result = FFI::MemoryPointer.new(:pointer)
33
36
  convert_result = Win32.convert_string_sid_to_sid(BUILTIN_ADMINISTRATORS_SID, administrators_sid_result)
34
37
  last_win32_error = Win32.get_last_error
@@ -18,5 +18,5 @@
18
18
 
19
19
  module Ohai
20
20
  OHAI_ROOT = File.expand_path(File.dirname(__FILE__))
21
- VERSION = "14.4.2".freeze
21
+ VERSION = "14.5.0".freeze
22
22
  end
@@ -21,6 +21,7 @@ require_relative "../../spec_helper.rb"
21
21
  describe Ohai::System, "plugin openstack" do
22
22
 
23
23
  let(:plugin) { get_plugin("openstack") }
24
+ let(:default_timeout) { 2 }
24
25
 
25
26
  before(:each) do
26
27
  allow(plugin).to receive(:hint?).with("openstack").and_return(false)
@@ -38,7 +39,7 @@ describe Ohai::System, "plugin openstack" do
38
39
  context "and the metadata service is not available" do
39
40
  before do
40
41
  allow(plugin).to receive(:can_socket_connect?)
41
- .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80)
42
+ .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80, default_timeout)
42
43
  .and_return(false)
43
44
  plugin[:dmi] = dmi_data
44
45
  plugin.run
@@ -77,7 +78,7 @@ describe Ohai::System, "plugin openstack" do
77
78
  it "sets openstack provider attribute to dreamhost" do
78
79
  plugin["etc"] = { "passwd" => { "dhc-user" => {} } }
79
80
  allow(plugin).to receive(:can_socket_connect?)
80
- .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80)
81
+ .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80, default_timeout)
81
82
  .and_return(false)
82
83
  plugin[:dmi] = { system: { all_records: [ { Manufacturer: "OpenStack Foundation" } ] } }
83
84
  plugin.run
@@ -89,7 +90,7 @@ describe Ohai::System, "plugin openstack" do
89
90
  context "and the metadata service is not available" do
90
91
  before do
91
92
  allow(plugin).to receive(:can_socket_connect?)
92
- .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80)
93
+ .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80, default_timeout)
93
94
  .and_return(false)
94
95
  allow(plugin).to receive(:hint?).with("openstack").and_return(true)
95
96
  plugin.run
@@ -102,6 +103,23 @@ describe Ohai::System, "plugin openstack" do
102
103
  it "doesn't set metadata attributes" do
103
104
  expect(plugin[:openstack][:instance_id]).to be_nil
104
105
  end
106
+ context "when timout was set" do
107
+ let(:override_timout) { 10 }
108
+ before do
109
+ Ohai::Config.ohai[:openstack_metadata_timeout] = override_timout
110
+ end
111
+ after do
112
+ Ohai::Config.ohai[:openstack_metadata_timeout] = nil
113
+ end
114
+
115
+ it "overwrite timout by setting" do
116
+ allow(plugin).to receive(:can_socket_connect?)
117
+ .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80, override_timout)
118
+ .and_return(false)
119
+ allow(plugin).to receive(:hint?).with("openstack").and_return(true)
120
+ plugin.run
121
+ end
122
+ end
105
123
  end
106
124
 
107
125
  context "and the metadata service is available" do
@@ -196,7 +214,7 @@ EOM
196
214
  before do
197
215
  allow(plugin).to receive(:hint?).with("openstack").and_return(true)
198
216
  allow(plugin).to receive(:can_socket_connect?)
199
- .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80)
217
+ .with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80, default_timeout)
200
218
  .and_return(true)
201
219
 
202
220
  allow(Net::HTTP).to receive(:start)
@@ -17,7 +17,6 @@
17
17
  #
18
18
 
19
19
  require_relative "../../spec_helper.rb"
20
- require "ohai/util/win32/group_helper"
21
20
 
22
21
  describe Ohai::System, "root_group" do
23
22
  before(:each) do
@@ -78,11 +77,20 @@ describe Ohai::System, "root_group" do
78
77
  end
79
78
 
80
79
  describe "windows platform" do
81
- it "should return the group administrators" do
80
+
81
+ let(:wmi) { double("wmi", { query: "" }) }
82
+
83
+ before(:each) do
84
+ allow(WmiLite::Wmi).to receive(:new).and_return(wmi)
82
85
  allow(@plugin).to receive(:collect_os).and_return(:windows)
83
- expect(Ohai::Util::Win32::GroupHelper).to receive(:windows_root_group_name).and_return("administrators")
86
+ end
87
+ it "should return the group Administrators" do
88
+ expect(wmi)
89
+ .to receive(:query)
90
+ .with("select * from Win32_Group where sid like 'S-1-5-32-544' and LocalAccount=True")
91
+ .and_return("Administrators")
92
+
84
93
  @plugin.run
85
- expect(@plugin[:root_group]).to eq("administrators")
86
94
  end
87
95
  end
88
96
  end
@@ -0,0 +1,226 @@
1
+ #
2
+ # Author:: Nimesh Pathi <nimesh.patni@msystechnologies.com>
3
+ # Copyright:: Copyright (c) 2018 Chef Software, 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
+ require_relative "../../../spec_helper.rb"
20
+ require "wmi-lite/wmi"
21
+
22
+ describe Ohai::System, "Windows Filesystem Plugin", :windows_only do
23
+ let(:plugin) { get_plugin("windows/filesystem") }
24
+
25
+ let(:success) { true }
26
+
27
+ let(:logical_disks_instances) do
28
+ [
29
+ {
30
+ "caption" => "C:",
31
+ "deviceid" => "C:",
32
+ "size" => "10000000",
33
+ "filesystem" => "NTFS",
34
+ "freespace" => "100000",
35
+ "name" => "C:",
36
+ "volumename " => "",
37
+ },
38
+ {
39
+ "caption" => "D:",
40
+ "deviceid" => "D:",
41
+ "size" => "10000000",
42
+ "filesystem" => "FAT32",
43
+ "freespace" => "100000",
44
+ "name" => "D:"
45
+ # Lets not pass "volumename" for this drive
46
+ }
47
+ ]
48
+ end
49
+
50
+ let(:encryptable_volume_instances) do
51
+ [
52
+ {
53
+ "conversionstatus" => 0,
54
+ "driveletter" => "C:",
55
+ },
56
+ {
57
+ "conversionstatus" => 2,
58
+ "driveletter" => "D:",
59
+ }
60
+ ]
61
+ end
62
+
63
+ let(:wmi_exception) do
64
+ namespace = "Exception while testing"
65
+ exception = WIN32OLERuntimeError.new(namespace)
66
+ WmiLite::WmiException.new(exception, :ConnectServer, @namespace)
67
+ end
68
+
69
+ before(:each) do
70
+ allow(plugin).to receive(:collect_os).and_return(:windows)
71
+ end
72
+
73
+ describe "#logical_properties" do
74
+ let(:disks) { logical_disks_instances }
75
+ let(:logical_props) { %i{kb_size kb_available kb_used percent_used mount fs_type volume_name} }
76
+
77
+ it "Returns a mash" do
78
+ expect(plugin.logical_properties(disks)).to be_a(Mash)
79
+ end
80
+
81
+ it "Returns an empty mash when blank array is passed" do
82
+ expect(plugin.logical_properties([])).to be_a(Mash)
83
+ expect(plugin.logical_properties([])).to be_empty
84
+ end
85
+
86
+ it "Returns properties without values when there is no disk information" do
87
+ data = plugin.logical_properties([{}])
88
+ expect(data[nil].symbolize_keys.keys).to eq(logical_props)
89
+ expect(data[nil]["kb_used"]).to eq(0)
90
+ expect(data[nil]["fs_type"]).to be_empty
91
+ end
92
+
93
+ it "Refines required logical properties out of given instance" do
94
+ data = plugin.logical_properties(disks)
95
+ expect(data["C:"].symbolize_keys.keys).to eq(logical_props)
96
+ expect(data["D:"].symbolize_keys.keys).to eq(logical_props)
97
+ end
98
+
99
+ it "Calculates logical properties out of given instance" do
100
+ data = plugin.logical_properties(disks)
101
+ expect(data["C:"]["kb_used"]).to eq(data["D:"]["kb_used"]).and eq(9900)
102
+ expect(data["C:"]["percent_used"]).to eq(data["D:"]["percent_used"]).and eq(99)
103
+ expect(data["C:"]["fs_type"]).to eq("ntfs")
104
+ expect(data["D:"]["fs_type"]).to eq("fat32")
105
+ end
106
+ end
107
+
108
+ describe "#logical_info" do
109
+ it "Returns an empty mash when wmi namespace does not exists" do
110
+ allow(WmiLite::Wmi).to receive(:new).and_raise(wmi_exception)
111
+ expect(plugin.logical_info).to be_a(Mash)
112
+ expect(plugin.logical_info).to be_empty
113
+ end
114
+
115
+ it "Returns an empty mash when Win32_LogicalDisk could not be processed" do
116
+ allow(WmiLite::Wmi).to receive(:new).and_return(success)
117
+ allow(success)
118
+ .to receive(:instances_of)
119
+ .with("Win32_LogicalDisk")
120
+ .and_raise(wmi_exception)
121
+ expect(plugin.logical_info).to be_a(Mash)
122
+ expect(plugin.logical_info).to be_empty
123
+ end
124
+
125
+ it "Returns a Mash loaded with logical details" do
126
+ allow(WmiLite::Wmi).to receive(:new).and_return(success)
127
+ allow(success)
128
+ .to receive(:instances_of)
129
+ .with("Win32_LogicalDisk")
130
+ .and_return(logical_disks_instances)
131
+ expect(plugin.logical_info).to be_a(Mash)
132
+ expect(plugin.logical_info).not_to be_empty
133
+ end
134
+ end
135
+
136
+ describe "#encryption_properties" do
137
+ let(:disks) { encryptable_volume_instances }
138
+ let(:encryption_props) { [:encryption_status] }
139
+
140
+ it "Returns a mash" do
141
+ expect(plugin.encryption_properties(disks)).to be_a(Mash)
142
+ end
143
+
144
+ it "Returns an empty mash when blank array is passed" do
145
+ expect(plugin.encryption_properties([])).to be_a(Mash)
146
+ expect(plugin.encryption_properties([])).to be_empty
147
+ end
148
+
149
+ it "Returns properties without values when there is no disk information" do
150
+ data = plugin.encryption_properties([{}])
151
+ expect(data[nil].symbolize_keys.keys).to eq(encryption_props)
152
+ expect(data[nil]["encryption_status"]).to be_empty
153
+ end
154
+
155
+ it "Refines required encryption properties out of given instance" do
156
+ data = plugin.encryption_properties(disks)
157
+ expect(data["C:"].symbolize_keys.keys).to eq(encryption_props)
158
+ expect(data["D:"].symbolize_keys.keys).to eq(encryption_props)
159
+ end
160
+
161
+ it "Calculates encryption properties out of given instance" do
162
+ data = plugin.encryption_properties(disks)
163
+ expect(data["C:"]["encryption_status"]).to eq("FullyDecrypted")
164
+ expect(data["D:"]["encryption_status"]).to eq("EncryptionInProgress")
165
+ end
166
+ end
167
+
168
+ describe "#encryptable_info" do
169
+ it "Returns an empty mash when wmi namespace does not exists" do
170
+ allow(WmiLite::Wmi).to receive(:new).and_raise(wmi_exception)
171
+ expect(plugin.encryptable_info).to be_a(Mash)
172
+ expect(plugin.encryptable_info).to be_empty
173
+ end
174
+
175
+ it "Returns an empty mash when Win32_EncryptableVolume could not be processed" do
176
+ allow(WmiLite::Wmi).to receive(:new).and_return(success)
177
+ allow(success)
178
+ .to receive(:instances_of)
179
+ .with("Win32_EncryptableVolume")
180
+ .and_raise(wmi_exception)
181
+ expect(plugin.encryptable_info).to be_a(Mash)
182
+ expect(plugin.encryptable_info).to be_empty
183
+ end
184
+
185
+ it "Returns a Mash loaded with encryption details" do
186
+ allow(WmiLite::Wmi).to receive(:new).and_return(success)
187
+ allow(success)
188
+ .to receive(:instances_of)
189
+ .with("Win32_EncryptableVolume")
190
+ .and_return(encryptable_volume_instances)
191
+ expect(plugin.encryptable_info).to be_a(Mash)
192
+ expect(plugin.encryptable_info).not_to be_empty
193
+ end
194
+ end
195
+
196
+ describe "#merge_info" do
197
+ let(:info1) do
198
+ { "drive1" => { "x" => 10, "y" => "test1" },
199
+ "drive2" => { "x" => 20, "z" => "test2" } }
200
+ end
201
+ let(:info2) do
202
+ { "drive1" => { "k" => 10, "l" => "test1" },
203
+ "drive2" => { "l" => 20, "m" => "test2" } }
204
+ end
205
+ let(:info3) { { "drive1" => { "o" => 10, "p" => "test1" } } }
206
+ let(:info4) { { "drive2" => { "q" => 10, "r" => "test1" } } }
207
+
208
+ it "Returns an empty mash when no info is passed" do
209
+ expect(plugin.merge_info([])).to be_a(Mash)
210
+ expect(plugin.merge_info([])).to be_empty
211
+ end
212
+
213
+ it "Merges all the various properties of filesystems" do
214
+ expect(plugin.merge_info([info1, info2, info3, info4]))
215
+ .to eq("drive1" => { "x" => 10, "y" => "test1", "k" => 10, "l" => "test1", "o" => 10, "p" => "test1" },
216
+ "drive2" => { "x" => 20, "z" => "test2", "l" => 20, "m" => "test2", "q" => 10, "r" => "test1" })
217
+ end
218
+
219
+ it "Does not affect any core information after processing" do
220
+ expect(plugin.merge_info([info3, info4])).to eq("drive1" => { "o" => 10, "p" => "test1" },
221
+ "drive2" => { "q" => 10, "r" => "test1" })
222
+ expect(info3).to eq("drive1" => { "o" => 10, "p" => "test1" })
223
+ expect(info4).to eq("drive2" => { "q" => 10, "r" => "test1" })
224
+ end
225
+ end
226
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ohai
3
3
  version: !ruby/object:Gem::Version
4
- version: 14.4.2
4
+ version: 14.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Jacob
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-22 00:00:00.000000000 Z
11
+ date: 2018-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: systemu
@@ -511,6 +511,7 @@ files:
511
511
  - spec/unit/plugins/virtualbox_spec.rb
512
512
  - spec/unit/plugins/vmware_spec.rb
513
513
  - spec/unit/plugins/windows/cpu_spec.rb
514
+ - spec/unit/plugins/windows/filesystem_spec.rb
514
515
  - spec/unit/plugins/windows/fips_spec.rb
515
516
  - spec/unit/plugins/windows/kernel_spec.rb
516
517
  - spec/unit/plugins/windows/memory_spec.rb