vagrant-shell-commander 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ InstalledFiles
7
+ _yardoc
8
+ coverage
9
+ doc/
10
+ lib/bundler/man
11
+ pkg
12
+ rdoc
13
+ spec/reports
14
+ test/tmp
15
+ test/version_tmp
16
+ tmp
17
+ .ruby-*
18
+ *~
19
+ .vagrant
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format doc
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3-p286
4
+ install: bundle install
5
+ script: bundle exec rake
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vagrant-shell-commander.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
8
+ end
@@ -0,0 +1,72 @@
1
+ GIT
2
+ remote: git://github.com/mitchellh/vagrant.git
3
+ revision: e1e57024dc78565b99b8f2ccdd9c388270bf2de0
4
+ specs:
5
+ vagrant (1.2.3.dev)
6
+ childprocess (~> 0.3.7)
7
+ erubis (~> 2.7.0)
8
+ i18n (~> 0.6.0)
9
+ log4r (~> 1.1.9)
10
+ net-scp (~> 1.1.0)
11
+ net-ssh (~> 2.6.6)
12
+
13
+ PATH
14
+ remote: .
15
+ specs:
16
+ vagrant-shell-commander (0.1.0)
17
+
18
+ GEM
19
+ remote: https://rubygems.org/
20
+ specs:
21
+ cane (2.6.0)
22
+ parallel
23
+ childprocess (0.3.9)
24
+ ffi (~> 1.0, >= 1.0.11)
25
+ diff-lcs (1.2.4)
26
+ erubis (2.7.0)
27
+ ffi (1.9.0)
28
+ i18n (0.6.4)
29
+ log4r (1.1.10)
30
+ multi_json (1.7.7)
31
+ net-scp (1.1.1)
32
+ net-ssh (>= 2.6.5)
33
+ net-ssh (2.6.7)
34
+ parallel (0.7.1)
35
+ rake (10.1.0)
36
+ reek (1.3.1)
37
+ ruby2ruby (~> 2.0.2)
38
+ ruby_parser (~> 3.1.1)
39
+ sexp_processor
40
+ rspec (2.13.0)
41
+ rspec-core (~> 2.13.0)
42
+ rspec-expectations (~> 2.13.0)
43
+ rspec-mocks (~> 2.13.0)
44
+ rspec-core (2.13.1)
45
+ rspec-expectations (2.13.0)
46
+ diff-lcs (>= 1.1.3, < 2.0)
47
+ rspec-mocks (2.13.1)
48
+ ruby2ruby (2.0.6)
49
+ ruby_parser (~> 3.1)
50
+ sexp_processor (~> 4.0)
51
+ ruby_parser (3.1.3)
52
+ sexp_processor (~> 4.1)
53
+ sexp_processor (4.2.1)
54
+ simplecov (0.7.1)
55
+ multi_json (~> 1.0)
56
+ simplecov-html (~> 0.7.1)
57
+ simplecov-html (0.7.1)
58
+ yard (0.8.6.2)
59
+
60
+ PLATFORMS
61
+ ruby
62
+
63
+ DEPENDENCIES
64
+ bundler (~> 1.3)
65
+ cane
66
+ rake
67
+ reek
68
+ rspec
69
+ simplecov
70
+ vagrant!
71
+ vagrant-shell-commander!
72
+ yard
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Federico Gimenez Nieto
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,34 @@
1
+ [![Build Status](https://travis-ci.org/fgimenez/vagrant-shell-commander.png)](https://travis-ci.org/fgimenez/vagrant-shell-commander)
2
+ [![Code Climate](https://codeclimate.com/github/fgimenez/vagrant-shell-commander.png)](https://codeclimate.com/github/fgimenez/vagrant-shell-commander)
3
+
4
+ # Vagrant::Shell::Commander
5
+
6
+ Vagrant plugin for executing arbitrary shell commands on guest. Executes the given command on all the machines on multinode environments. It also gives the option to specify a working directory.
7
+
8
+ ## Installation
9
+
10
+ Install it as a vagrant plugin:
11
+
12
+ $ vagrant plugin install vagrant-shell-commander
13
+
14
+ ## Usage
15
+
16
+ To execute a command on all the machines:
17
+
18
+ $ vagrant sh --cmd 'free'
19
+
20
+ Restrict the machine to run:
21
+
22
+ $ vagrant sh --cmd 'free' machine1
23
+
24
+ Add working directory:
25
+
26
+ $ vagrant sh --cmd 'ls -al' --cwd '/srv/www'
27
+
28
+ ## Contributing
29
+
30
+ 1. Fork it
31
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
32
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
33
+ 4. Push to the branch (`git push origin my-new-feature`)
34
+ 5. Create new Pull Request
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ Dir.glob('lib/tasks/*.rake').each { |r| import r }
4
+
5
+ task default: [:reek, :spec, :quality]
@@ -0,0 +1,6 @@
1
+ Vagrant.require_plugin "vagrant-shell-commander"
2
+
3
+ Vagrant::Config.run do |config|
4
+ config.vm.box = "canonical-ubuntu-12.04"
5
+ config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box"
6
+ end
@@ -0,0 +1,12 @@
1
+ begin
2
+ require 'cane/rake_task'
3
+
4
+ desc "Run cane to check quality metrics"
5
+ Cane::RakeTask.new(:quality) do |cane|
6
+ cane.abc_max = 15
7
+ cane.add_threshold 'coverage/.last_run.json', :>=, 95
8
+ cane.no_style = true
9
+ end
10
+ rescue LoadError
11
+ warn "cane not available, quality task not provided."
12
+ end
@@ -0,0 +1,5 @@
1
+ require 'reek/rake/task'
2
+
3
+ Reek::Rake::Task.new do |t|
4
+ t.fail_on_error = false
5
+ end
@@ -0,0 +1,6 @@
1
+ begin
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec)
4
+ rescue LoadError
5
+ warn "rspec not available, spec task not provided."
6
+ end
@@ -0,0 +1,15 @@
1
+ require "vagrant-shell-commander/version"
2
+ require "vagrant-shell-commander/option_manager"
3
+
4
+ module VagrantShellCommander
5
+ # Plugin definition
6
+ #
7
+ class Plugin < Vagrant.plugin("2")
8
+ name 'vagrant shell commander'
9
+
10
+ command 'sh' do
11
+ require_relative 'vagrant-shell-commander/command'
12
+ Command
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,53 @@
1
+ module VagrantShellCommander
2
+ # Main plugin command
3
+ class Command < Vagrant.plugin("2", "command")
4
+ attr_accessor :env
5
+
6
+ # Main entry point of this command
7
+ #
8
+ def execute
9
+ cli_options = OptionManager.new.execute
10
+ argv = parse_options(cli_options[:parser])
11
+
12
+ return unless argv
13
+
14
+ with_target_vms(argv) do |machine|
15
+ manage_machine(machine, cli_options)
16
+ end
17
+
18
+ 0
19
+ end
20
+
21
+ private
22
+
23
+ # Executes actions for a given machine
24
+ #
25
+ # @param [Vagrant::Machine] subject vm
26
+ # @param [Hash] Parser (:parser key) and parsed options (:values key)
27
+ # @return nil
28
+ #
29
+ def manage_machine(machine, cli_options)
30
+ if machine.state.id != :running
31
+ env.ui.info("Machine #{machine.name} is not running.")
32
+ return
33
+ end
34
+
35
+ machine.communicate.
36
+ execute(add_cwd_to_command(cli_options[:values][:cmd],
37
+ cli_options[:values][:cwd])) do |type, data|
38
+ env.ui.info("#{machine.name}:: #{data}")
39
+ end
40
+ end
41
+
42
+ # Adds the change to a working directory to the given command
43
+ #
44
+ # @param cmd [String] Shell command
45
+ # @param cwd [String] Optional working directory
46
+ # @return [String] Command with directory change if cwd is present
47
+ #
48
+ def add_cwd_to_command(cmd, cwd=nil)
49
+ return cmd unless cwd
50
+ "cd #{cwd} && #{cmd}"
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,31 @@
1
+ module VagrantShellCommander
2
+ # Option parser
3
+ #
4
+ class OptionManager
5
+ # Main parsing method
6
+ # @return [Hash] The keys are :parser for the object returned by
7
+ # OptionParser and :values for the actual option values
8
+ #
9
+ def execute
10
+ options = {}
11
+ block = lambda do |parser|
12
+ parser.banner = "Usage: vagrant sh --cmd 'COMMAND' --cwd [DIR] [MACHINE]"
13
+
14
+ parser.separator ''
15
+
16
+ parser.on('--cwd [DIR]', '--change-working-dir [DIR]',
17
+ 'Directory to execute the command') do |cwd|
18
+ options[:cwd] = cwd
19
+ end
20
+
21
+ parser.on("--cmd 'COMMAND'", "--command 'COMMAND'",
22
+ 'Command to execute') do |cmd|
23
+ options[:cmd] = cmd
24
+ end
25
+ end
26
+
27
+ {parser: OptionParser.new(&block), values: options}
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,3 @@
1
+ module VagrantShellCommander
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ describe VagrantShellCommander::Command do
4
+ let(:subject) {described_class.new('2', 'command')}
5
+ let(:argv) {double}
6
+ let(:opts) {{parser: 'parser', values: 'values'}}
7
+
8
+ before(:each) do
9
+ VagrantShellCommander::OptionManager.stub_chain(:new, :execute).
10
+ and_return(opts)
11
+
12
+ subject.stub(:with_target_vms)
13
+ subject.stub(:parse_options).and_return(argv)
14
+ end
15
+
16
+ describe '#execute' do
17
+ it 'returns 0 if all went good' do
18
+ expect(subject.execute).to eql(0)
19
+ end
20
+
21
+ describe 'options' do
22
+ after(:each) do
23
+ subject.execute
24
+ end
25
+
26
+ it 'parses the given options' do
27
+ subject.should_receive(:parse_options).with(opts[:parser])
28
+ end
29
+
30
+ it 'returns on option parsing failure' do
31
+ subject.stub(:parse_options).and_return(false)
32
+
33
+ expect(subject.execute).to eql(nil)
34
+ end
35
+
36
+ end
37
+
38
+ describe 'command execution' do
39
+ let(:machine) {double}
40
+ let(:ui) {double(info: true)}
41
+ let(:env) {double(ui: ui)}
42
+ let(:machine_name) {'machine_name'}
43
+
44
+ before(:each) do
45
+ subject.stub(:with_target_vms).and_yield(machine)
46
+ subject.stub(:env).and_return env
47
+ machine.stub(:name).and_return(machine_name)
48
+ end
49
+
50
+ after(:each) do
51
+ subject.execute
52
+ end
53
+
54
+ context 'not running machine' do
55
+ before(:each) do
56
+ machine.stub_chain(:state, :id).and_return(:not_running)
57
+ end
58
+
59
+ it 'reports information about state' do
60
+ ui.should_receive(:info).with("Machine #{machine_name} is not running.")
61
+ end
62
+
63
+ it 'dows not try to execute the command' do
64
+ machine.should_not_receive(:communicate)
65
+ end
66
+ end
67
+
68
+ context 'running machine' do
69
+ let(:cmd) {'command'}
70
+ let(:communicate) {double(execute: true)}
71
+
72
+ before(:each) do
73
+ VagrantShellCommander::OptionManager.stub_chain(:new, :execute).
74
+ and_return(parser: 'parser', values: {cmd: cmd})
75
+
76
+ machine.stub_chain(:state, :id).and_return(:running)
77
+ machine.stub(:communicate).and_return(communicate)
78
+ end
79
+
80
+ it 'executes the given command' do
81
+ communicate.should_receive(:execute).with(cmd)
82
+ end
83
+
84
+ it 'shows the command output along with the machine name' do
85
+ data = 'data'
86
+
87
+ communicate.stub(:execute).and_yield('type', data)
88
+
89
+ ui.should_receive(:info).with("#{machine_name}:: #{data}")
90
+ end
91
+
92
+ it 'executes the command in the given cwd' do
93
+ cwd = 'cwd'
94
+
95
+ VagrantShellCommander::OptionManager.stub_chain(:new, :execute).
96
+ and_return(parser: 'parser', values: {cmd: cmd, cwd: cwd})
97
+
98
+ communicate.should_receive(:execute).with("cd #{cwd} && #{cmd}")
99
+ end
100
+
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe VagrantShellCommander::OptionManager do
4
+ let(:subject) {described_class.new}
5
+ let(:argv) {double()}
6
+
7
+ describe '#execute' do
8
+ let(:option_parser) {double(:banner= => true,
9
+ separator: true,
10
+ on: true)}
11
+
12
+ before(:each) do
13
+ OptionParser.stub(:new).
14
+ and_yield(option_parser)
15
+
16
+ subject.stub(:parse_options).and_return(true)
17
+ end
18
+
19
+ after(:each) do
20
+
21
+ end
22
+
23
+ it 'displays a informing banner' do
24
+ option_parser.should_receive(:banner=)
25
+
26
+ subject.execute
27
+ end
28
+
29
+ it 'has a cwd option' do
30
+ cwd_value = 'cwd'
31
+
32
+ option_parser.stub(:on).with('--cwd [DIR]',
33
+ anything,
34
+ anything).
35
+ and_yield(cwd_value)
36
+
37
+ result = subject.execute
38
+
39
+ expect(result[:values][:cwd]).to eql(cwd_value)
40
+ end
41
+
42
+ it 'has a cmd option' do
43
+ cmd_value = 'cmd'
44
+
45
+ option_parser.stub(:on).with("--cmd 'COMMAND'",
46
+ anything,
47
+ anything).
48
+ and_yield(cmd_value)
49
+
50
+ result = subject.execute
51
+
52
+ expect(result[:values][:cmd]).to eql(cmd_value)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,26 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'vagrant'
5
+
6
+ # This file was generated by the `rspec --init` command. Conventionally, all
7
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
8
+ # Require this file using `require "spec_helper"` to ensure that it is only
9
+ # loaded once.
10
+ #
11
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
12
+
13
+ Dir['lib/**/*.rb'].each {|f| require File.expand_path(f)}
14
+
15
+ RSpec.configure do |config|
16
+ config.treat_symbols_as_metadata_keys_with_true_values = true
17
+ config.run_all_when_everything_filtered = true
18
+ config.filter_run :focus
19
+
20
+
21
+ # Run specs in random order to surface order dependencies. If you find an
22
+ # order dependency and want to debug it, you can fix the order by providing
23
+ # the seed, which is printed after each run.
24
+ # --seed 1234
25
+ config.order = 'random'
26
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe VagrantShellCommander::Plugin do
4
+ it 'should have a name' do
5
+ expect(described_class.name).not_to be_nil
6
+ end
7
+
8
+ it "should define a command of type Command" do
9
+ default_command = described_class.command.
10
+ to_hash[:"sh"]
11
+ expect(default_command).to be(VagrantShellCommander::Command)
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vagrant-shell-commander/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vagrant-shell-commander"
8
+ spec.version = VagrantShellCommander::VERSION
9
+ spec.authors = ["Federico Gimenez Nieto"]
10
+ spec.email = ["federico.gimenez@gmail.com"]
11
+ spec.description = %q{This plugin allows you to execute a given shell command on all the machines of your multinode environment. You can aldo specify the working directory to execute the command}
12
+ spec.summary = %q{Vagrant plugin for executing arbitrary shell commands on guest(s)}
13
+ spec.homepage = "https://github.com/fgimenez/vagrant-shell-commander"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "reek"
25
+ spec.add_development_dependency "cane"
26
+ spec.add_development_dependency "yard"
27
+ spec.add_development_dependency "simplecov"
28
+ end
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-shell-commander
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Federico Gimenez Nieto
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: reek
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: cane
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: yard
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: simplecov
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: This plugin allows you to execute a given shell command on all the machines
127
+ of your multinode environment. You can aldo specify the working directory to execute
128
+ the command
129
+ email:
130
+ - federico.gimenez@gmail.com
131
+ executables: []
132
+ extensions: []
133
+ extra_rdoc_files: []
134
+ files:
135
+ - .gitignore
136
+ - .rspec
137
+ - .travis.yml
138
+ - Gemfile
139
+ - Gemfile.lock
140
+ - LICENSE.txt
141
+ - README.md
142
+ - Rakefile
143
+ - Vagrantfile
144
+ - lib/tasks/cane.rake
145
+ - lib/tasks/reek.rake
146
+ - lib/tasks/rspec.rake
147
+ - lib/vagrant-shell-commander.rb
148
+ - lib/vagrant-shell-commander/command.rb
149
+ - lib/vagrant-shell-commander/option_manager.rb
150
+ - lib/vagrant-shell-commander/version.rb
151
+ - spec/command_spec.rb
152
+ - spec/option_manager_spec.rb
153
+ - spec/spec_helper.rb
154
+ - spec/vagrant_shell_commander_spec.rb
155
+ - vagrant-shell-commander.gemspec
156
+ homepage: https://github.com/fgimenez/vagrant-shell-commander
157
+ licenses:
158
+ - MIT
159
+ post_install_message:
160
+ rdoc_options: []
161
+ require_paths:
162
+ - lib
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ! '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ! '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ requirements: []
176
+ rubyforge_project:
177
+ rubygems_version: 1.8.25
178
+ signing_key:
179
+ specification_version: 3
180
+ summary: Vagrant plugin for executing arbitrary shell commands on guest(s)
181
+ test_files:
182
+ - spec/command_spec.rb
183
+ - spec/option_manager_spec.rb
184
+ - spec/spec_helper.rb
185
+ - spec/vagrant_shell_commander_spec.rb
186
+ has_rdoc: