fixed-vagrant 0.7.4.dev
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/.gitignore +15 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +272 -0
- data/Gemfile +21 -0
- data/LICENSE +21 -0
- data/README.md +75 -0
- data/Rakefile +22 -0
- data/bin/vagrant +22 -0
- data/config/default.rb +39 -0
- data/contrib/README.md +12 -0
- data/contrib/emacs/vagrant.el +8 -0
- data/contrib/vim/vagrantfile.vim +9 -0
- data/keys/README.md +17 -0
- data/keys/vagrant +27 -0
- data/keys/vagrant.ppk +26 -0
- data/keys/vagrant.pub +1 -0
- data/lib/vagrant.rb +42 -0
- data/lib/vagrant/action.rb +134 -0
- data/lib/vagrant/action/box.rb +11 -0
- data/lib/vagrant/action/box/destroy.rb +21 -0
- data/lib/vagrant/action/box/download.rb +72 -0
- data/lib/vagrant/action/box/package.rb +19 -0
- data/lib/vagrant/action/box/unpackage.rb +55 -0
- data/lib/vagrant/action/box/verify.rb +23 -0
- data/lib/vagrant/action/builder.rb +124 -0
- data/lib/vagrant/action/builtin.rb +104 -0
- data/lib/vagrant/action/env.rb +7 -0
- data/lib/vagrant/action/env/set.rb +18 -0
- data/lib/vagrant/action/environment.rb +50 -0
- data/lib/vagrant/action/general.rb +8 -0
- data/lib/vagrant/action/general/package.rb +109 -0
- data/lib/vagrant/action/general/validate.rb +19 -0
- data/lib/vagrant/action/vm.rb +31 -0
- data/lib/vagrant/action/vm/boot.rb +48 -0
- data/lib/vagrant/action/vm/check_box.rb +28 -0
- data/lib/vagrant/action/vm/check_guest_additions.rb +30 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +39 -0
- data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
- data/lib/vagrant/action/vm/clear_shared_folders.rb +32 -0
- data/lib/vagrant/action/vm/customize.rb +21 -0
- data/lib/vagrant/action/vm/destroy.rb +19 -0
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +30 -0
- data/lib/vagrant/action/vm/discard_state.rb +22 -0
- data/lib/vagrant/action/vm/export.rb +52 -0
- data/lib/vagrant/action/vm/forward_ports.rb +134 -0
- data/lib/vagrant/action/vm/forward_ports_helpers.rb +28 -0
- data/lib/vagrant/action/vm/halt.rb +29 -0
- data/lib/vagrant/action/vm/host_name.rb +21 -0
- data/lib/vagrant/action/vm/import.rb +35 -0
- data/lib/vagrant/action/vm/match_mac_address.rb +21 -0
- data/lib/vagrant/action/vm/network.rb +139 -0
- data/lib/vagrant/action/vm/nfs.rb +159 -0
- data/lib/vagrant/action/vm/nfs_helpers.rb +11 -0
- data/lib/vagrant/action/vm/package.rb +23 -0
- data/lib/vagrant/action/vm/package_vagrantfile.rb +33 -0
- data/lib/vagrant/action/vm/provision.rb +41 -0
- data/lib/vagrant/action/vm/resume.rb +20 -0
- data/lib/vagrant/action/vm/share_folders.rb +70 -0
- data/lib/vagrant/action/vm/suspend.rb +20 -0
- data/lib/vagrant/action/warden.rb +79 -0
- data/lib/vagrant/box.rb +90 -0
- data/lib/vagrant/box_collection.rb +53 -0
- data/lib/vagrant/cli.rb +55 -0
- data/lib/vagrant/command.rb +25 -0
- data/lib/vagrant/command/base.rb +106 -0
- data/lib/vagrant/command/box.rb +33 -0
- data/lib/vagrant/command/destroy.rb +17 -0
- data/lib/vagrant/command/group_base.rb +107 -0
- data/lib/vagrant/command/halt.rb +18 -0
- data/lib/vagrant/command/helpers.rb +33 -0
- data/lib/vagrant/command/init.rb +14 -0
- data/lib/vagrant/command/named_base.rb +14 -0
- data/lib/vagrant/command/package.rb +41 -0
- data/lib/vagrant/command/provision.rb +17 -0
- data/lib/vagrant/command/reload.rb +17 -0
- data/lib/vagrant/command/resume.rb +17 -0
- data/lib/vagrant/command/ssh.rb +42 -0
- data/lib/vagrant/command/ssh_config.rb +26 -0
- data/lib/vagrant/command/status.rb +22 -0
- data/lib/vagrant/command/suspend.rb +17 -0
- data/lib/vagrant/command/up.rb +19 -0
- data/lib/vagrant/command/upgrade_to_060.rb +45 -0
- data/lib/vagrant/command/version.rb +13 -0
- data/lib/vagrant/config.rb +123 -0
- data/lib/vagrant/config/base.rb +85 -0
- data/lib/vagrant/config/error_recorder.rb +19 -0
- data/lib/vagrant/config/nfs.rb +10 -0
- data/lib/vagrant/config/package.rb +9 -0
- data/lib/vagrant/config/ssh.rb +33 -0
- data/lib/vagrant/config/top.rb +61 -0
- data/lib/vagrant/config/vagrant.rb +16 -0
- data/lib/vagrant/config/vm.rb +137 -0
- data/lib/vagrant/config/vm/provisioner.rb +56 -0
- data/lib/vagrant/config/vm/sub_vm.rb +17 -0
- data/lib/vagrant/data_store.rb +70 -0
- data/lib/vagrant/downloaders.rb +7 -0
- data/lib/vagrant/downloaders/base.rb +23 -0
- data/lib/vagrant/downloaders/file.rb +22 -0
- data/lib/vagrant/downloaders/http.rb +64 -0
- data/lib/vagrant/environment.rb +392 -0
- data/lib/vagrant/errors.rb +332 -0
- data/lib/vagrant/hosts.rb +8 -0
- data/lib/vagrant/hosts/arch.rb +27 -0
- data/lib/vagrant/hosts/base.rb +78 -0
- data/lib/vagrant/hosts/bsd.rb +52 -0
- data/lib/vagrant/hosts/linux.rb +47 -0
- data/lib/vagrant/plugin.rb +57 -0
- data/lib/vagrant/provisioners.rb +9 -0
- data/lib/vagrant/provisioners/base.rb +63 -0
- data/lib/vagrant/provisioners/chef.rb +130 -0
- data/lib/vagrant/provisioners/chef_server.rb +103 -0
- data/lib/vagrant/provisioners/chef_solo.rb +142 -0
- data/lib/vagrant/provisioners/puppet.rb +137 -0
- data/lib/vagrant/provisioners/puppet_server.rb +55 -0
- data/lib/vagrant/provisioners/shell.rb +52 -0
- data/lib/vagrant/ssh.rb +173 -0
- data/lib/vagrant/ssh/session.rb +125 -0
- data/lib/vagrant/systems.rb +11 -0
- data/lib/vagrant/systems/base.rb +87 -0
- data/lib/vagrant/systems/debian.rb +36 -0
- data/lib/vagrant/systems/freebsd.rb +84 -0
- data/lib/vagrant/systems/gentoo.rb +27 -0
- data/lib/vagrant/systems/linux.rb +83 -0
- data/lib/vagrant/systems/linux/config.rb +21 -0
- data/lib/vagrant/systems/linux/error.rb +9 -0
- data/lib/vagrant/systems/redhat.rb +39 -0
- data/lib/vagrant/systems/solaris.rb +62 -0
- data/lib/vagrant/systems/ubuntu.rb +17 -0
- data/lib/vagrant/test_helpers.rb +128 -0
- data/lib/vagrant/ui.rb +69 -0
- data/lib/vagrant/util.rb +13 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/plain_logger.rb +25 -0
- data/lib/vagrant/util/platform.rb +65 -0
- data/lib/vagrant/util/resource_logger.rb +63 -0
- data/lib/vagrant/util/retryable.rb +25 -0
- data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
- data/lib/vagrant/util/template_renderer.rb +83 -0
- data/lib/vagrant/version.rb +6 -0
- data/lib/vagrant/vm.rb +177 -0
- data/templates/chef_server_client.erb +18 -0
- data/templates/chef_solo_solo.erb +19 -0
- data/templates/commands/init/Vagrantfile.erb +82 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/locales/en.yml +535 -0
- data/templates/network_entry_debian.erb +8 -0
- data/templates/network_entry_gentoo.erb +5 -0
- data/templates/network_entry_redhat.erb +8 -0
- data/templates/nfs/exports.erb +5 -0
- data/templates/nfs/exports_linux.erb +5 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/templates/ssh_config.erb +9 -0
- data/test/locales/en.yml +8 -0
- data/test/test_helper.rb +26 -0
- data/test/vagrant/action/box/destroy_test.rb +18 -0
- data/test/vagrant/action/box/download_test.rb +125 -0
- data/test/vagrant/action/box/package_test.rb +25 -0
- data/test/vagrant/action/box/unpackage_test.rb +84 -0
- data/test/vagrant/action/box/verify_test.rb +30 -0
- data/test/vagrant/action/builder_test.rb +203 -0
- data/test/vagrant/action/env/set_test.rb +24 -0
- data/test/vagrant/action/environment_test.rb +27 -0
- data/test/vagrant/action/general/package_test.rb +268 -0
- data/test/vagrant/action/general/validate_test.rb +31 -0
- data/test/vagrant/action/vm/boot_test.rb +66 -0
- data/test/vagrant/action/vm/check_box_test.rb +56 -0
- data/test/vagrant/action/vm/check_guest_additions_test.rb +9 -0
- data/test/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
- data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +72 -0
- data/test/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
- data/test/vagrant/action/vm/clear_shared_folders_test.rb +49 -0
- data/test/vagrant/action/vm/customize_test.rb +30 -0
- data/test/vagrant/action/vm/destroy_test.rb +25 -0
- data/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
- data/test/vagrant/action/vm/discard_state_test.rb +45 -0
- data/test/vagrant/action/vm/export_test.rb +107 -0
- data/test/vagrant/action/vm/forward_ports_helpers_test.rb +70 -0
- data/test/vagrant/action/vm/forward_ports_test.rb +194 -0
- data/test/vagrant/action/vm/halt_test.rb +79 -0
- data/test/vagrant/action/vm/host_name_test.rb +36 -0
- data/test/vagrant/action/vm/import_test.rb +66 -0
- data/test/vagrant/action/vm/match_mac_address_test.rb +36 -0
- data/test/vagrant/action/vm/network_test.rb +286 -0
- data/test/vagrant/action/vm/nfs_helpers_test.rb +26 -0
- data/test/vagrant/action/vm/nfs_test.rb +260 -0
- data/test/vagrant/action/vm/package_test.rb +25 -0
- data/test/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
- data/test/vagrant/action/vm/provision_test.rb +90 -0
- data/test/vagrant/action/vm/resume_test.rb +35 -0
- data/test/vagrant/action/vm/share_folders_test.rb +139 -0
- data/test/vagrant/action/vm/suspend_test.rb +35 -0
- data/test/vagrant/action/warden_test.rb +119 -0
- data/test/vagrant/action_test.rb +89 -0
- data/test/vagrant/box_collection_test.rb +45 -0
- data/test/vagrant/box_test.rb +74 -0
- data/test/vagrant/cli_test.rb +35 -0
- data/test/vagrant/command/base_test.rb +23 -0
- data/test/vagrant/command/group_base_test.rb +15 -0
- data/test/vagrant/command/helpers_test.rb +88 -0
- data/test/vagrant/command/package_test.rb +27 -0
- data/test/vagrant/config/base_test.rb +52 -0
- data/test/vagrant/config/error_recorder_test.rb +18 -0
- data/test/vagrant/config/ssh_test.rb +12 -0
- data/test/vagrant/config/vagrant_test.rb +35 -0
- data/test/vagrant/config/vm/provisioner_test.rb +92 -0
- data/test/vagrant/config/vm_test.rb +86 -0
- data/test/vagrant/config_test.rb +162 -0
- data/test/vagrant/data_store_test.rb +77 -0
- data/test/vagrant/downloaders/base_test.rb +28 -0
- data/test/vagrant/downloaders/file_test.rb +48 -0
- data/test/vagrant/downloaders/http_test.rb +80 -0
- data/test/vagrant/environment_test.rb +508 -0
- data/test/vagrant/errors_test.rb +42 -0
- data/test/vagrant/hosts/base_test.rb +46 -0
- data/test/vagrant/hosts/bsd_test.rb +53 -0
- data/test/vagrant/hosts/linux_test.rb +54 -0
- data/test/vagrant/plugin_test.rb +9 -0
- data/test/vagrant/provisioners/base_test.rb +63 -0
- data/test/vagrant/provisioners/chef_server_test.rb +188 -0
- data/test/vagrant/provisioners/chef_solo_test.rb +219 -0
- data/test/vagrant/provisioners/chef_test.rb +179 -0
- data/test/vagrant/provisioners/puppet_server_test.rb +68 -0
- data/test/vagrant/provisioners/puppet_test.rb +182 -0
- data/test/vagrant/provisioners/shell_test.rb +68 -0
- data/test/vagrant/ssh/session_test.rb +40 -0
- data/test/vagrant/ssh_test.rb +342 -0
- data/test/vagrant/systems/base_test.rb +18 -0
- data/test/vagrant/systems/linux_test.rb +114 -0
- data/test/vagrant/ui_test.rb +29 -0
- data/test/vagrant/util/busy_test.rb +106 -0
- data/test/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
- data/test/vagrant/util/plain_logger_test.rb +17 -0
- data/test/vagrant/util/platform_test.rb +18 -0
- data/test/vagrant/util/resource_logger_test.rb +78 -0
- data/test/vagrant/util/retryable_test.rb +50 -0
- data/test/vagrant/util/stacked_proc_runner_test.rb +43 -0
- data/test/vagrant/util/template_renderer_test.rb +145 -0
- data/test/vagrant/vm_test.rb +291 -0
- data/vagrant.gemspec +36 -0
- metadata +514 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'archive/tar/minitar'
|
|
3
|
+
|
|
4
|
+
module Vagrant
|
|
5
|
+
class Action
|
|
6
|
+
module Box
|
|
7
|
+
# Unpackages a downloaded box to a given directory with a given
|
|
8
|
+
# name.
|
|
9
|
+
#
|
|
10
|
+
# # Required Variables
|
|
11
|
+
#
|
|
12
|
+
# * `download.temp_path` - A location for the downloaded box. This is
|
|
13
|
+
# set by the {Download} action.
|
|
14
|
+
# * `box` - A {Vagrant::Box} object.
|
|
15
|
+
#
|
|
16
|
+
class Unpackage
|
|
17
|
+
attr_reader :box_directory
|
|
18
|
+
|
|
19
|
+
def initialize(app, env)
|
|
20
|
+
@app = app
|
|
21
|
+
@env = env
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def call(env)
|
|
25
|
+
@env = env
|
|
26
|
+
|
|
27
|
+
setup_box_directory
|
|
28
|
+
decompress
|
|
29
|
+
|
|
30
|
+
@app.call(@env)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def recover(env)
|
|
34
|
+
if box_directory && File.directory?(box_directory)
|
|
35
|
+
FileUtils.rm_rf(box_directory)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def setup_box_directory
|
|
40
|
+
raise Errors::BoxAlreadyExists, :name => @env["box"].name if File.directory?(@env["box"].directory)
|
|
41
|
+
|
|
42
|
+
FileUtils.mkdir_p(@env["box"].directory)
|
|
43
|
+
@box_directory = @env["box"].directory
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def decompress
|
|
47
|
+
Dir.chdir(@env["box"].directory) do
|
|
48
|
+
@env.ui.info I18n.t("vagrant.actions.box.unpackage.extracting")
|
|
49
|
+
Archive::Tar::Minitar.unpack(@env["download.temp_path"], @env["box"].directory.to_s)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module Box
|
|
4
|
+
class Verify
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
@env = env
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def call(env)
|
|
11
|
+
begin
|
|
12
|
+
env.ui.info I18n.t("vagrant.actions.box.verify.verifying")
|
|
13
|
+
VirtualBox::Appliance.new(env["box"].ovf_file.to_s)
|
|
14
|
+
rescue Exception
|
|
15
|
+
raise Errors::BoxVerificationFailed
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
@app.call(env)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
# Action builder which provides a nice DSL for building up
|
|
4
|
+
# a middleware sequence for Vagrant actions. This code is based
|
|
5
|
+
# heavily off of `Rack::Builder` and `ActionDispatch::MiddlewareStack`
|
|
6
|
+
# in Rack and Rails, respectively.
|
|
7
|
+
#
|
|
8
|
+
# Usage
|
|
9
|
+
#
|
|
10
|
+
# Building an action sequence is very easy:
|
|
11
|
+
#
|
|
12
|
+
# app = Vagrant::Action::Builder.new do
|
|
13
|
+
# use MiddlewareA
|
|
14
|
+
# use MiddlewareB
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# Vagrant::Action.run(app)
|
|
18
|
+
#
|
|
19
|
+
class Builder
|
|
20
|
+
# Initializes the builder. An optional block can be passed which
|
|
21
|
+
# will be evaluated in the context of the instance.
|
|
22
|
+
def initialize(&block)
|
|
23
|
+
instance_eval(&block) if block_given?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns the current stack of middlewares. You probably won't
|
|
27
|
+
# need to use this directly, and it's recommended that you don't.
|
|
28
|
+
#
|
|
29
|
+
# @return [Array]
|
|
30
|
+
def stack
|
|
31
|
+
@stack ||= []
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns a mergeable version of the builder. If `use` is called with
|
|
35
|
+
# the return value of this method, then the stack will merge, instead
|
|
36
|
+
# of being treated as a separate single middleware.
|
|
37
|
+
def flatten
|
|
38
|
+
lambda do |env|
|
|
39
|
+
self.call(env)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Adds a middleware class to the middleware stack. Any additional
|
|
44
|
+
# args and a block, if given, are saved and passed to the initializer
|
|
45
|
+
# of the middleware.
|
|
46
|
+
#
|
|
47
|
+
# @param [Class] middleware The middleware class
|
|
48
|
+
def use(middleware, *args, &block)
|
|
49
|
+
if middleware.kind_of?(Builder)
|
|
50
|
+
# Prepend with a environment setter if args are given
|
|
51
|
+
self.use(Env::Set, *args, &block) if !args.empty? && args.first.is_a?(Hash)
|
|
52
|
+
|
|
53
|
+
# Merge in the other builder's stack into our own
|
|
54
|
+
self.stack.concat(middleware.stack)
|
|
55
|
+
else
|
|
56
|
+
self.stack << [middleware, args, block]
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
self
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Inserts a middleware at the given index or directly before the
|
|
63
|
+
# given middleware object.
|
|
64
|
+
def insert(index, middleware, *args, &block)
|
|
65
|
+
index = self.index(index) unless index.is_a?(Integer)
|
|
66
|
+
stack.insert(index, [middleware, args, block])
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
alias_method :insert_before, :insert
|
|
70
|
+
|
|
71
|
+
# Inserts a middleware after the given index or middleware object.
|
|
72
|
+
def insert_after(index, middleware, *args, &block)
|
|
73
|
+
index = self.index(index) unless index.is_a?(Integer)
|
|
74
|
+
raise "no such middleware to insert after: #{index.inspect}" unless index
|
|
75
|
+
insert(index + 1, middleware, *args, &block)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Swaps out the given middlware object or index with the new
|
|
79
|
+
# middleware.
|
|
80
|
+
def swap(index, middleware, *args, &block)
|
|
81
|
+
if index.is_a?(Integer)
|
|
82
|
+
delete(index)
|
|
83
|
+
insert(index, middleware, *args, &block)
|
|
84
|
+
else
|
|
85
|
+
insert_before(index, middleware, *args, &block)
|
|
86
|
+
delete(index)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Deletes the given middleware object or index
|
|
91
|
+
def delete(index)
|
|
92
|
+
index = self.index(index) unless index.is_a?(Integer)
|
|
93
|
+
stack.delete_at(index)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Returns the numeric index for the given middleware object.
|
|
97
|
+
#
|
|
98
|
+
# @param [Object] object The item to find the index for
|
|
99
|
+
# @return [Integer]
|
|
100
|
+
def index(object)
|
|
101
|
+
stack.each_with_index do |item, i|
|
|
102
|
+
return i if item[0] == object
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
nil
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Converts the builder stack to a runnable action sequence.
|
|
109
|
+
#
|
|
110
|
+
# @param [Vagrant::Action::Environment] env The action environment
|
|
111
|
+
# @return [Object] A callable object
|
|
112
|
+
def to_app(env)
|
|
113
|
+
# Wrap the middleware stack with the Warden to provide a consistent
|
|
114
|
+
# and predictable behavior upon exceptions.
|
|
115
|
+
Warden.new(stack.dup, env)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Runs the builder stack with the given environment.
|
|
119
|
+
def call(env)
|
|
120
|
+
to_app(env).call(env)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
# Registers the builtin actions. These are locked away in a
|
|
4
|
+
# method so that their definition can be deferred until after
|
|
5
|
+
# all the necessary Vagrant libraries are loaded. Hopefully
|
|
6
|
+
# in the future this will no longer be necessary with autoloading.
|
|
7
|
+
def self.builtin!
|
|
8
|
+
# provision - Provisions a running VM
|
|
9
|
+
register(:provision, Builder.new do
|
|
10
|
+
use VM::Provision
|
|
11
|
+
end)
|
|
12
|
+
|
|
13
|
+
# start - Starts a VM, assuming it already exists on the
|
|
14
|
+
# environment.
|
|
15
|
+
register(:start, Builder.new do
|
|
16
|
+
use VM::CleanMachineFolder
|
|
17
|
+
use VM::Customize
|
|
18
|
+
use VM::ClearForwardedPorts
|
|
19
|
+
use VM::ForwardPorts
|
|
20
|
+
use VM::Provision
|
|
21
|
+
use VM::NFS
|
|
22
|
+
use VM::ClearSharedFolders
|
|
23
|
+
use VM::ShareFolders
|
|
24
|
+
use VM::HostName
|
|
25
|
+
use VM::Network
|
|
26
|
+
use VM::Boot
|
|
27
|
+
end)
|
|
28
|
+
|
|
29
|
+
# halt - Halts the VM, attempting gracefully but then forcing
|
|
30
|
+
# a restart if fails.
|
|
31
|
+
register(:halt, Builder.new do
|
|
32
|
+
use VM::DiscardState
|
|
33
|
+
use VM::Halt
|
|
34
|
+
end)
|
|
35
|
+
|
|
36
|
+
# suspend - Suspends the VM
|
|
37
|
+
register(:suspend, Builder.new do
|
|
38
|
+
use VM::Suspend
|
|
39
|
+
end)
|
|
40
|
+
|
|
41
|
+
# resume - Resume a VM
|
|
42
|
+
register(:resume, Builder.new do
|
|
43
|
+
use VM::Resume
|
|
44
|
+
end)
|
|
45
|
+
|
|
46
|
+
# reload - Halts then restarts the VM
|
|
47
|
+
register(:reload, Builder.new do
|
|
48
|
+
use Action[:halt]
|
|
49
|
+
use Action[:start]
|
|
50
|
+
end)
|
|
51
|
+
|
|
52
|
+
# up - Imports, prepares, then starts a fresh VM.
|
|
53
|
+
register(:up, Builder.new do
|
|
54
|
+
use VM::CheckBox
|
|
55
|
+
use VM::Import
|
|
56
|
+
use VM::MatchMACAddress
|
|
57
|
+
use VM::CheckGuestAdditions
|
|
58
|
+
use Action[:start]
|
|
59
|
+
end)
|
|
60
|
+
|
|
61
|
+
# destroy - Halts, cleans up, and destroys an existing VM
|
|
62
|
+
register(:destroy, Builder.new do
|
|
63
|
+
use Action[:halt], :force => true
|
|
64
|
+
use VM::ClearNFSExports
|
|
65
|
+
use VM::Destroy
|
|
66
|
+
use VM::CleanMachineFolder
|
|
67
|
+
use VM::DestroyUnusedNetworkInterfaces
|
|
68
|
+
end)
|
|
69
|
+
|
|
70
|
+
# package - Export and package the VM
|
|
71
|
+
register(:package, Builder.new do
|
|
72
|
+
use Action[:halt]
|
|
73
|
+
use VM::ClearForwardedPorts
|
|
74
|
+
use VM::ClearSharedFolders
|
|
75
|
+
use VM::Export
|
|
76
|
+
use VM::PackageVagrantfile
|
|
77
|
+
use VM::Package
|
|
78
|
+
end)
|
|
79
|
+
|
|
80
|
+
# box_add - Download and add a box.
|
|
81
|
+
register(:box_add, Builder.new do
|
|
82
|
+
use Box::Download
|
|
83
|
+
use Box::Unpackage
|
|
84
|
+
use Box::Verify
|
|
85
|
+
end)
|
|
86
|
+
|
|
87
|
+
# box_remove - Removes/deletes a box.
|
|
88
|
+
register(:box_remove, Builder.new do
|
|
89
|
+
use Box::Destroy
|
|
90
|
+
end)
|
|
91
|
+
|
|
92
|
+
# box_repackage - Repackages a box.
|
|
93
|
+
register(:box_repackage, Builder.new do
|
|
94
|
+
use Box::Package
|
|
95
|
+
end)
|
|
96
|
+
|
|
97
|
+
# Other callbacks. There will be more of these in the future. For
|
|
98
|
+
# now, these are limited to what are needed internally.
|
|
99
|
+
register(:before_action_run, Builder.new do
|
|
100
|
+
use General::Validate
|
|
101
|
+
end)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module Env
|
|
4
|
+
# A middleware which just sets up the environment with some
|
|
5
|
+
# options which are passed to it.
|
|
6
|
+
class Set
|
|
7
|
+
def initialize(app,env,options=nil)
|
|
8
|
+
@app = app
|
|
9
|
+
env.merge!(options || {})
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def call(env)
|
|
13
|
+
@app.call(env)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
# Represents an action environment which is what is passed
|
|
4
|
+
# to the `call` method of each action. This environment contains
|
|
5
|
+
# some helper methods for accessing the environment as well
|
|
6
|
+
# as being a hash, to store any additional options.
|
|
7
|
+
class Environment < Util::HashWithIndifferentAccess
|
|
8
|
+
# The {Vagrant::Environment} object represented by this
|
|
9
|
+
# action environment.
|
|
10
|
+
attr_reader :env
|
|
11
|
+
|
|
12
|
+
def initialize(env)
|
|
13
|
+
super() do |h,k|
|
|
14
|
+
# By default, try to find the key as a method on the
|
|
15
|
+
# environment. Gross eval use here.
|
|
16
|
+
begin
|
|
17
|
+
value = eval("h.env.#{k}")
|
|
18
|
+
h[k] = value
|
|
19
|
+
rescue Exception
|
|
20
|
+
nil
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@env = env
|
|
25
|
+
@interrupted = false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Returns a UI object from the environment
|
|
29
|
+
def ui
|
|
30
|
+
env.ui
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Marks an environment as interrupted (by an outside signal or
|
|
34
|
+
# anything). This will trigger any middleware sequences using this
|
|
35
|
+
# environment to halt. This is automatically set by {Action} when
|
|
36
|
+
# a SIGINT is captured.
|
|
37
|
+
def interrupt!
|
|
38
|
+
@interrupted = true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns a boolean denoting if environment has been interrupted
|
|
42
|
+
# with a SIGINT.
|
|
43
|
+
#
|
|
44
|
+
# @return [Bool]
|
|
45
|
+
def interrupted?
|
|
46
|
+
!!@interrupted
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'archive/tar/minitar'
|
|
3
|
+
|
|
4
|
+
module Vagrant
|
|
5
|
+
class Action
|
|
6
|
+
module General
|
|
7
|
+
# A general packaging (tar) middleware. Given the following options,
|
|
8
|
+
# it will do the right thing:
|
|
9
|
+
#
|
|
10
|
+
# * package.output - The filename of the outputted package.
|
|
11
|
+
# * package.include - An array of files to include in the package.
|
|
12
|
+
# * package.directory - The directory which contains the contents to
|
|
13
|
+
# compress into the package.
|
|
14
|
+
#
|
|
15
|
+
# This middleware always produces the final file in the current working
|
|
16
|
+
# directory (FileUtils.pwd)
|
|
17
|
+
class Package
|
|
18
|
+
include Util
|
|
19
|
+
|
|
20
|
+
def initialize(app, env)
|
|
21
|
+
@app = app
|
|
22
|
+
@env = env
|
|
23
|
+
@env["package.output"] ||= env["config"].package.name
|
|
24
|
+
@env["package.include"] ||= []
|
|
25
|
+
@env["package.vagrantfile"] ||= nil
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def call(env)
|
|
29
|
+
@env = env
|
|
30
|
+
|
|
31
|
+
raise Errors::PackageOutputExists if File.exist?(tar_path)
|
|
32
|
+
raise Errors::PackageRequiresDirectory if !@env["package.directory"] || !File.directory?(@env["package.directory"])
|
|
33
|
+
|
|
34
|
+
verify_files_to_copy
|
|
35
|
+
compress
|
|
36
|
+
|
|
37
|
+
@app.call(env)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def recover(env)
|
|
41
|
+
# Cleanup any packaged files if the packaging failed at some point.
|
|
42
|
+
File.delete(tar_path) if File.exist?(tar_path)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def files_to_copy
|
|
46
|
+
package_dir = Pathname.new(@env["package.directory"]).join("include")
|
|
47
|
+
|
|
48
|
+
files = @env["package.include"].inject({}) do |acc, file|
|
|
49
|
+
source = Pathname.new(file)
|
|
50
|
+
acc[file] = source.relative? ? package_dir.join(source) : package_dir.join(source.basename)
|
|
51
|
+
acc
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
files[@env["package.vagrantfile"]] = package_dir.join("_Vagrantfile") if @env["package.vagrantfile"]
|
|
55
|
+
files
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def verify_files_to_copy
|
|
59
|
+
files_to_copy.each do |file, _|
|
|
60
|
+
raise Errors::PackageIncludeMissing, :file => file if !File.exist?(file)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# This method copies the include files (passed in via command line)
|
|
65
|
+
# to the temporary directory so they are included in a sub-folder within
|
|
66
|
+
# the actual box
|
|
67
|
+
def copy_include_files
|
|
68
|
+
files_to_copy.each do |from, to|
|
|
69
|
+
@env.ui.info I18n.t("vagrant.actions.general.package.packaging", :file => from)
|
|
70
|
+
FileUtils.mkdir_p(to.parent)
|
|
71
|
+
|
|
72
|
+
# Copy direcotry contents recursively.
|
|
73
|
+
if File.directory?(from)
|
|
74
|
+
FileUtils.cp_r(Dir.glob(from), to.parent)
|
|
75
|
+
else
|
|
76
|
+
FileUtils.cp(from, to)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Compress the exported file into a package
|
|
82
|
+
def compress
|
|
83
|
+
@env.ui.info I18n.t("vagrant.actions.general.package.compressing", :tar_path => tar_path)
|
|
84
|
+
File.open(tar_path, Platform.tar_file_options) do |tar|
|
|
85
|
+
Archive::Tar::Minitar::Output.open(tar) do |output|
|
|
86
|
+
begin
|
|
87
|
+
current_dir = FileUtils.pwd
|
|
88
|
+
|
|
89
|
+
copy_include_files
|
|
90
|
+
|
|
91
|
+
FileUtils.cd(@env["package.directory"])
|
|
92
|
+
Dir.glob(File.join(".", "**", "*")).each do |entry|
|
|
93
|
+
Archive::Tar::Minitar.pack_file(entry, output)
|
|
94
|
+
end
|
|
95
|
+
ensure
|
|
96
|
+
FileUtils.cd(current_dir)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Path to the final box output file
|
|
103
|
+
def tar_path
|
|
104
|
+
File.join(FileUtils.pwd, @env["package.output"])
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|