summaryrefslogtreecommitdiff
path: root/lib/chef/powershell.rb
diff options
context:
space:
mode:
authorStuart Preston <stuart@chef.io>2018-03-03 16:49:20 -0800
committerStuart Preston <stuart@chef.io>2018-03-03 16:49:20 -0800
commit611c9cbb8e9cba16e6e6d85edcadde7e78349ea0 (patch)
tree686936de28788dc048eaa1d7a72204b86fa2dbc7 /lib/chef/powershell.rb
parent599f0dfec0c8c2b0d6d6eaf2a594abeebf40ff66 (diff)
downloadchef-611c9cbb8e9cba16e6e6d85edcadde7e78349ea0.tar.gz
Initial commit of new Chef PowerShell support
Signed-off-by: Stuart Preston <stuart@chef.io>
Diffstat (limited to 'lib/chef/powershell.rb')
-rw-r--r--lib/chef/powershell.rb53
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/chef/powershell.rb b/lib/chef/powershell.rb
new file mode 100644
index 0000000000..32a3a2f532
--- /dev/null
+++ b/lib/chef/powershell.rb
@@ -0,0 +1,53 @@
+#
+# Author:: Stuart Preston (<stuart@chef.io>)
+# Copyright:: Copyright 2018, Chef Software, 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 "chef/json_compat"
+require "win32ole" if RUBY_PLATFORM =~ /mswin|mingw32|windows/
+
+class Chef
+ class PowerShell
+
+ attr_reader :result
+ attr_reader :errors
+
+ # Run a command under PowerShell via a managed (.NET) COM interop API.
+ # This implementation requires the managed dll to be registered on the
+ # target machine.
+ #
+ # Requires: .NET Framework 4.0 or higher on the target machine.
+ #
+ # @param script [String] script to run
+ # @return [Object] output
+ def initialize(*command_args)
+ raise "This class can only be used on the Windows platform." unless RUBY_PLATFORM =~ /mswin|mingw32|windows/
+ exec(command_args.first)
+ end
+
+ def exec(script)
+ ps = WIN32OLE.new("Chef.PowerShell")
+ outcome = ps.ExecuteScript(script)
+ hashed_outcome = Chef::JSONCompat.parse(outcome)
+ @result = Chef::JSONCompat.parse(hashed_outcome["result"])
+ @errors = hashed_outcome["errors"]
+ end
+
+ def error?
+ return true if errors.count > 0
+ false
+ end
+ end
+end