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.
- 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
@@ -1,31 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Action
|
3
|
-
module Builtin
|
4
|
-
# This class is intended to be used by the Action::Warden class for executing
|
5
|
-
# action triggers before any given action.
|
6
|
-
#
|
7
|
-
# @param [Symbol] action_name - name to fire trigger on
|
8
|
-
# @param [Vagrant::Plugin::V2::Triger] triggers - trigger object
|
9
|
-
class AfterTriggerAction
|
10
|
-
# @param [Symbol] action_name - The action class name to fire trigger on
|
11
|
-
# @param [Vagrant::Plugin::V2::Triger] triggers - trigger object
|
12
|
-
def initialize(app, env, action_name, triggers)
|
13
|
-
@app = app
|
14
|
-
@env = env
|
15
|
-
@triggers = triggers
|
16
|
-
@action_name = action_name
|
17
|
-
end
|
18
|
-
|
19
|
-
def call(env)
|
20
|
-
machine = env[:machine]
|
21
|
-
machine_name = machine.name if machine
|
22
|
-
|
23
|
-
@triggers.fire_triggers(@action_name, :after, machine_name, :action) if Vagrant::Util::Experimental.feature_enabled?("typed_triggers");
|
24
|
-
|
25
|
-
# Carry on
|
26
|
-
@app.call(env)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Action
|
3
|
-
module Builtin
|
4
|
-
# This class is intended to be used by the Action::Warden class for executing
|
5
|
-
# action triggers before any given action.
|
6
|
-
class BeforeTriggerAction
|
7
|
-
# @param [Symbol] action_name - The action class name to fire trigger on
|
8
|
-
# @param [Vagrant::Plugin::V2::Triger] triggers - trigger object
|
9
|
-
def initialize(app, env, action_name, triggers)
|
10
|
-
@app = app
|
11
|
-
@env = env
|
12
|
-
@triggers = triggers
|
13
|
-
@action_name = action_name
|
14
|
-
end
|
15
|
-
|
16
|
-
def call(env)
|
17
|
-
machine = env[:machine]
|
18
|
-
machine_name = machine.name if machine
|
19
|
-
|
20
|
-
@triggers.fire_triggers(@action_name, :before, machine_name, :action) if Vagrant::Util::Experimental.feature_enabled?("typed_triggers");
|
21
|
-
|
22
|
-
# Carry on
|
23
|
-
@app.call(env)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,253 +0,0 @@
|
|
1
|
-
require "rest_client"
|
2
|
-
require "vagrant/util/downloader"
|
3
|
-
require "vagrant/util/presence"
|
4
|
-
|
5
|
-
module VagrantPlugins
|
6
|
-
module LoginCommand
|
7
|
-
class Client
|
8
|
-
APP = "app".freeze
|
9
|
-
|
10
|
-
include Vagrant::Util::Presence
|
11
|
-
|
12
|
-
attr_accessor :username_or_email
|
13
|
-
attr_accessor :password
|
14
|
-
attr_reader :two_factor_default_delivery_method
|
15
|
-
attr_reader :two_factor_delivery_methods
|
16
|
-
|
17
|
-
# Initializes a login client with the given Vagrant::Environment.
|
18
|
-
#
|
19
|
-
# @param [Vagrant::Environment] env
|
20
|
-
def initialize(env)
|
21
|
-
@logger = Log4r::Logger.new("vagrant::login::client")
|
22
|
-
@env = env
|
23
|
-
end
|
24
|
-
|
25
|
-
# Removes the token, effectively logging the user out.
|
26
|
-
def clear_token
|
27
|
-
@logger.info("Clearing token")
|
28
|
-
token_path.delete if token_path.file?
|
29
|
-
end
|
30
|
-
|
31
|
-
# Checks if the user is logged in by verifying their authentication
|
32
|
-
# token.
|
33
|
-
#
|
34
|
-
# @return [Boolean]
|
35
|
-
def logged_in?
|
36
|
-
token = self.token
|
37
|
-
return false if !token
|
38
|
-
|
39
|
-
with_error_handling do
|
40
|
-
url = "#{Vagrant.server_url}/api/v1/authenticate" +
|
41
|
-
"?access_token=#{token}"
|
42
|
-
RestClient.get(url, content_type: :json)
|
43
|
-
true
|
44
|
-
end
|
45
|
-
rescue Errors::Unauthorized
|
46
|
-
false
|
47
|
-
end
|
48
|
-
|
49
|
-
# Login logs a user in and returns the token for that user. The token
|
50
|
-
# is _not_ stored unless {#store_token} is called.
|
51
|
-
#
|
52
|
-
# @param [String] description
|
53
|
-
# @param [String] code
|
54
|
-
# @return [String] token The access token, or nil if auth failed.
|
55
|
-
def login(description: nil, code: nil)
|
56
|
-
@logger.info("Logging in '#{username_or_email}'")
|
57
|
-
|
58
|
-
response = post(
|
59
|
-
"/api/v1/authenticate", {
|
60
|
-
user: {
|
61
|
-
login: username_or_email,
|
62
|
-
password: password
|
63
|
-
},
|
64
|
-
token: {
|
65
|
-
description: description
|
66
|
-
},
|
67
|
-
two_factor: {
|
68
|
-
code: code
|
69
|
-
}
|
70
|
-
}
|
71
|
-
)
|
72
|
-
|
73
|
-
response["token"]
|
74
|
-
end
|
75
|
-
|
76
|
-
# Requests a 2FA code
|
77
|
-
# @param [String] delivery_method
|
78
|
-
def request_code(delivery_method)
|
79
|
-
@env.ui.warn("Requesting 2FA code via #{delivery_method.upcase}...")
|
80
|
-
|
81
|
-
response = post(
|
82
|
-
"/api/v1/two-factor/request-code", {
|
83
|
-
user: {
|
84
|
-
login: username_or_email,
|
85
|
-
password: password
|
86
|
-
},
|
87
|
-
two_factor: {
|
88
|
-
delivery_method: delivery_method.downcase
|
89
|
-
}
|
90
|
-
}
|
91
|
-
)
|
92
|
-
|
93
|
-
two_factor = response['two_factor']
|
94
|
-
obfuscated_destination = two_factor['obfuscated_destination']
|
95
|
-
|
96
|
-
@env.ui.success("2FA code sent to #{obfuscated_destination}.")
|
97
|
-
end
|
98
|
-
|
99
|
-
# Issues a post to a Vagrant Cloud path with the given payload.
|
100
|
-
# @param [String] path
|
101
|
-
# @param [Hash] payload
|
102
|
-
# @return [Hash] response data
|
103
|
-
def post(path, payload)
|
104
|
-
with_error_handling do
|
105
|
-
url = File.join(Vagrant.server_url, path)
|
106
|
-
|
107
|
-
proxy = nil
|
108
|
-
proxy ||= ENV["HTTPS_PROXY"] || ENV["https_proxy"]
|
109
|
-
proxy ||= ENV["HTTP_PROXY"] || ENV["http_proxy"]
|
110
|
-
RestClient.proxy = proxy
|
111
|
-
|
112
|
-
response = RestClient::Request.execute(
|
113
|
-
method: :post,
|
114
|
-
url: url,
|
115
|
-
payload: JSON.dump(payload),
|
116
|
-
proxy: proxy,
|
117
|
-
headers: {
|
118
|
-
accept: :json,
|
119
|
-
content_type: :json,
|
120
|
-
user_agent: Vagrant::Util::Downloader::USER_AGENT,
|
121
|
-
},
|
122
|
-
)
|
123
|
-
|
124
|
-
JSON.load(response.to_s)
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
# Stores the given token locally, removing any previous tokens.
|
129
|
-
#
|
130
|
-
# @param [String] token
|
131
|
-
def store_token(token)
|
132
|
-
@logger.info("Storing token in #{token_path}")
|
133
|
-
|
134
|
-
token_path.open("w") do |f|
|
135
|
-
f.write(token)
|
136
|
-
end
|
137
|
-
|
138
|
-
nil
|
139
|
-
end
|
140
|
-
|
141
|
-
# Reads the access token if there is one. This will first read the
|
142
|
-
# `VAGRANT_CLOUD_TOKEN` environment variable and then fallback to the stored
|
143
|
-
# access token on disk.
|
144
|
-
#
|
145
|
-
# @return [String]
|
146
|
-
def token
|
147
|
-
if present?(ENV["VAGRANT_CLOUD_TOKEN"]) && token_path.exist?
|
148
|
-
@env.ui.warn <<-EOH.strip
|
149
|
-
Vagrant detected both the VAGRANT_CLOUD_TOKEN environment variable and a Vagrant login
|
150
|
-
token are present on this system. The VAGRANT_CLOUD_TOKEN environment variable takes
|
151
|
-
precedence over the locally stored token. To remove this error, either unset
|
152
|
-
the VAGRANT_CLOUD_TOKEN environment variable or remove the login token stored on disk:
|
153
|
-
|
154
|
-
~/.vagrant.d/data/vagrant_login_token
|
155
|
-
|
156
|
-
EOH
|
157
|
-
end
|
158
|
-
|
159
|
-
if present?(ENV["VAGRANT_CLOUD_TOKEN"])
|
160
|
-
@logger.debug("Using authentication token from environment variable")
|
161
|
-
return ENV["VAGRANT_CLOUD_TOKEN"]
|
162
|
-
end
|
163
|
-
|
164
|
-
if token_path.exist?
|
165
|
-
@logger.debug("Using authentication token from disk at #{token_path}")
|
166
|
-
return token_path.read.strip
|
167
|
-
end
|
168
|
-
|
169
|
-
if present?(ENV["ATLAS_TOKEN"])
|
170
|
-
@logger.warn("ATLAS_TOKEN detected within environment. Using ATLAS_TOKEN in place of VAGRANT_CLOUD_TOKEN.")
|
171
|
-
return ENV["ATLAS_TOKEN"]
|
172
|
-
end
|
173
|
-
|
174
|
-
@logger.debug("No authentication token in environment or #{token_path}")
|
175
|
-
|
176
|
-
nil
|
177
|
-
end
|
178
|
-
|
179
|
-
protected
|
180
|
-
|
181
|
-
def with_error_handling(&block)
|
182
|
-
yield
|
183
|
-
rescue RestClient::Unauthorized
|
184
|
-
@logger.debug("Unauthorized!")
|
185
|
-
raise Errors::Unauthorized
|
186
|
-
rescue RestClient::BadRequest => e
|
187
|
-
@logger.debug("Bad request:")
|
188
|
-
@logger.debug(e.message)
|
189
|
-
@logger.debug(e.backtrace.join("\n"))
|
190
|
-
parsed_response = JSON.parse(e.response)
|
191
|
-
errors = parsed_response["errors"].join("\n")
|
192
|
-
raise Errors::ServerError, errors: errors
|
193
|
-
rescue RestClient::NotAcceptable => e
|
194
|
-
@logger.debug("Got unacceptable response:")
|
195
|
-
@logger.debug(e.message)
|
196
|
-
@logger.debug(e.backtrace.join("\n"))
|
197
|
-
|
198
|
-
parsed_response = JSON.parse(e.response)
|
199
|
-
|
200
|
-
if two_factor = parsed_response['two_factor']
|
201
|
-
store_two_factor_information two_factor
|
202
|
-
|
203
|
-
if two_factor_default_delivery_method != APP
|
204
|
-
request_code two_factor_default_delivery_method
|
205
|
-
end
|
206
|
-
|
207
|
-
raise Errors::TwoFactorRequired
|
208
|
-
end
|
209
|
-
|
210
|
-
begin
|
211
|
-
errors = parsed_response["errors"].join("\n")
|
212
|
-
raise Errors::ServerError, errors: errors
|
213
|
-
rescue JSON::ParserError; end
|
214
|
-
|
215
|
-
raise "An unexpected error occurred: #{e.inspect}"
|
216
|
-
rescue SocketError
|
217
|
-
@logger.info("Socket error")
|
218
|
-
raise Errors::ServerUnreachable, url: Vagrant.server_url.to_s
|
219
|
-
end
|
220
|
-
|
221
|
-
def token_path
|
222
|
-
@env.data_dir.join("vagrant_login_token")
|
223
|
-
end
|
224
|
-
|
225
|
-
def store_two_factor_information(two_factor)
|
226
|
-
@two_factor_default_delivery_method =
|
227
|
-
two_factor['default_delivery_method']
|
228
|
-
|
229
|
-
@two_factor_delivery_methods =
|
230
|
-
two_factor['delivery_methods']
|
231
|
-
|
232
|
-
@env.ui.warn "2FA is enabled for your account."
|
233
|
-
if two_factor_default_delivery_method == APP
|
234
|
-
@env.ui.info "Enter the code from your authenticator."
|
235
|
-
else
|
236
|
-
@env.ui.info "Default method is " \
|
237
|
-
"'#{two_factor_default_delivery_method}'."
|
238
|
-
end
|
239
|
-
|
240
|
-
other_delivery_methods =
|
241
|
-
two_factor_delivery_methods - [APP]
|
242
|
-
|
243
|
-
if other_delivery_methods.any?
|
244
|
-
other_delivery_methods_sentence = other_delivery_methods
|
245
|
-
.map { |word| "'#{word}'" }
|
246
|
-
.join(' or ')
|
247
|
-
@env.ui.info "You can also type #{other_delivery_methods_sentence} " \
|
248
|
-
"to request a new code."
|
249
|
-
end
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
@@ -1,137 +0,0 @@
|
|
1
|
-
require 'socket'
|
2
|
-
|
3
|
-
module VagrantPlugins
|
4
|
-
module LoginCommand
|
5
|
-
class Command < Vagrant.plugin("2", "command")
|
6
|
-
def self.synopsis
|
7
|
-
"log in to HashiCorp's Vagrant Cloud"
|
8
|
-
end
|
9
|
-
|
10
|
-
def execute
|
11
|
-
options = {}
|
12
|
-
|
13
|
-
opts = OptionParser.new do |o|
|
14
|
-
o.banner = "Usage: vagrant login"
|
15
|
-
o.separator ""
|
16
|
-
o.on("-c", "--check", "Only checks if you're logged in") do |c|
|
17
|
-
options[:check] = c
|
18
|
-
end
|
19
|
-
|
20
|
-
o.on("-d", "--description DESCRIPTION", String, "Description for the Vagrant Cloud token") do |t|
|
21
|
-
options[:description] = t
|
22
|
-
end
|
23
|
-
|
24
|
-
o.on("-k", "--logout", "Logs you out if you're logged in") do |k|
|
25
|
-
options[:logout] = k
|
26
|
-
end
|
27
|
-
|
28
|
-
o.on("-t", "--token TOKEN", String, "Set the Vagrant Cloud token") do |t|
|
29
|
-
options[:token] = t
|
30
|
-
end
|
31
|
-
|
32
|
-
o.on("-u", "--username USERNAME_OR_EMAIL", String, "Specify your Vagrant Cloud username or email address") do |t|
|
33
|
-
options[:login] = t
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# Parse the options
|
38
|
-
argv = parse_options(opts)
|
39
|
-
return if !argv
|
40
|
-
|
41
|
-
@client = Client.new(@env)
|
42
|
-
@client.username_or_email = options[:login]
|
43
|
-
|
44
|
-
# Determine what task we're actually taking based on flags
|
45
|
-
if options[:check]
|
46
|
-
return execute_check
|
47
|
-
elsif options[:logout]
|
48
|
-
return execute_logout
|
49
|
-
elsif options[:token]
|
50
|
-
return execute_token(options[:token])
|
51
|
-
end
|
52
|
-
|
53
|
-
# Let the user know what is going on.
|
54
|
-
@env.ui.output(I18n.t("login_command.command_header") + "\n")
|
55
|
-
|
56
|
-
# If it is a private cloud installation, show that
|
57
|
-
if Vagrant.server_url != Vagrant::DEFAULT_SERVER_URL
|
58
|
-
@env.ui.output("Vagrant Cloud URL: #{Vagrant.server_url}")
|
59
|
-
end
|
60
|
-
|
61
|
-
# Ask for the username
|
62
|
-
if @client.username_or_email
|
63
|
-
@env.ui.output("Vagrant Cloud username or email: #{@client.username_or_email}")
|
64
|
-
end
|
65
|
-
until @client.username_or_email
|
66
|
-
@client.username_or_email = @env.ui.ask("Vagrant Cloud username or email: ")
|
67
|
-
end
|
68
|
-
|
69
|
-
until @client.password
|
70
|
-
@client.password = @env.ui.ask("Password (will be hidden): ", echo: false)
|
71
|
-
end
|
72
|
-
|
73
|
-
description = options[:description]
|
74
|
-
if description
|
75
|
-
@env.ui.output("Token description: #{description}")
|
76
|
-
else
|
77
|
-
description_default = "Vagrant login from #{Socket.gethostname}"
|
78
|
-
until description
|
79
|
-
description =
|
80
|
-
@env.ui.ask("Token description (Defaults to #{description_default.inspect}): ")
|
81
|
-
end
|
82
|
-
description = description_default if description.empty?
|
83
|
-
end
|
84
|
-
|
85
|
-
code = nil
|
86
|
-
|
87
|
-
begin
|
88
|
-
token = @client.login(description: description, code: code)
|
89
|
-
rescue Errors::TwoFactorRequired
|
90
|
-
until code
|
91
|
-
code = @env.ui.ask("2FA code: ")
|
92
|
-
|
93
|
-
if @client.two_factor_delivery_methods.include?(code.downcase)
|
94
|
-
delivery_method, code = code, nil
|
95
|
-
@client.request_code delivery_method
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
retry
|
100
|
-
end
|
101
|
-
|
102
|
-
@client.store_token(token)
|
103
|
-
@env.ui.success(I18n.t("login_command.logged_in"))
|
104
|
-
0
|
105
|
-
end
|
106
|
-
|
107
|
-
def execute_check
|
108
|
-
if @client.logged_in?
|
109
|
-
@env.ui.success(I18n.t("login_command.check_logged_in"))
|
110
|
-
return 0
|
111
|
-
else
|
112
|
-
@env.ui.error(I18n.t("login_command.check_not_logged_in"))
|
113
|
-
return 1
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def execute_logout
|
118
|
-
@client.clear_token
|
119
|
-
@env.ui.success(I18n.t("login_command.logged_out"))
|
120
|
-
return 0
|
121
|
-
end
|
122
|
-
|
123
|
-
def execute_token(token)
|
124
|
-
@client.store_token(token)
|
125
|
-
@env.ui.success(I18n.t("login_command.token_saved"))
|
126
|
-
|
127
|
-
if @client.logged_in?
|
128
|
-
@env.ui.success(I18n.t("login_command.check_logged_in"))
|
129
|
-
return 0
|
130
|
-
else
|
131
|
-
@env.ui.error(I18n.t("login_command.invalid_token"))
|
132
|
-
return 1
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|