This patch queries wmi for the Caption property in the
Win32_OperatingSystem class. The result is a string that
is parsed by comparing it to a hardcode list of possible
versions. A hardcoded list is not ideal but Microsoft does
not provide a function to grab just the release string.

A possible alternative would be using regex to grab the
value, accounting for the various cases between windows
version names and then hoping Mircrosoft doesn't change
the format of the caption property in future releases.

The patch also adds a windowsrelease fact which is the full
name of the specific version of windows.
ie. "Microsoft Windows 7 Professional"

Signed-off-by: William Van Hevelingen <[email protected]>
---
Local-branch: feature/master/7621-windows_osrelease
 lib/facter/operatingsystemrelease.rb |   15 +++++++++++++++
 lib/facter/util/mswindows.rb         |   12 ++++++++++++
 lib/facter/windowsrelease.rb         |   18 ++++++++++++++++++
 3 files changed, 45 insertions(+), 0 deletions(-)
 create mode 100644 lib/facter/util/mswindows.rb
 create mode 100644 lib/facter/windowsrelease.rb

diff --git a/lib/facter/operatingsystemrelease.rb 
b/lib/facter/operatingsystemrelease.rb
index 347fe7f..b0a2108 100644
--- a/lib/facter/operatingsystemrelease.rb
+++ b/lib/facter/operatingsystemrelease.rb
@@ -123,5 +123,20 @@ Facter.add(:operatingsystemrelease) do
 end
 
 Facter.add(:operatingsystemrelease) do
+  confine :operatingsystem => :windows
+  require 'facter/util/mswindows'
+      setcode do
+        result = nil
+        # Added spaces to make the values unique
+        [" XP ", " Vista ", " 7 ", " 2003 ", " 2008 ", "2008 R2 ", " 8 "].each 
do |r|
+          if Facter::Util::MSWindows.getWindowsRelease.include?(r)
+            result = r.gsub(/\s/, "")
+          end
+        end
+        result
+      end
+end
+
+Facter.add(:operatingsystemrelease) do
     setcode do Facter[:kernelrelease].value end
 end
diff --git a/lib/facter/util/mswindows.rb b/lib/facter/util/mswindows.rb
new file mode 100644
index 0000000..32ab0ed
--- /dev/null
+++ b/lib/facter/util/mswindows.rb
@@ -0,0 +1,12 @@
+module Facter::Util::MSWindows
+
+  def self.getWindowsRelease
+    require 'win32ole'
+    # WMI returns an IEnumVariant object
+    wmi = WIN32OLE.connect("winmgmts://").ExecQuery("select Caption from 
Win32_OperatingSystem")
+    result = nil
+    wmi.each { |x| result = x["Caption"] }
+    result
+  end
+
+end
diff --git a/lib/facter/windowsrelease.rb b/lib/facter/windowsrelease.rb
new file mode 100644
index 0000000..3469622
--- /dev/null
+++ b/lib/facter/windowsrelease.rb
@@ -0,0 +1,18 @@
+# Fact: windowsrelease
+#
+# Purpose:
+#   Returns the windowsrelease of the system.
+#
+# Resolution:
+#   Uses WMI to query for the OS caption string
+#
+# Caveats:
+#
+require 'facter/util/mswindows'
+
+Facter.add(:windowsrelease) do
+    confine :operatingsystem => :windows
+    setcode do
+      Facter::Util::MSWindows.getWindowsRelease
+    end
+end
-- 
1.7.0.4

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to