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.
Files changed (242) hide show
  1. data/.gitignore +15 -0
  2. data/.yardopts +1 -0
  3. data/CHANGELOG.md +272 -0
  4. data/Gemfile +21 -0
  5. data/LICENSE +21 -0
  6. data/README.md +75 -0
  7. data/Rakefile +22 -0
  8. data/bin/vagrant +22 -0
  9. data/config/default.rb +39 -0
  10. data/contrib/README.md +12 -0
  11. data/contrib/emacs/vagrant.el +8 -0
  12. data/contrib/vim/vagrantfile.vim +9 -0
  13. data/keys/README.md +17 -0
  14. data/keys/vagrant +27 -0
  15. data/keys/vagrant.ppk +26 -0
  16. data/keys/vagrant.pub +1 -0
  17. data/lib/vagrant.rb +42 -0
  18. data/lib/vagrant/action.rb +134 -0
  19. data/lib/vagrant/action/box.rb +11 -0
  20. data/lib/vagrant/action/box/destroy.rb +21 -0
  21. data/lib/vagrant/action/box/download.rb +72 -0
  22. data/lib/vagrant/action/box/package.rb +19 -0
  23. data/lib/vagrant/action/box/unpackage.rb +55 -0
  24. data/lib/vagrant/action/box/verify.rb +23 -0
  25. data/lib/vagrant/action/builder.rb +124 -0
  26. data/lib/vagrant/action/builtin.rb +104 -0
  27. data/lib/vagrant/action/env.rb +7 -0
  28. data/lib/vagrant/action/env/set.rb +18 -0
  29. data/lib/vagrant/action/environment.rb +50 -0
  30. data/lib/vagrant/action/general.rb +8 -0
  31. data/lib/vagrant/action/general/package.rb +109 -0
  32. data/lib/vagrant/action/general/validate.rb +19 -0
  33. data/lib/vagrant/action/vm.rb +31 -0
  34. data/lib/vagrant/action/vm/boot.rb +48 -0
  35. data/lib/vagrant/action/vm/check_box.rb +28 -0
  36. data/lib/vagrant/action/vm/check_guest_additions.rb +30 -0
  37. data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
  38. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +39 -0
  39. data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
  40. data/lib/vagrant/action/vm/clear_shared_folders.rb +32 -0
  41. data/lib/vagrant/action/vm/customize.rb +21 -0
  42. data/lib/vagrant/action/vm/destroy.rb +19 -0
  43. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +30 -0
  44. data/lib/vagrant/action/vm/discard_state.rb +22 -0
  45. data/lib/vagrant/action/vm/export.rb +52 -0
  46. data/lib/vagrant/action/vm/forward_ports.rb +134 -0
  47. data/lib/vagrant/action/vm/forward_ports_helpers.rb +28 -0
  48. data/lib/vagrant/action/vm/halt.rb +29 -0
  49. data/lib/vagrant/action/vm/host_name.rb +21 -0
  50. data/lib/vagrant/action/vm/import.rb +35 -0
  51. data/lib/vagrant/action/vm/match_mac_address.rb +21 -0
  52. data/lib/vagrant/action/vm/network.rb +139 -0
  53. data/lib/vagrant/action/vm/nfs.rb +159 -0
  54. data/lib/vagrant/action/vm/nfs_helpers.rb +11 -0
  55. data/lib/vagrant/action/vm/package.rb +23 -0
  56. data/lib/vagrant/action/vm/package_vagrantfile.rb +33 -0
  57. data/lib/vagrant/action/vm/provision.rb +41 -0
  58. data/lib/vagrant/action/vm/resume.rb +20 -0
  59. data/lib/vagrant/action/vm/share_folders.rb +70 -0
  60. data/lib/vagrant/action/vm/suspend.rb +20 -0
  61. data/lib/vagrant/action/warden.rb +79 -0
  62. data/lib/vagrant/box.rb +90 -0
  63. data/lib/vagrant/box_collection.rb +53 -0
  64. data/lib/vagrant/cli.rb +55 -0
  65. data/lib/vagrant/command.rb +25 -0
  66. data/lib/vagrant/command/base.rb +106 -0
  67. data/lib/vagrant/command/box.rb +33 -0
  68. data/lib/vagrant/command/destroy.rb +17 -0
  69. data/lib/vagrant/command/group_base.rb +107 -0
  70. data/lib/vagrant/command/halt.rb +18 -0
  71. data/lib/vagrant/command/helpers.rb +33 -0
  72. data/lib/vagrant/command/init.rb +14 -0
  73. data/lib/vagrant/command/named_base.rb +14 -0
  74. data/lib/vagrant/command/package.rb +41 -0
  75. data/lib/vagrant/command/provision.rb +17 -0
  76. data/lib/vagrant/command/reload.rb +17 -0
  77. data/lib/vagrant/command/resume.rb +17 -0
  78. data/lib/vagrant/command/ssh.rb +42 -0
  79. data/lib/vagrant/command/ssh_config.rb +26 -0
  80. data/lib/vagrant/command/status.rb +22 -0
  81. data/lib/vagrant/command/suspend.rb +17 -0
  82. data/lib/vagrant/command/up.rb +19 -0
  83. data/lib/vagrant/command/upgrade_to_060.rb +45 -0
  84. data/lib/vagrant/command/version.rb +13 -0
  85. data/lib/vagrant/config.rb +123 -0
  86. data/lib/vagrant/config/base.rb +85 -0
  87. data/lib/vagrant/config/error_recorder.rb +19 -0
  88. data/lib/vagrant/config/nfs.rb +10 -0
  89. data/lib/vagrant/config/package.rb +9 -0
  90. data/lib/vagrant/config/ssh.rb +33 -0
  91. data/lib/vagrant/config/top.rb +61 -0
  92. data/lib/vagrant/config/vagrant.rb +16 -0
  93. data/lib/vagrant/config/vm.rb +137 -0
  94. data/lib/vagrant/config/vm/provisioner.rb +56 -0
  95. data/lib/vagrant/config/vm/sub_vm.rb +17 -0
  96. data/lib/vagrant/data_store.rb +70 -0
  97. data/lib/vagrant/downloaders.rb +7 -0
  98. data/lib/vagrant/downloaders/base.rb +23 -0
  99. data/lib/vagrant/downloaders/file.rb +22 -0
  100. data/lib/vagrant/downloaders/http.rb +64 -0
  101. data/lib/vagrant/environment.rb +392 -0
  102. data/lib/vagrant/errors.rb +332 -0
  103. data/lib/vagrant/hosts.rb +8 -0
  104. data/lib/vagrant/hosts/arch.rb +27 -0
  105. data/lib/vagrant/hosts/base.rb +78 -0
  106. data/lib/vagrant/hosts/bsd.rb +52 -0
  107. data/lib/vagrant/hosts/linux.rb +47 -0
  108. data/lib/vagrant/plugin.rb +57 -0
  109. data/lib/vagrant/provisioners.rb +9 -0
  110. data/lib/vagrant/provisioners/base.rb +63 -0
  111. data/lib/vagrant/provisioners/chef.rb +130 -0
  112. data/lib/vagrant/provisioners/chef_server.rb +103 -0
  113. data/lib/vagrant/provisioners/chef_solo.rb +142 -0
  114. data/lib/vagrant/provisioners/puppet.rb +137 -0
  115. data/lib/vagrant/provisioners/puppet_server.rb +55 -0
  116. data/lib/vagrant/provisioners/shell.rb +52 -0
  117. data/lib/vagrant/ssh.rb +173 -0
  118. data/lib/vagrant/ssh/session.rb +125 -0
  119. data/lib/vagrant/systems.rb +11 -0
  120. data/lib/vagrant/systems/base.rb +87 -0
  121. data/lib/vagrant/systems/debian.rb +36 -0
  122. data/lib/vagrant/systems/freebsd.rb +84 -0
  123. data/lib/vagrant/systems/gentoo.rb +27 -0
  124. data/lib/vagrant/systems/linux.rb +83 -0
  125. data/lib/vagrant/systems/linux/config.rb +21 -0
  126. data/lib/vagrant/systems/linux/error.rb +9 -0
  127. data/lib/vagrant/systems/redhat.rb +39 -0
  128. data/lib/vagrant/systems/solaris.rb +62 -0
  129. data/lib/vagrant/systems/ubuntu.rb +17 -0
  130. data/lib/vagrant/test_helpers.rb +128 -0
  131. data/lib/vagrant/ui.rb +69 -0
  132. data/lib/vagrant/util.rb +13 -0
  133. data/lib/vagrant/util/busy.rb +59 -0
  134. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  135. data/lib/vagrant/util/plain_logger.rb +25 -0
  136. data/lib/vagrant/util/platform.rb +65 -0
  137. data/lib/vagrant/util/resource_logger.rb +63 -0
  138. data/lib/vagrant/util/retryable.rb +25 -0
  139. data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
  140. data/lib/vagrant/util/template_renderer.rb +83 -0
  141. data/lib/vagrant/version.rb +6 -0
  142. data/lib/vagrant/vm.rb +177 -0
  143. data/templates/chef_server_client.erb +18 -0
  144. data/templates/chef_solo_solo.erb +19 -0
  145. data/templates/commands/init/Vagrantfile.erb +82 -0
  146. data/templates/config/validation_failed.erb +7 -0
  147. data/templates/locales/en.yml +535 -0
  148. data/templates/network_entry_debian.erb +8 -0
  149. data/templates/network_entry_gentoo.erb +5 -0
  150. data/templates/network_entry_redhat.erb +8 -0
  151. data/templates/nfs/exports.erb +5 -0
  152. data/templates/nfs/exports_linux.erb +5 -0
  153. data/templates/package_Vagrantfile.erb +11 -0
  154. data/templates/ssh_config.erb +9 -0
  155. data/test/locales/en.yml +8 -0
  156. data/test/test_helper.rb +26 -0
  157. data/test/vagrant/action/box/destroy_test.rb +18 -0
  158. data/test/vagrant/action/box/download_test.rb +125 -0
  159. data/test/vagrant/action/box/package_test.rb +25 -0
  160. data/test/vagrant/action/box/unpackage_test.rb +84 -0
  161. data/test/vagrant/action/box/verify_test.rb +30 -0
  162. data/test/vagrant/action/builder_test.rb +203 -0
  163. data/test/vagrant/action/env/set_test.rb +24 -0
  164. data/test/vagrant/action/environment_test.rb +27 -0
  165. data/test/vagrant/action/general/package_test.rb +268 -0
  166. data/test/vagrant/action/general/validate_test.rb +31 -0
  167. data/test/vagrant/action/vm/boot_test.rb +66 -0
  168. data/test/vagrant/action/vm/check_box_test.rb +56 -0
  169. data/test/vagrant/action/vm/check_guest_additions_test.rb +9 -0
  170. data/test/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
  171. data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +72 -0
  172. data/test/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
  173. data/test/vagrant/action/vm/clear_shared_folders_test.rb +49 -0
  174. data/test/vagrant/action/vm/customize_test.rb +30 -0
  175. data/test/vagrant/action/vm/destroy_test.rb +25 -0
  176. data/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
  177. data/test/vagrant/action/vm/discard_state_test.rb +45 -0
  178. data/test/vagrant/action/vm/export_test.rb +107 -0
  179. data/test/vagrant/action/vm/forward_ports_helpers_test.rb +70 -0
  180. data/test/vagrant/action/vm/forward_ports_test.rb +194 -0
  181. data/test/vagrant/action/vm/halt_test.rb +79 -0
  182. data/test/vagrant/action/vm/host_name_test.rb +36 -0
  183. data/test/vagrant/action/vm/import_test.rb +66 -0
  184. data/test/vagrant/action/vm/match_mac_address_test.rb +36 -0
  185. data/test/vagrant/action/vm/network_test.rb +286 -0
  186. data/test/vagrant/action/vm/nfs_helpers_test.rb +26 -0
  187. data/test/vagrant/action/vm/nfs_test.rb +260 -0
  188. data/test/vagrant/action/vm/package_test.rb +25 -0
  189. data/test/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
  190. data/test/vagrant/action/vm/provision_test.rb +90 -0
  191. data/test/vagrant/action/vm/resume_test.rb +35 -0
  192. data/test/vagrant/action/vm/share_folders_test.rb +139 -0
  193. data/test/vagrant/action/vm/suspend_test.rb +35 -0
  194. data/test/vagrant/action/warden_test.rb +119 -0
  195. data/test/vagrant/action_test.rb +89 -0
  196. data/test/vagrant/box_collection_test.rb +45 -0
  197. data/test/vagrant/box_test.rb +74 -0
  198. data/test/vagrant/cli_test.rb +35 -0
  199. data/test/vagrant/command/base_test.rb +23 -0
  200. data/test/vagrant/command/group_base_test.rb +15 -0
  201. data/test/vagrant/command/helpers_test.rb +88 -0
  202. data/test/vagrant/command/package_test.rb +27 -0
  203. data/test/vagrant/config/base_test.rb +52 -0
  204. data/test/vagrant/config/error_recorder_test.rb +18 -0
  205. data/test/vagrant/config/ssh_test.rb +12 -0
  206. data/test/vagrant/config/vagrant_test.rb +35 -0
  207. data/test/vagrant/config/vm/provisioner_test.rb +92 -0
  208. data/test/vagrant/config/vm_test.rb +86 -0
  209. data/test/vagrant/config_test.rb +162 -0
  210. data/test/vagrant/data_store_test.rb +77 -0
  211. data/test/vagrant/downloaders/base_test.rb +28 -0
  212. data/test/vagrant/downloaders/file_test.rb +48 -0
  213. data/test/vagrant/downloaders/http_test.rb +80 -0
  214. data/test/vagrant/environment_test.rb +508 -0
  215. data/test/vagrant/errors_test.rb +42 -0
  216. data/test/vagrant/hosts/base_test.rb +46 -0
  217. data/test/vagrant/hosts/bsd_test.rb +53 -0
  218. data/test/vagrant/hosts/linux_test.rb +54 -0
  219. data/test/vagrant/plugin_test.rb +9 -0
  220. data/test/vagrant/provisioners/base_test.rb +63 -0
  221. data/test/vagrant/provisioners/chef_server_test.rb +188 -0
  222. data/test/vagrant/provisioners/chef_solo_test.rb +219 -0
  223. data/test/vagrant/provisioners/chef_test.rb +179 -0
  224. data/test/vagrant/provisioners/puppet_server_test.rb +68 -0
  225. data/test/vagrant/provisioners/puppet_test.rb +182 -0
  226. data/test/vagrant/provisioners/shell_test.rb +68 -0
  227. data/test/vagrant/ssh/session_test.rb +40 -0
  228. data/test/vagrant/ssh_test.rb +342 -0
  229. data/test/vagrant/systems/base_test.rb +18 -0
  230. data/test/vagrant/systems/linux_test.rb +114 -0
  231. data/test/vagrant/ui_test.rb +29 -0
  232. data/test/vagrant/util/busy_test.rb +106 -0
  233. data/test/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
  234. data/test/vagrant/util/plain_logger_test.rb +17 -0
  235. data/test/vagrant/util/platform_test.rb +18 -0
  236. data/test/vagrant/util/resource_logger_test.rb +78 -0
  237. data/test/vagrant/util/retryable_test.rb +50 -0
  238. data/test/vagrant/util/stacked_proc_runner_test.rb +43 -0
  239. data/test/vagrant/util/template_renderer_test.rb +145 -0
  240. data/test/vagrant/vm_test.rb +291 -0
  241. data/vagrant.gemspec +36 -0
  242. 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,7 @@
1
+ module Vagrant
2
+ class Action
3
+ module Env
4
+ autoload :Set, 'vagrant/action/env/set'
5
+ end
6
+ end
7
+ 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,8 @@
1
+ module Vagrant
2
+ class Action
3
+ module General
4
+ autoload :Package, 'vagrant/action/general/package'
5
+ autoload :Validate, 'vagrant/action/general/validate'
6
+ end
7
+ end
8
+ 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