vagrant-unbundled 2.2.7.0 → 2.2.16.0

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 (282) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +2 -0
  3. data/CHANGELOG.md +228 -0
  4. data/Gemfile +1 -1
  5. data/README.md +9 -51
  6. data/RELEASE.md +1 -1
  7. data/bin/vagrant +50 -1
  8. data/contrib/README.md +1 -0
  9. data/contrib/sudoers/linux-suse +2 -2
  10. data/contrib/zsh/_vagrant +738 -0
  11. data/contrib/zsh/generate_zsh_completion.rb +165 -0
  12. data/lib/vagrant.rb +28 -5
  13. data/lib/vagrant/action.rb +7 -0
  14. data/lib/vagrant/action/builder.rb +184 -38
  15. data/lib/vagrant/action/builtin/box_add.rb +24 -8
  16. data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
  17. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  18. data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
  19. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  20. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  21. data/lib/vagrant/action/builtin/disk.rb +14 -1
  22. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  23. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  24. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  25. data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
  26. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  27. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  28. data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
  29. data/lib/vagrant/action/builtin/trigger.rb +37 -0
  30. data/lib/vagrant/action/hook.rb +76 -23
  31. data/lib/vagrant/action/runner.rb +12 -27
  32. data/lib/vagrant/action/warden.rb +28 -31
  33. data/lib/vagrant/box.rb +11 -4
  34. data/lib/vagrant/box_collection.rb +1 -1
  35. data/lib/vagrant/bundler.rb +310 -61
  36. data/lib/vagrant/cli.rb +4 -2
  37. data/lib/vagrant/environment.rb +1 -0
  38. data/lib/vagrant/errors.rb +69 -1
  39. data/lib/vagrant/machine.rb +64 -11
  40. data/lib/vagrant/machine_index.rb +28 -1
  41. data/lib/vagrant/patches/net-ssh.rb +186 -0
  42. data/lib/vagrant/plugin/manager.rb +45 -16
  43. data/lib/vagrant/plugin/v2/command.rb +7 -2
  44. data/lib/vagrant/plugin/v2/components.rb +6 -0
  45. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  46. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  47. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  48. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  49. data/lib/vagrant/shared_helpers.rb +36 -0
  50. data/lib/vagrant/ui.rb +43 -2
  51. data/lib/vagrant/util.rb +2 -0
  52. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  53. data/lib/vagrant/util/caps.rb +48 -0
  54. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  55. data/lib/vagrant/util/curl_helper.rb +12 -8
  56. data/lib/vagrant/util/directory.rb +19 -0
  57. data/lib/vagrant/util/downloader.rb +10 -5
  58. data/lib/vagrant/util/guest_hosts.rb +68 -0
  59. data/lib/vagrant/util/guest_inspection.rb +9 -1
  60. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  61. data/lib/vagrant/util/io.rb +7 -27
  62. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  63. data/lib/vagrant/util/is_port_open.rb +8 -19
  64. data/lib/vagrant/util/map_command_options.rb +33 -0
  65. data/lib/vagrant/util/mime.rb +92 -0
  66. data/lib/vagrant/util/network_ip.rb +11 -1
  67. data/lib/vagrant/util/numeric.rb +28 -0
  68. data/lib/vagrant/util/platform.rb +10 -2
  69. data/lib/vagrant/util/powershell.rb +31 -15
  70. data/lib/vagrant/util/subprocess.rb +9 -1
  71. data/lib/vagrant/util/template_renderer.rb +2 -2
  72. data/lib/vagrant/util/uploader.rb +7 -4
  73. data/lib/vagrant/vagrantfile.rb +2 -2
  74. data/plugins/commands/autocomplete/command/install.rb +49 -0
  75. data/plugins/commands/autocomplete/command/root.rb +64 -0
  76. data/plugins/commands/autocomplete/plugin.rb +18 -0
  77. data/plugins/commands/cap/command.rb +5 -1
  78. data/plugins/commands/cloud/auth/login.rb +20 -23
  79. data/plugins/commands/cloud/auth/logout.rb +2 -10
  80. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
  81. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
  82. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  83. data/plugins/commands/cloud/box/create.rb +33 -29
  84. data/plugins/commands/cloud/box/delete.rb +30 -24
  85. data/plugins/commands/cloud/box/show.rb +41 -31
  86. data/plugins/commands/cloud/box/update.rb +34 -26
  87. data/plugins/commands/cloud/client/client.rb +55 -79
  88. data/plugins/commands/cloud/list.rb +3 -4
  89. data/plugins/commands/cloud/locales/en.yml +15 -11
  90. data/plugins/commands/cloud/plugin.rb +10 -0
  91. data/plugins/commands/cloud/provider/create.rb +38 -28
  92. data/plugins/commands/cloud/provider/delete.rb +39 -29
  93. data/plugins/commands/cloud/provider/update.rb +37 -28
  94. data/plugins/commands/cloud/provider/upload.rb +53 -33
  95. data/plugins/commands/cloud/publish.rb +193 -106
  96. data/plugins/commands/cloud/search.rb +34 -21
  97. data/plugins/commands/cloud/util.rb +273 -161
  98. data/plugins/commands/cloud/version/create.rb +33 -28
  99. data/plugins/commands/cloud/version/delete.rb +35 -28
  100. data/plugins/commands/cloud/version/release.rb +35 -29
  101. data/plugins/commands/cloud/version/revoke.rb +36 -29
  102. data/plugins/commands/cloud/version/update.rb +29 -25
  103. data/plugins/commands/destroy/command.rb +7 -7
  104. data/plugins/commands/login/plugin.rb +0 -13
  105. data/plugins/commands/ssh_config/command.rb +1 -1
  106. data/plugins/communicators/ssh/communicator.rb +25 -24
  107. data/plugins/communicators/winrm/config.rb +1 -1
  108. data/plugins/communicators/winrm/helper.rb +1 -1
  109. data/plugins/communicators/winrm/shell.rb +1 -1
  110. data/plugins/communicators/winssh/communicator.rb +126 -38
  111. data/plugins/communicators/winssh/config.rb +3 -7
  112. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  113. data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
  114. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  115. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  116. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  117. data/plugins/guests/arch/cap/smb.rb +1 -1
  118. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  119. data/plugins/guests/centos/cap/flavor.rb +24 -0
  120. data/plugins/guests/centos/guest.rb +9 -0
  121. data/plugins/guests/centos/plugin.rb +20 -0
  122. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  123. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  124. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  125. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
  126. data/plugins/guests/darwin/plugin.rb +15 -0
  127. data/plugins/guests/debian/cap/change_host_name.rb +12 -11
  128. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  129. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  130. data/plugins/guests/fedora/guest.rb +4 -4
  131. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  132. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  133. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  134. data/plugins/guests/haiku/plugin.rb +15 -0
  135. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  136. data/plugins/guests/linux/cap/halt.rb +9 -1
  137. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
  138. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
  139. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
  140. data/plugins/guests/linux/cap/reboot.rb +36 -7
  141. data/plugins/guests/linux/plugin.rb +10 -0
  142. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  143. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  144. data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
  145. data/plugins/guests/openwrt/cap/halt.rb +16 -0
  146. data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
  147. data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
  148. data/plugins/guests/openwrt/cap/rsync.rb +35 -0
  149. data/plugins/guests/openwrt/guest.rb +23 -0
  150. data/plugins/guests/openwrt/plugin.rb +61 -0
  151. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  152. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  153. data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
  154. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  155. data/plugins/guests/redhat/cap/smb.rb +20 -0
  156. data/plugins/guests/redhat/plugin.rb +5 -0
  157. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  158. data/plugins/guests/solaris11/plugin.rb +5 -0
  159. data/plugins/guests/suse/cap/change_host_name.rb +31 -9
  160. data/plugins/guests/windows/cap/public_key.rb +3 -3
  161. data/plugins/guests/windows/cap/reboot.rb +10 -5
  162. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  163. data/plugins/hosts/darwin/plugin.rb +10 -0
  164. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  165. data/plugins/hosts/linux/cap/nfs.rb +1 -0
  166. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  167. data/plugins/hosts/linux/plugin.rb +10 -0
  168. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  169. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  170. data/plugins/hosts/windows/plugin.rb +15 -0
  171. data/plugins/kernel_v2/config/cloud_init.rb +133 -0
  172. data/plugins/kernel_v2/config/disk.rb +67 -14
  173. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  174. data/plugins/kernel_v2/config/vm.rb +155 -21
  175. data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
  176. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  177. data/plugins/providers/docker/action.rb +8 -17
  178. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  179. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  180. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  181. data/plugins/providers/docker/communicator.rb +1 -1
  182. data/plugins/providers/docker/driver.rb +58 -7
  183. data/plugins/providers/docker/plugin.rb +5 -0
  184. data/plugins/providers/hyperv/action.rb +3 -1
  185. data/plugins/providers/hyperv/action/configure.rb +8 -0
  186. data/plugins/providers/hyperv/action/export.rb +4 -2
  187. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  188. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  189. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  190. data/plugins/providers/hyperv/config.rb +5 -0
  191. data/plugins/providers/hyperv/driver.rb +90 -9
  192. data/plugins/providers/hyperv/plugin.rb +25 -0
  193. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  194. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  195. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  196. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  197. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  198. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  199. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  200. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  201. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  202. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  203. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
  204. data/plugins/providers/virtualbox/action.rb +13 -1
  205. data/plugins/providers/virtualbox/action/export.rb +4 -2
  206. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  207. data/plugins/providers/virtualbox/action/import.rb +8 -4
  208. data/plugins/providers/virtualbox/action/network.rb +12 -5
  209. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  210. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  211. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  212. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
  213. data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
  214. data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
  215. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
  216. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  217. data/plugins/providers/virtualbox/driver/meta.rb +16 -2
  218. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  219. data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
  220. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  221. data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
  222. data/plugins/providers/virtualbox/plugin.rb +42 -0
  223. data/plugins/providers/virtualbox/provider.rb +2 -1
  224. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  225. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  226. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
  227. data/plugins/provisioners/ansible/plugin.rb +5 -0
  228. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  229. data/plugins/provisioners/container/client.rb +203 -0
  230. data/plugins/provisioners/container/config.rb +83 -0
  231. data/plugins/provisioners/container/installer.rb +13 -0
  232. data/plugins/provisioners/container/plugin.rb +23 -0
  233. data/plugins/provisioners/container/provisioner.rb +28 -0
  234. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  235. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  236. data/plugins/provisioners/docker/client.rb +4 -175
  237. data/plugins/provisioners/docker/config.rb +2 -72
  238. data/plugins/provisioners/docker/installer.rb +3 -5
  239. data/plugins/provisioners/docker/plugin.rb +6 -6
  240. data/plugins/provisioners/docker/provisioner.rb +4 -10
  241. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  242. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  243. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  244. data/plugins/provisioners/podman/client.rb +12 -0
  245. data/plugins/provisioners/podman/config.rb +28 -0
  246. data/plugins/provisioners/podman/installer.rb +33 -0
  247. data/plugins/provisioners/podman/plugin.rb +38 -0
  248. data/plugins/provisioners/podman/provisioner.rb +52 -0
  249. data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
  250. data/plugins/provisioners/salt/provisioner.rb +4 -0
  251. data/plugins/provisioners/shell/config.rb +1 -6
  252. data/plugins/provisioners/shell/provisioner.rb +61 -26
  253. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  254. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  255. data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
  256. data/plugins/synced_folders/smb/plugin.rb +20 -0
  257. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  258. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  259. data/scripts/website_push_www.sh +1 -1
  260. data/templates/commands/init/Vagrantfile.min.erb +3 -0
  261. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  262. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  263. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  264. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  265. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  266. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  267. data/templates/guests/linux/etc_fstab.erb +6 -0
  268. data/templates/guests/nixos/network.erb +5 -6
  269. data/templates/locales/en.yml +221 -5
  270. data/templates/locales/providers_docker.yml +4 -0
  271. data/templates/nfs/exports_darwin.erb +1 -1
  272. data/vagrant.gemspec +14 -20
  273. data/version.txt +1 -1
  274. metadata +5092 -8978
  275. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  276. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  277. data/plugins/commands/login/client.rb +0 -253
  278. data/plugins/commands/login/command.rb +0 -137
  279. data/plugins/commands/login/errors.rb +0 -24
  280. data/plugins/commands/login/locales/en.yml +0 -49
  281. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
  282. data/scripts/website_push_docs.sh +0 -40
@@ -13,9 +13,11 @@ module Vagrant
13
13
  # a hand-rolled Ruby library, so we defer to its expertise.
14
14
  class Uploader
15
15
 
16
- # @param [String] destination - valid URL to upload file to
17
- # @param [String] file - location of file to upload on disk
18
- # @param [Hash] options
16
+ # @param [String] destination Valid URL to upload file to
17
+ # @param [String] file Location of file to upload on disk
18
+ # @param [Hash] options
19
+ # @option options [Vagrant::UI] :ui UI interface for output
20
+ # @option options [String, Symbol] :method Request method for upload
19
21
  def initialize(destination, file, options=nil)
20
22
  options ||= {}
21
23
  @logger = Log4r::Logger.new("vagrant::util::uploader")
@@ -27,6 +29,7 @@ module Vagrant
27
29
  if !@request_method
28
30
  @request_method = "PUT"
29
31
  end
32
+ @request_method = @request_method.to_s.upcase
30
33
  end
31
34
 
32
35
  def upload!
@@ -51,7 +54,7 @@ module Vagrant
51
54
  protected
52
55
 
53
56
  def build_options
54
- options = [@destination, "--request", @request_method, "--upload-file", @file]
57
+ options = [@destination, "--request", @request_method, "--upload-file", @file, "--fail"]
55
58
  return options
56
59
  end
57
60
 
@@ -197,7 +197,7 @@ module Vagrant
197
197
  local_keys = keys.dup
198
198
 
199
199
  # Load the box Vagrantfile, if there is one
200
- if config.vm.box && boxes
200
+ if !config.vm.box.to_s.empty? && boxes
201
201
  box = boxes.find(config.vm.box, box_formats, config.vm.box_version)
202
202
  if box
203
203
  box_vagrantfile = find_vagrantfile(box.directory)
@@ -241,7 +241,7 @@ module Vagrant
241
241
  # configuration and attempt to load that
242
242
  if box.nil?
243
243
  @logger.warn("Failed to locate #{config.vm.box} with version #{config.vm.box_version}")
244
- @logger.warn("Performing lookup with inital values #{initial_box} with version #{initial_version}")
244
+ @logger.warn("Performing lookup with initial values #{initial_box} with version #{initial_version}")
245
245
  config.vm.box = original_box = initial_box
246
246
  config.vm.box_version = original_box = initial_version
247
247
  load_box_proc.call
@@ -0,0 +1,49 @@
1
+ require 'optparse'
2
+
3
+ require 'vagrant/util/install_cli_autocomplete'
4
+
5
+ module VagrantPlugins
6
+ module CommandAutocomplete
7
+ module Command
8
+ class Install < Vagrant.plugin("2", :command)
9
+ def execute
10
+ options = {
11
+ shells: []
12
+ }
13
+
14
+ opts = OptionParser.new do |o|
15
+ o.banner = "Usage: vagrant autocomplete install [-h] [shell name]"
16
+ o.separator ""
17
+ o.separator "Available shells: #{Vagrant::Util::InstallCLIAutocomplete::SUPPORTED_SHELLS.keys.join(' ')}"
18
+ o.separator ""
19
+ o.separator "Options:"
20
+ o.separator ""
21
+
22
+ o.on("-b", "--bash", "Install bash autocomplete") do |c|
23
+ options[:shells].append("bash")
24
+ end
25
+
26
+ o.on("-z", "--zsh", "Install zsh autocomplete") do |c|
27
+ options[:shells].append("zsh")
28
+ end
29
+ end
30
+
31
+ # Parse the options
32
+ argv = parse_options(opts)
33
+ return if !argv
34
+ raise Vagrant::Errors::CLIInvalidUsage, help: opts.help.chomp if argv.length > 0
35
+
36
+ written_paths = Vagrant::Util::InstallCLIAutocomplete.install(options[:shells])
37
+ if written_paths && written_paths.length > 0
38
+ @env.ui.info(I18n.t("vagrant.autocomplete.installed", paths: written_paths.join("\n- ")))
39
+ else
40
+ @env.ui.info(I18n.t("vagrant.autocomplete.not_installed"))
41
+ end
42
+
43
+ # Success, exit status 0
44
+ 0
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,64 @@
1
+ require "optparse"
2
+ require 'vagrant/util/install_cli_autocomplete'
3
+
4
+ module VagrantPlugins
5
+ module CommandAutocomplete
6
+ module Command
7
+ class Root < Vagrant.plugin("2", :command)
8
+ def self.synopsis
9
+ "manages autocomplete installation on host"
10
+ end
11
+
12
+ def initialize(argv, env)
13
+ super
14
+
15
+ @main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
16
+
17
+ @subcommands = Vagrant::Registry.new
18
+ @subcommands.register(:install) do
19
+ require File.expand_path("../install", __FILE__)
20
+ Install
21
+ end
22
+ end
23
+
24
+ def execute
25
+ if @main_args.include?("-h") || @main_args.include?("--help")
26
+ # Print the help for all the box commands.
27
+ return help
28
+ end
29
+
30
+ # If we reached this far then we must have a subcommand. If not,
31
+ # then we also just print the help and exit.
32
+ command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
33
+ return help if !command_class || !@sub_command
34
+ @logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")
35
+
36
+ # Initialize and execute the command class
37
+ command_class.new(@sub_args, @env).execute
38
+ end
39
+
40
+ def help
41
+ opts = OptionParser.new do |opts|
42
+ opts.banner = "Usage: vagrant autocomplete <subcommand>"
43
+ opts.separator ""
44
+ opts.separator "Available subcommands:"
45
+
46
+ # Add the available subcommands as separators in order to print them
47
+ # out as well.
48
+ keys = []
49
+ keys = @subcommands.keys.map(&:to_s)
50
+
51
+ keys.sort.each do |key|
52
+ opts.separator " #{key}"
53
+ end
54
+
55
+ opts.separator ""
56
+ opts.separator "For help on any individual subcommand run `vagrant autocomplete <subcommand> -h`"
57
+ end
58
+
59
+ @env.ui.info(opts.help, prefix: false)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,18 @@
1
+ require "vagrant"
2
+
3
+
4
+ module VagrantPlugins
5
+ module CommandAutocomplete
6
+ class Plugin < Vagrant.plugin("2")
7
+ name "autocomplete command"
8
+ description <<-DESC
9
+ The `autocomplete` manipulates Vagrant the autocomplete feature.
10
+ DESC
11
+
12
+ command("autocomplete") do
13
+ require File.expand_path("../command/root", __FILE__)
14
+ Command::Root
15
+ end
16
+ end
17
+ end
18
+ end
@@ -27,6 +27,10 @@ module VagrantPlugins
27
27
  o.on("--check", "Only checks for a capability, does not execute") do |f|
28
28
  options[:check] = f
29
29
  end
30
+
31
+ o.on("-t", "--target=TARGET", "Target guest to run against (if applicable)") do |t|
32
+ options[:target] = t
33
+ end
30
34
  end
31
35
 
32
36
  # Parse the options
@@ -45,7 +49,7 @@ module VagrantPlugins
45
49
  if type == :host
46
50
  cap_host = @env.host
47
51
  else
48
- with_target_vms([]) do |vm|
52
+ with_target_vms(options[:target] || []) do |vm|
49
53
  cap_host = case type
50
54
  when :provider
51
55
  vm.provider
@@ -5,6 +5,8 @@ module VagrantPlugins
5
5
  module AuthCommand
6
6
  module Command
7
7
  class Login < Vagrant.plugin("2", :command)
8
+ include Util
9
+
8
10
  def execute
9
11
  options = {}
10
12
 
@@ -16,15 +18,10 @@ module VagrantPlugins
16
18
  o.on("-c", "--check", "Checks if currently logged in") do |c|
17
19
  options[:check] = c
18
20
  end
19
-
20
21
  o.on("-d", "--description DESCRIPTION", String, "Set description for the Vagrant Cloud token") do |d|
21
22
  options[:description] = d
22
23
  end
23
24
 
24
- o.on("-k", "--logout", "Logout from Vagrant Cloud") do |k|
25
- options[:logout] = k
26
- end
27
-
28
25
  o.on("-t", "--token TOKEN", String, "Set the Vagrant Cloud token") do |t|
29
26
  options[:token] = t
30
27
  end
@@ -37,26 +34,32 @@ module VagrantPlugins
37
34
  # Parse the options
38
35
  argv = parse_options(opts)
39
36
  return if !argv
37
+ if !argv.empty?
38
+ raise Vagrant::Errors::CLIInvalidUsage,
39
+ help: opts.help.chomp
40
+ end
40
41
 
41
- @client = Client.new(@env)
42
- @client.username_or_email = options[:login]
42
+ client = Client.new(@env)
43
+ client.username_or_email = options[:login]
43
44
 
44
45
  # Determine what task we're actually taking based on flags
45
46
  if options[:check]
46
- return execute_check
47
- elsif options[:logout]
48
- return execute_logout
47
+ return execute_check(client)
49
48
  elsif options[:token]
50
- return execute_token(options[:token])
49
+ return execute_token(client, options[:token])
51
50
  else
52
- @client = VagrantPlugins::CloudCommand::Util.client_login(@env, options)
51
+ if client.logged_in?
52
+ @env.ui.success(I18n.t("cloud_command.check_logged_in"))
53
+ else
54
+ client_login(@env, options.slice(:login, :description))
55
+ end
53
56
  end
54
57
 
55
58
  0
56
59
  end
57
60
 
58
- def execute_check
59
- if @client.logged_in?
61
+ def execute_check(client)
62
+ if client.logged_in?
60
63
  @env.ui.success(I18n.t("cloud_command.check_logged_in"))
61
64
  return 0
62
65
  else
@@ -65,17 +68,11 @@ module VagrantPlugins
65
68
  end
66
69
  end
67
70
 
68
- def execute_logout
69
- @client.clear_token
70
- @env.ui.success(I18n.t("cloud_command.logged_out"))
71
- return 0
72
- end
73
-
74
- def execute_token(token)
75
- @client.store_token(token)
71
+ def execute_token(client, token)
72
+ client.store_token(token)
76
73
  @env.ui.success(I18n.t("cloud_command.token_saved"))
77
74
 
78
- if @client.logged_in?
75
+ if client.logged_in?
79
76
  @env.ui.success(I18n.t("cloud_command.check_logged_in"))
80
77
  return 0
81
78
  else
@@ -9,15 +9,9 @@ module VagrantPlugins
9
9
  options = {}
10
10
 
11
11
  opts = OptionParser.new do |o|
12
- o.banner = "Usage: vagrant cloud auth logout [options]"
12
+ o.banner = "Usage: vagrant cloud auth logout"
13
13
  o.separator ""
14
14
  o.separator "Log out of Vagrant Cloud"
15
- o.separator ""
16
- o.separator "Options:"
17
- o.separator ""
18
- o.on("-u", "--username USERNAME_OR_EMAIL", String, "Vagrant Cloud username or email address") do |l|
19
- options[:login] = l
20
- end
21
15
  end
22
16
 
23
17
  # Parse the options
@@ -28,9 +22,7 @@ module VagrantPlugins
28
22
  help: opts.help.chomp
29
23
  end
30
24
 
31
- # Initializes client and deletes token on disk
32
- @client = VagrantPlugins::CloudCommand::Util.client_login(@env, options[:username])
33
-
25
+ @client = Client.new(@env)
34
26
  @client.clear_token
35
27
  @env.ui.success(I18n.t("cloud_command.logged_out"))
36
28
  return 0
@@ -1,5 +1,6 @@
1
1
  require "cgi"
2
2
  require "uri"
3
+ require "log4r"
3
4
 
4
5
  require Vagrant.source_root.join("plugins/commands/cloud/client/client")
5
6
 
@@ -27,55 +28,83 @@ module VagrantPlugins
27
28
 
28
29
  def initialize(app, env)
29
30
  @app = app
31
+ @logger = Log4r::Logger.new("vagrant::cloud::auth::authenticate-box-url")
30
32
  CloudCommand::Plugin.init!
31
33
  end
32
34
 
33
35
  def call(env)
34
- client = Client.new(env[:env])
35
- token = client.token
36
+ if ENV["VAGRANT_SERVER_ACCESS_TOKEN_BY_URL"]
37
+ @logger.warn("Adding access token as GET parameter by user request")
38
+ client = Client.new(env[:env])
39
+ token = client.token
36
40
 
37
- env[:box_urls].map! do |url|
38
- begin
39
- u = URI.parse(url)
40
- if u.host != TARGET_HOST && REPLACEMENT_HOSTS.include?(u.host)
41
- u.host = TARGET_HOST
42
- u.to_s
43
- else
41
+ env[:box_urls].map! do |url|
42
+ begin
43
+ u = URI.parse(url)
44
+ if u.host != TARGET_HOST && REPLACEMENT_HOSTS.include?(u.host)
45
+ u.host = TARGET_HOST
46
+ u.to_s
47
+ else
48
+ url
49
+ end
50
+ rescue URI::Error
44
51
  url
45
52
  end
46
- rescue URI::Error
47
- url
48
53
  end
49
- end
50
54
 
51
- server_uri = URI.parse(Vagrant.server_url.to_s)
55
+ server_uri = URI.parse(Vagrant.server_url.to_s)
52
56
 
53
- if token && !server_uri.host.to_s.empty?
54
- env[:box_urls].map! do |url|
55
- u = URI.parse(url)
57
+ if token && !server_uri.host.to_s.empty?
58
+ env[:box_urls].map! do |url|
59
+ begin
60
+ u = URI.parse(url)
56
61
 
57
- if u.host == server_uri.host
58
- if server_uri.host != TARGET_HOST && !self.class.custom_host_notified?
59
- env[:ui].warn(I18n.t("cloud_command.middleware.authentication.different_target",
60
- custom_host: server_uri.host, known_host: TARGET_HOST) + "\n")
61
- sleep CUSTOM_HOST_NOTIFY_WAIT
62
- self.class.custom_host_notified!
63
- end
62
+ if u.host == server_uri.host
63
+ if server_uri.host != TARGET_HOST && !self.class.custom_host_notified?
64
+ env[:ui].warn(I18n.t("cloud_command.middleware.authentication.different_target",
65
+ custom_host: server_uri.host, known_host: TARGET_HOST) + "\n")
66
+ sleep CUSTOM_HOST_NOTIFY_WAIT
67
+ self.class.custom_host_notified!
68
+ end
64
69
 
65
- q = CGI.parse(u.query || "")
70
+ q = CGI.parse(u.query || "")
66
71
 
67
- current = q["access_token"]
68
- if current && current.empty?
69
- q["access_token"] = token
70
- end
72
+ current = q["access_token"]
73
+ if current && current.empty?
74
+ q["access_token"] = token
75
+ end
71
76
 
72
- u.query = URI.encode_www_form(q)
77
+ u.query = URI.encode_www_form(q)
78
+ end
79
+
80
+ u.to_s
81
+ rescue URI::Error
82
+ url
83
+ end
73
84
  end
85
+ end
86
+ else
87
+ env[:box_urls].map! do |url|
88
+ begin
89
+ u = URI.parse(url)
90
+ q = CGI.parse(u.query || "")
91
+ if q["access_token"]
92
+ @logger.warn("Removing access token from URL parameter.")
93
+ q.delete("access_token")
94
+ if q.empty?
95
+ u.query = nil
96
+ else
97
+ u.query = URI.encode_www_form(q)
98
+ end
99
+ end
74
100
 
75
- u.to_s
101
+ u.to_s
102
+ rescue URI::Error
103
+ url
104
+ end
76
105
  end
106
+ @logger.warn("Authentication token not added as GET parameter.")
77
107
  end
78
-
79
108
  @app.call(env)
80
109
  end.freeze
81
110
  end
@@ -0,0 +1,64 @@
1
+ require "cgi"
2
+ require "uri"
3
+
4
+ require "vagrant/util/credential_scrubber"
5
+ require_relative "./add_authentication"
6
+
7
+ require Vagrant.source_root.join("plugins/commands/cloud/client/client")
8
+
9
+ # Similar to AddAuthentication this middleware will add authentication for interacting
10
+ # with Vagrant cloud. It does this by adding Authentication headers to a
11
+ # Vagrant::Util::Downloader object.
12
+ module VagrantPlugins
13
+ module CloudCommand
14
+ class AddDownloaderAuthentication < AddAuthentication
15
+
16
+ def initialize(app, env)
17
+ super
18
+ @logger = Log4r::Logger.new("vagrant::cloud::auth::add-download-authentication")
19
+ end
20
+
21
+ def call(env)
22
+ if ENV["VAGRANT_SERVER_ACCESS_TOKEN_BY_URL"]
23
+ @logger.warn("Authentication header not added due to user requested access token URL parameter")
24
+ else
25
+ client = Client.new(env[:env])
26
+ token = client.token
27
+ Vagrant::Util::CredentialScrubber.sensitive(token)
28
+
29
+ begin
30
+ target_url = URI.parse(env[:downloader].source)
31
+ if target_url.host != TARGET_HOST && REPLACEMENT_HOSTS.include?(target_url.host)
32
+ target_url.host = TARGET_HOST
33
+ env[:downloader].source = target_url.to_s
34
+ end
35
+ rescue URI::Error
36
+ # if there is an error, use current target_url
37
+ end
38
+
39
+ server_uri = URI.parse(Vagrant.server_url.to_s)
40
+ if token && !server_uri.host.to_s.empty?
41
+ if target_url.host == server_uri.host
42
+ if server_uri.host != TARGET_HOST && !self.class.custom_host_notified?
43
+ env[:ui].warn(I18n.t("cloud_command.middleware.authentication.different_target",
44
+ custom_host: server_uri.host, known_host: TARGET_HOST) + "\n")
45
+ sleep CUSTOM_HOST_NOTIFY_WAIT
46
+ self.class.custom_host_notified!
47
+ end
48
+
49
+ if Array(env[:downloader].headers).any? { |h| h.include?("Authorization") }
50
+ @logger.info("Not adding an authentication header, one already found")
51
+ else
52
+ env[:downloader].headers << "Authorization: Bearer #{token}"
53
+ end
54
+ end
55
+
56
+ env[:downloader]
57
+ end
58
+ end
59
+
60
+ @app.call(env)
61
+ end.freeze
62
+ end
63
+ end
64
+ end