kpn_winrm 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rspec +3 -0
- data/.rubocop.yml +4 -0
- data/Gemfile +6 -0
- data/README.md +82 -0
- data/Rakefile +7 -0
- data/kpn_winrm.gemspec +36 -0
- data/lib/kpn_winrm.rb +99 -0
- data/lib/kpn_winrm/version.rb +3 -0
- metadata +123 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0a8fa621a194fcac699a2a168a87d3bbb55f0fac53e8da0daf938e5ede20c7e5
|
4
|
+
data.tar.gz: cab7d40f550adb3a2d6336df145213c9efeff7e188b07c43949e666fd5981b82
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 58cc3cb31c6a6941f827f90249799b5f02122e9010c75923b5947ee9d53ee5486afc0f5c1923f9fca79195f0a990e3307b0772e0a4d1f054304e320a5ecd4d9a
|
7
|
+
data.tar.gz: f12ea25c53b8ae58a045328c4f6c2bdc7899509b6cbfaf6ed6546710030957df3b4ddc5e2853c3617f7a8e4083ef4f2b4abfde900a88d307206f887a19f73e2b
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# kpn_winrm
|
2
|
+
|
3
|
+
This gem is used to execute Puppet module acceptance tests (beaker) for Windows using WinRM instead of SSH.
|
4
|
+
|
5
|
+
|
6
|
+
TODO: rspec test for this gem
|
7
|
+
|
8
|
+
## Dependencies
|
9
|
+
|
10
|
+
This gem has two gem dependencies:
|
11
|
+
- [winrm](https://rubygems.org/gems/winrm) (version requirement: >= 2.2.2)
|
12
|
+
- [winrm-elevated](https://rubygems.org/gems/winrm-elevated) (version requirement: >= 1.1.0)
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
Add this line to your spec_helper_acceptance.rb:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
require 'kpn_winrm'
|
20
|
+
```
|
21
|
+
|
22
|
+
Make sure the gem is installed:
|
23
|
+
|
24
|
+
$ gem install kpn_winrm
|
25
|
+
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
This gem contains 2 functions:
|
30
|
+
- apply_manifest_on_winrm
|
31
|
+
- winrm_command
|
32
|
+
|
33
|
+
### apply_manifest_on_winrm
|
34
|
+
This function can be used to apply a puppet manifest on the beaker node using winrm.
|
35
|
+
|
36
|
+
The functions has 3 parameters:
|
37
|
+
#### host
|
38
|
+
The host definition on which to execute the commands, for one node tests set this to `default`.
|
39
|
+
|
40
|
+
#### manifest
|
41
|
+
The ruby variable containting the manifest to apply, example:
|
42
|
+
```ruby
|
43
|
+
pp = <<-PP
|
44
|
+
user { 'testuser':
|
45
|
+
password => 'Dummy1234qwer!',
|
46
|
+
groups => ['Administrators'],
|
47
|
+
}
|
48
|
+
PP
|
49
|
+
```
|
50
|
+
|
51
|
+
#### opts
|
52
|
+
A hash of options, which can have one of the following:
|
53
|
+
- catch_changes
|
54
|
+
- catch_failures
|
55
|
+
- expect_failures
|
56
|
+
- expect_changes
|
57
|
+
|
58
|
+
Example
|
59
|
+
```ruby
|
60
|
+
apply_manifest_on_winrm(default, pp, :catch_failures => true)
|
61
|
+
apply_manifest_on_winrm(default, pp, :catch_changes => true)
|
62
|
+
```
|
63
|
+
|
64
|
+
### winrm_command
|
65
|
+
Run a command on the beaker node via winrm.
|
66
|
+
|
67
|
+
The functions has 3 parameters:
|
68
|
+
#### host
|
69
|
+
The host definition on which to execute the commands, for one node tests set this to `default`.
|
70
|
+
|
71
|
+
#### command
|
72
|
+
The command which should be executed via WinRM.
|
73
|
+
- acceptable_exit_codes
|
74
|
+
- run_as_cmd
|
75
|
+
|
76
|
+
#### opts
|
77
|
+
A hash of options, which can have one of the following:
|
78
|
+
|
79
|
+
Example
|
80
|
+
```ruby
|
81
|
+
winrm_command(default, 'SecEdit /export /cfg c:\cfg.txt')
|
82
|
+
```
|
data/Rakefile
ADDED
data/kpn_winrm.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'kpn_winrm/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'kpn_winrm'
|
7
|
+
spec.version = KpnWinrm::VERSION
|
8
|
+
spec.authors = ['kpn']
|
9
|
+
spec.email = ['noreply@kpn.com']
|
10
|
+
|
11
|
+
spec.summary = 'Additional functions for acceptance testing, to run commands and puppet apply over WinRM instead of ssh'
|
12
|
+
spec.homepage = 'https://github.com/kpn-puppet/gem-kpn-winrm'
|
13
|
+
spec.license = 'Apache-2.0'
|
14
|
+
|
15
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
16
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
17
|
+
if spec.respond_to?(:metadata)
|
18
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
19
|
+
else
|
20
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
21
|
+
'public gem pushes.'
|
22
|
+
end
|
23
|
+
|
24
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
25
|
+
f.match(%r{^(test|spec|features)/})
|
26
|
+
end
|
27
|
+
spec.bindir = 'exe'
|
28
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
29
|
+
spec.require_paths = ['lib']
|
30
|
+
|
31
|
+
spec.add_dependency 'winrm', '~> 2.2', '>= 2.2.2'
|
32
|
+
spec.add_dependency 'winrm-elevated', '~> 1.1', '>= 1.1.0'
|
33
|
+
|
34
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
35
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
36
|
+
end
|
data/lib/kpn_winrm.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'winrm'
|
2
|
+
require 'winrm-elevated'
|
3
|
+
|
4
|
+
# kpn_winrm
|
5
|
+
module KpnWinrm
|
6
|
+
def self.winrm_command(host, command, opts = {})
|
7
|
+
# Get parameters
|
8
|
+
puts host
|
9
|
+
user = host[:ssh][:user]
|
10
|
+
pass = host[:ssh][:password]
|
11
|
+
hostname = host.to_s
|
12
|
+
endpoint = 'http://' + hostname + ':5985/wsman'
|
13
|
+
acceptable_exit_codes = if opts.key?(:acceptable_exit_codes) && !opts[:acceptable_exit_codes].nil?
|
14
|
+
opts[:acceptable_exit_codes]
|
15
|
+
else
|
16
|
+
opts[:acceptable_exit_codes] = [0]
|
17
|
+
end
|
18
|
+
|
19
|
+
run_as_cmd = false
|
20
|
+
if opts.key?(:run_as_cmd) && !opts[:acceptable_exit_codes].nil?
|
21
|
+
run_as_cmd = true
|
22
|
+
end
|
23
|
+
|
24
|
+
# Setup winrm
|
25
|
+
opts = {
|
26
|
+
user: user,
|
27
|
+
password: pass,
|
28
|
+
endpoint: endpoint,
|
29
|
+
operation_timeout: 300,
|
30
|
+
}
|
31
|
+
host.logger.debug 'Trying to connect to windows host'
|
32
|
+
p opts.inspect
|
33
|
+
winrm = WinRM::Connection.new opts
|
34
|
+
|
35
|
+
# Debugging
|
36
|
+
host.logger.debug "Running command '#{command}' via winrm"
|
37
|
+
# Execute command via winrm
|
38
|
+
if run_as_cmd
|
39
|
+
winrm.shell(:cmd) do |shell|
|
40
|
+
@result = shell.run(command) do |stdout, stderr|
|
41
|
+
host.logger.debug stdout
|
42
|
+
host.logger.debug stderr
|
43
|
+
end
|
44
|
+
end
|
45
|
+
else
|
46
|
+
winrm.shell(:elevated) do |shell|
|
47
|
+
@result = shell.run(command) do |stdout, stderr|
|
48
|
+
host.logger.debug stdout
|
49
|
+
host.logger.debug stderr
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Debugging
|
55
|
+
host.logger.debug "winrm - stdout :#{stdout}"
|
56
|
+
host.logger.debug "winrm - stderr :#{stderr}"
|
57
|
+
host.logger.debug "winrm - exitcode:#{@result.exitcode}"
|
58
|
+
|
59
|
+
unless acceptable_exit_codes.include?(@result.exitcode)
|
60
|
+
raise StandardError, "Command '#{command}' failed with unacceptable exit code:#{@result.exitcode} on host '#{hostname}'\n" \
|
61
|
+
"Stdout:#{@result.stdout}\n" \
|
62
|
+
"Stderr:#{@result.stderr}\n"
|
63
|
+
end
|
64
|
+
|
65
|
+
# Return flat hash with stdout, stderr and the exitcode
|
66
|
+
{ stdout: @result.stdout,
|
67
|
+
stderr: @result.stderr,
|
68
|
+
exitcode: @result.exitcode }
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.apply_manifest_on_winrm(host, manifest, opts = {})
|
72
|
+
if [opts[:catch_changes], opts[:catch_failures], opts[:expect_failures], opts[:expect_changes]].compact.length > 1
|
73
|
+
raise StandardError, 'only one of :catch_changes, :catch_failures, :expect_failures and :expect_changes should be set'
|
74
|
+
end
|
75
|
+
|
76
|
+
acceptedexitcodes = [0]
|
77
|
+
|
78
|
+
if opts[:catch_changes]
|
79
|
+
acceptedexitcodes = [0]
|
80
|
+
end
|
81
|
+
|
82
|
+
if opts[:catch_failures]
|
83
|
+
acceptedexitcodes = [0, 2]
|
84
|
+
end
|
85
|
+
|
86
|
+
if opts[:expect_failures]
|
87
|
+
acceptedexitcodes = [1, 4, 6]
|
88
|
+
end
|
89
|
+
|
90
|
+
if opts[:expect_changes]
|
91
|
+
acceptedexitcodes = [2]
|
92
|
+
end
|
93
|
+
|
94
|
+
file_path = host.tmpfile('apply_manifest.pp')
|
95
|
+
create_remote_file(host, file_path, manifest + "\n")
|
96
|
+
|
97
|
+
winrm_command(host, 'puppet apply --detailed-exitcodes ' + file_path + '; exit $lastexitcode', acceptable_exit_codes: acceptedexitcodes)
|
98
|
+
end
|
99
|
+
end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kpn_winrm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- kpn
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-04-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: winrm
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.2'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.2.2
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.2'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.2.2
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: winrm-elevated
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.1'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.1.0
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.1.0
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: bundler
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.16'
|
60
|
+
type: :development
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.16'
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: rspec
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '3.0'
|
74
|
+
type: :development
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - "~>"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '3.0'
|
81
|
+
description:
|
82
|
+
email:
|
83
|
+
- noreply@kpn.com
|
84
|
+
executables: []
|
85
|
+
extensions: []
|
86
|
+
extra_rdoc_files: []
|
87
|
+
files:
|
88
|
+
- ".gitignore"
|
89
|
+
- ".rspec"
|
90
|
+
- ".rubocop.yml"
|
91
|
+
- Gemfile
|
92
|
+
- README.md
|
93
|
+
- Rakefile
|
94
|
+
- kpn_winrm.gemspec
|
95
|
+
- lib/kpn_winrm.rb
|
96
|
+
- lib/kpn_winrm/version.rb
|
97
|
+
homepage: https://github.com/kpn-puppet/gem-kpn-winrm
|
98
|
+
licenses:
|
99
|
+
- Apache-2.0
|
100
|
+
metadata:
|
101
|
+
allowed_push_host: https://rubygems.org
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 2.7.6
|
119
|
+
signing_key:
|
120
|
+
specification_version: 4
|
121
|
+
summary: Additional functions for acceptance testing, to run commands and puppet apply
|
122
|
+
over WinRM instead of ssh
|
123
|
+
test_files: []
|