vagrant-winrm 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.travis.yml +4 -0
- data/Gemfile +7 -0
- data/LICENSE +15 -0
- data/README.md +78 -0
- data/Rakefile +19 -0
- data/lib/vagrant-winrm.rb +22 -0
- data/lib/vagrant-winrm/commands/winrm.rb +63 -0
- data/lib/vagrant-winrm/commands/winrm_config.rb +52 -0
- data/lib/vagrant-winrm/commands/winrm_upload.rb +40 -0
- data/lib/vagrant-winrm/errors.rb +14 -0
- data/lib/vagrant-winrm/plugin.rb +29 -0
- data/lib/version.rb +5 -0
- data/locales/en.yml +7 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/vagrant-winrm/commands/winrm_config_spec.rb +102 -0
- data/spec/vagrant-winrm/commands/winrm_spec.rb +120 -0
- data/spec/vagrant-winrm/commands/winrm_upload_spec.rb +87 -0
- data/templates/winrm_config/config.erb +5 -0
- data/vagrant-winrm.gemspec +28 -0
- metadata +149 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 210c89d4530fcbed54ae1c14abfb7296eac6a39f
|
4
|
+
data.tar.gz: 26bd2ffbf4d1b9aebedd4f3dd5e8c2c14ef6b4ef
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 376ec1e96ba09e7edb537c4d813b9e39bff4dff4a14024c4ad95d89a5c47bbb2bd2cc82951ead06258da431e0ebc0fbc822a7b338cf30a2931b88d59227885d9
|
7
|
+
data.tar.gz: 6a14eee48918be937014f323f63f1d9ca5c8554c7c3452963d1a480626009416964c9ce836e50efe9d44792b52a5c2699e63f3cec554423730c21e81959393a7
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Author:: Baptiste Courtois (<b.courtois@criteo.com>)
|
2
|
+
|
3
|
+
Copyright (C) 2014, Baptiste Courtois
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# <a name="title"></a> Vagrant-WinRM
|
2
|
+
|
3
|
+
This is a [Vagrant][vagrant_dl] 1.6+ plugin that adds new command to extends WinRM communication features.
|
4
|
+
|
5
|
+
**NOTE:** This plugin requires Vagrant 1.6+
|
6
|
+
|
7
|
+
## <a name="features"></a> Features
|
8
|
+
|
9
|
+
* Execute remote command
|
10
|
+
* Upload files
|
11
|
+
* Retrieve WinRM configuration
|
12
|
+
|
13
|
+
## <a name="installation"></a> Installation
|
14
|
+
|
15
|
+
Install using standard Vagrant plugin installation methods:
|
16
|
+
|
17
|
+
vagrant plugin install vagrant-winrm
|
18
|
+
|
19
|
+
Please read the [Plugin usage][plugin_usage] page for more details.
|
20
|
+
|
21
|
+
## <a name="usage"></a> Usage
|
22
|
+
|
23
|
+
### <a name="usage-winrm"> winrm
|
24
|
+
|
25
|
+
This command allows you to execute arbitrary remote commands through WinRM.
|
26
|
+
|
27
|
+
vagrant winrm -c "pre-install.bat" -c "install.bat" -c "post-install.bat" Windows2008VM
|
28
|
+
|
29
|
+
### <a name="usage-winrm-upload"> winrm-upload
|
30
|
+
|
31
|
+
This command allows you to upload a file or a directory to your machine through WinRM.
|
32
|
+
|
33
|
+
vagrant winrm-upload "c:\mylocalFolder" "d:\" Windows2008VM
|
34
|
+
|
35
|
+
## <a name="usage-winrm-config"> winrm-config
|
36
|
+
|
37
|
+
This command prints the current WinRM configuration of your machine.
|
38
|
+
|
39
|
+
```bash
|
40
|
+
$ vagrant winrm-config --host "CustomHostname" Windows2008VM
|
41
|
+
Host CustomHostname
|
42
|
+
HostName Windows2008VM.vagrant.up
|
43
|
+
Port 5985
|
44
|
+
User vagrant
|
45
|
+
Password vagrant
|
46
|
+
```
|
47
|
+
|
48
|
+
## <a name="development"></a> Development
|
49
|
+
|
50
|
+
* Source hosted at [Gitlab][repo]
|
51
|
+
* Report issues/questions/feature requests on [Gitlab Issues][issues]
|
52
|
+
|
53
|
+
Pull requests are very welcome! Make sure your patches are well tested.
|
54
|
+
Ideally create a topic branch for every separate change you make. For
|
55
|
+
example:
|
56
|
+
|
57
|
+
1. Fork the repo
|
58
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
59
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
60
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
61
|
+
5. Create new Pull Request
|
62
|
+
|
63
|
+
## <a name="authors"></a> Authors
|
64
|
+
|
65
|
+
Created and maintained by [Baptiste Courtois][author] (<b.courtois@criteo.com>)
|
66
|
+
|
67
|
+
## <a name="license"></a> License
|
68
|
+
|
69
|
+
Apache 2.0 (see [LICENSE][license])
|
70
|
+
|
71
|
+
|
72
|
+
[author]: https://github.com/Annih
|
73
|
+
[issues]: https://gitlab.criteois.lan/ruby-gems/kitchen-vagrant_winrm/issues
|
74
|
+
[license]: https://gitlab.criteois.lan/ruby-gems/kitchen-vagrant_winrm/blob/master/LICENSE
|
75
|
+
[repo]: https://gitlab.criteois.lan/ruby-gems/kitchen-vagrant_winrm
|
76
|
+
[plugin_usage]: http://docs.vagrantup.com/v2/plugins/usage.html
|
77
|
+
|
78
|
+
[vagrant_dl]: http://downloads.vagrantup.com/
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
# Change to the directory of this file.
|
6
|
+
Dir.chdir(File.expand_path('../', __FILE__))
|
7
|
+
|
8
|
+
# For gem creation and bundling
|
9
|
+
require 'bundler/gem_tasks'
|
10
|
+
|
11
|
+
# Run the unit test suite
|
12
|
+
RSpec::Core::RakeTask.new do |task|
|
13
|
+
task.pattern = 'spec/**/*_spec.rb'
|
14
|
+
task.rspec_opts = ['--color', '-f documentation']
|
15
|
+
task.rspec_opts << '-tunit'
|
16
|
+
end
|
17
|
+
|
18
|
+
# Default task is to run tests
|
19
|
+
task :default => 'spec'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module VagrantWinRM
|
5
|
+
|
6
|
+
# This returns the path to the source of this plugin.
|
7
|
+
#
|
8
|
+
# @return [Pathname]
|
9
|
+
def self.source_root
|
10
|
+
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
11
|
+
end
|
12
|
+
|
13
|
+
# This initializes the internationalization strings.
|
14
|
+
def self.setup_i18n
|
15
|
+
I18n.load_path << File.expand_path('locales/en.yml', source_root)
|
16
|
+
I18n.reload!
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
VagrantPlugins::VagrantWinRM.setup_i18n()
|
22
|
+
require 'vagrant-winrm/plugin'
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'vagrant/util/safe_puts'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module VagrantWinRM
|
6
|
+
class WinRM < Vagrant.plugin('2', :command)
|
7
|
+
def self.synopsis
|
8
|
+
'connects to machine via WinRM'
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
options = {}
|
13
|
+
|
14
|
+
opts = OptionParser.new do |o|
|
15
|
+
o.banner = 'Usage: vagrant winrm [options] [name]'
|
16
|
+
o.separator ''
|
17
|
+
o.separator 'Options:'
|
18
|
+
o.separator ''
|
19
|
+
|
20
|
+
o.on('-c', '--command COMMAND', 'Execute a WinRM command directly') do |c|
|
21
|
+
options[:command] = Array.new if options[:command].nil?
|
22
|
+
options[:command].push c
|
23
|
+
end
|
24
|
+
|
25
|
+
o.on('--plugin-version', 'Print the version of the plugin and exit') do
|
26
|
+
options[:version] = true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Parse the options and return if we don't have any target.
|
31
|
+
argv = parse_options(opts)
|
32
|
+
return unless argv
|
33
|
+
|
34
|
+
if options[:version]
|
35
|
+
require "#{VagrantPlugins::VagrantWinRM.source_root}/lib/version"
|
36
|
+
safe_puts "Vagrant-winrm plugin #{VERSION}"
|
37
|
+
return 0
|
38
|
+
end
|
39
|
+
|
40
|
+
return 0 unless options[:command]
|
41
|
+
|
42
|
+
# Execute the actual WinRM command
|
43
|
+
with_target_vms(argv, single_target: true) do |vm|
|
44
|
+
|
45
|
+
raise Errors::ConfigurationError, { :communicator => vm.config.vm.communicator } if vm.config.vm.communicator != :winrm
|
46
|
+
|
47
|
+
exit_code = 0
|
48
|
+
@logger.debug("Executing a batch of #{options[:command].length} on remote machine")
|
49
|
+
|
50
|
+
options[:command].each do |c|
|
51
|
+
@logger.debug("Executing command: #{c}")
|
52
|
+
c.gsub! '"', '\"' if c.include? '`' or c.include? '$(' # Powershell is so strange sometimes!
|
53
|
+
exit_code |= vm.communicate.execute(c) do |type, data|
|
54
|
+
$stdout.print data if type == :stdout
|
55
|
+
$stderr.print data if type == :stderr
|
56
|
+
end
|
57
|
+
end
|
58
|
+
return exit_code
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'vagrant/util/safe_puts'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module VagrantWinRM
|
6
|
+
class WinRMConfig < Vagrant.plugin('2', :command)
|
7
|
+
include Vagrant::Util::SafePuts
|
8
|
+
|
9
|
+
def self.synopsis
|
10
|
+
'outputs winrm configuration to connect to the machine like ssh-config'
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
options = {}
|
15
|
+
|
16
|
+
opts = OptionParser.new do |o|
|
17
|
+
o.banner = 'Usage: vagrant winrm-config [options] [name]'
|
18
|
+
o.separator ''
|
19
|
+
o.separator 'Options:'
|
20
|
+
o.separator ''
|
21
|
+
|
22
|
+
o.on('--host NAME', 'Name the host for the config') do |h|
|
23
|
+
options[:host] = h
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Parse the options and return if we don't have any target.
|
28
|
+
argv = parse_options(opts)
|
29
|
+
return unless argv
|
30
|
+
|
31
|
+
with_target_vms(argv) do |machine|
|
32
|
+
|
33
|
+
variables = {
|
34
|
+
host_key: options[:host] || machine.name || 'vagrant',
|
35
|
+
winrm_host: machine.config.winrm.host,
|
36
|
+
winrm_port: machine.config.winrm.port,
|
37
|
+
winrm_user: machine.config.winrm.username,
|
38
|
+
winrm_password: machine.config.winrm.password
|
39
|
+
}
|
40
|
+
|
41
|
+
# Render the template and output directly to STDOUT
|
42
|
+
template = "#{VagrantPlugins::VagrantWinRM.source_root}/templates/winrm_config/config"
|
43
|
+
safe_puts(Vagrant::Util::TemplateRenderer.render(template, variables))
|
44
|
+
safe_puts
|
45
|
+
end
|
46
|
+
|
47
|
+
# Success, exit status 0
|
48
|
+
0
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module VagrantWinRM
|
5
|
+
class WinRMUpload < Vagrant.plugin('2', :command)
|
6
|
+
def self.synopsis
|
7
|
+
'upload file or directory to machine via WinRM'
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute
|
11
|
+
|
12
|
+
opts = OptionParser.new do |o|
|
13
|
+
o.banner = 'Usage: vagrant winrm-upload <source> <destination> [name]'
|
14
|
+
end
|
15
|
+
|
16
|
+
# Parse the options and return if we don't have any target.
|
17
|
+
argv = parse_options opts
|
18
|
+
return unless argv
|
19
|
+
|
20
|
+
if argv.empty? || argv.length > 3 || argv.length < 2
|
21
|
+
raise Vagrant::Errors::CLIInvalidUsage,
|
22
|
+
help: opts.help.chomp
|
23
|
+
end
|
24
|
+
|
25
|
+
source = argv[0]
|
26
|
+
destination = argv[1]
|
27
|
+
argv = argv.drop(2)
|
28
|
+
|
29
|
+
# Execute the actual WinRM
|
30
|
+
with_target_vms(argv, single_target: true) do |vm|
|
31
|
+
|
32
|
+
raise Errors::ConfigurationError, { :communicator => vm.config.vm.communicator } if vm.config.vm.communicator != :winrm
|
33
|
+
|
34
|
+
@logger.debug("Uploading #{source} to #{destination}")
|
35
|
+
return vm.communicate.upload(source, destination)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VagrantWinRM
|
3
|
+
module Errors
|
4
|
+
# A convenient superclass for all our errors.
|
5
|
+
class WinRMError < Vagrant::Errors::VagrantError
|
6
|
+
error_namespace('vagrant_winrm.errors')
|
7
|
+
end
|
8
|
+
|
9
|
+
class ConfigurationError < WinRMError
|
10
|
+
error_key(:config_error)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module VagrantWinRM
|
5
|
+
autoload :Errors, File.expand_path('../errors', __FILE__)
|
6
|
+
|
7
|
+
class Plugin < Vagrant.plugin('2')
|
8
|
+
name 'winrm'
|
9
|
+
description <<-DESC
|
10
|
+
This plugin extends Vagrant WinRM features and add new commands.
|
11
|
+
DESC
|
12
|
+
|
13
|
+
command 'winrm-config' do
|
14
|
+
require_relative 'commands/winrm_config'
|
15
|
+
WinRMConfig
|
16
|
+
end
|
17
|
+
|
18
|
+
command 'winrm-upload' do
|
19
|
+
require_relative 'commands/winrm_upload'
|
20
|
+
WinRMUpload
|
21
|
+
end
|
22
|
+
|
23
|
+
command 'winrm' do
|
24
|
+
require_relative 'commands/winrm'
|
25
|
+
WinRM
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/version.rb
ADDED
data/locales/en.yml
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
require 'rspec'
|
7
|
+
require './lib/vagrant-winrm.rb'
|
8
|
+
require './lib/vagrant-winrm/plugin.rb'
|
9
|
+
require './lib/vagrant-winrm/plugin.rb'
|
10
|
+
require './lib/vagrant-winrm/commands/winrm.rb'
|
11
|
+
require './lib/vagrant-winrm/commands/winrm_config.rb'
|
12
|
+
require './lib/vagrant-winrm/commands/winrm_upload.rb'
|
13
|
+
|
14
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.run_all_when_everything_filtered = true
|
17
|
+
config.filter_run :focus
|
18
|
+
|
19
|
+
# Run specs in random order to surface order dependencies. If you find an
|
20
|
+
# order dependency and want to debug it, you can fix the order by providing
|
21
|
+
# the seed, which is printed after each run.
|
22
|
+
# --seed 1234
|
23
|
+
config.order = 'random'
|
24
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
describe VagrantPlugins::VagrantWinRM::WinRMConfig, :unit => true do
|
5
|
+
|
6
|
+
=begin ############
|
7
|
+
# Here we mock!
|
8
|
+
=end ##############
|
9
|
+
|
10
|
+
let(:idx) { double('idx') }
|
11
|
+
let(:winrm_config) { double('winrm_config', host: 'winrm_super_host', port: 32424, username: 'usern@me', password: 'p4ssw0rd') }
|
12
|
+
let(:machine_config) { double('machine_config', winrm: winrm_config) }
|
13
|
+
let(:machine) { double('machine', config: machine_config, name: 'vagrant', provider: 'virtualbox', config: machine_config, ui: double('ui', opts: {})) }
|
14
|
+
let(:env) { double('env', root_path: '', home_path: '', ui_class: '', machine_names: [machine.name], active_machines: [machine], machine_index: idx, default_provider: 'virtualbox') }
|
15
|
+
|
16
|
+
before do
|
17
|
+
# Mock the local env creation
|
18
|
+
allow(machine).to receive(:vagrant_env).with('', { :ui_class => '' }).and_return env
|
19
|
+
|
20
|
+
# Mock the index to include only our machine
|
21
|
+
allow(idx).to receive(:release).with machine
|
22
|
+
allow(idx).to receive(:include?).with(any_args) do |name|
|
23
|
+
'vagrant' == name
|
24
|
+
end
|
25
|
+
allow(idx).to receive(:get).with(any_args) do |name|
|
26
|
+
env.machine(name.to_sym, :virtualbox)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Add our machine to the environment
|
30
|
+
allow(env).to receive(:machine).with(any_args, :virtualbox) do |name, provider|
|
31
|
+
machine if :vagrant == name
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
=begin ############
|
36
|
+
# Here we test!
|
37
|
+
=end ##############
|
38
|
+
describe 'execute' do
|
39
|
+
|
40
|
+
it 'displays help message with option --help' do
|
41
|
+
c = VagrantPlugins::VagrantWinRM::WinRMConfig.new(['--help'], env)
|
42
|
+
expect {
|
43
|
+
expect(c.execute).to be_nil
|
44
|
+
}.to output.to_stdout
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'raises error on unknown target' do
|
48
|
+
c = VagrantPlugins::VagrantWinRM::WinRMConfig.new(['unknownTarget'], env)
|
49
|
+
expect { c.execute }.to raise_error(Vagrant::Errors::VMNotFoundError)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'raises error ''invalid options'' on unknown option' do
|
53
|
+
c = VagrantPlugins::VagrantWinRM::WinRMConfig.new(['--unknown'], env)
|
54
|
+
expect { c.execute }.to raise_error(Vagrant::Errors::CLIInvalidOptions)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'ouputs the WinRMConfig with no Target' do
|
58
|
+
c = VagrantPlugins::VagrantWinRM::WinRMConfig.new([], env)
|
59
|
+
begin
|
60
|
+
$stdout = StringIO.new
|
61
|
+
expect(c.execute).to be_zero
|
62
|
+
expect($stdout.string).to match(/#{machine.name}/)
|
63
|
+
expect($stdout.string).to match(/#{winrm_config.host}/)
|
64
|
+
expect($stdout.string).to match(/#{winrm_config.port}/)
|
65
|
+
expect($stdout.string).to match(/#{winrm_config.username}/)
|
66
|
+
expect($stdout.string).to match(/#{winrm_config.password}/)
|
67
|
+
ensure
|
68
|
+
$stdout = STDOUT
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'ouputs the WinRMConfig with target' do
|
73
|
+
c = VagrantPlugins::VagrantWinRM::WinRMConfig.new(['vagrant'], env)
|
74
|
+
begin
|
75
|
+
$stdout = StringIO.new
|
76
|
+
expect(c.execute).to be_zero
|
77
|
+
expect($stdout.string).to match(/#{machine.name}/)
|
78
|
+
expect($stdout.string).to match(/#{winrm_config.host}/)
|
79
|
+
expect($stdout.string).to match(/#{winrm_config.port}/)
|
80
|
+
expect($stdout.string).to match(/#{winrm_config.username}/)
|
81
|
+
expect($stdout.string).to match(/#{winrm_config.password}/)
|
82
|
+
ensure
|
83
|
+
$stdout = STDOUT
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'ouputs the WinRMConfig with custom host key when --host is provided' do
|
88
|
+
c = VagrantPlugins::VagrantWinRM::WinRMConfig.new(['--host', 'custom_host_key', 'vagrant'], env)
|
89
|
+
begin
|
90
|
+
$stdout = StringIO.new
|
91
|
+
expect(c.execute).to be_zero
|
92
|
+
expect($stdout.string).to match(/custom_host_key/)
|
93
|
+
expect($stdout.string).to match(/#{winrm_config.host}/)
|
94
|
+
expect($stdout.string).to match(/#{winrm_config.port}/)
|
95
|
+
expect($stdout.string).to match(/#{winrm_config.username}/)
|
96
|
+
expect($stdout.string).to match(/#{winrm_config.password}/)
|
97
|
+
ensure
|
98
|
+
$stdout = STDOUT
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
describe VagrantPlugins::VagrantWinRM::WinRM, :unit => true do
|
5
|
+
|
6
|
+
=begin ############
|
7
|
+
# Here we mock!
|
8
|
+
=end ##############
|
9
|
+
|
10
|
+
let(:idx) { double('idx') }
|
11
|
+
let(:communicator) { double('communicator') }
|
12
|
+
let(:config_vm) { double('config_vm', communicator: :winrm) }
|
13
|
+
let(:machine_config) { double('machine_config', vm: config_vm) }
|
14
|
+
let(:machine) { double('machine', config: machine_config, name: 'vagrant', provider: 'virtualbox', config: machine_config, communicate: communicator, ui: double('ui', opts: {})) }
|
15
|
+
let(:env) { double('env', root_path: '', home_path: '', ui_class: '', machine_names: [machine.name], active_machines: [machine], machine_index: idx, default_provider: 'virtualbox') }
|
16
|
+
|
17
|
+
before do
|
18
|
+
# Mock the local env creation
|
19
|
+
allow(machine).to receive(:vagrant_env).with('', { :ui_class => '' }).and_return env
|
20
|
+
|
21
|
+
# Mock the index to include only our machine
|
22
|
+
allow(idx).to receive(:release).with machine
|
23
|
+
allow(idx).to receive(:include?).with(any_args) do |name|
|
24
|
+
'vagrant' == name
|
25
|
+
end
|
26
|
+
allow(idx).to receive(:get).with(any_args) do |name|
|
27
|
+
env.machine(name.to_sym, :virtualbox)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Add our machine to the environment
|
31
|
+
allow(env).to receive(:machine).with(any_args, :virtualbox) do |name, provider|
|
32
|
+
machine if :vagrant == name
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
=begin ############
|
37
|
+
# Here we test!
|
38
|
+
=end ##############
|
39
|
+
describe 'execute' do
|
40
|
+
it 'does nothing with no option' do
|
41
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new([], env)
|
42
|
+
expect {
|
43
|
+
expect(c.execute).to be_zero
|
44
|
+
}.not_to output.to_stdout
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'gives proper version with option --plugin-version' do
|
48
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['--plugin-version'], env)
|
49
|
+
expect {
|
50
|
+
expect(c.execute).to be_zero
|
51
|
+
}.to output("Vagrant-winrm plugin 0.0.1\n").to_stdout
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'displays help message with option --help' do
|
55
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['--help'], env)
|
56
|
+
expect {
|
57
|
+
expect(c.execute).to be_nil
|
58
|
+
}.to output.to_stdout
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'raises error when communicator not winrm' do
|
62
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['-c', 'dummyCommand'], env)
|
63
|
+
expect(config_vm).to receive(:communicator).and_return :ssh
|
64
|
+
|
65
|
+
expect { c.execute }.to raise_error(VagrantPlugins::VagrantWinRM::Errors::ConfigurationError, /not configured to communicate through WinRM/)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'raises error on unknown target' do
|
69
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['-c', 'command1', 'unknownTarget'], env)
|
70
|
+
expect { c.execute }.to raise_error(Vagrant::Errors::VMNotFoundError)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'raises error ''invalid options'' on unknown option' do
|
74
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['--unknown'], env)
|
75
|
+
expect { c.execute }.to raise_error(Vagrant::Errors::CLIInvalidOptions)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'passes commands to communicator with no target' do
|
79
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['-c', 'command1', '--command', 'command2', '-c', 'command3', '--command', 'command4'], env)
|
80
|
+
|
81
|
+
expect(communicator).to receive(:execute).ordered.with('command1').and_return 0
|
82
|
+
expect(communicator).to receive(:execute).ordered.with('command2').and_return 0
|
83
|
+
expect(communicator).to receive(:execute).ordered.with('command3').and_return 0
|
84
|
+
expect(communicator).to receive(:execute).ordered.with('command4').and_return 0
|
85
|
+
|
86
|
+
expect {
|
87
|
+
expect(c.execute).to be_zero
|
88
|
+
}.not_to output.to_stdout
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'passes commands to communicator even with a specific target' do
|
92
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['-c', 'command5', '--command', 'command6', '-c', 'command7', '--command', 'command8', 'vagrant'], env)
|
93
|
+
expect(communicator).to receive(:execute).ordered.with('command5').and_return 0
|
94
|
+
expect(communicator).to receive(:execute).ordered.with('command6').and_return 0
|
95
|
+
expect(communicator).to receive(:execute).ordered.with('command7').and_return 0
|
96
|
+
expect(communicator).to receive(:execute).ordered.with('command8').and_return 0
|
97
|
+
expect {
|
98
|
+
expect(c.execute).to be_zero
|
99
|
+
}.not_to output.to_stdout
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'redirects winrm outputs to stdout' do
|
103
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['-c', 'command'], env)
|
104
|
+
|
105
|
+
expect(communicator).to receive(:execute).with('command').and_yield(:stdout, 'output message').and_return 0
|
106
|
+
expect {
|
107
|
+
expect(c.execute).to be_zero
|
108
|
+
}.to output('output message').to_stdout
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'redirects winrm errors to stderr' do
|
112
|
+
c = VagrantPlugins::VagrantWinRM::WinRM.new(['-c', 'command'], env)
|
113
|
+
|
114
|
+
expect(communicator).to receive(:execute).with('command').and_yield(:stderr, 'error message').and_return 0
|
115
|
+
expect {
|
116
|
+
expect(c.execute).to be_zero
|
117
|
+
}.to output('error message').to_stderr
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
describe VagrantPlugins::VagrantWinRM::WinRMUpload, :unit => true do
|
5
|
+
|
6
|
+
=begin ############
|
7
|
+
# Here we mock!
|
8
|
+
=end ##############
|
9
|
+
|
10
|
+
let(:idx) { double('idx') }
|
11
|
+
let(:communicator) { double('communicator') }
|
12
|
+
let(:config_vm) { double('config_vm', communicator: :winrm) }
|
13
|
+
let(:machine_config) { double('machine_config', vm: config_vm) }
|
14
|
+
let(:machine) { double('machine', config: machine_config, name: 'vagrant', provider: 'virtualbox', config: machine_config, communicate: communicator, ui: double('ui', opts: {})) }
|
15
|
+
let(:env) { double('env', root_path: '', home_path: '', ui_class: '', machine_names: [machine.name], active_machines: [machine], machine_index: idx, default_provider: 'virtualbox') }
|
16
|
+
|
17
|
+
before do
|
18
|
+
# Mock the local env creation
|
19
|
+
allow(machine).to receive(:vagrant_env).with('', { :ui_class => '' }).and_return env
|
20
|
+
|
21
|
+
# Mock the index to include only our machine
|
22
|
+
allow(idx).to receive(:release).with machine
|
23
|
+
allow(idx).to receive(:include?).with(any_args) do |name|
|
24
|
+
'vagrant' == name
|
25
|
+
end
|
26
|
+
allow(idx).to receive(:get).with(any_args) do |name|
|
27
|
+
env.machine(name.to_sym, :virtualbox)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Add our machine to the environment
|
31
|
+
allow(env).to receive(:machine).with(any_args, :virtualbox) do |name, provider|
|
32
|
+
machine if :vagrant == name
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
=begin ############
|
37
|
+
# Here we test!
|
38
|
+
=end ##############
|
39
|
+
describe 'execute' do
|
40
|
+
it 'raises error ''invalid usage'' on bad usage' do
|
41
|
+
c = VagrantPlugins::VagrantWinRM::WinRMUpload.new([], env)
|
42
|
+
expect { c.execute }.to raise_error(Vagrant::Errors::CLIInvalidUsage)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'raises error ''invalid options'' on unknown option' do
|
46
|
+
c = VagrantPlugins::VagrantWinRM::WinRMUpload.new(['--unknown'], env)
|
47
|
+
expect { c.execute }.to raise_error(Vagrant::Errors::CLIInvalidOptions)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'displays help message with option --help' do
|
51
|
+
c = VagrantPlugins::VagrantWinRM::WinRMUpload.new(['--help'], env)
|
52
|
+
expect {
|
53
|
+
expect(c.execute).to be_nil
|
54
|
+
}.to output.to_stdout
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'raises error when communicator not winrm' do
|
58
|
+
c = VagrantPlugins::VagrantWinRM::WinRMUpload.new(['source', 'destination'], env)
|
59
|
+
expect(config_vm).to receive(:communicator).and_return :ssh
|
60
|
+
|
61
|
+
expect { c.execute }.to raise_error(VagrantPlugins::VagrantWinRM::Errors::ConfigurationError, /not configured to communicate through WinRM/)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'raises error on unknown target' do
|
65
|
+
c = VagrantPlugins::VagrantWinRM::WinRMUpload.new(['source', 'destination', 'unknownTarget'], env)
|
66
|
+
expect { c.execute }.to raise_error Vagrant::Errors::VMNotFoundError
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
it 'passes source and destination to communicator with no target' do
|
71
|
+
c = VagrantPlugins::VagrantWinRM::WinRMUpload.new(['source', 'destination'], env)
|
72
|
+
expect(communicator).to receive(:upload).with('source', 'destination').and_return 0
|
73
|
+
|
74
|
+
expect {
|
75
|
+
expect(c.execute).to be_zero
|
76
|
+
}.not_to output.to_stdout
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'passes source and destination to communicator even with a specific target' do
|
80
|
+
c = VagrantPlugins::VagrantWinRM::WinRMUpload.new(['source', 'destination', 'vagrant'], env)
|
81
|
+
expect(communicator).to receive(:upload).with('source', 'destination').and_return 0
|
82
|
+
expect {
|
83
|
+
expect(c.execute).to be_zero
|
84
|
+
}.not_to output.to_stdout
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'vagrant-winrm'
|
6
|
+
s.version = VagrantPlugins::VagrantWinRM::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ['Baptiste Courtois']
|
9
|
+
s.email = ['b.courtois@criteo.fr']
|
10
|
+
s.homepage = 'https://gitlab.criteois.lan/ruby-gems/vagrant-winrm/'
|
11
|
+
s.summary = 'A Vagrant 1.6+ plugin extending WinRM communication features.'
|
12
|
+
s.description = 'A Vagrant 1.6+ plugin that adds new command to extends WinRM communication features.'
|
13
|
+
s.license = 'Apache 2.0'
|
14
|
+
|
15
|
+
s.required_rubygems_version = '>= 2.0.0'
|
16
|
+
|
17
|
+
s.add_development_dependency 'rake'
|
18
|
+
s.add_development_dependency 'rspec_junit_formatter'
|
19
|
+
s.add_development_dependency 'rspec-core', '~> 3.0.0'
|
20
|
+
s.add_development_dependency 'rspec-expectations', '~> 3.0.0'
|
21
|
+
s.add_development_dependency 'rspec-mocks', '~> 3.0.0'
|
22
|
+
|
23
|
+
s.add_development_dependency 'bundler', '>= 1.0.0'
|
24
|
+
|
25
|
+
s.files = `git ls-files`.split("\n")
|
26
|
+
s.executables = `git ls-files`.split("\n").map { |f| f =~ /^bin\/(.*)/ ? $1 : nil }.compact
|
27
|
+
s.require_path = 'lib'
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vagrant-winrm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Baptiste Courtois
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-06-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec_junit_formatter
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec-core
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.0.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-expectations
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.0.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.0.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-mocks
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.0.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.0.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: bundler
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.0.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.0.0
|
97
|
+
description: A Vagrant 1.6+ plugin that adds new command to extends WinRM communication
|
98
|
+
features.
|
99
|
+
email:
|
100
|
+
- b.courtois@criteo.fr
|
101
|
+
executables: []
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- .gitignore
|
106
|
+
- .travis.yml
|
107
|
+
- Gemfile
|
108
|
+
- LICENSE
|
109
|
+
- README.md
|
110
|
+
- Rakefile
|
111
|
+
- lib/vagrant-winrm.rb
|
112
|
+
- lib/vagrant-winrm/commands/winrm.rb
|
113
|
+
- lib/vagrant-winrm/commands/winrm_config.rb
|
114
|
+
- lib/vagrant-winrm/commands/winrm_upload.rb
|
115
|
+
- lib/vagrant-winrm/errors.rb
|
116
|
+
- lib/vagrant-winrm/plugin.rb
|
117
|
+
- lib/version.rb
|
118
|
+
- locales/en.yml
|
119
|
+
- spec/spec_helper.rb
|
120
|
+
- spec/vagrant-winrm/commands/winrm_config_spec.rb
|
121
|
+
- spec/vagrant-winrm/commands/winrm_spec.rb
|
122
|
+
- spec/vagrant-winrm/commands/winrm_upload_spec.rb
|
123
|
+
- templates/winrm_config/config.erb
|
124
|
+
- vagrant-winrm.gemspec
|
125
|
+
homepage: https://gitlab.criteois.lan/ruby-gems/vagrant-winrm/
|
126
|
+
licenses:
|
127
|
+
- Apache 2.0
|
128
|
+
metadata: {}
|
129
|
+
post_install_message:
|
130
|
+
rdoc_options: []
|
131
|
+
require_paths:
|
132
|
+
- lib
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - '>='
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 2.0.0
|
143
|
+
requirements: []
|
144
|
+
rubyforge_project:
|
145
|
+
rubygems_version: 2.0.14
|
146
|
+
signing_key:
|
147
|
+
specification_version: 4
|
148
|
+
summary: A Vagrant 1.6+ plugin extending WinRM communication features.
|
149
|
+
test_files: []
|