summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNate Walck <nate.walck@gmail.com>2016-07-20 11:07:38 -0700
committerPhil Dibowitz <phil@ipom.com>2016-07-20 11:07:38 -0700
commit618c4493940188c55ff3d4baf3bb211804cc1b5f (patch)
tree9ac0fcef7f402691ac49aa351fe7c39fa35f0e3e
parentd70e02a812fdbabaec6ec10999990ab2e2268875 (diff)
downloadohai-618c4493940188c55ff3d4baf3bb211804cc1b5f.tar.gz
Added hardware plugin for ohai on darwin (#839)
-rw-r--r--lib/ohai/plugins/darwin/hardware.rb98
-rw-r--r--spec/unit/plugins/darwin/hardware_spec.rb116
-rw-r--r--spec/unit/plugins/darwin/hardware_system_profiler_output.rb1110
3 files changed, 1324 insertions, 0 deletions
diff --git a/lib/ohai/plugins/darwin/hardware.rb b/lib/ohai/plugins/darwin/hardware.rb
new file mode 100644
index 00000000..1aab3b92
--- /dev/null
+++ b/lib/ohai/plugins/darwin/hardware.rb
@@ -0,0 +1,98 @@
+#
+# Author:: Nate Walck (<nate.walck@gmail.com>)
+# Copyright:: Copyright (c) 2016-present Facebook, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+Ohai.plugin(:Hardware) do
+ provides "hardware"
+
+ def system_profiler(datatype)
+ sp_cmd = "system_profiler #{datatype} -xml"
+ # Hardware queries
+ sp_std = shell_out(sp_cmd)
+ sp_hash = Plist.parse_xml(sp_std.stdout)
+ end
+
+ collect_data(:darwin) do
+ unless hardware
+ hardware Mash.new
+ else
+ Ohai::Log.debug("Plugin Darwin Hardware: namespace already exists")
+ next
+ end
+
+ begin
+ require "plist"
+ rescue LoadError => e
+ # In case the plist gem isn't present, skip this plugin.
+ Ohai::Log.debug("Plugin Hardware: Can't load gem: #{e}. Cannot continue.")
+ next
+ end
+
+ hw_hash = system_profiler("SPHardwareDataType")
+ hw_hash[0]["_items"][0].delete("_name")
+ hardware.merge!(hw_hash[0]["_items"][0])
+
+ {
+ "operating_system" => "sw_vers -productName",
+ "operating_system_version" => "sw_vers -productVersion",
+ "build_version" => "sw_vers -buildVersion",
+ "architecture" => "uname -m",
+ }.each do |var, cmd|
+ os_info = shell_out(cmd).stdout
+ hardware[var] = os_info.strip unless os_info.nil?
+ end
+
+ # Storage queries
+ storage = []
+ storage_hash = system_profiler("SPStorageDataType")
+ drives = storage_hash[0]["_items"]
+ drives.each do |drive_entry|
+ drive = Mash.new
+ drive[:name] = drive_entry["_name"]
+ drive[:bsd_name] = drive_entry["bsd_name"]
+ drive[:capacity] = drive_entry["size_in_bytes"]
+ if drive_entry.has_key?("com.apple.corestorage.pv")
+ drive[:drive_type] = drive_entry["com.apple.corestorage.pv"][0]["medium_type"]
+ drive[:smart_status] = drive_entry["com.apple.corestorage.pv"][0]["smart_status"]
+ drive[:partitions] = drive_entry["com.apple.corestorage.pv"].count
+ end
+ storage << drive
+ end
+
+ hardware["storage"] = storage
+
+ # Battery queries
+ battery_hash = system_profiler("SPPowerDataType")
+ power_entries = battery_hash[0]["_items"]
+ battery = Mash.new
+ power_entries.each do |entry|
+ if entry.value?("spbattery_information")
+ charge = entry["sppower_battery_charge_info"]
+ health = entry["sppower_battery_health_info"]
+ battery[:current_capacity] = charge["sppower_battery_current_capacity"]
+ battery[:max_capacity] = charge["sppower_battery_max_capacity"]
+ battery[:fully_charged] = charge["sppower_battery_fully_charged"].eql?("TRUE")
+ battery[:is_charging] = charge["sppower_battery_is_charging"].eql?("TRUE")
+ battery[:charge_cycle_count] = health["sppower_battery_cycle_count"]
+ battery[:health] = health["sppower_battery_health"]
+ battery[:serial] = entry["sppower_battery_model_info"]["sppower_battery_serial_number"]
+ battery[:remaining] = (battery["current_capacity"].to_f / battery["max_capacity"].to_f * 100).to_i
+ end
+ end
+ hardware[:battery] = battery
+ end
+end
diff --git a/spec/unit/plugins/darwin/hardware_spec.rb b/spec/unit/plugins/darwin/hardware_spec.rb
new file mode 100644
index 00000000..65f3cd4f
--- /dev/null
+++ b/spec/unit/plugins/darwin/hardware_spec.rb
@@ -0,0 +1,116 @@
+#
+# Author:: Nate Walck (<nate.walck@gmail.com>)
+# Copyright:: Copyright (c) 2016-present Facebook, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require File.expand_path(File.dirname(__FILE__) + "/../../../spec_helper.rb")
+require File.expand_path("#{File.dirname(__FILE__)}/hardware_system_profiler_output.rb")
+
+describe Ohai::System, "Darwin hardware plugin", :unix_only do
+ let (:plugin) { get_plugin("darwin/hardware") }
+ before(:each) do
+ allow(plugin).to receive(:collect_os).and_return(:darwin)
+ # Make sure it always runs correct commands and mock the data as it calls them
+ allow(plugin).to receive(:shell_out).with(
+ "system_profiler SPHardwareDataType -xml"
+ ).and_return(
+ mock_shell_out(0, HardwareSystemProfilerOutput::Hardware, "")
+ )
+
+ allow(plugin).to receive(:shell_out).with(
+ "sw_vers -productName"
+ ).and_return(
+ mock_shell_out(0, "Mac OS X", "")
+ )
+
+ allow(plugin).to receive(:shell_out).with(
+ "sw_vers -productVersion"
+ ).and_return(
+ mock_shell_out(0, "10.12", "")
+ )
+
+ allow(plugin).to receive(:shell_out).with(
+ "sw_vers -buildVersion"
+ ).and_return(
+ mock_shell_out(0, "16A239j", "")
+ )
+
+ allow(plugin).to receive(:shell_out).with(
+ "uname -m"
+ ).and_return(
+ mock_shell_out(0, "x86_64", "")
+ )
+
+ allow(plugin).to receive(:shell_out).with(
+ "system_profiler SPStorageDataType -xml"
+ ).and_return(
+ mock_shell_out(0, HardwareSystemProfilerOutput::Storage, "")
+ )
+
+ allow(plugin).to receive(:shell_out).with(
+ "system_profiler SPPowerDataType -xml"
+ ).and_return(
+ mock_shell_out(0, HardwareSystemProfilerOutput::Power, "")
+ )
+ end
+
+ it "parses hardware data correctly" do
+ plugin.run
+ expect(plugin["hardware"]["SMC_version_system"]).to eq("2.16f68")
+ expect(plugin["hardware"]["boot_rom_version"]).to eq("MBP111.0138.B17")
+ expect(plugin["hardware"]["cpu_type"]).to eq("Intel Core i7")
+ expect(plugin["hardware"]["current_processor_speed"]).to eq("3 GHz")
+ expect(plugin["hardware"]["l2_cache_core"]).to eq("256 KB")
+ expect(plugin["hardware"]["l3_cache"]).to eq("4 MB")
+ expect(plugin["hardware"]["machine_model"]).to eq("MacBookPro11,1")
+ expect(plugin["hardware"]["machine_name"]).to eq("MacBook Pro")
+ expect(plugin["hardware"]["number_processors"]).to eq(2)
+ expect(plugin["hardware"]["packages"]).to eq(1)
+ expect(plugin["hardware"]["physical_memory"]).to eq("16 GB")
+ expect(plugin["hardware"]["platform_UUID"]).to eq("F1A4AE0F-84A8-45D8-83C7-F3F904464FC5")
+ expect(plugin["hardware"]["serial_number"]).to eq("ABCDEFG12345")
+ end
+
+ it "parses sw_vers and uname data correctly" do
+ plugin.run
+ expect(plugin["hardware"]["operating_system"]).to eq("Mac OS X")
+ expect(plugin["hardware"]["operating_system_version"]).to eq("10.12")
+ expect(plugin["hardware"]["build_version"]).to eq("16A239j")
+ expect(plugin["hardware"]["architecture"]).to eq("x86_64")
+ end
+
+ it "parses storage data correctly" do
+ plugin.run
+ expect(plugin["hardware"]["storage"][0]["name"]).to eq("Macintosh HD")
+ expect(plugin["hardware"]["storage"][0]["bsd_name"]).to eq("disk1")
+ expect(plugin["hardware"]["storage"][0]["capacity"]).to eq(249661751296)
+ expect(plugin["hardware"]["storage"][0]["drive_type"]).to eq("ssd")
+ expect(plugin["hardware"]["storage"][0]["smart_status"]).to eq("Verified")
+ expect(plugin["hardware"]["storage"][0]["partitions"]).to eq(1)
+ end
+
+ it "parses storage data correctly" do
+ plugin.run
+ expect(plugin["hardware"]["battery"]["current_capacity"]).to eq(5841)
+ expect(plugin["hardware"]["battery"]["max_capacity"]).to eq(5841)
+ expect(plugin["hardware"]["battery"]["fully_charged"]).to eq(true)
+ expect(plugin["hardware"]["battery"]["is_charging"]).to eq(false)
+ expect(plugin["hardware"]["battery"]["charge_cycle_count"]).to eq(201)
+ expect(plugin["hardware"]["battery"]["health"]).to eq("Good")
+ expect(plugin["hardware"]["battery"]["serial"]).to eq("D123456789ABCDEFG")
+ expect(plugin["hardware"]["battery"]["remaining"]).to eq(100)
+ end
+end
diff --git a/spec/unit/plugins/darwin/hardware_system_profiler_output.rb b/spec/unit/plugins/darwin/hardware_system_profiler_output.rb
new file mode 100644
index 00000000..086ebec0
--- /dev/null
+++ b/spec/unit/plugins/darwin/hardware_system_profiler_output.rb
@@ -0,0 +1,1110 @@
+module HardwareSystemProfilerOutput
+ Hardware = <<hardware_output
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<array>
+ <dict>
+ <key>_SPCommandLineArguments</key>
+ <array>
+ <string>/usr/sbin/system_profiler</string>
+ <string>-nospawn</string>
+ <string>-xml</string>
+ <string>SPHardwareDataType</string>
+ <string>-detailLevel</string>
+ <string>full</string>
+ </array>
+ <key>_SPCompletionInterval</key>
+ <real>0.095997989177703857</real>
+ <key>_SPResponseTime</key>
+ <real>0.21922904253005981</real>
+ <key>_dataType</key>
+ <string>SPHardwareDataType</string>
+ <key>_detailLevel</key>
+ <string>-2</string>
+ <key>_items</key>
+ <array>
+ <dict>
+ <key>SMC_version_system</key>
+ <string>2.16f68</string>
+ <key>_name</key>
+ <string>hardware_overview</string>
+ <key>boot_rom_version</key>
+ <string>MBP111.0138.B17</string>
+ <key>cpu_type</key>
+ <string>Intel Core i7</string>
+ <key>current_processor_speed</key>
+ <string>3 GHz</string>
+ <key>l2_cache_core</key>
+ <string>256 KB</string>
+ <key>l3_cache</key>
+ <string>4 MB</string>
+ <key>machine_model</key>
+ <string>MacBookPro11,1</string>
+ <key>machine_name</key>
+ <string>MacBook Pro</string>
+ <key>number_processors</key>
+ <integer>2</integer>
+ <key>packages</key>
+ <integer>1</integer>
+ <key>physical_memory</key>
+ <string>16 GB</string>
+ <key>platform_UUID</key>
+ <string>F1A4AE0F-84A8-45D8-83C7-F3F904464FC5</string>
+ <key>serial_number</key>
+ <string>ABCDEFG12345</string>
+ </dict>
+ </array>
+ <key>_parentDataType</key>
+ <string>SPRootDataType</string>
+ <key>_properties</key>
+ <dict>
+ <key>LOM_revision</key>
+ <dict>
+ <key>_order</key>
+ <string>85</string>
+ </dict>
+ <key>Lightshow_version</key>
+ <dict>
+ <key>_order</key>
+ <string>83</string>
+ <key>_suppressLocalization</key>
+ <string>YES</string>
+ </dict>
+ <key>MMM_state</key>
+ <dict>
+ <key>_order</key>
+ <string>70</string>
+ </dict>
+ <key>SMC_version_other</key>
+ <dict>
+ <key>_order</key>
+ <string>82</string>
+ </dict>
+ <key>SMC_version_riser</key>
+ <dict>
+ <key>_order</key>
+ <string>81</string>
+ </dict>
+ <key>SMC_version_system</key>
+ <dict>
+ <key>_order</key>
+ <string>80</string>
+ <key>_suppressLocalization</key>
+ <string>YES</string>
+ </dict>
+ <key>apple_rom_info</key>
+ <dict>
+ <key>_order</key>
+ <string>53</string>
+ </dict>
+ <key>boot_rom_release_date</key>
+ <dict>
+ <key>_order</key>
+ <string>52</string>
+ </dict>
+ <key>boot_rom_vendor</key>
+ <dict>
+ <key>_order</key>
+ <string>50</string>
+ </dict>
+ <key>boot_rom_version</key>
+ <dict>
+ <key>_order</key>
+ <string>51</string>
+ </dict>
+ <key>bus_speed</key>
+ <dict>
+ <key>_order</key>
+ <string>45</string>
+ </dict>
+ <key>cores_per_package</key>
+ <dict>
+ <key>_order</key>
+ <string>24</string>
+ </dict>
+ <key>cpu_interconnect_speed</key>
+ <dict>
+ <key>_order</key>
+ <string>46</string>
+ </dict>
+ <key>cpu_type</key>
+ <dict>
+ <key>_order</key>
+ <string>15</string>
+ </dict>
+ <key>current_processor_speed</key>
+ <dict>
+ <key>_order</key>
+ <string>17</string>
+ </dict>
+ <key>l2_cache</key>
+ <dict>
+ <key>_order</key>
+ <string>26</string>
+ </dict>
+ <key>l2_cache_core</key>
+ <dict>
+ <key>_order</key>
+ <string>26</string>
+ </dict>
+ <key>l2_cache_share</key>
+ <dict>
+ <key>_order</key>
+ <string>26</string>
+ </dict>
+ <key>l2_cache_size</key>
+ <dict>
+ <key>_order</key>
+ <string>26</string>
+ </dict>
+ <key>l3_cache</key>
+ <dict>
+ <key>_order</key>
+ <string>27</string>
+ </dict>
+ <key>l3_cache_processor</key>
+ <dict>
+ <key>_order</key>
+ <string>27</string>
+ </dict>
+ <key>l3_cache_size</key>
+ <dict>
+ <key>_order</key>
+ <string>27</string>
+ </dict>
+ <key>machine_model</key>
+ <dict>
+ <key>_order</key>
+ <string>11</string>
+ </dict>
+ <key>machine_name</key>
+ <dict>
+ <key>_order</key>
+ <string>10</string>
+ </dict>
+ <key>maximum_processor_speed</key>
+ <dict>
+ <key>_order</key>
+ <string>19</string>
+ </dict>
+ <key>minimum_processor_speed</key>
+ <dict>
+ <key>_order</key>
+ <string>18</string>
+ </dict>
+ <key>number_cpus</key>
+ <dict>
+ <key>_order</key>
+ <string>20</string>
+ </dict>
+ <key>number_processors</key>
+ <dict>
+ <key>_order</key>
+ <string>22</string>
+ </dict>
+ <key>packages</key>
+ <dict>
+ <key>_order</key>
+ <string>20</string>
+ </dict>
+ <key>physical_memory</key>
+ <dict>
+ <key>_order</key>
+ <string>40</string>
+ </dict>
+ <key>platform_UUID</key>
+ <dict>
+ <key>_detailLevel</key>
+ <string>0</string>
+ <key>_order</key>
+ <string>98</string>
+ </dict>
+ <key>platform_cpu_features</key>
+ <dict>
+ <key>_order</key>
+ <string>30</string>
+ </dict>
+ <key>platform_cpu_htt</key>
+ <dict>
+ <key>_order</key>
+ <string>28</string>
+ </dict>
+ <key>platform_cpu_vendor</key>
+ <dict>
+ <key>_order</key>
+ <string>12</string>
+ </dict>
+ <key>platform_manufacturer</key>
+ <dict>
+ <key>_order</key>
+ <string>4</string>
+ </dict>
+ <key>platform_product_name</key>
+ <dict>
+ <key>_order</key>
+ <string>2</string>
+ </dict>
+ <key>platform_version</key>
+ <dict>
+ <key>_order</key>
+ <string>6</string>
+ </dict>
+ <key>riser_serial_number</key>
+ <dict>
+ <key>_detailLevel</key>
+ <string>0</string>
+ <key>_order</key>
+ <string>92</string>
+ </dict>
+ <key>sales_order_number</key>
+ <dict>
+ <key>_detailLevel</key>
+ <string>0</string>
+ <key>_order</key>
+ <string>95</string>
+ </dict>
+ <key>serial_number</key>
+ <dict>
+ <key>_detailLevel</key>
+ <string>0</string>
+ <key>_order</key>
+ <string>90</string>
+ </dict>
+ <key>volumes</key>
+ <dict>
+ <key>_detailLevel</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>_timeStamp</key>
+ <date>2016-07-08T19:44:04Z</date>
+ <key>_versionInfo</key>
+ <dict>
+ <key>com.apple.SystemProfiler.SPPlatformReporter</key>
+ <string>1445</string>
+ </dict>
+ </dict>
+</array>
+</plist>
+hardware_output
+
+ Storage = <<storage_output
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<array>
+ <dict>
+ <key>_SPCommandLineArguments</key>
+ <array>
+ <string>/usr/sbin/system_profiler</string>
+ <string>-nospawn</string>
+ <string>-xml</string>
+ <string>SPStorageDataType</string>
+ <string>-detailLevel</string>
+ <string>full</string>
+ </array>
+ <key>_SPCompletionInterval</key>
+ <real>0.35913503170013428</real>
+ <key>_SPResponseTime</key>
+ <real>0.46972799301147461</real>
+ <key>_dataType</key>
+ <string>SPStorageDataType</string>
+ <key>_items</key>
+ <array>
+ <dict>
+ <key>_name</key>
+ <string>Macintosh HD</string>
+ <key>bsd_name</key>
+ <string>disk1</string>
+ <key>com.apple.corestorage.lv</key>
+ <dict>
+ <key>com.apple.corestorage.lv.encrypted</key>
+ <string>yes</string>
+ <key>com.apple.corestorage.lv.encryptionType</key>
+ <string>AES-XTS</string>
+ <key>com.apple.corestorage.lv.locked</key>
+ <string>no</string>
+ <key>com.apple.corestorage.lv.revertible</key>
+ <string>kCoreStorageDecryptRevert</string>
+ <key>com.apple.corestorage.lv.uuid</key>
+ <string>1CD892E5-60BC-4339-AEF9-8C2818735617</string>
+ </dict>
+ <key>com.apple.corestorage.lvg</key>
+ <dict>
+ <key>com.apple.corestorage.lvg.freeSpace</key>
+ <integer>0</integer>
+ <key>com.apple.corestorage.lvg.name</key>
+ <string>Macintosh HD</string>
+ <key>com.apple.corestorage.lvg.size</key>
+ <integer>250006216704</integer>
+ <key>com.apple.corestorage.lvg.uuid</key>
+ <string>949A3F85-1B19-4930-8EE0-B1565D66F2C5</string>
+ </dict>
+ <key>com.apple.corestorage.pv</key>
+ <array>
+ <dict>
+ <key>_name</key>
+ <string>disk0s2</string>
+ <key>com.apple.corestorage.pv.size</key>
+ <integer>250006216704</integer>
+ <key>com.apple.corestorage.pv.status</key>
+ <string>Online</string>
+ <key>com.apple.corestorage.pv.uuid</key>
+ <string>D26DACEB-E661-4621-9BE3-355FAE611398</string>
+ <key>device_name</key>
+ <string>APPLE SSD SM0256F</string>
+ <key>is_internal_disk</key>
+ <string>yes</string>
+ <key>media_name</key>
+ <string>APPLE SSD SM0256F Media</string>
+ <key>medium_type</key>
+ <string>ssd</string>
+ <key>partition_map_type</key>
+ <string>guid_partition_map_type</string>
+ <key>protocol</key>
+ <string>PCI</string>
+ <key>smart_status</key>
+ <string>Verified</string>
+ </dict>
+ </array>
+ <key>file_system</key>
+ <string>Journaled HFS+</string>
+ <key>free_space_in_bytes</key>
+ <integer>23864803328</integer>
+ <key>ignore_ownership</key>
+ <string>no</string>
+ <key>mount_point</key>
+ <string>/</string>
+ <key>size_in_bytes</key>
+ <integer>249661751296</integer>
+ <key>volume_uuid</key>
+ <string>06A53A23-1675-31BF-93BF-E78C149C61E9</string>
+ <key>writable</key>
+ <string>yes</string>
+ </dict>
+ </array>
+ <key>_parentDataType</key>
+ <string>SPHardwareDataType</string>
+ <key>_properties</key>
+ <dict>
+ <key>_name</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>YES</string>
+ <key>_order</key>
+ <string>100</string>
+ </dict>
+ <key>bsd_name</key>
+ <dict>
+ <key>_isColumn</key>
+ <true/>
+ <key>_order</key>
+ <string>180</string>
+ </dict>
+ <key>com.apple.corestorage.lv</key>
+ <dict>
+ <key>_order</key>
+ <string>200</string>
+ </dict>
+ <key>com.apple.corestorage.lv.bytesConverted</key>
+ <dict>
+ <key>_isByteSize</key>
+ <true/>
+ <key>_order</key>
+ <string>250</string>
+ </dict>
+ <key>com.apple.corestorage.lv.conversionState</key>
+ <dict>
+ <key>_order</key>
+ <string>240</string>
+ </dict>
+ <key>com.apple.corestorage.lv.encrypted</key>
+ <dict>
+ <key>_order</key>
+ <string>220</string>
+ </dict>
+ <key>com.apple.corestorage.lv.encryptionType</key>
+ <dict>
+ <key>_order</key>
+ <string>225</string>
+ </dict>
+ <key>com.apple.corestorage.lv.locked</key>
+ <dict>
+ <key>_order</key>
+ <string>230</string>
+ </dict>
+ <key>com.apple.corestorage.lv.revertible</key>
+ <dict>
+ <key>_order</key>
+ <string>210</string>
+ </dict>
+ <key>com.apple.corestorage.lv.uuid</key>
+ <dict>
+ <key>_order</key>
+ <string>290</string>
+ </dict>
+ <key>com.apple.corestorage.lvg</key>
+ <dict>
+ <key>_order</key>
+ <string>400</string>
+ </dict>
+ <key>com.apple.corestorage.lvg.freeSpace</key>
+ <dict>
+ <key>_isByteSize</key>
+ <true/>
+ <key>_order</key>
+ <string>430</string>
+ </dict>
+ <key>com.apple.corestorage.lvg.name</key>
+ <dict>
+ <key>_order</key>
+ <string>410</string>
+ </dict>
+ <key>com.apple.corestorage.lvg.size</key>
+ <dict>
+ <key>_isByteSize</key>
+ <true/>
+ <key>_order</key>
+ <string>420</string>
+ </dict>
+ <key>com.apple.corestorage.lvg.uuid</key>
+ <dict>
+ <key>_order</key>
+ <string>440</string>
+ </dict>
+ <key>com.apple.corestorage.pv</key>
+ <dict>
+ <key>_order</key>
+ <string>500</string>
+ </dict>
+ <key>com.apple.corestorage.pv.size</key>
+ <dict>
+ <key>_isByteSize</key>
+ <true/>
+ <key>_order</key>
+ <string>520</string>
+ </dict>
+ <key>com.apple.corestorage.pv.status</key>
+ <dict>
+ <key>_order</key>
+ <string>565</string>
+ </dict>
+ <key>com.apple.corestorage.pv.uuid</key>
+ <dict>
+ <key>_order</key>
+ <string>590</string>
+ </dict>
+ <key>device_name</key>
+ <dict>
+ <key>_order</key>
+ <string>505</string>
+ </dict>
+ <key>file_system</key>
+ <dict>
+ <key>_isColumn</key>
+ <true/>
+ <key>_order</key>
+ <string>140</string>
+ </dict>
+ <key>free_space_in_bytes</key>
+ <dict>
+ <key>_isByteSize</key>
+ <true/>
+ <key>_isColumn</key>
+ <true/>
+ <key>_order</key>
+ <string>110</string>
+ </dict>
+ <key>ignore_ownership</key>
+ <dict>
+ <key>_order</key>
+ <string>160</string>
+ </dict>
+ <key>is_internal_disk</key>
+ <dict>
+ <key>_order</key>
+ <string>550</string>
+ </dict>
+ <key>media_name</key>
+ <dict>
+ <key>_order</key>
+ <string>510</string>
+ </dict>
+ <key>medium_type</key>
+ <dict>
+ <key>_order</key>
+ <string>530</string>
+ </dict>
+ <key>mount_point</key>
+ <dict>
+ <key>_isColumn</key>
+ <true/>
+ <key>_order</key>
+ <string>130</string>
+ </dict>
+ <key>optical_media_type</key>
+ <dict>
+ <key>_order</key>
+ <string>535</string>
+ </dict>
+ <key>partition_map_type</key>
+ <dict>
+ <key>_order</key>
+ <string>560</string>
+ </dict>
+ <key>protocol</key>
+ <dict>
+ <key>_order</key>
+ <string>540</string>
+ </dict>
+ <key>size_in_bytes</key>
+ <dict>
+ <key>_isByteSize</key>
+ <string>YES</string>
+ <key>_isColumn</key>
+ <true/>
+ <key>_order</key>
+ <string>120</string>
+ </dict>
+ <key>smart_status</key>
+ <dict>
+ <key>_order</key>
+ <string>570</string>
+ </dict>
+ <key>volume_uuid</key>
+ <dict>
+ <key>_order</key>
+ <string>190</string>
+ </dict>
+ <key>volumes</key>
+ <dict>
+ <key>_detailLevel</key>
+ <string>0</string>
+ </dict>
+ <key>writable</key>
+ <dict>
+ <key>_order</key>
+ <string>150</string>
+ </dict>
+ </dict>
+ <key>_timeStamp</key>
+ <date>2016-07-08T19:45:57Z</date>
+ <key>_versionInfo</key>
+ <dict>
+ <key>com.apple.SystemProfiler.SPStorageReporter</key>
+ <string>900</string>
+ </dict>
+ </dict>
+</array>
+</plist>
+storage_output
+
+ Power = <<power_output
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<array>
+ <dict>
+ <key>_SPCommandLineArguments</key>
+ <array>
+ <string>/usr/sbin/system_profiler</string>
+ <string>-nospawn</string>
+ <string>-xml</string>
+ <string>SPPowerDataType</string>
+ <string>-detailLevel</string>
+ <string>full</string>
+ </array>
+ <key>_SPCompletionInterval</key>
+ <real>0.061106979846954346</real>
+ <key>_SPResponseTime</key>
+ <real>0.16731500625610352</real>
+ <key>_dataType</key>
+ <string>SPPowerDataType</string>
+ <key>_detailLevel</key>
+ <string>0</string>
+ <key>_items</key>
+ <array>
+ <dict>
+ <key>_name</key>
+ <string>spbattery_information</string>
+ <key>sppower_battery_charge_info</key>
+ <dict>
+ <key>sppower_battery_current_capacity</key>
+ <integer>5841</integer>
+ <key>sppower_battery_fully_charged</key>
+ <string>TRUE</string>
+ <key>sppower_battery_is_charging</key>
+ <string>FALSE</string>
+ <key>sppower_battery_max_capacity</key>
+ <integer>5841</integer>
+ </dict>
+ <key>sppower_battery_health_info</key>
+ <dict>
+ <key>sppower_battery_cycle_count</key>
+ <integer>201</integer>
+ <key>sppower_battery_health</key>
+ <string>Good</string>
+ </dict>
+ <key>sppower_battery_installed</key>
+ <string>TRUE</string>
+ <key>sppower_battery_model_info</key>
+ <dict>
+ <key>PCB Lot Code</key>
+ <string>0000</string>
+ <key>Pack Lot Code</key>
+ <string>0000</string>
+ <key>sppower_battery_cell_revision</key>
+ <string>0389</string>
+ <key>sppower_battery_device_name</key>
+ <string>bq20z451</string>
+ <key>sppower_battery_firmware_version</key>
+ <string>0702</string>
+ <key>sppower_battery_hardware_revision</key>
+ <string>000a</string>
+ <key>sppower_battery_manufacturer</key>
+ <string>SMP</string>
+ <key>sppower_battery_serial_number</key>
+ <string>D123456789ABCDEFG</string>
+ </dict>
+ <key>sppower_current_amperage</key>
+ <integer>0</integer>
+ <key>sppower_current_voltage</key>
+ <integer>12788</integer>
+ </dict>
+ <dict>
+ <key>AC Power</key>
+ <dict>
+ <key>AutoPowerOff Delay</key>
+ <integer>14400</integer>
+ <key>AutoPowerOff Enabled</key>
+ <integer>1</integer>
+ <key>Current Power Source</key>
+ <string>TRUE</string>
+ <key>DarkWakeBackgroundTasks</key>
+ <true/>
+ <key>Disk Sleep Timer</key>
+ <integer>10</integer>
+ <key>Display Sleep Timer</key>
+ <integer>10</integer>
+ <key>Display Sleep Uses Dim</key>
+ <string>Yes</string>
+ <key>Hibernate Mode</key>
+ <integer>3</integer>
+ <key>PrioritizeNetworkReachabilityOverSleep</key>
+ <integer>0</integer>
+ <key>Standby Delay</key>
+ <integer>10800</integer>
+ <key>Standby Enabled</key>
+ <integer>1</integer>
+ <key>System Sleep Timer</key>
+ <integer>1</integer>
+ <key>Wake On AC Change</key>
+ <string>No</string>
+ <key>Wake On Clamshell Open</key>
+ <string>Yes</string>
+ <key>Wake On LAN</key>
+ <string>Yes</string>
+ </dict>
+ <key>Battery Power</key>
+ <dict>
+ <key>AutoPowerOff Delay</key>
+ <integer>14400</integer>
+ <key>AutoPowerOff Enabled</key>
+ <integer>1</integer>
+ <key>DarkWakeBackgroundTasks</key>
+ <false/>
+ <key>Disk Sleep Timer</key>
+ <integer>10</integer>
+ <key>Display Sleep Timer</key>
+ <integer>2</integer>
+ <key>Display Sleep Uses Dim</key>
+ <string>Yes</string>
+ <key>Hibernate Mode</key>
+ <integer>3</integer>
+ <key>ReduceBrightness</key>
+ <string>Yes</string>
+ <key>Standby Delay</key>
+ <integer>10800</integer>
+ <key>Standby Enabled</key>
+ <integer>1</integer>
+ <key>System Sleep Timer</key>
+ <integer>1</integer>
+ <key>Wake On AC Change</key>
+ <string>No</string>
+ <key>Wake On Clamshell Open</key>
+ <string>Yes</string>
+ </dict>
+ <key>_name</key>
+ <string>sppower_information</string>
+ </dict>
+ <dict>
+ <key>_name</key>
+ <string>sppower_hwconfig_information</string>
+ <key>sppower_ups_installed</key>
+ <string>FALSE</string>
+ </dict>
+ <dict>
+ <key>_name</key>
+ <string>sppower_ac_charger_information</string>
+ <key>sppower_ac_charger_ID</key>
+ <string>0x0100</string>
+ <key>sppower_ac_charger_family</key>
+ <string>0x0085</string>
+ <key>sppower_ac_charger_revision</key>
+ <string>0x0000</string>
+ <key>sppower_ac_charger_serial_number</key>
+ <string>0x00a1dab7</string>
+ <key>sppower_ac_charger_watts</key>
+ <string>85</string>
+ <key>sppower_battery_charger_connected</key>
+ <string>TRUE</string>
+ <key>sppower_battery_is_charging</key>
+ <string>FALSE</string>
+ </dict>
+ </array>
+ <key>_parentDataType</key>
+ <string>SPHardwareDataType</string>
+ <key>_properties</key>
+ <dict>
+ <key>Automatic Restart On Power Loss</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>107</string>
+ </dict>
+ <key>Disk Sleep Timer</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>102</string>
+ </dict>
+ <key>Display Sleep Timer</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>103</string>
+ </dict>
+ <key>Dynamic Power Step</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>104</string>
+ </dict>
+ <key>PCB Lot Code</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>404</string>
+ </dict>
+ <key>Pack Lot Code</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>403</string>
+ </dict>
+ <key>Reduce Processor Speed</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>105</string>
+ </dict>
+ <key>Sleep On Power Button</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>106</string>
+ </dict>
+ <key>System Sleep Timer</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>101</string>
+ </dict>
+ <key>Wake On AC Change</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>108</string>
+ </dict>
+ <key>Wake On Clamshell Open</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>109</string>
+ </dict>
+ <key>Wake On LAN</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>110</string>
+ </dict>
+ <key>Wake On Modem Ring</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>111</string>
+ </dict>
+ <key>spbattery_information</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>200</string>
+ </dict>
+ <key>sppower_ac_charger_ID</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>310</string>
+ </dict>
+ <key>sppower_ac_charger_family</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>313</string>
+ </dict>
+ <key>sppower_ac_charger_firmware_version</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>318</string>
+ </dict>
+ <key>sppower_ac_charger_hardware_version</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>317</string>
+ </dict>
+ <key>sppower_ac_charger_information</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>300</string>
+ </dict>
+ <key>sppower_ac_charger_manufacturer</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>316</string>
+ </dict>
+ <key>sppower_ac_charger_name</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>315</string>
+ </dict>
+ <key>sppower_ac_charger_revision</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>312</string>
+ </dict>
+ <key>sppower_ac_charger_serial_number</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>314</string>
+ </dict>
+ <key>sppower_ac_charger_watts</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>311</string>
+ </dict>
+ <key>sppower_battery_cannot_charge</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>401</string>
+ </dict>
+ <key>sppower_battery_cell_revision</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>407</string>
+ </dict>
+ <key>sppower_battery_charge_info</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>2</string>
+ </dict>
+ <key>sppower_battery_charger_connected</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>302</string>
+ </dict>
+ <key>sppower_battery_depleted</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>203</string>
+ </dict>
+ <key>sppower_battery_device_name</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>402</string>
+ </dict>
+ <key>sppower_battery_firmware_version</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>405</string>
+ </dict>
+ <key>sppower_battery_hardware_revision</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>406</string>
+ </dict>
+ <key>sppower_battery_health_info</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>3</string>
+ </dict>
+ <key>sppower_battery_installed</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>201</string>
+ </dict>
+ <key>sppower_battery_manufacturer</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>401</string>
+ </dict>
+ <key>sppower_battery_model_info</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>1</string>
+ </dict>
+ <key>sppower_battery_serial_number</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>400</string>
+ </dict>
+ <key>sppower_clamshell_closed</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>401</string>
+ </dict>
+ <key>sppower_current_amperage</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>206</string>
+ </dict>
+ <key>sppower_current_voltage</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>207</string>
+ </dict>
+ <key>sppower_events_info</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>500</string>
+ </dict>
+ <key>sppower_hwconfig_information</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>400</string>
+ </dict>
+ <key>sppower_information</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>100</string>
+ </dict>
+ <key>sppower_repeating_events_info</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>520</string>
+ </dict>
+ <key>sppower_scheduled_events_info</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>510</string>
+ </dict>
+ <key>sppower_watts</key>
+ <dict>
+ <key>_isColumn</key>
+ <string>NO</string>
+ <key>_order</key>
+ <string>301</string>
+ </dict>
+ <key>volumes</key>
+ <dict>
+ <key>_detailLevel</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>_timeStamp</key>
+ <date>2016-07-08T19:46:23Z</date>
+ <key>_versionInfo</key>
+ <dict>
+ <key>com.apple.SystemProfiler.SPPowerReporter</key>
+ <string>150</string>
+ </dict>
+ </dict>
+</array>
+</plist>
+power_output
+
+end