ohai 14.4.2 → 14.5.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 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