tnargav 1.3.4 → 1.3.5
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.
- data/bin/vagrant +118 -0
- data/config/default.rb +34 -0
- data/keys/README.md +10 -0
- data/keys/vagrant +27 -0
- data/keys/vagrant.pub +1 -0
- data/lib/vagrant.rb +265 -0
- data/plugins/README.md +5 -0
- data/tasks/acceptance.rake +113 -0
- data/tasks/bundler.rake +3 -0
- data/tasks/test.rake +20 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/templates/rgloader.rb +9 -0
- data/tnargav.gemspec +1 -1
- metadata +15 -2
data/bin/vagrant
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Trap interrupts to quit cleanly. This will be overriden at some point
|
4
|
+
# by Vagrant. This is made to catch any interrupts while Vagrant is
|
5
|
+
# initializing which have historically resulted in stack traces.
|
6
|
+
Signal.trap("INT") { exit 1 }
|
7
|
+
|
8
|
+
require 'log4r'
|
9
|
+
require 'vagrant'
|
10
|
+
require 'vagrant/cli'
|
11
|
+
require 'vagrant/util/platform'
|
12
|
+
|
13
|
+
# Create a logger right away
|
14
|
+
logger = Log4r::Logger.new("vagrant::bin::vagrant")
|
15
|
+
logger.info("`vagrant` invoked: #{ARGV.inspect}")
|
16
|
+
|
17
|
+
# Stdout/stderr should not buffer output
|
18
|
+
$stdout.sync = true
|
19
|
+
$stderr.sync = true
|
20
|
+
|
21
|
+
# These will be the options that are passed to initialze the Vagrant
|
22
|
+
# environment.
|
23
|
+
opts = {}
|
24
|
+
|
25
|
+
# Disable color in a few cases:
|
26
|
+
#
|
27
|
+
# * --no-color is anywhere in our arguments
|
28
|
+
# * STDOUT is not a TTY
|
29
|
+
# * The terminal doesn't support colors (Windows)
|
30
|
+
#
|
31
|
+
if ARGV.include?("--no-color")
|
32
|
+
# Delete the argument from the list so that it doesn't
|
33
|
+
# cause any invalid arguments down the road.
|
34
|
+
ARGV.delete("--no-color")
|
35
|
+
|
36
|
+
opts[:ui_class] = Vagrant::UI::Basic
|
37
|
+
elsif !Vagrant::Util::Platform.terminal_supports_colors?
|
38
|
+
opts[:ui_class] = Vagrant::UI::Basic
|
39
|
+
elsif !$stdout.tty? && !Vagrant::Util::Platform.cygwin?
|
40
|
+
opts[:ui_class] = Vagrant::UI::Basic
|
41
|
+
end
|
42
|
+
|
43
|
+
# Also allow users to force colors.
|
44
|
+
if ARGV.include?("--color")
|
45
|
+
ARGV.delete("--color")
|
46
|
+
opts[:ui_class] = Vagrant::UI::Colored
|
47
|
+
end
|
48
|
+
|
49
|
+
# Default to colored output
|
50
|
+
opts[:ui_class] ||= Vagrant::UI::Colored
|
51
|
+
|
52
|
+
# This is kind of hacky, and I'd love to find a better way to do this, but
|
53
|
+
# if we're accessing the plugin interface, we want to NOT load plugins
|
54
|
+
# for this run, because they can actually interfere with the function
|
55
|
+
# of the plugin interface.
|
56
|
+
ARGV.each do |arg|
|
57
|
+
if !arg.start_with?("-")
|
58
|
+
ENV["VAGRANT_NO_PLUGINS"] = "1" if arg == "plugin"
|
59
|
+
break
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Fast path the version of Vagrant
|
64
|
+
if ARGV.include?("-v") || ARGV.include?("--version")
|
65
|
+
puts "Vagrant #{Vagrant::VERSION}"
|
66
|
+
exit 0
|
67
|
+
end
|
68
|
+
|
69
|
+
env = nil
|
70
|
+
begin
|
71
|
+
# Create the environment, which is the cwd of wherever the
|
72
|
+
# `vagrant` command was invoked from
|
73
|
+
logger.debug("Creating Vagrant environment")
|
74
|
+
env = Vagrant::Environment.new(opts)
|
75
|
+
|
76
|
+
if !Vagrant.in_installer?
|
77
|
+
warned = false
|
78
|
+
|
79
|
+
# If we're in a bundler environment, we assume it is for plugin
|
80
|
+
# development and will let the user know that.
|
81
|
+
if defined?(Bundler)
|
82
|
+
require 'bundler/shared_helpers'
|
83
|
+
if Bundler::SharedHelpers.in_bundle?
|
84
|
+
warned = true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# If we're not in the installer, warn.
|
89
|
+
env.ui.warn(I18n.t("vagrant.general.not_in_installer")) if !warned
|
90
|
+
end
|
91
|
+
|
92
|
+
begin
|
93
|
+
# Execute the CLI interface, and exit with the proper error code
|
94
|
+
exit_status = env.cli(ARGV)
|
95
|
+
ensure
|
96
|
+
# Unload the environment so cleanup can be done
|
97
|
+
env.unload
|
98
|
+
end
|
99
|
+
|
100
|
+
# Exit with the exit status from our CLI command
|
101
|
+
exit(exit_status)
|
102
|
+
rescue Vagrant::Errors::VagrantError => e
|
103
|
+
logger.error("Vagrant experienced an error! Details:")
|
104
|
+
logger.error(e.inspect)
|
105
|
+
logger.error(e.message)
|
106
|
+
logger.error(e.backtrace.join("\n"))
|
107
|
+
|
108
|
+
if env
|
109
|
+
opts = { :prefix => false }
|
110
|
+
env.ui.error e.message, opts if e.message
|
111
|
+
else
|
112
|
+
$stderr.puts "Vagrant failed to initialize at a very early stage:\n\n"
|
113
|
+
$stderr.puts e.message
|
114
|
+
end
|
115
|
+
|
116
|
+
exit e.status_code if e.respond_to?(:status_code)
|
117
|
+
exit 999 # An error occurred with no status code defined
|
118
|
+
end
|
data/config/default.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Vagrant.configure("2") do |config|
|
2
|
+
config.vagrant.host = :detect
|
3
|
+
|
4
|
+
config.ssh.forward_agent = false
|
5
|
+
config.ssh.forward_x11 = false
|
6
|
+
config.ssh.guest_port = 22
|
7
|
+
config.ssh.keep_alive = true
|
8
|
+
config.ssh.shell = "bash -l"
|
9
|
+
|
10
|
+
config.ssh.default.username = "vagrant"
|
11
|
+
|
12
|
+
config.vm.usable_port_range = (2200..2250)
|
13
|
+
config.vm.box_url = nil
|
14
|
+
config.vm.base_mac = nil
|
15
|
+
config.vm.boot_timeout = 300
|
16
|
+
config.vm.graceful_halt_timeout = 60
|
17
|
+
|
18
|
+
# Share SSH locally by default
|
19
|
+
config.vm.network :forwarded_port,
|
20
|
+
guest: 22,
|
21
|
+
host: 2222,
|
22
|
+
host_ip: "127.0.0.1",
|
23
|
+
id: "ssh",
|
24
|
+
auto_correct: true
|
25
|
+
|
26
|
+
# Share the root folder. This can then be overridden by
|
27
|
+
# other Vagrantfiles, if they wish.
|
28
|
+
config.vm.synced_folder ".", "/vagrant"
|
29
|
+
|
30
|
+
config.nfs.map_uid = :auto
|
31
|
+
config.nfs.map_gid = :auto
|
32
|
+
|
33
|
+
config.package.name = 'package.box'
|
34
|
+
end
|
data/keys/README.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# Insecure Keypair
|
2
|
+
|
3
|
+
These keys are the "insecure" public/private keypair we offer to
|
4
|
+
[base box creators](http://docs.vagrantup.com/v1/docs/base_boxes.html) for use in their base boxes so that
|
5
|
+
vagrant installations can automatically SSH into the boxes.
|
6
|
+
|
7
|
+
If you're working with a team or company or with a custom box and
|
8
|
+
you want more secure SSH, you should create your own keypair
|
9
|
+
and configure the private key in the Vagrantfile with
|
10
|
+
`config.ssh.private_key_path`
|
data/keys/vagrant
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEogIBAAKCAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzI
|
3
|
+
w+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoP
|
4
|
+
kcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2
|
5
|
+
hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NO
|
6
|
+
Td0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcW
|
7
|
+
yLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQIBIwKCAQEA4iqWPJXtzZA68mKd
|
8
|
+
ELs4jJsdyky+ewdZeNds5tjcnHU5zUYE25K+ffJED9qUWICcLZDc81TGWjHyAqD1
|
9
|
+
Bw7XpgUwFgeUJwUlzQurAv+/ySnxiwuaGJfhFM1CaQHzfXphgVml+fZUvnJUTvzf
|
10
|
+
TK2Lg6EdbUE9TarUlBf/xPfuEhMSlIE5keb/Zz3/LUlRg8yDqz5w+QWVJ4utnKnK
|
11
|
+
iqwZN0mwpwU7YSyJhlT4YV1F3n4YjLswM5wJs2oqm0jssQu/BT0tyEXNDYBLEF4A
|
12
|
+
sClaWuSJ2kjq7KhrrYXzagqhnSei9ODYFShJu8UWVec3Ihb5ZXlzO6vdNQ1J9Xsf
|
13
|
+
4m+2ywKBgQD6qFxx/Rv9CNN96l/4rb14HKirC2o/orApiHmHDsURs5rUKDx0f9iP
|
14
|
+
cXN7S1uePXuJRK/5hsubaOCx3Owd2u9gD6Oq0CsMkE4CUSiJcYrMANtx54cGH7Rk
|
15
|
+
EjFZxK8xAv1ldELEyxrFqkbE4BKd8QOt414qjvTGyAK+OLD3M2QdCQKBgQDtx8pN
|
16
|
+
CAxR7yhHbIWT1AH66+XWN8bXq7l3RO/ukeaci98JfkbkxURZhtxV/HHuvUhnPLdX
|
17
|
+
3TwygPBYZFNo4pzVEhzWoTtnEtrFueKxyc3+LjZpuo+mBlQ6ORtfgkr9gBVphXZG
|
18
|
+
YEzkCD3lVdl8L4cw9BVpKrJCs1c5taGjDgdInQKBgHm/fVvv96bJxc9x1tffXAcj
|
19
|
+
3OVdUN0UgXNCSaf/3A/phbeBQe9xS+3mpc4r6qvx+iy69mNBeNZ0xOitIjpjBo2+
|
20
|
+
dBEjSBwLk5q5tJqHmy/jKMJL4n9ROlx93XS+njxgibTvU6Fp9w+NOFD/HvxB3Tcz
|
21
|
+
6+jJF85D5BNAG3DBMKBjAoGBAOAxZvgsKN+JuENXsST7F89Tck2iTcQIT8g5rwWC
|
22
|
+
P9Vt74yboe2kDT531w8+egz7nAmRBKNM751U/95P9t88EDacDI/Z2OwnuFQHCPDF
|
23
|
+
llYOUI+SpLJ6/vURRbHSnnn8a/XG+nzedGH5JGqEJNQsz+xT2axM0/W/CRknmGaJ
|
24
|
+
kda/AoGANWrLCz708y7VYgAtW2Uf1DPOIYMdvo6fxIB5i9ZfISgcJ/bbCUkFrhoH
|
25
|
+
+vq/5CIWxCPp0f85R4qxxQ5ihxJ0YDQT9Jpx4TMss4PSavPaBH3RXow5Ohe+bYoQ
|
26
|
+
NE5OgEXk2wVfZczCZpigBKbKZHNYcelXtTt/nP3rsCuGcM4h53s=
|
27
|
+
-----END RSA PRIVATE KEY-----
|
data/keys/vagrant.pub
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key
|
data/lib/vagrant.rb
ADDED
@@ -0,0 +1,265 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
|
3
|
+
# Enable logging if it is requested. We do this before
|
4
|
+
# anything else so that we can setup the output before
|
5
|
+
# any logging occurs.
|
6
|
+
if ENV["VAGRANT_LOG"] && ENV["VAGRANT_LOG"] != ""
|
7
|
+
# Require Log4r and define the levels we'll be using
|
8
|
+
require 'log4r/config'
|
9
|
+
Log4r.define_levels(*Log4r::Log4rConfig::LogLevels)
|
10
|
+
|
11
|
+
level = nil
|
12
|
+
begin
|
13
|
+
level = Log4r.const_get(ENV["VAGRANT_LOG"].upcase)
|
14
|
+
rescue NameError
|
15
|
+
# This means that the logging constant wasn't found,
|
16
|
+
# which is fine. We just keep `level` as `nil`. But
|
17
|
+
# we tell the user.
|
18
|
+
level = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
# Some constants, such as "true" resolve to booleans, so the
|
22
|
+
# above error checking doesn't catch it. This will check to make
|
23
|
+
# sure that the log level is an integer, as Log4r requires.
|
24
|
+
level = nil if !level.is_a?(Integer)
|
25
|
+
|
26
|
+
if !level
|
27
|
+
# We directly write to stderr here because the VagrantError system
|
28
|
+
# is not setup yet.
|
29
|
+
$stderr.puts "Invalid VAGRANT_LOG level is set: #{ENV["VAGRANT_LOG"]}"
|
30
|
+
$stderr.puts ""
|
31
|
+
$stderr.puts "Please use one of the standard log levels: debug, info, warn, or error"
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
|
35
|
+
# Set the logging level on all "vagrant" namespaced
|
36
|
+
# logs as long as we have a valid level.
|
37
|
+
if level
|
38
|
+
logger = Log4r::Logger.new("vagrant")
|
39
|
+
logger.outputters = Log4r::Outputter.stderr
|
40
|
+
logger.level = level
|
41
|
+
logger = nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
require 'json'
|
46
|
+
require 'pathname'
|
47
|
+
require 'stringio'
|
48
|
+
|
49
|
+
require 'childprocess'
|
50
|
+
require 'i18n'
|
51
|
+
|
52
|
+
# OpenSSL must be loaded here since when it is loaded via `autoload`
|
53
|
+
# there are issues with ciphers not being properly loaded.
|
54
|
+
require 'openssl'
|
55
|
+
|
56
|
+
# Always make the version available
|
57
|
+
require 'vagrant/version'
|
58
|
+
global_logger = Log4r::Logger.new("vagrant::global")
|
59
|
+
global_logger.info("Vagrant version: #{Vagrant::VERSION}")
|
60
|
+
|
61
|
+
# We need these components always so instead of an autoload we
|
62
|
+
# just require them explicitly here.
|
63
|
+
require "vagrant/registry"
|
64
|
+
|
65
|
+
module Vagrant
|
66
|
+
autoload :Action, 'vagrant/action'
|
67
|
+
autoload :BatchAction, 'vagrant/batch_action'
|
68
|
+
autoload :Box, 'vagrant/box'
|
69
|
+
autoload :BoxCollection, 'vagrant/box_collection'
|
70
|
+
autoload :CLI, 'vagrant/cli'
|
71
|
+
autoload :Command, 'vagrant/command'
|
72
|
+
autoload :Config, 'vagrant/config'
|
73
|
+
autoload :Driver, 'vagrant/driver'
|
74
|
+
autoload :Environment, 'vagrant/environment'
|
75
|
+
autoload :Errors, 'vagrant/errors'
|
76
|
+
autoload :Guest, 'vagrant/guest'
|
77
|
+
autoload :Hosts, 'vagrant/hosts'
|
78
|
+
autoload :Machine, 'vagrant/machine'
|
79
|
+
autoload :MachineState, 'vagrant/machine_state'
|
80
|
+
autoload :Plugin, 'vagrant/plugin'
|
81
|
+
autoload :UI, 'vagrant/ui'
|
82
|
+
autoload :Util, 'vagrant/util'
|
83
|
+
|
84
|
+
# These are the various plugin versions and their components in
|
85
|
+
# a lazy loaded Hash-like structure.
|
86
|
+
PLUGIN_COMPONENTS = Registry.new.tap do |c|
|
87
|
+
c.register(:"1") { Plugin::V1::Plugin }
|
88
|
+
c.register([:"1", :command]) { Plugin::V1::Command }
|
89
|
+
c.register([:"1", :communicator]) { Plugin::V1::Communicator }
|
90
|
+
c.register([:"1", :config]) { Plugin::V1::Config }
|
91
|
+
c.register([:"1", :guest]) { Plugin::V1::Guest }
|
92
|
+
c.register([:"1", :host]) { Plugin::V1::Host }
|
93
|
+
c.register([:"1", :provider]) { Plugin::V1::Provider }
|
94
|
+
c.register([:"1", :provisioner]) { Plugin::V1::Provisioner }
|
95
|
+
|
96
|
+
c.register(:"2") { Plugin::V2::Plugin }
|
97
|
+
c.register([:"2", :command]) { Plugin::V2::Command }
|
98
|
+
c.register([:"2", :communicator]) { Plugin::V2::Communicator }
|
99
|
+
c.register([:"2", :config]) { Plugin::V2::Config }
|
100
|
+
c.register([:"2", :guest]) { Plugin::V2::Guest }
|
101
|
+
c.register([:"2", :host]) { Plugin::V2::Host }
|
102
|
+
c.register([:"2", :provider]) { Plugin::V2::Provider }
|
103
|
+
c.register([:"2", :provisioner]) { Plugin::V2::Provisioner }
|
104
|
+
end
|
105
|
+
|
106
|
+
# This returns a true/false showing whether we're running from the
|
107
|
+
# environment setup by the Vagrant installers.
|
108
|
+
#
|
109
|
+
# @return [Boolean]
|
110
|
+
def self.in_installer?
|
111
|
+
!!ENV["VAGRANT_INSTALLER_ENV"]
|
112
|
+
end
|
113
|
+
|
114
|
+
# The source root is the path to the root directory of
|
115
|
+
# the Vagrant gem.
|
116
|
+
def self.source_root
|
117
|
+
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
118
|
+
end
|
119
|
+
|
120
|
+
# Configure a Vagrant environment. The version specifies the version
|
121
|
+
# of the configuration that is expected by the block. The block, based
|
122
|
+
# on that version, configures the environment.
|
123
|
+
#
|
124
|
+
# Note that the block isn't run immediately. Instead, the configuration
|
125
|
+
# block is stored until later, and is run when an environment is loaded.
|
126
|
+
#
|
127
|
+
# @param [String] version Version of the configuration
|
128
|
+
def self.configure(version, &block)
|
129
|
+
Config.run(version, &block)
|
130
|
+
end
|
131
|
+
|
132
|
+
# This checks if a plugin with the given name is installed. This can
|
133
|
+
# be used from the Vagrantfile to easily branch based on plugin
|
134
|
+
# availability.
|
135
|
+
def self.has_plugin?(name)
|
136
|
+
plugin("2").manager.registered.any? { |plugin| plugin.name == name }
|
137
|
+
end
|
138
|
+
|
139
|
+
# Returns a superclass to use when creating a plugin for Vagrant.
|
140
|
+
# Given a specific version, this returns a proper superclass to use
|
141
|
+
# to register plugins for that version.
|
142
|
+
#
|
143
|
+
# Optionally, if you give a specific component, then it will return
|
144
|
+
# the proper superclass for that component as well.
|
145
|
+
#
|
146
|
+
# Plugins and plugin components should subclass the classes returned by
|
147
|
+
# this method. This method lets Vagrant core control these superclasses
|
148
|
+
# and change them over time without affecting plugins. For example, if
|
149
|
+
# the V1 superclass happens to be "Vagrant::V1," future versions of
|
150
|
+
# Vagrant may move it to "Vagrant::Plugins::V1" and plugins will not be
|
151
|
+
# affected.
|
152
|
+
#
|
153
|
+
# @param [String] version
|
154
|
+
# @param [String] component
|
155
|
+
# @return [Class]
|
156
|
+
def self.plugin(version, component=nil)
|
157
|
+
# Build up the key and return a result
|
158
|
+
key = version.to_s.to_sym
|
159
|
+
key = [key, component.to_s.to_sym] if component
|
160
|
+
result = PLUGIN_COMPONENTS.get(key)
|
161
|
+
|
162
|
+
# If we found our component then we return that
|
163
|
+
return result if result
|
164
|
+
|
165
|
+
# If we didn't find a result, then raise an exception, depending
|
166
|
+
# on if we got a component or not.
|
167
|
+
raise ArgumentError, "Plugin superclass not found for version/component: " +
|
168
|
+
"#{version} #{component}"
|
169
|
+
end
|
170
|
+
|
171
|
+
# This should be used instead of Ruby's built-in `require` in order to
|
172
|
+
# load a Vagrant plugin. This will load the given plugin by first doing
|
173
|
+
# a normal `require`, giving a nice error message if things go wrong,
|
174
|
+
# and second by verifying that a Vagrant plugin was actually defined in
|
175
|
+
# the process.
|
176
|
+
#
|
177
|
+
# @param [String] name Name of the plugin to load.
|
178
|
+
def self.require_plugin(name)
|
179
|
+
if ENV["VAGRANT_NO_PLUGINS"]
|
180
|
+
logger = Log4r::Logger.new("vagrant::root")
|
181
|
+
logger.warn("VAGRANT_NO_PLUGINS is set, not loading 3rd party plugin: #{name}")
|
182
|
+
return
|
183
|
+
end
|
184
|
+
|
185
|
+
# Redirect stdout/stderr so that we can output it in our own way.
|
186
|
+
previous_stderr = $stderr
|
187
|
+
previous_stdout = $stdout
|
188
|
+
$stderr = StringIO.new
|
189
|
+
$stdout = StringIO.new
|
190
|
+
|
191
|
+
# Attempt the normal require
|
192
|
+
begin
|
193
|
+
require name
|
194
|
+
rescue Exception => e
|
195
|
+
# Since this is a rare case, we create a one-time logger here
|
196
|
+
# in order to output the error
|
197
|
+
logger = Log4r::Logger.new("vagrant::root")
|
198
|
+
logger.error("Failed to load plugin: #{name}")
|
199
|
+
logger.error(" -- Error: #{e.inspect}")
|
200
|
+
logger.error(" -- Backtrace:")
|
201
|
+
logger.error(e.backtrace.join("\n"))
|
202
|
+
|
203
|
+
# If it is a LoadError we first try to see if it failed loading
|
204
|
+
# the top-level entrypoint. If so, then we report a different error.
|
205
|
+
if e.is_a?(LoadError)
|
206
|
+
# Parse the message in order to get what failed to load, and
|
207
|
+
# add some extra protection around if the message is different.
|
208
|
+
parts = e.to_s.split(" -- ", 2)
|
209
|
+
if parts.length == 2 && parts[1] == name
|
210
|
+
raise Errors::PluginLoadError, :plugin => name
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
# Get the string data out from the stdout/stderr captures
|
215
|
+
stderr = $stderr.string
|
216
|
+
stdout = $stdout.string
|
217
|
+
if !stderr.empty? || !stdout.empty?
|
218
|
+
raise Errors::PluginLoadFailedWithOutput,
|
219
|
+
:plugin => name,
|
220
|
+
:stderr => stderr,
|
221
|
+
:stdout => stdout
|
222
|
+
end
|
223
|
+
|
224
|
+
# And raise an error itself
|
225
|
+
raise Errors::PluginLoadFailed,
|
226
|
+
:plugin => name
|
227
|
+
end
|
228
|
+
ensure
|
229
|
+
$stderr = previous_stderr if previous_stderr
|
230
|
+
$stdout = previous_stdout if previous_stdout
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# Default I18n to load the en locale
|
235
|
+
I18n.load_path << File.expand_path("templates/locales/en.yml", Vagrant.source_root)
|
236
|
+
|
237
|
+
# A lambda that knows how to load plugins from a single directory.
|
238
|
+
plugin_load_proc = lambda do |directory|
|
239
|
+
# We only care about directories
|
240
|
+
next false if !directory.directory?
|
241
|
+
|
242
|
+
# If there is a plugin file in the top-level directory, then load
|
243
|
+
# that up.
|
244
|
+
plugin_file = directory.join("plugin.rb")
|
245
|
+
if plugin_file.file?
|
246
|
+
global_logger.debug("Loading core plugin: #{plugin_file}")
|
247
|
+
load(plugin_file)
|
248
|
+
next true
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
# Go through the `plugins` directory and attempt to load any plugins. The
|
253
|
+
# plugins are allowed to be in a directory in `plugins` or at most one
|
254
|
+
# directory deep within the plugins directory. So a plugin can be at
|
255
|
+
# `plugins/foo` or also at `plugins/foo/bar`, but no deeper.
|
256
|
+
Vagrant.source_root.join("plugins").children(true).each do |directory|
|
257
|
+
# Ignore non-directories
|
258
|
+
next if !directory.directory?
|
259
|
+
|
260
|
+
# Load from this directory, and exit if we successfully loaded a plugin
|
261
|
+
next if plugin_load_proc.call(directory)
|
262
|
+
|
263
|
+
# Otherwise, attempt to load from sub-directories
|
264
|
+
directory.children(true).each(&plugin_load_proc)
|
265
|
+
end
|
data/plugins/README.md
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
require 'net/http'
|
3
|
+
require 'pathname'
|
4
|
+
require 'uri'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
require 'childprocess'
|
8
|
+
|
9
|
+
require 'vagrant/util/file_checksum'
|
10
|
+
|
11
|
+
namespace :acceptance do
|
12
|
+
desc "Downloads the boxes required for running the acceptance tests."
|
13
|
+
task :boxes, :directory do |t, args|
|
14
|
+
# Create the directory where the boxes will be downloaded
|
15
|
+
box_dir = Pathname.new(args[:directory] || File.expand_path("../../boxes", __FILE__))
|
16
|
+
box_dir.mkpath
|
17
|
+
puts "Boxes will be placed in: #{box_dir}"
|
18
|
+
|
19
|
+
# Load the required boxes
|
20
|
+
boxes = YAML.load_file(File.expand_path("../../test/config/acceptance_boxes.yml", __FILE__))
|
21
|
+
|
22
|
+
boxes.each do |box|
|
23
|
+
puts "Box: #{box["name"]}"
|
24
|
+
box_file = box_dir.join("#{box["name"]}.box")
|
25
|
+
checksum = FileChecksum.new(box_file, Digest::SHA1)
|
26
|
+
|
27
|
+
# If the box exists, we need to check the checksum and determine if we need
|
28
|
+
# to redownload the file.
|
29
|
+
if box_file.exist?
|
30
|
+
print "Box exists, checking SHA1 sum... "
|
31
|
+
if checksum.checksum == box["checksum"]
|
32
|
+
print "OK\n"
|
33
|
+
next
|
34
|
+
else
|
35
|
+
print "FAIL\n"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Download the file. Note that this has no error checking and just uses
|
40
|
+
# pure net/http. There could be a better way.
|
41
|
+
puts "Downloading: #{box["url"]}"
|
42
|
+
destination = box_file.open("wb")
|
43
|
+
uri = URI.parse(box["url"])
|
44
|
+
Net::HTTP.new(uri.host, uri.port).start do |http|
|
45
|
+
http.request_get(uri.request_uri) do |response|
|
46
|
+
total = response.content_length
|
47
|
+
progress = 0
|
48
|
+
count = 0
|
49
|
+
|
50
|
+
response.read_body do |segment|
|
51
|
+
# Really elementary progress meter
|
52
|
+
progress += segment.length
|
53
|
+
count += 1
|
54
|
+
puts "Progress: #{(progress.to_f / total.to_f) * 100}%" if count % 300 == 0
|
55
|
+
|
56
|
+
# Write out to the destination file
|
57
|
+
destination.write(segment)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
destination.close
|
63
|
+
|
64
|
+
# Check the checksum of the new file to verify that it
|
65
|
+
# downloaded properly. This shouldn't happen, but it can!
|
66
|
+
if checksum.checksum != box["checksum"]
|
67
|
+
puts "Checksum didn't match! Download was corrupt!"
|
68
|
+
abort
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "Generates the configuration for acceptance tests from current source."
|
74
|
+
task :config, :box_dir do |t, args|
|
75
|
+
require File.expand_path("../../lib/vagrant/version", __FILE__)
|
76
|
+
require File.expand_path('../../test/support/tempdir', __FILE__)
|
77
|
+
|
78
|
+
# Get the directory for the boxes
|
79
|
+
box_dir = Pathname.new(args[:box_dir] || File.expand_path("../../boxes", __FILE__))
|
80
|
+
|
81
|
+
# Generate the binstubs for the Vagrant binary
|
82
|
+
tempdir = Tempdir.new
|
83
|
+
process = ChildProcess.build("bundle", "install", "--binstubs", tempdir.path)
|
84
|
+
process.io.inherit!
|
85
|
+
process.start
|
86
|
+
process.poll_for_exit(64000)
|
87
|
+
if process.exit_code != 0
|
88
|
+
# Bundle install failed...
|
89
|
+
puts "Bundle install failed!"
|
90
|
+
abort
|
91
|
+
end
|
92
|
+
|
93
|
+
# Generate the actual configuration
|
94
|
+
config = {
|
95
|
+
"vagrant_path" => File.join(tempdir.path, "vagrant"),
|
96
|
+
"vagrant_version" => Vagrant::VERSION,
|
97
|
+
"env" => {
|
98
|
+
"BUNDLE_GEMFILE" => File.expand_path("../../Gemfile", __FILE__)
|
99
|
+
},
|
100
|
+
"box_directory" => box_dir.to_s
|
101
|
+
}
|
102
|
+
|
103
|
+
File.open("acceptance_config.yml", "w+") do |f|
|
104
|
+
f.write(YAML.dump(config))
|
105
|
+
end
|
106
|
+
|
107
|
+
puts <<-OUTPUT
|
108
|
+
Acceptance test configuration is now in this directory in
|
109
|
+
"acceptance_config.yml." Set your ACCEPTANCE_CONFIG environmental
|
110
|
+
variable to this file and run any of the acceptance tests now.
|
111
|
+
OUTPUT
|
112
|
+
end
|
113
|
+
end
|
data/tasks/bundler.rake
ADDED
data/tasks/test.rake
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
namespace :test do
|
5
|
+
RSpec::Core::RakeTask.new do |t|
|
6
|
+
t.name = "unit"
|
7
|
+
t.pattern = "test/unit/**/*_test.rb"
|
8
|
+
end
|
9
|
+
|
10
|
+
Rake::TestTask.new do |t|
|
11
|
+
t.name = "unit_old"
|
12
|
+
t.libs << "test/unit_legacy"
|
13
|
+
t.pattern = "test/unit_legacy/**/*_test.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
RSpec::Core::RakeTask.new do |t|
|
17
|
+
t.name = "acceptance"
|
18
|
+
t.pattern = "test/acceptance/**/*_test.rb"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Vagrant::Config.run do |config|
|
2
|
+
# This Vagrantfile is auto-generated by `vagrant package` to contain
|
3
|
+
# the MAC address of the box. Custom configuration should be placed in
|
4
|
+
# the actual `Vagrantfile` in this box.
|
5
|
+
config.vm.base_mac = "<%= base_mac %>"
|
6
|
+
end
|
7
|
+
|
8
|
+
# Load include vagrant file if it exists after the auto-generated
|
9
|
+
# so it can override any of the settings
|
10
|
+
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
|
11
|
+
load include_vagrantfile if File.exist?(include_vagrantfile)
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# This file loads the proper rgloader/loader.rb file that comes packaged
|
2
|
+
# with Vagrant so that encoded files can properly run with Vagrant.
|
3
|
+
|
4
|
+
if ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]
|
5
|
+
require File.expand_path(
|
6
|
+
"rgloader/loader", ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"])
|
7
|
+
else
|
8
|
+
raise "Encoded files can't be read outside of the Vagrant installer."
|
9
|
+
end
|
data/tnargav.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
s.add_development_dependency "rspec-mocks", "~> 2.11.0"
|
33
33
|
|
34
34
|
root_path = File.dirname(__FILE__)
|
35
|
-
all_files = Dir.chdir(root_path) { Dir.glob("
|
35
|
+
all_files = Dir.chdir(root_path) { Dir.glob("{bin,config,keys,lib,plugins,tasks,templates,test}/**") }
|
36
36
|
all_files.reject! { |file| [".", ".."].include?(File.basename(file)) }
|
37
37
|
all_files += %w(CHANGELOG.md CONTRIBUTING.md Gemfile LICENSE README.md tnargav.gemspec)
|
38
38
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tnargav
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -225,10 +225,23 @@ description: Vagrant is a tool for building and distributing virtualized develop
|
|
225
225
|
email:
|
226
226
|
- mitchell.hashimoto@gmail.com
|
227
227
|
- john.m.bender@gmail.com
|
228
|
-
executables:
|
228
|
+
executables:
|
229
|
+
- vagrant
|
229
230
|
extensions: []
|
230
231
|
extra_rdoc_files: []
|
231
232
|
files:
|
233
|
+
- bin/vagrant
|
234
|
+
- config/default.rb
|
235
|
+
- keys/README.md
|
236
|
+
- keys/vagrant
|
237
|
+
- keys/vagrant.pub
|
238
|
+
- lib/vagrant.rb
|
239
|
+
- plugins/README.md
|
240
|
+
- tasks/acceptance.rake
|
241
|
+
- tasks/bundler.rake
|
242
|
+
- tasks/test.rake
|
243
|
+
- templates/package_Vagrantfile.erb
|
244
|
+
- templates/rgloader.rb
|
232
245
|
- CHANGELOG.md
|
233
246
|
- CONTRIBUTING.md
|
234
247
|
- Gemfile
|