Allow the FreeBSD plugin to install without bash [GH-2485]

The default shell is "bash -l" which does not get installed by default
on FreeBSD. This change allows the plugin to override the default shell
and use a known installed shell (sh).
This commit is contained in:
Mark Peek 2013-11-22 15:30:12 -08:00
parent bf2b06e1be
commit d5dcf84d62
6 changed files with 22 additions and 19 deletions

View File

@ -54,6 +54,7 @@ module VagrantPlugins
:error_class => Vagrant::Errors::VagrantError,
:error_key => :ssh_bad_exit_status,
:command => command,
:shell => nil,
:sudo => false
}.merge(opts || {})
@ -61,7 +62,7 @@ module VagrantPlugins
stdout = ""
stderr = ""
exit_status = connect do |connection|
shell_execute(connection, command, opts[:sudo]) do |type, data|
shell_execute(connection, command, opts[:sudo], opts[:shell]) do |type, data|
if type == :stdout
stdout += data
elsif type == :stderr
@ -273,18 +274,20 @@ module VagrantPlugins
end
# Executes the command on an SSH connection within a login shell.
def shell_execute(connection, command, sudo=false)
def shell_execute(connection, command, sudo=false, shell=nil)
@logger.info("Execute: #{command} (sudo=#{sudo.inspect})")
exit_status = nil
# Determine the shell to execute. If we are using `sudo` then we
# Determine the shell to execute. Prefer the explicitly passed in shell
# over the default configured shell. If we are using `sudo` then we
# need to wrap the shell in a `sudo` call.
shell = @machine.config.ssh.shell
shell = "sudo -H #{shell}" if sudo
shell_cmd = @machine.config.ssh.shell
shell_cmd = shell if shell
shell_cmd = "sudo -H #{shell_cmd}" if sudo
# Open the channel so we can execute or command
channel = connection.open_channel do |ch|
ch.exec(shell) do |ch2, _|
ch.exec(shell_cmd) do |ch2, _|
# Setup the channel callbacks so we can get data and exit status
ch2.on_data do |ch3, data|
# Filter out the clear screen command

View File

@ -3,9 +3,9 @@ module VagrantPlugins
module Cap
class ChangeHostName
def self.change_host_name(machine, name)
if !machine.communicate.test("hostname -f | grep '^#{name}$' || hostname -s | grep '^#{name}$'")
machine.communicate.sudo("sed -i '' 's/^hostname=.*$/hostname=#{name}/' /etc/rc.conf")
machine.communicate.sudo("hostname #{name}")
if !machine.communicate.test("hostname -f | grep '^#{name}$' || hostname -s | grep '^#{name}$'", {:shell => "sh"})
machine.communicate.sudo("sed -i '' 's/^hostname=.*$/hostname=#{name}/' /etc/rc.conf", {:shell => "sh"})
machine.communicate.sudo("hostname #{name}", {:shell => "sh"})
end
end
end

View File

@ -10,7 +10,7 @@ module VagrantPlugins
def self.configure_networks(machine, networks)
# Remove any previous network additions to the configuration file.
machine.communicate.sudo("sed -i '' -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/rc.conf")
machine.communicate.sudo("sed -i '' -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/rc.conf", {:shell => "sh"})
networks.each do |network|
entry = TemplateRenderer.render("guests/freebsd/network_#{network[:type]}",
@ -22,14 +22,14 @@ module VagrantPlugins
temp.write(entry)
temp.close
machine.communicate.upload(temp.path, "/tmp/vagrant-network-entry")
machine.communicate.sudo("su -m root -c 'cat /tmp/vagrant-network-entry >> /etc/rc.conf'")
machine.communicate.sudo("rm /tmp/vagrant-network-entry")
machine.communicate.upload(temp.path, "/tmp/vagrant-network-entry", {:shell => "sh"})
machine.communicate.sudo("su -m root -c 'cat /tmp/vagrant-network-entry >> /etc/rc.conf'", {:shell => "sh"})
machine.communicate.sudo("rm /tmp/vagrant-network-entry", {:shell => "sh"})
if network[:type].to_sym == :static
machine.communicate.sudo("ifconfig em#{network[:interface]} inet #{network[:ip]} netmask #{network[:netmask]}")
machine.communicate.sudo("ifconfig em#{network[:interface]} inet #{network[:ip]} netmask #{network[:netmask]}", {:shell => "sh"})
elsif network[:type].to_sym == :dhcp
machine.communicate.sudo("dhclient em#{network[:interface]}")
machine.communicate.sudo("dhclient em#{network[:interface]}", {:shell => "sh"})
end
end
end

View File

@ -4,7 +4,7 @@ module VagrantPlugins
class Halt
def self.halt(machine)
begin
machine.communicate.sudo("shutdown -p now")
machine.communicate.sudo("shutdown -p now", {:shell => "sh"})
rescue IOError
# Do nothing because SSH connection closed and it probably
# means the VM just shut down really fast.

View File

@ -4,8 +4,8 @@ module VagrantPlugins
class MountNFSFolder
def self.mount_nfs_folder(machine, ip, folders)
folders.each do |name, opts|
machine.communicate.sudo("mkdir -p #{opts[:guestpath]}")
machine.communicate.sudo("mount -t nfs '#{ip}:#{opts[:hostpath]}' '#{opts[:guestpath]}'")
machine.communicate.sudo("mkdir -p #{opts[:guestpath]}", {:shell => "sh"})
machine.communicate.sudo("mount -t nfs '#{ip}:#{opts[:hostpath]}' '#{opts[:guestpath]}'", {:shell => "sh"})
end
end
end

View File

@ -7,7 +7,7 @@ module VagrantPlugins
# Contributed by Kenneth Vestergaard <kvs@binarysolutions.dk>
class Guest < Vagrant.plugin("2", :guest)
def detect?(machine)
machine.communicate.test("uname -s | grep 'FreeBSD'")
machine.communicate.test("uname -s | grep 'FreeBSD'", {:shell => "sh"})
end
end
end