insert_public_key cap, and use that if it exists
This commit is contained in:
parent
664aaa0088
commit
b3a9e6a088
|
@ -300,6 +300,12 @@ module Vagrant
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# If we have a private key in our data dir, then use that
|
||||||
|
data_private_key = @data_dir.join("private_key")
|
||||||
|
if data_private_key.file?
|
||||||
|
info[:private_key_path] = [data_private_key.to_s]
|
||||||
|
end
|
||||||
|
|
||||||
# Setup the keys
|
# Setup the keys
|
||||||
info[:private_key_path] ||= []
|
info[:private_key_path] ||= []
|
||||||
if !info[:private_key_path].is_a?(Array)
|
if !info[:private_key_path].is_a?(Array)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
require 'logger'
|
require 'logger'
|
||||||
require 'pathname'
|
require 'pathname'
|
||||||
require 'stringio'
|
require 'stringio'
|
||||||
|
require 'thread'
|
||||||
require 'timeout'
|
require 'timeout'
|
||||||
|
|
||||||
require 'log4r'
|
require 'log4r'
|
||||||
|
@ -27,25 +28,57 @@ module VagrantPlugins
|
||||||
end
|
end
|
||||||
|
|
||||||
def initialize(machine)
|
def initialize(machine)
|
||||||
|
@lock = Mutex.new
|
||||||
@machine = machine
|
@machine = machine
|
||||||
@logger = Log4r::Logger.new("vagrant::communication::ssh")
|
@logger = Log4r::Logger.new("vagrant::communication::ssh")
|
||||||
@connection = nil
|
@connection = nil
|
||||||
|
@inserted_key = false
|
||||||
end
|
end
|
||||||
|
|
||||||
def ready?
|
def ready?
|
||||||
@logger.debug("Checking whether SSH is ready...")
|
@logger.debug("Checking whether SSH is ready...")
|
||||||
|
|
||||||
# Attempt to connect. This will raise an exception if it fails.
|
# Attempt to connect. This will raise an exception if it fails.
|
||||||
connect
|
begin
|
||||||
|
connect
|
||||||
|
@logger.info("SSH is ready!")
|
||||||
|
rescue Vagrant::Errors::VagrantError => e
|
||||||
|
# We catch a `VagrantError` which would signal that something went
|
||||||
|
# wrong expectedly in the `connect`, which means we didn't connect.
|
||||||
|
@logger.info("SSH not up: #{e.inspect}")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
# If we're already attempting to switch out the SSH key, then
|
||||||
|
# just return that we're ready (for Machine#guest).
|
||||||
|
@lock.synchronize do
|
||||||
|
return true if @inserted_key
|
||||||
|
@inserted_key = true
|
||||||
|
end
|
||||||
|
|
||||||
|
# If we used a password, then insert the insecure key
|
||||||
|
ssh_info = @machine.ssh_info
|
||||||
|
if ssh_info[:password] && ssh_info[:private_key_path].empty?
|
||||||
|
@logger.info("Inserting insecure key to avoid password")
|
||||||
|
@machine.guest.capability(
|
||||||
|
:insert_public_key,
|
||||||
|
Vagrant.source_root.join("keys", "vagrant.pub").read)
|
||||||
|
|
||||||
|
# Write out the private key in the data dir so that the
|
||||||
|
# machine automatically picks it up.
|
||||||
|
@machine.data_dir.join("private_key").open("w+") do |f|
|
||||||
|
f.write(Vagrant.source_root.join("keys", "vagrant").read)
|
||||||
|
end
|
||||||
|
|
||||||
|
@logger.info("Disconecting SSH so we can reconnect with new SSH key")
|
||||||
|
@connection.close
|
||||||
|
@connection = nil
|
||||||
|
|
||||||
|
return ready?
|
||||||
|
end
|
||||||
|
|
||||||
# If we reached this point then we successfully connected
|
# If we reached this point then we successfully connected
|
||||||
@logger.info("SSH is ready!")
|
|
||||||
true
|
true
|
||||||
rescue Vagrant::Errors::VagrantError => e
|
|
||||||
# We catch a `VagrantError` which would signal that something went
|
|
||||||
# wrong expectedly in the `connect`, which means we didn't connect.
|
|
||||||
@logger.info("SSH not up: #{e.inspect}")
|
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def execute(command, opts=nil, &block)
|
def execute(command, opts=nil, &block)
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module GuestLinux
|
||||||
|
module Cap
|
||||||
|
class InsertPublicKey
|
||||||
|
def self.insert_public_key(machine, contents)
|
||||||
|
machine.communicate.tap do |comm|
|
||||||
|
comm.execute("echo #{contents} > /tmp/key.pub")
|
||||||
|
comm.execute("mkdir -p ~/.ssh")
|
||||||
|
comm.execute("chmod 0700 ~/.ssh")
|
||||||
|
comm.execute("cat /tmp/key.pub >> ~/.ssh/authorized_keys")
|
||||||
|
comm.execute("chmod 0600 ~/.ssh/authorized_keys")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -16,6 +16,11 @@ module VagrantPlugins
|
||||||
Cap::Halt
|
Cap::Halt
|
||||||
end
|
end
|
||||||
|
|
||||||
|
guest_capability("linux", "insert_public_key") do
|
||||||
|
require_relative "cap/insert_public_key"
|
||||||
|
Cap::InsertPublicKey
|
||||||
|
end
|
||||||
|
|
||||||
guest_capability("linux", "shell_expand_guest_path") do
|
guest_capability("linux", "shell_expand_guest_path") do
|
||||||
require_relative "cap/shell_expand_guest_path"
|
require_relative "cap/shell_expand_guest_path"
|
||||||
Cap::ShellExpandGuestPath
|
Cap::ShellExpandGuestPath
|
||||||
|
|
|
@ -6,6 +6,7 @@ module VagrantPlugins
|
||||||
attr_accessor :private_key_path
|
attr_accessor :private_key_path
|
||||||
attr_accessor :username
|
attr_accessor :username
|
||||||
attr_accessor :password
|
attr_accessor :password
|
||||||
|
attr_accessor :insert_key
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@host = UNSET_VALUE
|
@host = UNSET_VALUE
|
||||||
|
@ -13,6 +14,7 @@ module VagrantPlugins
|
||||||
@private_key_path = UNSET_VALUE
|
@private_key_path = UNSET_VALUE
|
||||||
@username = UNSET_VALUE
|
@username = UNSET_VALUE
|
||||||
@password = UNSET_VALUE
|
@password = UNSET_VALUE
|
||||||
|
@insert_key = UNSET_VALUE
|
||||||
end
|
end
|
||||||
|
|
||||||
def finalize!
|
def finalize!
|
||||||
|
@ -21,6 +23,7 @@ module VagrantPlugins
|
||||||
@private_key_path = nil if @private_key_path == UNSET_VALUE
|
@private_key_path = nil if @private_key_path == UNSET_VALUE
|
||||||
@username = nil if @username == UNSET_VALUE
|
@username = nil if @username == UNSET_VALUE
|
||||||
@password = nil if @password == UNSET_VALUE
|
@password = nil if @password == UNSET_VALUE
|
||||||
|
@insert_key = true if @insert_key == UNSET_VALUE
|
||||||
|
|
||||||
if @private_key_path && !@private_key_path.is_a?(Array)
|
if @private_key_path && !@private_key_path.is_a?(Array)
|
||||||
@private_key_path = [@private_key_path]
|
@private_key_path = [@private_key_path]
|
||||||
|
|
|
@ -382,6 +382,20 @@ describe Vagrant::Machine do
|
||||||
expect(instance.ssh_info[:private_key_path]).to be_empty
|
expect(instance.ssh_info[:private_key_path]).to be_empty
|
||||||
expect(instance.ssh_info[:password]).to eql("")
|
expect(instance.ssh_info[:password]).to eql("")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should return the private key in the data dir above all else" do
|
||||||
|
provider_ssh_info[:private_key_path] = nil
|
||||||
|
instance.config.ssh.private_key_path = nil
|
||||||
|
instance.config.ssh.password = ""
|
||||||
|
|
||||||
|
instance.data_dir.join("private_key").open("w+") do |f|
|
||||||
|
f.write("hey")
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(instance.ssh_info[:private_key_path]).to eql(
|
||||||
|
[instance.data_dir.join("private_key").to_s])
|
||||||
|
expect(instance.ssh_info[:password]).to eql("")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue