vagrant-unbundled 2.2.14.0 → 2.2.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +52 -0
  3. data/bin/vagrant +27 -1
  4. data/contrib/README.md +1 -1
  5. data/lib/vagrant.rb +3 -1
  6. data/lib/vagrant/action/builtin/box_add.rb +13 -3
  7. data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
  8. data/lib/vagrant/bundler.rb +15 -5
  9. data/lib/vagrant/environment.rb +1 -0
  10. data/lib/vagrant/errors.rb +12 -0
  11. data/lib/vagrant/machine_index.rb +1 -1
  12. data/lib/vagrant/patches/net-ssh.rb +186 -0
  13. data/lib/vagrant/plugin/manager.rb +20 -2
  14. data/lib/vagrant/util.rb +1 -0
  15. data/lib/vagrant/util/curl_helper.rb +7 -6
  16. data/lib/vagrant/util/guest_hosts.rb +1 -1
  17. data/lib/vagrant/util/numeric.rb +20 -0
  18. data/lib/vagrant/util/powershell.rb +30 -14
  19. data/lib/vagrant/vagrantfile.rb +1 -1
  20. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
  21. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +34 -27
  22. data/plugins/commands/cloud/client/client.rb +10 -3
  23. data/plugins/commands/cloud/locales/en.yml +5 -1
  24. data/plugins/commands/cloud/provider/upload.rb +10 -0
  25. data/plugins/commands/cloud/publish.rb +10 -0
  26. data/plugins/commands/cloud/util.rb +10 -2
  27. data/plugins/commands/destroy/command.rb +1 -5
  28. data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
  29. data/plugins/guests/fedora/guest.rb +4 -4
  30. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +1 -1
  31. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +1 -2
  32. data/plugins/guests/linux/cap/reboot.rb +21 -3
  33. data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
  34. data/plugins/guests/openwrt/cap/halt.rb +16 -0
  35. data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
  36. data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
  37. data/plugins/guests/openwrt/cap/rsync.rb +35 -0
  38. data/plugins/guests/openwrt/guest.rb +23 -0
  39. data/plugins/guests/openwrt/plugin.rb +61 -0
  40. data/plugins/providers/docker/driver.rb +2 -2
  41. data/plugins/providers/virtualbox/action/network.rb +12 -5
  42. data/plugins/providers/virtualbox/cap/mount_options.rb +5 -0
  43. data/plugins/providers/virtualbox/plugin.rb +5 -0
  44. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
  45. data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
  46. data/plugins/synced_folders/smb/cap/mount_options.rb +2 -2
  47. data/templates/commands/init/Vagrantfile.min.erb +3 -0
  48. data/templates/guests/nixos/network.erb +5 -6
  49. data/templates/locales/en.yml +21 -4
  50. data/vagrant.gemspec +5 -11
  51. data/version.txt +1 -1
  52. metadata +2921 -29
@@ -58,6 +58,16 @@ module VagrantPlugins
58
58
  access_token: access_token
59
59
  )
60
60
 
61
+ # Include size check on file and disable direct if over 5G
62
+ if options[:direct]
63
+ fsize = File.stat(file).size
64
+ if fsize > (5 * Vagrant::Util::Numeric::GIGABYTE)
65
+ box_size = Vagrant::Util::Numeric.bytes_to_string(fsize)
66
+ @env.ui.warn(I18n.t("cloud_command.provider.direct_disable", size: box_size))
67
+ options[:direct] = false
68
+ end
69
+ end
70
+
61
71
  with_provider(account: account, org: org, box: box, version: version, provider: provider) do |p|
62
72
  p.upload(direct: options[:direct]) do |upload_url|
63
73
  m = options[:direct] ? :put : :put
@@ -129,6 +129,16 @@ module VagrantPlugins
129
129
  def upload_box_file(provider, box_file, options={})
130
130
  box_file = File.absolute_path(box_file)
131
131
  @env.ui.info(I18n.t("cloud_command.publish.upload_provider", file: box_file))
132
+ # Include size check on file and disable direct if over 5G
133
+ if options[:direct_upload]
134
+ fsize = File.stat(box_file).size
135
+ if fsize > (5 * Vagrant::Util::Numeric::GIGABYTE)
136
+ box_size = Vagrant::Util::Numeric.bytes_to_string(fsize)
137
+ @env.ui.warn(I18n.t("cloud_command.provider.direct_disable", size: box_size))
138
+ options[:direct_upload] = false
139
+ end
140
+ end
141
+
132
142
  provider.upload(direct: options[:direct_upload]) do |upload_url|
133
143
  Vagrant::Util::Uploader.new(upload_url, box_file, ui: @env.ui, method: :put).upload!
134
144
  end
@@ -5,8 +5,16 @@ module VagrantPlugins
5
5
  def api_server_url
6
6
  if Vagrant.server_url == Vagrant::DEFAULT_SERVER_URL
7
7
  return "#{Vagrant.server_url}/api/v1"
8
- else
9
- return Vagrant.server_url
8
+ end
9
+ begin
10
+ addr = URI.parse(Vagrant.server_url)
11
+ if addr.path.empty? || addr.path.to_s == "/"
12
+ addr.path = "/api/v1"
13
+ end
14
+
15
+ addr.to_s
16
+ rescue URI::Error
17
+ Vagrant.server_url
10
18
  end
11
19
  end
12
20
 
@@ -56,7 +56,7 @@ module VagrantPlugins
56
56
  end
57
57
 
58
58
  machines.each do |m|
59
- if m.state.id == init_states[m.name]
59
+ if init_states[m.name] != :not_created && m.state.id == init_states[m.name]
60
60
  declined += 1
61
61
  end
62
62
  end
@@ -64,10 +64,6 @@ module VagrantPlugins
64
64
  # Nothing was declined
65
65
  return 0 if declined == 0
66
66
 
67
- # Everything was declined, and all states are `not_created`
68
- return 0 if declined == machines.length &&
69
- declined == init_states.values.count(:not_created)
70
-
71
67
  # Everything was declined, state was not changed
72
68
  return 1 if declined == machines.length
73
69
 
@@ -45,7 +45,7 @@ module VagrantPlugins
45
45
  # each specifically, we avoid reconfiguring eth0 (the NAT interface) so
46
46
  # SSH never dies.
47
47
  interfaces.each do |interface|
48
- comm.sudo("/sbin/ifdown eth#{interface} 2> /dev/null")
48
+ comm.sudo("if [[ $(/sbin/ip a show eth#{interface} | grep UP) ]]; then /sbin/ifdown eth#{interface} 2> /dev/null; fi")
49
49
  comm.sudo("/sbin/ip addr flush dev eth#{interface} 2> /dev/null")
50
50
  end
51
51
 
@@ -1,11 +1,11 @@
1
1
  require "vagrant"
2
+ require_relative '../linux/guest'
2
3
 
3
4
  module VagrantPlugins
4
5
  module GuestFedora
5
- class Guest < Vagrant.plugin("2", :guest)
6
- def detect?(machine)
7
- machine.communicate.test("grep 'Fedora release' /etc/redhat-release")
8
- end
6
+ class Guest < VagrantPlugins::GuestLinux::Guest
7
+ # Name used for guest detection
8
+ GUEST_DETECTION_NAME = "fedora".freeze
9
9
  end
10
10
  end
11
11
  end
@@ -20,7 +20,7 @@ module VagrantPlugins
20
20
  :shell_expand_guest_path, guestpath)
21
21
  options[:smb_id] ||= name
22
22
 
23
- mount_device = options[:plugin].capability(:mount_name, options)
23
+ mount_device = options[:plugin].capability(:mount_name, name, options)
24
24
  mount_options, _, _ = options[:plugin].capability(
25
25
  :mount_options, name, expanded_guest_path, options)
26
26
  mount_type = options[:plugin].capability(:mount_type)
@@ -34,13 +34,12 @@ module VagrantPlugins
34
34
  mount_options, _, _ = data[:plugin].capability(
35
35
  :mount_options, name, guest_path, data)
36
36
  if data[:plugin].capability?(:mount_name)
37
- name = data[:plugin].capability(:mount_name, data)
37
+ name = data[:plugin].capability(:mount_name, name, data)
38
38
  end
39
39
  else
40
40
  next
41
41
  end
42
42
 
43
- mount_options = "#{mount_options},nofail"
44
43
  {
45
44
  name: name,
46
45
  mount_point: guest_path,
@@ -12,13 +12,16 @@ module VagrantPlugins
12
12
 
13
13
  def self.reboot(machine)
14
14
  @logger = Log4r::Logger.new("vagrant::linux::reboot")
15
+ reboot_script = "ps -q 1 -o comm=,start= > /tmp/.vagrant-reboot"
16
+
15
17
  if systemd?(machine.communicate)
16
- reboot_script = "systemctl reboot"
18
+ reboot_cmd = "systemctl reboot"
17
19
  else
18
- reboot_script = "reboot"
20
+ reboot_cmd = "reboot"
19
21
  end
20
22
 
21
23
  comm = machine.communicate
24
+ reboot_script += "; #{reboot_cmd}"
22
25
 
23
26
  @logger.debug("Issuing reboot command for guest")
24
27
  comm.sudo(reboot_script)
@@ -43,8 +46,23 @@ module VagrantPlugins
43
46
  end
44
47
 
45
48
  def self.wait_for_reboot(machine)
46
- while !machine.guest.ready?
49
+ caught = false
50
+ begin
51
+ check_script = 'grep "$(ps -q 1 -o comm=,start=)" /tmp/.vagrant-reboot'
52
+ while machine.guest.ready? && machine.communicate.execute(check_script, error_check: false) == 0
53
+ sleep 10
54
+ end
55
+ rescue
56
+ # The check script execution may result in an exception
57
+ # getting raised depending on the state of the communicator
58
+ # when executing. We'll allow for it to happen once, and then
59
+ # raise if we get an exception again
60
+ if caught
61
+ raise
62
+ end
63
+ caught = true
47
64
  sleep 10
65
+ retry
48
66
  end
49
67
  end
50
68
  end
@@ -0,0 +1,19 @@
1
+ module VagrantPlugins
2
+ module GuestOpenWrt
3
+ module Cap
4
+ class ChangeHostName
5
+ def self.change_host_name(machine, name)
6
+ comm = machine.communicate
7
+
8
+ if !comm.test("uci get system.@system[0].hostname | grep '^#{name}$'", sudo: false)
9
+ comm.execute <<~EOH
10
+ uci set system.@system[0].hostname='#{name}'
11
+ uci commit system
12
+ /etc/init.d/system reload
13
+ EOH
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module GuestOpenWrt
3
+ module Cap
4
+ class Halt
5
+ def self.halt(machine)
6
+ begin
7
+ machine.communicate.execute("halt")
8
+ rescue IOError, Vagrant::Errors::SSHDisconnected
9
+ # Ignore, this probably means connection closed because it
10
+ # shut down.
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ require "vagrant/util/shell_quote"
2
+
3
+ module VagrantPlugins
4
+ module GuestOpenWrt
5
+ module Cap
6
+ class InsertPublicKey
7
+ def self.insert_public_key(machine, contents)
8
+ contents = contents.chomp
9
+ contents = Vagrant::Util::ShellQuote.escape(contents, "'")
10
+
11
+ machine.communicate.tap do |comm|
12
+ comm.execute <<~EOH
13
+ printf '#{contents}\\n' >> /etc/dropbear/authorized_keys
14
+ EOH
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ require "vagrant/util/shell_quote"
2
+
3
+ module VagrantPlugins
4
+ module GuestOpenWrt
5
+ module Cap
6
+ class RemovePublicKey
7
+ def self.remove_public_key(machine, contents)
8
+ contents = contents.chomp
9
+ contents = Vagrant::Util::ShellQuote.escape(contents, "'")
10
+
11
+ machine.communicate.tap do |comm|
12
+ comm.execute <<~EOH
13
+ if test -f /etc/dropbear/authorized_keys ; then
14
+ sed -i '/^.*#{contents}.*$/d' /etc/dropbear/authorized_keys
15
+ fi
16
+ EOH
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ module VagrantPlugins
2
+ module GuestOpenWrt
3
+ module Cap
4
+ class RSync
5
+ def self.rsync_installed(machine)
6
+ machine.communicate.test("which rsync")
7
+ end
8
+
9
+ def self.rsync_install(machine)
10
+ machine.communicate.tap do |comm|
11
+ comm.execute <<~EOH
12
+ opkg update
13
+ opkg install rsync
14
+ EOH
15
+ end
16
+ end
17
+
18
+ def self.rsync_pre(machine, opts)
19
+ machine.communicate.tap do |comm|
20
+ comm.execute("mkdir -p '#{opts[:guestpath]}'")
21
+ end
22
+ end
23
+
24
+ def self.rsync_command(machine)
25
+ "rsync -zz"
26
+ end
27
+
28
+ def self.rsync_post(machine, opts)
29
+ # Don't do anything because BusyBox's `find` doesn't support the
30
+ # syntax in plugins/synced_folders/rsync/default_unix_cap.rb.
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ module VagrantPlugins
2
+ module GuestOpenWrt
3
+ class Guest
4
+ # Name used for guest detection
5
+ GUEST_DETECTION_NAME = "openwrt".freeze
6
+
7
+ def detect?(machine)
8
+ machine.communicate.test <<~EOH
9
+ if test -e /etc/openwrt_release; then
10
+ exit
11
+ fi
12
+ if test -r /etc/os-release; then
13
+ source /etc/os-release && test 'x#{self.class.const_get(:GUEST_DETECTION_NAME)}' = "x$ID" && exit
14
+ fi
15
+ if test -r /etc/banner; then
16
+ cat /etc/banner | grep -qi '#{self.class.const_get(:GUEST_DETECTION_NAME)}' && exit
17
+ fi
18
+ exit 1
19
+ EOH
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,61 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module GuestOpenWrt
5
+ class Plugin < Vagrant.plugin("2")
6
+ name "OpenWrt guest"
7
+ description "OpenWrt guest support."
8
+
9
+ guest(:openwrt, :linux) do
10
+ require_relative "guest"
11
+ Guest
12
+ end
13
+
14
+ guest_capability(:openwrt, :insert_public_key) do
15
+ require_relative "cap/insert_public_key"
16
+ Cap::InsertPublicKey
17
+ end
18
+
19
+ guest_capability(:openwrt, :remove_public_key) do
20
+ require_relative "cap/remove_public_key"
21
+ Cap::RemovePublicKey
22
+ end
23
+
24
+ guest_capability(:openwrt, :change_host_name) do
25
+ require_relative "cap/change_host_name"
26
+ Cap::ChangeHostName
27
+ end
28
+
29
+ guest_capability(:openwrt, :rsync_installed) do
30
+ require_relative "cap/rsync"
31
+ Cap::RSync
32
+ end
33
+
34
+ guest_capability(:openwrt, :rsync_install) do
35
+ require_relative "cap/rsync"
36
+ Cap::RSync
37
+ end
38
+
39
+ guest_capability(:openwrt, :rsync_pre) do
40
+ require_relative "cap/rsync"
41
+ Cap::RSync
42
+ end
43
+
44
+ guest_capability(:openwrt, :rsync_command) do
45
+ require_relative "cap/rsync"
46
+ Cap::RSync
47
+ end
48
+
49
+ guest_capability(:openwrt, :rsync_post) do
50
+ require_relative "cap/rsync"
51
+ Cap::RSync
52
+ end
53
+
54
+ guest_capability(:openwrt, :halt) do
55
+ require_relative "cap/halt"
56
+ Cap::Halt
57
+ end
58
+ end
59
+ end
60
+ end
61
+
@@ -25,9 +25,9 @@ module VagrantPlugins
25
25
  opts = {with_stderr: true}
26
26
  result = execute('docker', 'build', *args, opts, &block)
27
27
  # Check for the new output format 'writing image sha256...'
28
- # In this case, docker builtkit is enabled. Its format is different
28
+ # In this case, docker buildkit is enabled. Its format is different
29
29
  # from standard docker
30
- matches = result.scan(/writing image .+:([0-9a-z]+) done/i).last
30
+ matches = result.scan(/writing image .+:([^\s]+)/i).last
31
31
  if !matches
32
32
  if podman?
33
33
  # Check for podman format when it is emulating docker CLI.
@@ -255,9 +255,17 @@ module VagrantPlugins
255
255
 
256
256
  # Make sure the type is a symbol
257
257
  options[:type] = options[:type].to_sym
258
-
259
- # Default IP is in the 20-bit private network block for DHCP based networks
260
- options[:ip] = "172.28.128.1" if options[:type] == :dhcp && !options[:ip]
258
+
259
+ if options[:type] == :dhcp && !options[:ip]
260
+ # Try to find a matching device to set the config ip to
261
+ matching_device = hostonly_find_matching_network(options)
262
+ if matching_device
263
+ options[:ip] = matching_device[:ip]
264
+ else
265
+ # Default IP is in the 20-bit private network block for DHCP based networks
266
+ options[:ip] = "172.28.128.1"
267
+ end
268
+ end
261
269
 
262
270
  begin
263
271
  ip = IPAddr.new(options[:ip])
@@ -469,7 +477,7 @@ module VagrantPlugins
469
477
 
470
478
  # This finds a matching host only network for the given configuration.
471
479
  def hostonly_find_matching_network(config)
472
- this_netaddr = network_address(config[:ip], config[:netmask])
480
+ this_netaddr = network_address(config[:ip], config[:netmask]) if config[:ip]
473
481
 
474
482
  @env[:machine].provider.driver.read_host_only_interfaces.each do |interface|
475
483
  return interface if config[:name] && config[:name] == interface[:name]
@@ -515,7 +523,6 @@ module VagrantPlugins
515
523
  # @param [Hash<String>] config hash as returned from hostonly_config
516
524
  def create_dhcp_server_if_necessary(interface, config)
517
525
  existing_dhcp_server = find_matching_dhcp_server(interface)
518
-
519
526
  if existing_dhcp_server
520
527
  if dhcp_server_matches_config?(existing_dhcp_server, config)
521
528
  @logger.debug("DHCP server already properly configured")
@@ -22,6 +22,7 @@ module VagrantPlugins
22
22
 
23
23
  mount_options << "uid=#{mount_uid}"
24
24
  mount_options << "gid=#{mount_gid}"
25
+ mount_options << "_netdev"
25
26
  mount_options = mount_options.join(',')
26
27
  return mount_options, mount_uid, mount_gid
27
28
  end
@@ -29,6 +30,10 @@ module VagrantPlugins
29
30
  def self.mount_type(machine)
30
31
  return VB_MOUNT_TYPE
31
32
  end
33
+
34
+ def self.mount_name(machine, name, data)
35
+ name.gsub(/[\s\/\\]/,'_').sub(/^_/, '')
36
+ end
32
37
  end
33
38
  end
34
39
  end