vagrant-unbundled 2.2.7.0 → 2.2.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.hashibot.hcl +2 -0
- data/CHANGELOG.md +228 -0
- data/Gemfile +1 -1
- data/README.md +9 -51
- data/RELEASE.md +1 -1
- data/bin/vagrant +50 -1
- data/contrib/README.md +1 -0
- data/contrib/sudoers/linux-suse +2 -2
- data/contrib/zsh/_vagrant +738 -0
- data/contrib/zsh/generate_zsh_completion.rb +165 -0
- data/lib/vagrant.rb +28 -5
- data/lib/vagrant/action.rb +7 -0
- data/lib/vagrant/action/builder.rb +184 -38
- data/lib/vagrant/action/builtin/box_add.rb +24 -8
- data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
- data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
- data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
- data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
- data/lib/vagrant/action/builtin/delayed.rb +26 -0
- data/lib/vagrant/action/builtin/disk.rb +14 -1
- data/lib/vagrant/action/builtin/handle_box.rb +3 -1
- data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
- data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
- data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
- data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
- data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
- data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
- data/lib/vagrant/action/builtin/trigger.rb +37 -0
- data/lib/vagrant/action/hook.rb +76 -23
- data/lib/vagrant/action/runner.rb +12 -27
- data/lib/vagrant/action/warden.rb +28 -31
- data/lib/vagrant/box.rb +11 -4
- data/lib/vagrant/box_collection.rb +1 -1
- data/lib/vagrant/bundler.rb +310 -61
- data/lib/vagrant/cli.rb +4 -2
- data/lib/vagrant/environment.rb +1 -0
- data/lib/vagrant/errors.rb +69 -1
- data/lib/vagrant/machine.rb +64 -11
- data/lib/vagrant/machine_index.rb +28 -1
- data/lib/vagrant/patches/net-ssh.rb +186 -0
- data/lib/vagrant/plugin/manager.rb +45 -16
- data/lib/vagrant/plugin/v2/command.rb +7 -2
- data/lib/vagrant/plugin/v2/components.rb +6 -0
- data/lib/vagrant/plugin/v2/manager.rb +67 -0
- data/lib/vagrant/plugin/v2/plugin.rb +13 -0
- data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
- data/lib/vagrant/plugin/v2/trigger.rb +64 -25
- data/lib/vagrant/shared_helpers.rb +36 -0
- data/lib/vagrant/ui.rb +43 -2
- data/lib/vagrant/util.rb +2 -0
- data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
- data/lib/vagrant/util/caps.rb +48 -0
- data/lib/vagrant/util/credential_scrubber.rb +1 -1
- data/lib/vagrant/util/curl_helper.rb +12 -8
- data/lib/vagrant/util/directory.rb +19 -0
- data/lib/vagrant/util/downloader.rb +10 -5
- data/lib/vagrant/util/guest_hosts.rb +68 -0
- data/lib/vagrant/util/guest_inspection.rb +9 -1
- data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
- data/lib/vagrant/util/io.rb +7 -27
- data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
- data/lib/vagrant/util/is_port_open.rb +8 -19
- data/lib/vagrant/util/map_command_options.rb +33 -0
- data/lib/vagrant/util/mime.rb +92 -0
- data/lib/vagrant/util/network_ip.rb +11 -1
- data/lib/vagrant/util/numeric.rb +28 -0
- data/lib/vagrant/util/platform.rb +10 -2
- data/lib/vagrant/util/powershell.rb +31 -15
- data/lib/vagrant/util/subprocess.rb +9 -1
- data/lib/vagrant/util/template_renderer.rb +2 -2
- data/lib/vagrant/util/uploader.rb +7 -4
- data/lib/vagrant/vagrantfile.rb +2 -2
- data/plugins/commands/autocomplete/command/install.rb +49 -0
- data/plugins/commands/autocomplete/command/root.rb +64 -0
- data/plugins/commands/autocomplete/plugin.rb +18 -0
- data/plugins/commands/cap/command.rb +5 -1
- data/plugins/commands/cloud/auth/login.rb +20 -23
- data/plugins/commands/cloud/auth/logout.rb +2 -10
- data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
- data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
- data/plugins/commands/cloud/auth/whoami.rb +18 -20
- data/plugins/commands/cloud/box/create.rb +33 -29
- data/plugins/commands/cloud/box/delete.rb +30 -24
- data/plugins/commands/cloud/box/show.rb +41 -31
- data/plugins/commands/cloud/box/update.rb +34 -26
- data/plugins/commands/cloud/client/client.rb +55 -79
- data/plugins/commands/cloud/list.rb +3 -4
- data/plugins/commands/cloud/locales/en.yml +15 -11
- data/plugins/commands/cloud/plugin.rb +10 -0
- data/plugins/commands/cloud/provider/create.rb +38 -28
- data/plugins/commands/cloud/provider/delete.rb +39 -29
- data/plugins/commands/cloud/provider/update.rb +37 -28
- data/plugins/commands/cloud/provider/upload.rb +53 -33
- data/plugins/commands/cloud/publish.rb +193 -106
- data/plugins/commands/cloud/search.rb +34 -21
- data/plugins/commands/cloud/util.rb +273 -161
- data/plugins/commands/cloud/version/create.rb +33 -28
- data/plugins/commands/cloud/version/delete.rb +35 -28
- data/plugins/commands/cloud/version/release.rb +35 -29
- data/plugins/commands/cloud/version/revoke.rb +36 -29
- data/plugins/commands/cloud/version/update.rb +29 -25
- data/plugins/commands/destroy/command.rb +7 -7
- data/plugins/commands/login/plugin.rb +0 -13
- data/plugins/commands/ssh_config/command.rb +1 -1
- data/plugins/communicators/ssh/communicator.rb +25 -24
- data/plugins/communicators/winrm/config.rb +1 -1
- data/plugins/communicators/winrm/helper.rb +1 -1
- data/plugins/communicators/winrm/shell.rb +1 -1
- data/plugins/communicators/winssh/communicator.rb +126 -38
- data/plugins/communicators/winssh/config.rb +3 -7
- data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
- data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
- data/plugins/guests/alt/cap/change_host_name.rb +40 -53
- data/plugins/guests/arch/cap/change_host_name.rb +5 -14
- data/plugins/guests/arch/cap/configure_networks.rb +27 -10
- data/plugins/guests/arch/cap/smb.rb +1 -1
- data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
- data/plugins/guests/centos/cap/flavor.rb +24 -0
- data/plugins/guests/centos/guest.rb +9 -0
- data/plugins/guests/centos/plugin.rb +20 -0
- data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
- data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
- data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
- data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
- data/plugins/guests/darwin/plugin.rb +15 -0
- data/plugins/guests/debian/cap/change_host_name.rb +12 -11
- data/plugins/guests/debian/cap/configure_networks.rb +14 -6
- data/plugins/guests/esxi/cap/public_key.rb +3 -1
- data/plugins/guests/fedora/guest.rb +4 -4
- data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
- data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
- data/plugins/guests/haiku/cap/rsync.rb +19 -0
- data/plugins/guests/haiku/plugin.rb +15 -0
- data/plugins/guests/linux/cap/change_host_name.rb +46 -0
- data/plugins/guests/linux/cap/halt.rb +9 -1
- data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
- data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
- data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
- data/plugins/guests/linux/cap/reboot.rb +36 -7
- data/plugins/guests/linux/plugin.rb +10 -0
- data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
- data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
- data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
- data/plugins/guests/openwrt/cap/halt.rb +16 -0
- data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
- data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
- data/plugins/guests/openwrt/cap/rsync.rb +35 -0
- data/plugins/guests/openwrt/guest.rb +23 -0
- data/plugins/guests/openwrt/plugin.rb +61 -0
- data/plugins/guests/photon/cap/change_host_name.rb +9 -15
- data/plugins/guests/pld/cap/change_host_name.rb +11 -17
- data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
- data/plugins/guests/redhat/cap/flavor.rb +3 -1
- data/plugins/guests/redhat/cap/smb.rb +20 -0
- data/plugins/guests/redhat/plugin.rb +5 -0
- data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
- data/plugins/guests/solaris11/plugin.rb +5 -0
- data/plugins/guests/suse/cap/change_host_name.rb +31 -9
- data/plugins/guests/windows/cap/public_key.rb +3 -3
- data/plugins/guests/windows/cap/reboot.rb +10 -5
- data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
- data/plugins/hosts/darwin/plugin.rb +10 -0
- data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
- data/plugins/hosts/linux/cap/nfs.rb +1 -0
- data/plugins/hosts/linux/cap/rdp.rb +1 -1
- data/plugins/hosts/linux/plugin.rb +10 -0
- data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
- data/plugins/hosts/windows/cap/rdp.rb +1 -1
- data/plugins/hosts/windows/plugin.rb +15 -0
- data/plugins/kernel_v2/config/cloud_init.rb +133 -0
- data/plugins/kernel_v2/config/disk.rb +67 -14
- data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
- data/plugins/kernel_v2/config/vm.rb +155 -21
- data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
- data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
- data/plugins/providers/docker/action.rb +8 -17
- data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
- data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
- data/plugins/providers/docker/cap/has_communicator.rb +11 -0
- data/plugins/providers/docker/communicator.rb +1 -1
- data/plugins/providers/docker/driver.rb +58 -7
- data/plugins/providers/docker/plugin.rb +5 -0
- data/plugins/providers/hyperv/action.rb +3 -1
- data/plugins/providers/hyperv/action/configure.rb +8 -0
- data/plugins/providers/hyperv/action/export.rb +4 -2
- data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
- data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
- data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
- data/plugins/providers/hyperv/config.rb +5 -0
- data/plugins/providers/hyperv/driver.rb +90 -9
- data/plugins/providers/hyperv/plugin.rb +25 -0
- data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
- data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
- data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
- data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
- data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
- data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
- data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
- data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
- data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
- data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
- data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
- data/plugins/providers/virtualbox/action.rb +13 -1
- data/plugins/providers/virtualbox/action/export.rb +4 -2
- data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
- data/plugins/providers/virtualbox/action/import.rb +8 -4
- data/plugins/providers/virtualbox/action/network.rb +12 -5
- data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
- data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
- data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
- data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
- data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
- data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
- data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
- data/plugins/providers/virtualbox/driver/base.rb +15 -0
- data/plugins/providers/virtualbox/driver/meta.rb +16 -2
- data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
- data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
- data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
- data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
- data/plugins/providers/virtualbox/plugin.rb +42 -0
- data/plugins/providers/virtualbox/provider.rb +2 -1
- data/plugins/providers/virtualbox/synced_folder.rb +1 -0
- data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
- data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
- data/plugins/provisioners/ansible/plugin.rb +5 -0
- data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
- data/plugins/provisioners/container/client.rb +203 -0
- data/plugins/provisioners/container/config.rb +83 -0
- data/plugins/provisioners/container/installer.rb +13 -0
- data/plugins/provisioners/container/plugin.rb +23 -0
- data/plugins/provisioners/container/provisioner.rb +28 -0
- data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
- data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
- data/plugins/provisioners/docker/client.rb +4 -175
- data/plugins/provisioners/docker/config.rb +2 -72
- data/plugins/provisioners/docker/installer.rb +3 -5
- data/plugins/provisioners/docker/plugin.rb +6 -6
- data/plugins/provisioners/docker/provisioner.rb +4 -10
- data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
- data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
- data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
- data/plugins/provisioners/podman/client.rb +12 -0
- data/plugins/provisioners/podman/config.rb +28 -0
- data/plugins/provisioners/podman/installer.rb +33 -0
- data/plugins/provisioners/podman/plugin.rb +38 -0
- data/plugins/provisioners/podman/provisioner.rb +52 -0
- data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
- data/plugins/provisioners/salt/provisioner.rb +4 -0
- data/plugins/provisioners/shell/config.rb +1 -6
- data/plugins/provisioners/shell/provisioner.rb +61 -26
- data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
- data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
- data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
- data/plugins/synced_folders/smb/plugin.rb +20 -0
- data/plugins/synced_folders/smb/synced_folder.rb +2 -2
- data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
- data/scripts/website_push_www.sh +1 -1
- data/templates/commands/init/Vagrantfile.min.erb +3 -0
- data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
- data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
- data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
- data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
- data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
- data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
- data/templates/guests/linux/etc_fstab.erb +6 -0
- data/templates/guests/nixos/network.erb +5 -6
- data/templates/locales/en.yml +221 -5
- data/templates/locales/providers_docker.yml +4 -0
- data/templates/nfs/exports_darwin.erb +1 -1
- data/vagrant.gemspec +14 -20
- data/version.txt +1 -1
- metadata +5092 -8978
- data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
- data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
- data/plugins/commands/login/client.rb +0 -253
- data/plugins/commands/login/command.rb +0 -137
- data/plugins/commands/login/errors.rb +0 -24
- data/plugins/commands/login/locales/en.yml +0 -49
- data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
- data/scripts/website_push_docs.sh +0 -40
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
3
|
+
HEAD = """#compdef _vagrant vagrant
|
4
|
+
|
5
|
+
# ZSH completion for Vagrant
|
6
|
+
#
|
7
|
+
# To use this completion add this to ~/.zshrc
|
8
|
+
# fpath=(/path/to/this/dir $fpath)
|
9
|
+
# compinit
|
10
|
+
#
|
11
|
+
# For development reload the function after making changes
|
12
|
+
# unfunction _vagrant && autoload -U _vagrant
|
13
|
+
"""
|
14
|
+
|
15
|
+
BOX_LIST_FUNCTION = """
|
16
|
+
__box_list ()
|
17
|
+
{
|
18
|
+
_wanted application expl 'command' compadd $(command vagrant box list | awk '{print $1}' )
|
19
|
+
}
|
20
|
+
"""
|
21
|
+
|
22
|
+
PLUGIN_LIST_FUNCTION = """
|
23
|
+
__plugin_list ()
|
24
|
+
{
|
25
|
+
_wanted application expl 'command' compadd $(command vagrant plugin list | awk '{print $1}')
|
26
|
+
}
|
27
|
+
"""
|
28
|
+
|
29
|
+
ADD_FEATURE_FLAGS = ["remove", "repackage", "update", "repair", "uninstall"]
|
30
|
+
VAGRANT_COMMAND = "vagrant"
|
31
|
+
|
32
|
+
FLAG_REGEX = /--(\S)*/
|
33
|
+
CMDS_REGEX = /^(\s){1,}(\w)(\S)*/
|
34
|
+
|
35
|
+
def make_string_script_safe(s)
|
36
|
+
s.gsub("[","(").gsub("]",")").gsub("-","_").gsub("'", "")
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove_square_brakets(s)
|
40
|
+
s.gsub("[","(").gsub("]",")")
|
41
|
+
end
|
42
|
+
|
43
|
+
def format_flags(group_name, flags)
|
44
|
+
group_name = make_string_script_safe(group_name)
|
45
|
+
opts_str = "local -a #{group_name} && #{group_name}=(\n"
|
46
|
+
flags.each do |flag, desc|
|
47
|
+
opts_str = opts_str + " '#{remove_square_brakets(flag)}=[#{make_string_script_safe(desc)}]'\n"
|
48
|
+
end
|
49
|
+
opts_str + ")"
|
50
|
+
end
|
51
|
+
|
52
|
+
def format_subcommand(group_name, cmds)
|
53
|
+
opts_str = "local -a #{group_name} && #{group_name}=(\n"
|
54
|
+
cmds.each do |cmd, desc|
|
55
|
+
opts_str = opts_str + " '#{cmd}:#{desc}'\n"
|
56
|
+
end
|
57
|
+
opts_str + ")"
|
58
|
+
end
|
59
|
+
|
60
|
+
def format_case(group_name, cmds, cmd_list, feature_string)
|
61
|
+
case_str = """case $state in
|
62
|
+
(command)
|
63
|
+
_describe -t commands 'command' #{group_name}
|
64
|
+
return
|
65
|
+
;;
|
66
|
+
|
67
|
+
(options)
|
68
|
+
case $line[1] in
|
69
|
+
"""
|
70
|
+
|
71
|
+
cmds.each do |cmd, desc|
|
72
|
+
if cmd_list.include?(cmd)
|
73
|
+
case_append = """ #{cmd})
|
74
|
+
_arguments -s -S : $#{make_string_script_safe(cmd)}_arguments #{feature_string if ADD_FEATURE_FLAGS.include?(cmd)} ;;
|
75
|
+
"""
|
76
|
+
else
|
77
|
+
case_append = """ #{cmd})
|
78
|
+
__vagrant-#{cmd} ;;
|
79
|
+
"""
|
80
|
+
end
|
81
|
+
case_str = case_str + case_append
|
82
|
+
end
|
83
|
+
|
84
|
+
case_str = case_str + """esac
|
85
|
+
;;
|
86
|
+
esac
|
87
|
+
"""
|
88
|
+
end
|
89
|
+
|
90
|
+
def extract_flags(top_level_commands)
|
91
|
+
flags = top_level_commands.map { |c| [c.match(FLAG_REGEX)[0], c.split(" ")[-1].strip] if c.strip.start_with?("--") }.compact
|
92
|
+
end
|
93
|
+
|
94
|
+
def extract_subcommand(top_level_commands)
|
95
|
+
cmds = top_level_commands.map { |c| [c.match(CMDS_REGEX)[0].strip, c.split(" ")[-1].strip] if c.match(CMDS_REGEX) }.compact
|
96
|
+
end
|
97
|
+
|
98
|
+
def get_top_level_commands(root_command, cmd_list)
|
99
|
+
stdout, stderr, status = Open3.capture3("vagrant #{root_command} -h")
|
100
|
+
top_level_commands = stdout.split("\n")
|
101
|
+
|
102
|
+
root_subcommand = extract_subcommand(top_level_commands)
|
103
|
+
commands = format_subcommand("sub_commands", root_subcommand)
|
104
|
+
if root_command == "box"
|
105
|
+
feature_string = "':feature:__box_list'"
|
106
|
+
elsif root_command == "plugin"
|
107
|
+
feature_string = "':feature:__plugin_list'"
|
108
|
+
else
|
109
|
+
feature_string = ""
|
110
|
+
end
|
111
|
+
case_string = format_case("sub_commands", root_subcommand, cmd_list, feature_string)
|
112
|
+
|
113
|
+
flags_def = ""
|
114
|
+
root_subcommand.each do |cmd, desc|
|
115
|
+
next if !cmd_list.include?(cmd)
|
116
|
+
stdout, stderr, status = Open3.capture3("vagrant #{root_command} #{cmd} -h")
|
117
|
+
cmd_help = stdout.split("\n")
|
118
|
+
flags_def = flags_def + format_flags("#{cmd}_arguments", extract_flags(cmd_help)) + "\n\n"
|
119
|
+
end
|
120
|
+
|
121
|
+
return commands, flags_def, case_string
|
122
|
+
end
|
123
|
+
|
124
|
+
def format_script(root_command, subcommands, funciton_name)
|
125
|
+
top_level_commands, top_level_args, state_case = get_top_level_commands(root_command, subcommands)
|
126
|
+
|
127
|
+
script = """
|
128
|
+
function #{funciton_name} () {
|
129
|
+
|
130
|
+
#{top_level_commands}
|
131
|
+
|
132
|
+
#{top_level_args}
|
133
|
+
|
134
|
+
_arguments -C ':command:->command' '*::options:->options'
|
135
|
+
|
136
|
+
#{state_case}
|
137
|
+
}
|
138
|
+
"""
|
139
|
+
end
|
140
|
+
|
141
|
+
def generate_script
|
142
|
+
subcommand_list = {
|
143
|
+
"" => ["cloud", "destroy", "global-status", "halt", "help", "login", "init", "package", "port", "powershell", "provision", "push", "rdp", "reload", "resume", "ssh", "ssh-config", "status", "suspend", "up", "upload", "validate", "version", "winrm", "winrm-config"],
|
144
|
+
"box" => ["add", "list", "outdated", "prune", "remove", "repackage", "update"],
|
145
|
+
"snapshot" => ["delete", "list", "pop", "push", "restore", "save"],
|
146
|
+
"plugin" => ["install", "expunge", "license", "list", "repair", "uninstall", "update"],
|
147
|
+
}
|
148
|
+
|
149
|
+
script = """#{HEAD}
|
150
|
+
#{BOX_LIST_FUNCTION}
|
151
|
+
#{PLUGIN_LIST_FUNCTION}
|
152
|
+
"""
|
153
|
+
|
154
|
+
subcommand_list.each do |cmd, opts|
|
155
|
+
if cmd != ""
|
156
|
+
function_name = "__vagrant-#{cmd}"
|
157
|
+
else
|
158
|
+
function_name = "_vagrant"
|
159
|
+
end
|
160
|
+
script = script + format_script(cmd, opts, function_name)
|
161
|
+
end
|
162
|
+
script
|
163
|
+
end
|
164
|
+
|
165
|
+
puts generate_script
|
data/lib/vagrant.rb
CHANGED
@@ -9,6 +9,33 @@ class Log4r::BasicFormatter
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
# Add our patches to net-ssh
|
13
|
+
require "vagrant/patches/net-ssh"
|
14
|
+
|
15
|
+
require "optparse"
|
16
|
+
|
17
|
+
module Vagrant
|
18
|
+
# This is a customized OptionParser for Vagrant plugins. It
|
19
|
+
# will automatically add any default CLI options defined
|
20
|
+
# outside of command implementations to the local option
|
21
|
+
# parser instances in use
|
22
|
+
class OptionParser < ::OptionParser
|
23
|
+
def initialize(*_)
|
24
|
+
super
|
25
|
+
Vagrant.default_cli_options.each do |opt_proc|
|
26
|
+
opt_proc.call(self)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Inject the option parser into the vagrant plugins
|
33
|
+
# module so it is automatically used when defining
|
34
|
+
# command options
|
35
|
+
module VagrantPlugins
|
36
|
+
OptionParser = Vagrant::OptionParser
|
37
|
+
end
|
38
|
+
|
12
39
|
require "vagrant/shared_helpers"
|
13
40
|
require "rubygems"
|
14
41
|
require "vagrant/util"
|
@@ -54,7 +81,7 @@ if ENV["VAGRANT_LOG"] && ENV["VAGRANT_LOG"] != ""
|
|
54
81
|
# See https://github.com/rest-client/rest-client/issues/34#issuecomment-290858
|
55
82
|
# for more information
|
56
83
|
class VagrantLogger < Log4r::Logger
|
57
|
-
def <<
|
84
|
+
def << msg
|
58
85
|
debug(msg.strip)
|
59
86
|
end
|
60
87
|
end
|
@@ -68,10 +95,6 @@ if ENV["VAGRANT_LOG"] && ENV["VAGRANT_LOG"] != ""
|
|
68
95
|
date_pattern: "%F %T"
|
69
96
|
)
|
70
97
|
end
|
71
|
-
# Vagrant Cloud gem uses RestClient to make HTTP requests, so
|
72
|
-
# log them if debug is enabled and use Vagrants logger
|
73
|
-
require 'rest_client'
|
74
|
-
RestClient.log = logger
|
75
98
|
|
76
99
|
Log4r::Outputter.stderr.formatter = Vagrant::Util::LoggingFormatter.new(base_formatter)
|
77
100
|
logger = nil
|
data/lib/vagrant/action.rb
CHANGED
@@ -2,6 +2,7 @@ require 'vagrant/action/builder'
|
|
2
2
|
|
3
3
|
module Vagrant
|
4
4
|
module Action
|
5
|
+
autoload :Hook, 'vagrant/action/hook'
|
5
6
|
autoload :Runner, 'vagrant/action/runner'
|
6
7
|
autoload :Warden, 'vagrant/action/warden'
|
7
8
|
|
@@ -12,8 +13,12 @@ module Vagrant
|
|
12
13
|
autoload :BoxCheckOutdated, "vagrant/action/builtin/box_check_outdated"
|
13
14
|
autoload :BoxRemove, "vagrant/action/builtin/box_remove"
|
14
15
|
autoload :Call, "vagrant/action/builtin/call"
|
16
|
+
autoload :CleanupDisks, "vagrant/action/builtin/cleanup_disks"
|
17
|
+
autoload :CloudInitSetup, "vagrant/action/builtin/cloud_init_setup"
|
18
|
+
autoload :CloudInitWait, "vagrant/action/builtin/cloud_init_wait"
|
15
19
|
autoload :Confirm, "vagrant/action/builtin/confirm"
|
16
20
|
autoload :ConfigValidate, "vagrant/action/builtin/config_validate"
|
21
|
+
autoload :Delayed, "vagrant/action/builtin/delayed"
|
17
22
|
autoload :DestroyConfirm, "vagrant/action/builtin/destroy_confirm"
|
18
23
|
autoload :Disk, "vagrant/action/builtin/disk"
|
19
24
|
autoload :EnvSet, "vagrant/action/builtin/env_set"
|
@@ -21,6 +26,7 @@ module Vagrant
|
|
21
26
|
autoload :HandleBox, "vagrant/action/builtin/handle_box"
|
22
27
|
autoload :HandleBoxUrl, "vagrant/action/builtin/handle_box_url"
|
23
28
|
autoload :HandleForwardedPortCollisions, "vagrant/action/builtin/handle_forwarded_port_collisions"
|
29
|
+
autoload :HasProvisioner, "vagrant/action/builtin/has_provisioner"
|
24
30
|
autoload :IsEnvSet, "vagrant/action/builtin/is_env_set"
|
25
31
|
autoload :IsState, "vagrant/action/builtin/is_state"
|
26
32
|
autoload :Lock, "vagrant/action/builtin/lock"
|
@@ -33,6 +39,7 @@ module Vagrant
|
|
33
39
|
autoload :SSHRun, "vagrant/action/builtin/ssh_run"
|
34
40
|
autoload :SyncedFolders, "vagrant/action/builtin/synced_folders"
|
35
41
|
autoload :SyncedFolderCleanup, "vagrant/action/builtin/synced_folder_cleanup"
|
42
|
+
autoload :Trigger, "vagrant/action/builtin/trigger"
|
36
43
|
autoload :WaitForCommunicator, "vagrant/action/builtin/wait_for_communicator"
|
37
44
|
end
|
38
45
|
|
@@ -17,6 +17,11 @@ module Vagrant
|
|
17
17
|
# Vagrant::Action.run(app)
|
18
18
|
#
|
19
19
|
class Builder
|
20
|
+
# Container for Action arguments
|
21
|
+
MiddlewareArguments = Struct.new(:parameters, :block, :keywords, keyword_init: true)
|
22
|
+
# Item within the stack
|
23
|
+
StackItem = Struct.new(:middleware, :arguments, keyword_init: true)
|
24
|
+
|
20
25
|
# This is the stack of middlewares added. This should NOT be used
|
21
26
|
# directly.
|
22
27
|
#
|
@@ -28,8 +33,8 @@ module Vagrant
|
|
28
33
|
# see {#use} instead.
|
29
34
|
#
|
30
35
|
# @return [Builder]
|
31
|
-
def self.build(middleware, *args, &block)
|
32
|
-
new.use(middleware, *args, &block)
|
36
|
+
def self.build(middleware, *args, **keywords, &block)
|
37
|
+
new.use(middleware, *args, **keywords, &block)
|
33
38
|
end
|
34
39
|
|
35
40
|
def initialize
|
@@ -58,12 +63,21 @@ module Vagrant
|
|
58
63
|
# of the middleware.
|
59
64
|
#
|
60
65
|
# @param [Class] middleware The middleware class
|
61
|
-
def use(middleware, *args, &block)
|
66
|
+
def use(middleware, *args, **keywords, &block)
|
67
|
+
item = StackItem.new(
|
68
|
+
middleware: middleware,
|
69
|
+
arguments: MiddlewareArguments.new(
|
70
|
+
parameters: args,
|
71
|
+
keywords: keywords,
|
72
|
+
block: block
|
73
|
+
)
|
74
|
+
)
|
75
|
+
|
62
76
|
if middleware.kind_of?(Builder)
|
63
77
|
# Merge in the other builder's stack into our own
|
64
78
|
self.stack.concat(middleware.stack)
|
65
79
|
else
|
66
|
-
self.stack <<
|
80
|
+
self.stack << item
|
67
81
|
end
|
68
82
|
|
69
83
|
self
|
@@ -71,8 +85,22 @@ module Vagrant
|
|
71
85
|
|
72
86
|
# Inserts a middleware at the given index or directly before the
|
73
87
|
# given middleware object.
|
74
|
-
def insert(
|
75
|
-
|
88
|
+
def insert(idx_or_item, middleware, *args, **keywords, &block)
|
89
|
+
item = StackItem.new(
|
90
|
+
middleware: middleware,
|
91
|
+
arguments: MiddlewareArguments.new(
|
92
|
+
parameters: args,
|
93
|
+
keywords: keywords,
|
94
|
+
block: block
|
95
|
+
)
|
96
|
+
)
|
97
|
+
|
98
|
+
if idx_or_item.is_a?(Integer)
|
99
|
+
index = idx_or_item
|
100
|
+
else
|
101
|
+
index = self.index(idx_or_item)
|
102
|
+
end
|
103
|
+
|
76
104
|
raise "no such middleware to insert before: #{index.inspect}" unless index
|
77
105
|
|
78
106
|
if middleware.kind_of?(Builder)
|
@@ -80,27 +108,32 @@ module Vagrant
|
|
80
108
|
stack.insert(index, stack_item)
|
81
109
|
end
|
82
110
|
else
|
83
|
-
stack.insert(index,
|
111
|
+
stack.insert(index, item)
|
84
112
|
end
|
85
113
|
end
|
86
114
|
|
87
115
|
alias_method :insert_before, :insert
|
88
116
|
|
89
117
|
# Inserts a middleware after the given index or middleware object.
|
90
|
-
def insert_after(
|
91
|
-
|
118
|
+
def insert_after(idx_or_item, middleware, *args, **keywords, &block)
|
119
|
+
if idx_or_item.is_a?(Integer)
|
120
|
+
index = idx_or_item
|
121
|
+
else
|
122
|
+
index = self.index(idx_or_item)
|
123
|
+
end
|
124
|
+
|
92
125
|
raise "no such middleware to insert after: #{index.inspect}" unless index
|
93
126
|
insert(index + 1, middleware, *args, &block)
|
94
127
|
end
|
95
128
|
|
96
129
|
# Replaces the given middlware object or index with the new
|
97
130
|
# middleware.
|
98
|
-
def replace(index, middleware, *args, &block)
|
131
|
+
def replace(index, middleware, *args, **keywords, &block)
|
99
132
|
if index.is_a?(Integer)
|
100
133
|
delete(index)
|
101
|
-
insert(index, middleware, *args, &block)
|
134
|
+
insert(index, middleware, *args, **keywords, &block)
|
102
135
|
else
|
103
|
-
insert_before(index, middleware, *args, &block)
|
136
|
+
insert_before(index, middleware, *args, **keywords, &block)
|
104
137
|
delete(index)
|
105
138
|
end
|
106
139
|
end
|
@@ -122,8 +155,10 @@ module Vagrant
|
|
122
155
|
# @return [Integer]
|
123
156
|
def index(object)
|
124
157
|
stack.each_with_index do |item, i|
|
125
|
-
return i if item
|
126
|
-
return i if item
|
158
|
+
return i if item == object
|
159
|
+
return i if item.middleware == object
|
160
|
+
return i if item.middleware.respond_to?(:name) &&
|
161
|
+
item.middleware.name == object
|
127
162
|
end
|
128
163
|
|
129
164
|
nil
|
@@ -132,42 +167,153 @@ module Vagrant
|
|
132
167
|
# Converts the builder stack to a runnable action sequence.
|
133
168
|
#
|
134
169
|
# @param [Hash] env The action environment hash
|
135
|
-
# @return [
|
170
|
+
# @return [Warden] A callable object
|
136
171
|
def to_app(env)
|
137
|
-
|
172
|
+
# Start with a duplicate of ourself which can
|
173
|
+
# be modified
|
174
|
+
builder = self.dup
|
175
|
+
|
176
|
+
# Apply all dynamic modifications of the stack. This
|
177
|
+
# will generate dynamic hooks for all actions within
|
178
|
+
# the stack, load any triggers for action classes, and
|
179
|
+
# apply them to the builder's stack
|
180
|
+
builder.apply_dynamic_updates(env)
|
181
|
+
|
182
|
+
# Now that the stack is fully expanded, apply any
|
183
|
+
# action hooks that may be defined so they are on
|
184
|
+
# the outermost locations of the stack
|
185
|
+
builder.apply_action_name(env)
|
186
|
+
|
187
|
+
# Wrap the middleware stack with the Warden to provide a consistent
|
188
|
+
# and predictable behavior upon exceptions.
|
189
|
+
Warden.new(builder.stack.dup, env)
|
190
|
+
end
|
191
|
+
|
192
|
+
# Find any action hooks or triggers which have been defined
|
193
|
+
# for items within the stack. Update the stack with any
|
194
|
+
# hooks or triggers found.
|
195
|
+
#
|
196
|
+
# @param [Hash] env Call environment
|
197
|
+
# @return [Builder] self
|
198
|
+
def apply_dynamic_updates(env)
|
199
|
+
if Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
|
200
|
+
triggers = env[:triggers]
|
201
|
+
end
|
202
|
+
|
203
|
+
# Use a Hook as a convenient interface for injecting
|
204
|
+
# any applicable trigger actions within the stack
|
205
|
+
machine_name = env[:machine].name if env[:machine]
|
206
|
+
|
207
|
+
# Iterate over all items in the stack and apply new items
|
208
|
+
# into the hook as they are found. Must be sure to dup the
|
209
|
+
# stack here since we are modifying the stack in the loop.
|
210
|
+
stack.dup.each do |item|
|
211
|
+
hook = Hook.new
|
212
|
+
|
213
|
+
action = item.first
|
214
|
+
next if action.is_a?(Proc)
|
215
|
+
|
216
|
+
# Start with adding any action triggers that may be defined
|
217
|
+
if triggers && !triggers.find(action, :before, machine_name, :action).empty?
|
218
|
+
hook.prepend(Vagrant::Action::Builtin::Trigger,
|
219
|
+
action.name, triggers, :before, :action)
|
220
|
+
end
|
221
|
+
|
222
|
+
if triggers && !triggers.find(action, :after, machine_name, :action).empty?
|
223
|
+
hook.append(Vagrant::Action::Builtin::Trigger,
|
224
|
+
action.name, triggers, :after, :action)
|
225
|
+
end
|
138
226
|
|
139
|
-
|
140
|
-
|
141
|
-
|
227
|
+
# Next look for any hook triggers that may be defined against
|
228
|
+
# the dynamically generated action class hooks
|
229
|
+
if triggers && !triggers.find(action, :before, machine_name, :hook).empty?
|
230
|
+
hook.prepend(Vagrant::Action::Builtin::Trigger,
|
231
|
+
action.name, triggers, :before, :hook)
|
232
|
+
end
|
142
233
|
|
143
|
-
|
144
|
-
|
234
|
+
if triggers && !triggers.find(action, :after, machine_name, :hook).empty?
|
235
|
+
hook.append(Vagrant::Action::Builtin::Trigger,
|
236
|
+
action.name, triggers, :after, :hook)
|
237
|
+
end
|
145
238
|
|
146
|
-
#
|
147
|
-
#
|
148
|
-
|
149
|
-
|
239
|
+
# Finally load any registered hooks for dynamically generated
|
240
|
+
# action class based hooks
|
241
|
+
Vagrant.plugin("2").manager.find_action_hooks(action).each do |hook_proc|
|
242
|
+
hook_proc.call(hook)
|
150
243
|
end
|
151
244
|
|
152
|
-
|
153
|
-
|
154
|
-
|
245
|
+
hook.apply(self, root: item)
|
246
|
+
end
|
247
|
+
|
248
|
+
# Apply the hook to ourself to update the stack
|
249
|
+
self
|
250
|
+
end
|
251
|
+
|
252
|
+
# If action hooks have not already been set, this method
|
253
|
+
# will perform three tasks:
|
254
|
+
# 1. Load any hook triggers defined for the action_name
|
255
|
+
# 2. Load any action_hooks defined from plugins
|
256
|
+
# 3. Load any action triggers based on machine action called (not action classes)
|
257
|
+
#
|
258
|
+
# @param [Hash] env Call environment
|
259
|
+
# @return [Builder]
|
260
|
+
def apply_action_name(env)
|
261
|
+
env[:builder_raw_applied] ||= []
|
262
|
+
return self if !env[:action_name]
|
263
|
+
|
264
|
+
hook = Hook.new
|
265
|
+
machine_name = env[:machine].name if env[:machine]
|
155
266
|
|
156
|
-
|
157
|
-
|
158
|
-
|
267
|
+
# Start with loading any hook triggers if applicable
|
268
|
+
if Vagrant::Util::Experimental.feature_enabled?("typed_triggers") && env[:triggers]
|
269
|
+
if !env[:triggers].find(env[:action_name], :before, machine_name, :hook).empty?
|
270
|
+
hook.prepend(Vagrant::Action::Builtin::Trigger,
|
271
|
+
env[:action_name], env[:triggers], :before, :hook)
|
272
|
+
end
|
273
|
+
if !env[:triggers].find(env[:action_name], :after, machine_name, :hook).empty?
|
274
|
+
hook.append(Vagrant::Action::Builtin::Trigger,
|
275
|
+
env[:action_name], env[:triggers], :after, :hook)
|
159
276
|
end
|
277
|
+
end
|
160
278
|
|
161
|
-
|
162
|
-
|
279
|
+
# Next we load up all the action hooks that plugins may
|
280
|
+
# have defined
|
281
|
+
action_hooks = Vagrant.plugin("2").manager.action_hooks(env[:action_name])
|
282
|
+
action_hooks.each do |hook_proc|
|
283
|
+
hook_proc.call(hook)
|
163
284
|
end
|
164
285
|
|
165
|
-
#
|
166
|
-
|
286
|
+
# Finally load any action triggers defined. The action triggers
|
287
|
+
# are the originally implemented trigger style. They run before
|
288
|
+
# and after specific provider actions (like :up, :halt, etc) and
|
289
|
+
# are different from true action triggers
|
290
|
+
if env[:triggers] && !env[:builder_raw_applied].include?(env[:raw_action_name])
|
291
|
+
env[:builder_raw_applied] << env[:raw_action_name]
|
167
292
|
|
168
|
-
|
169
|
-
|
170
|
-
|
293
|
+
if !env[:triggers].find(env[:raw_action_name], :before, machine_name, :action, all: true).empty?
|
294
|
+
hook.prepend(Vagrant::Action::Builtin::Trigger,
|
295
|
+
env[:raw_action_name], env[:triggers], :before, :action, all: true)
|
296
|
+
end
|
297
|
+
if !env[:triggers].find(env[:raw_action_name], :after, machine_name, :action, all: true).empty?
|
298
|
+
# NOTE: These after triggers need to be delayed before running to
|
299
|
+
# allow the rest of the call stack to complete before being
|
300
|
+
# run. The delayed action is prepended to the stack (not appended)
|
301
|
+
# to ensure it is called first, which results in it properly
|
302
|
+
# waiting for everything to finish before itself completing.
|
303
|
+
builder = self.class.build(Vagrant::Action::Builtin::Trigger,
|
304
|
+
env[:raw_action_name], env[:triggers], :after, :action, all: true)
|
305
|
+
hook.prepend(Vagrant::Action::Builtin::Delayed, builder)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
# If the hooks are empty, then there was nothing to apply and
|
310
|
+
# we can just send ourself back
|
311
|
+
return self if hook.empty?
|
312
|
+
|
313
|
+
# Apply all the hooks to the new builder instance
|
314
|
+
hook.apply(self)
|
315
|
+
|
316
|
+
self
|
171
317
|
end
|
172
318
|
end
|
173
319
|
end
|