summaryrefslogtreecommitdiff
path: root/lib/chef/resource/windows_printer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/resource/windows_printer.rb')
-rw-r--r--lib/chef/resource/windows_printer.rb113
1 files changed, 113 insertions, 0 deletions
diff --git a/lib/chef/resource/windows_printer.rb b/lib/chef/resource/windows_printer.rb
new file mode 100644
index 0000000000..669ffe2e18
--- /dev/null
+++ b/lib/chef/resource/windows_printer.rb
@@ -0,0 +1,113 @@
+#
+# Copyright:: 2012-2017, Nordstrom, Inc.
+#
+# 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.
+#
+# See here for more info:
+# http://msdn.microsoft.com/en-us/library/windows/desktop/aa394492(v=vs.85).aspx
+
+require "chef/resource"
+
+class Chef
+ class Resource
+ # @author Doug Ireton <doug@1strategy.com>
+ # Create Windows printer. Note that this doesn't currently install a printer driver.
+ # You must already have the driver installed on the system.
+ class WindowsPrinter < Chef::Resource
+ resource_name :windows_printer
+ provides :windows_printer, os: "windows"
+
+ require "resolv"
+
+ property :device_id, String, name_property: true, required: true
+ property :comment, String
+ property :default, [true, false], default: false
+ property :driver_name, String, required: true
+ property :location, String
+ property :shared, [true, false], default: false
+ property :share_name, String
+ property :ipv4_address, String, regex: Resolv::IPv4::Regex
+ property :exists, [true, false], desired_state: true
+
+ PRINTERS_REG_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\\'.freeze unless defined?(PRINTERS_REG_KEY)
+
+ def printer_exists?(name)
+ printer_reg_key = PRINTERS_REG_KEY + name
+ Chef::Log.debug "Checking to see if this reg key exists: '#{printer_reg_key}'"
+ Registry.key_exists?(printer_reg_key)
+ end
+
+ load_current_value do |desired|
+ name desired.name
+ exists printer_exists?(desired.name)
+ # TODO: Set @current_resource printer properties from registry
+ end
+
+ action :create do
+ if @current_resource.exists
+ Chef::Log.info "#{@new_resource} already exists - nothing to do."
+ else
+ converge_by("Create #{@new_resource}") do
+ create_printer
+ end
+ end
+ end
+
+ action :delete do
+ if @current_resource.exists
+ converge_by("Delete #{@new_resource}") do
+ delete_printer
+ end
+ else
+ Chef::Log.info "#{@current_resource} doesn't exist - can't delete."
+ end
+ end
+
+ action_class do
+ def create_printer
+ # Create the printer port first
+ windows_printer_port new_resource.ipv4_address do
+ end
+
+ port_name = "IP_#{new_resource.ipv4_address}"
+
+ declare_resource(:powershell_script, "Creating printer: #{new_resource.name}") do
+ code <<-EOH
+
+ Set-WmiInstance -class Win32_Printer `
+ -EnableAllPrivileges `
+ -Argument @{ DeviceID = "#{new_resource.device_id}";
+ Comment = "#{new_resource.comment}";
+ Default = "$#{new_resource.default}";
+ DriverName = "#{new_resource.driver_name}";
+ Location = "#{new_resource.location}";
+ PortName = "#{port_name}";
+ Shared = "$#{new_resource.shared}";
+ ShareName = "#{new_resource.share_name}";
+ }
+ EOH
+ end
+ end
+
+ def delete_printer
+ declare_resource(:powershell_script, "Deleting printer: #{new_resource.name}") do
+ code <<-EOH
+ $printer = Get-WMIObject -class Win32_Printer -EnableAllPrivileges -Filter "name = '#{new_resource.name}'"
+ $printer.Delete()
+ EOH
+ end
+ end
+ end
+ end
+ end
+end