mixlibrary-core 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b6096253f03fb8d609d330f225b53b459614f17e
4
+ data.tar.gz: 130c30f1b3c838b4db5717439ff10b0f5f443125
5
+ SHA512:
6
+ metadata.gz: 9051a2d056ad8965e00c5a12996477d330388a233bbd41915aa3833a6b6916c196aead6f4528a0d2d4d45c39534050fc802c7110f19e74fcf16aa65a89f04011
7
+ data.tar.gz: 4aeced5c6efcccf30484308fa4b019470e2704ae08fbbdbb42bcd0cb83282abeb0d067b0e8bdd902d76191e219d88e9939519db6b3660c07f9234b7a387316b1
data/LICENSE.txt ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2014 EBSCO Information Services
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # Mixlibrary-Core
2
+
3
+ Wraps some provider functionality from chef into easily consumable ruby classes that do not have the extra baggage of being dependent on Chef data objects. Node object, Environment etc.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'mixlibrary-core'
10
+
11
+ And then execute:
12
+
13
+ $ bundle install
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install mixlibrary-core
18
+
19
+ ## Documentation
20
+ * Uses yard to document classes and methods. Generate docs or automatic documentation: http://www.rubydoc.info
21
+ * rake doc
22
+
23
+ ## Usage
24
+
25
+ ### Windows Oriented
26
+
27
+ #### Powershell Scripts
28
+ Needed ability to execute powershell scripts and get the powershell process back. So to execute a powershell script:
29
+
30
+ ```
31
+ require 'mixlibrary/core/apps/shell'
32
+
33
+ script= <<-EOF
34
+ write-host "Hello 'World'"
35
+ EOF
36
+
37
+ procobj = Mixlibrary::Core::Shell.windows_script_out!(:powershell,script)
38
+ ```
39
+
40
+ #### Batch
41
+ Not Implemented yet
42
+
43
+ ### Linux Oriented
44
+
45
+
46
+ ## Contributing
47
+ # Run All the Tests on your platform and build the gem
48
+
49
+ bundle exec rake
50
+
51
+
52
+
53
+
54
+ 1. Fork it (http://github.com/<my-github-username>/mixlibrary-core/fork)
55
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
56
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
57
+ 4. Push to the branch (`git push origin my-new-feature`)
58
+ 5. Create new Pull Request
@@ -0,0 +1,4 @@
1
+ #only needed for testing outside of chef executions. Should not be called from within a Chef Run
2
+ unless defined?(Chef::Mixin::ShellOut)
3
+ require 'chef'
4
+ end
@@ -0,0 +1,3 @@
1
+ require "mixlibrary/core/apps/_dependencies"
2
+
3
+ require "mixlibrary/core/shell/app"
@@ -0,0 +1,4 @@
1
+ require "mixlibrary/core/apps/_dependencies"
2
+
3
+ require 'mixlibrary/core/utilities/ruby_info'
4
+ require "mixlibrary/core/utilities/windows_architecture_helper"
@@ -0,0 +1,55 @@
1
+ #This file defines the typical entrypoint into this shell code base. Other entrypoints can be used, but this one is currently made easiest
2
+ #by including an apps folder at the top level and including this file to get the pieces that are needed.
3
+
4
+ #Could you easily enough require the powershell.rb directly and just outright call it, sure. But most if not all of this code should be stateless. This
5
+ #implies static methods should be used. After a bunch of reading, there seems to be no real consensus on where static methods belong. I like the idea of classes
6
+ #but I found more people sticking these methods in the base module, which is what I am doing here. So the way one can interpret this file is it is the base methods
7
+ #that are exposed in its entirety for the Shell (sub-module) within this Gem. Since everything is stateless no need to expose classes directly unless it is overwhelmingly
8
+ #more complicated and many methods would need to be exposed (Scalability). (We are just scripting after all....)
9
+
10
+ require 'mixlibrary/core/shell/scripts/powershell'
11
+ require "mixlibrary/core/shell/shell_call"
12
+
13
+ module Mixlibrary
14
+ module Core
15
+ module Shell
16
+
17
+ #########################
18
+ #Scripts
19
+ #########################
20
+ def self.windows_script_out(shellType,script, options=nil, flags=nil,desiredarchitecture=nil)
21
+ return run_windows_script(shellType,false,script, options, flags,desiredarchitecture)
22
+ end
23
+
24
+ def self.windows_script_out!(shellType,script, options=nil, flags=nil,desiredarchitecture=nil )
25
+ return run_windows_script(shellType,true,script, options, flags,desiredarchitecture)
26
+ end
27
+
28
+ #########################
29
+ #Shell Out
30
+ #########################
31
+ def self.shell_out!(command, options=nil)
32
+ shellclass=Shell::ShellCall.new
33
+ return shellclass.shell!(command, options)
34
+ end
35
+
36
+ def self.shell_out(command, options=nil)
37
+ shellclass=Shell::ShellCall.new
38
+ return shellclass.shell(command, options)
39
+ end
40
+
41
+ private
42
+ def self.run_windows_script(shellType, validate, script, options, flags, architecture)
43
+ case shellType
44
+ when :powershell
45
+
46
+ obj= Shell::Scripts::Powershell.new(script, validate, options, flags,architecture)
47
+ return obj.orchestrate
48
+
49
+ else
50
+ raise "Shell not supported. Currently supports: :powershell for now!"
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,32 @@
1
+ require "mixlibrary/core/shell/scripts/shelloutwrapper"
2
+
3
+ module Mixlibrary
4
+ module Core
5
+ module Shell
6
+ class Scripts
7
+
8
+ #Base class for all script classes. Provides an Interface of sorts that all other classes must implement and also provides the base methods that would need to be implemented.
9
+ class Base
10
+
11
+ #Orchestrates running the script. Might be as simple as calling shell_out or more complicated like doing syntax validation of the script before execution
12
+ def orchestrate
13
+ raise "Not Implemented Exception"
14
+ end
15
+
16
+ protected
17
+
18
+ def run_command(shell_executable, flags, filename_prefix, file_extension, code,shellout_options, eval_error)
19
+ shellobj =Scripts::ShellOutWrapper.new(shell_executable, flags, filename_prefix, file_extension, code, shellout_options)
20
+
21
+ if(eval_error)
22
+ return shellobj.run_command!
23
+ else
24
+ return shellobj.run_command
25
+ end
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,127 @@
1
+ #Runs powershell scripts with the least amount of intrusion possible. We do some syntax checking and validation that the script did not end badly, but other than that, we
2
+ #try to leave the executing script in the hands of the developer.
3
+
4
+ require "mixlibrary/core/shell/scripts/windows_script"
5
+
6
+ module Mixlibrary
7
+ module Core
8
+ module Shell
9
+ class Scripts
10
+ class Powershell < WindowsScript
11
+ @originalScript =nil
12
+ @validate =nil
13
+ @options =nil
14
+ @flagoverrides =nil
15
+
16
+ def initialize(script, validate, options, flags, architecture = nil)
17
+ super(architecture)
18
+ @originalScript=script
19
+ @options = options
20
+ @validate=validate
21
+ @flagoverrides=flags
22
+ end
23
+
24
+ def orchestrate
25
+ #Powershell kind of sucks with syntax checking.
26
+ #If any part of the script syntactically fails it will exit with a clean exit code of 0
27
+ #So this forced our hand to call powershell twice for every script call.
28
+ #1 - Put passed in script in a function to see if any standard error is generated -
29
+ #only will happen if syntax is incorrect since function is never called
30
+ #2 - Run the user script with exception wraps to guarantee some exit status
31
+ syntax_check()
32
+ return run_command(shell,flags,filename,file_extension, finalscript(), @options, @validate)
33
+ end
34
+
35
+ private
36
+
37
+ EXIT_STATUS_EXCEPTION_HANDLER= <<-EOF
38
+ trap [Exception]{
39
+ write-error -exception ($_.Exception.Message) -erroraction continue;
40
+ exit 1
41
+ }
42
+ EOF
43
+
44
+ EXIT_STATUS_RESET_SCRIPT= <<-EOF
45
+ $LASTEXITCODE=0
46
+ EOF
47
+
48
+ #Make this set-variable call a read only. Technically can be overridden but most of PS scripts that set this setting,
49
+ #usually try to set this by doing things like $ERRORACTIONPREFERENCE="Stop"
50
+ #Generally speaking this is the best way to handle this situation. We will need to determine if there are many dependent scripts
51
+ #that depend on being able to set this setting.
52
+ EXIT_STATUS_INTIALIZATION= <<-EOF
53
+ Set-Variable -Name ERRORACTIONPREFERENCE -Value "STOP" -Scope Script -Option "ReadOnly"
54
+ \#$ErrorActionPreference="STOP"
55
+ try{
56
+ EOF
57
+
58
+ EXIT_STATUS_POST= <<-EOF
59
+ }
60
+ catch{
61
+ write-error -exception ($_.Exception) -erroraction continue;
62
+ exit 1
63
+ }
64
+ EOF
65
+
66
+ #Validate valid powershell was passed in.
67
+ def syntax_check
68
+ local_script_contents=("function testme(){ \n #{@originalScript.to_s} \n} \n")
69
+
70
+ result = run_command(shell,flags,filename,file_extension, local_script_contents, @options, false)
71
+ #puts result.inspect
72
+ if(result.stderr.length >= 1 || result.exitstatus !=0)
73
+ #puts "Standard Output: \n #{result.stdout}"
74
+ #puts "Standard Error: \n #{result.stderr}"
75
+ raise RuntimeError,"Did not syntactically pass the powershell check. \n Standard out: #{result.stdout} \n Standard Error:#{result.stderr}"
76
+ end
77
+ end
78
+
79
+ def finalscript
80
+ changed_script =
81
+ EXIT_STATUS_EXCEPTION_HANDLER +
82
+ EXIT_STATUS_RESET_SCRIPT +
83
+ EXIT_STATUS_INTIALIZATION +
84
+ @originalScript +
85
+ EXIT_STATUS_POST
86
+
87
+ return changed_script
88
+ end
89
+
90
+ def flags
91
+ flags = [
92
+ # Hides the copyright banner at startup.
93
+ "-NoLogo",
94
+ # Does not present an interactive prompt to the user.
95
+ "-NonInteractive",
96
+ # Does not load the Windows PowerShell profile.
97
+ "-NoProfile",
98
+ # always set the ExecutionPolicy flag
99
+ # see http://technet.microsoft.com/en-us/library/ee176961.aspx
100
+ "-ExecutionPolicy RemoteSigned",
101
+ # Powershell will hang if STDIN is redirected
102
+ # http://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected
103
+ "-InputFormat None",
104
+
105
+ "-File"
106
+ ]
107
+ return @flagoverrides if @flagoverrides != nil
108
+ return flags.join(' ')
109
+ end
110
+
111
+ def shell
112
+ return "powershell.exe"
113
+ end
114
+
115
+ def filename
116
+ return "tempPSchef"
117
+ end
118
+
119
+ def file_extension
120
+ return ".ps1"
121
+ end
122
+
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,111 @@
1
+ #Wraps calling shell out with any script file. Will create the script file execute the shell out command and delete the file once complete
2
+
3
+ require "mixlibrary/core/shell/shell_call"
4
+ module Mixlibrary
5
+ module Core
6
+ module Shell
7
+ class Scripts
8
+ class ShellOutWrapper
9
+ @exe
10
+ @flags
11
+ @filename
12
+ @fileext
13
+ @code
14
+ @shellout_options
15
+
16
+ #runtime
17
+ @script_file
18
+
19
+ def initialize(exe, flags, filename, fileext, code, shellout_options)
20
+ @exe=exe
21
+ @flags=flags
22
+ @filename=filename
23
+ @fileext=fileext
24
+ @code=code
25
+ if(shellout_options==nil)
26
+ @shellout_options= Hash.new()
27
+ else
28
+ @shellout_options=shellout_options
29
+ end
30
+ end
31
+
32
+ public
33
+ #Supported options
34
+ #opts[:domain]
35
+ #opts[:password]
36
+ #opts[:timeout] = @new_resource.timeout || 3600
37
+ #opts[:returns] = @new_resource.returns if @new_resource.returns
38
+ #opts[:environment] = @new_resource.environment if @new_resource.environment
39
+ #opts[:user] = @new_resource.user if @new_resource.user
40
+ #opts[:group] = @new_resource.group if @new_resource.group
41
+ #opts[:cwd] = @new_resource.cwd if @new_resource.cwd
42
+ #opts[:umask] = @new_resource.umask if @new_resource.umask
43
+ #opts[:log_level] = :info
44
+ #opts[:log_tag] = @new_resource.to_s
45
+ #cmd = Chef::ShellOut.new("apachectl", "start", :user => 'www', :env => nil, :cwd => '/tmp')
46
+ #puts "#{script_file.path}"
47
+
48
+ def run_command
49
+ return shellout(false)
50
+ end
51
+
52
+ def run_command!
53
+ return shellout(true)
54
+ end
55
+
56
+ private
57
+
58
+ def set_owner_and_group
59
+ # FileUtils itself implements a no-op if +user+ or +group+ are nil
60
+ # You can prove this by running FileUtils.chown(nil,nil,'/tmp/file')
61
+ # as an unprivileged user.
62
+ #puts "#{@shellout_options.inspect}"
63
+ ::FileUtils.chown(@shellout_options[:user], @shellout_options[:group], @script_file.path)
64
+ end
65
+
66
+ def script_file
67
+ #puts "File name #{filename}"
68
+ @script_file ||= Tempfile.open([@filename, @fileext])
69
+ end
70
+
71
+ def unlink_script_file
72
+ @script_file && @script_file.close!
73
+ @script_file=nil
74
+ end
75
+
76
+ def create_file ()
77
+ #Output script to file path
78
+ script_file.puts(@code)
79
+ script_file.close
80
+
81
+ set_owner_and_group
82
+ end
83
+
84
+ def shellout(eval_error)
85
+ begin
86
+ create_file()
87
+
88
+ shellclass=Shell::ShellCall.new
89
+ if(eval_error)
90
+ result = shellclass.shell!("#{@exe} #{@flags} #{@script_file.path}", @shellout_options)
91
+ return result
92
+ else
93
+ result = shellclass.shell("#{@exe} #{@flags} #{@script_file.path}", @shellout_options)
94
+ return result
95
+ end
96
+
97
+ rescue Exception => e
98
+ #puts e.message
99
+ #puts e.backtrace.inspect
100
+ raise
101
+
102
+ ensure
103
+ unlink_script_file
104
+ end
105
+ end
106
+
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,55 @@
1
+ #All windows scripts will inherit from here
2
+ require "mixlibrary/core/shell/scripts/base"
3
+ require 'mixlibrary/core/apps/utilities'
4
+
5
+ module Mixlibrary
6
+ module Core
7
+ module Shell
8
+ class Scripts
9
+ class WindowsScript < Base
10
+
11
+ protected
12
+
13
+ @targetarchitecutre = nil;
14
+ @should_override = nil
15
+
16
+ def initialize(architecture)
17
+ super()
18
+
19
+ #The target arch is either what the machine is or passed in parameter
20
+ @targetarchitecutre = architecture.nil? ? Utilities::WindowsArchitectureHelper.architecture : architecture
21
+ @should_override = Utilities::WindowsArchitectureHelper.wow64_architecture_override_required?(@targetarchitecutre)
22
+
23
+ #why do we care here? If user wants a 32bit process call the 32 bit executable?
24
+ if ( @targetarchitecutre == :i386 )
25
+ if (RubyInfo.architecture==:x86_64)
26
+ raise "Support for the i386 architecture from a 64-bit Ruby runtime is not supported. Please call the specific 32 bit assembly directly"
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ def run_command(shell_executable, flags, filename_prefix, file_extension, code,shellout_options, eval_error)
33
+ wow64_redirection_state = nil
34
+
35
+ if @should_override
36
+ #puts "Disabling redirection"
37
+ wow64_redirection_state = Utilities::WindowsArchitectureHelper.disable_wow64_file_redirection()
38
+ end
39
+
40
+ begin
41
+ return super(shell_executable, flags, filename_prefix, file_extension, code,shellout_options, eval_error)
42
+ rescue
43
+ raise
44
+ ensure
45
+ if ! wow64_redirection_state.nil?
46
+ #puts "Restoring redirection"
47
+ Utilities::WindowsArchitectureHelper.restore_wow64_file_redirection(wow64_redirection_state)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,28 @@
1
+ #We had our hand forced here. We had to make this an instantianted class because the Ruby Include syntax does not work with entirely static methods.
2
+
3
+ module Mixlibrary
4
+ module Core
5
+ module Shell
6
+ class ShellCall
7
+ include Chef::Mixin::ShellOut
8
+
9
+ def intialize ()
10
+
11
+ end
12
+
13
+ def shell(command, options)
14
+ result = shell_out("#{command}", options)
15
+ return result
16
+ end
17
+
18
+ def shell!(command, options)
19
+ result = shell_out!("#{command}", options)
20
+ return result
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+
28
+
@@ -0,0 +1,23 @@
1
+ #Begin defining constant symbols for ruby versions
2
+
3
+ module Mixlibrary
4
+ module Core
5
+ module Utilities
6
+ class RubyInfo
7
+
8
+ def self.architecture
9
+ #x64-mingw32
10
+ #i386-mingw32
11
+ myarch = RbConfig::CONFIG["arch"]
12
+ if(myarch.upcase.include?("I386"))
13
+ return :i386
14
+ elsif (myarch.upcase.include?("X64"))
15
+ return :x86_64
16
+ else
17
+ raise "Unsupported arch found: #{myarch}"
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,78 @@
1
+ require 'win32/api' if Chef::Platform.windows?
2
+
3
+ module Mixlibrary
4
+ module Core
5
+ module Utilities
6
+ class WindowsArchitectureHelper
7
+
8
+ #Attempts to determine if this machine is 64 bit or not in a variety of ways - using generic ruby and/or Windows specific environment variabes
9
+ def self.is_machine_64bit?
10
+ if(RubyInfo.architecture==:x86_64)
11
+ return true
12
+ end
13
+
14
+ if(ENV.has_key?('ProgramFiles(x86)'))
15
+ return true;
16
+ end
17
+
18
+ if(ENV.has_key?('PROCESSOR_ARCHITEW6432'))
19
+ return true;
20
+ end
21
+
22
+ return false;
23
+ end
24
+
25
+ #returns the architecture based on if the machine is 64 bit
26
+ def self.architecture
27
+ if(is_machine_64bit?)
28
+ return :x86_64
29
+ else
30
+ return :i386
31
+ end
32
+ end
33
+
34
+ #Determines if the syswow redirection needs to be disabled based on the desired architecture.
35
+ def self.wow64_architecture_override_required?(desired_architecture)
36
+ #only use case we need to disable redirection is if
37
+ #running as 32 bit
38
+ #want 64 bit
39
+ #On 64bit machine
40
+ RubyInfo.architecture==:i386 &&
41
+ desired_architecture == :x86_64 &&
42
+ is_machine_64bit?
43
+
44
+ end
45
+
46
+ #Disables syswow redirection
47
+ def self.disable_wow64_file_redirection()
48
+ original_redirection_state = ['0'].pack('P')
49
+
50
+ win32_wow_64_disable_wow_64_fs_redirection =
51
+ ::Win32::API.new('Wow64DisableWow64FsRedirection', 'P', 'L', 'kernel32')
52
+
53
+ succeeded = win32_wow_64_disable_wow_64_fs_redirection.call(original_redirection_state)
54
+
55
+ if succeeded == 0
56
+ raise "Failed to disable Wow64 file redirection"
57
+ end
58
+
59
+ return original_redirection_state
60
+ end
61
+
62
+ #Restore syswow redirection
63
+ def self.restore_wow64_file_redirection(original_redirection_state )
64
+
65
+ win32_wow_64_revert_wow_64_fs_redirection =
66
+ ::Win32::API.new('Wow64RevertWow64FsRedirection', 'P', 'L', 'kernel32')
67
+
68
+ succeeded = win32_wow_64_revert_wow_64_fs_redirection.call(original_redirection_state)
69
+
70
+ if succeeded == 0
71
+ raise "Failed to revert Wow64 file redirection"
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,6 @@
1
+ module Mixlibrary
2
+ module Core
3
+ VERSION = "0.0.3"
4
+ NAME = "mixlibrary-core"
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mixlibrary-core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Nicholas Carpenter
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '5.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '5.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.8'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0.8'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-reporters
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: chef
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '11.16'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '11.16'
97
+ - !ruby/object:Gem::Dependency
98
+ name: win32-api
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.5.1
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.5.1
111
+ description: 'MixLib for creating Core libraries in ruby for automating machines. This
112
+ is an abstraction away from using Chef Providers directly to give us access to the
113
+ lower layers of Chef implementation to meet additional use cases. '
114
+ email:
115
+ - ncarpenter@ebsco.com
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - LICENSE.txt
121
+ - README.md
122
+ - lib/mixlibrary/core/apps/_dependencies.rb
123
+ - lib/mixlibrary/core/apps/shell.rb
124
+ - lib/mixlibrary/core/apps/utilities.rb
125
+ - lib/mixlibrary/core/shell/app.rb
126
+ - lib/mixlibrary/core/shell/scripts/base.rb
127
+ - lib/mixlibrary/core/shell/scripts/powershell.rb
128
+ - lib/mixlibrary/core/shell/scripts/shelloutwrapper.rb
129
+ - lib/mixlibrary/core/shell/scripts/windows_script.rb
130
+ - lib/mixlibrary/core/shell/shell_call.rb
131
+ - lib/mixlibrary/core/utilities/ruby_info.rb
132
+ - lib/mixlibrary/core/utilities/windows_architecture_helper.rb
133
+ - lib/mixlibrary/core/version.rb
134
+ homepage: ''
135
+ licenses:
136
+ - Apache2
137
+ metadata: {}
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - '>='
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 2.4.1
155
+ signing_key:
156
+ specification_version: 4
157
+ summary: MixLib for creating Core libraries in ruby for automating machines.
158
+ test_files: []
159
+ has_rdoc: