vaguerent/plugins/guests/redhat/cap/change_host_name.rb
smoyer 3964298504 This was introduced in 1.4.1 with d26c147.
This PR sets the active hostname back to the name specified in the Vagrantfile (fqdn) and updates the unit tests.

Setting it to the short name causes loads of problems while configuring the system. I've had issues with sudoers hostname matching, Weblogic certificate generation and a few others. Even if I changed all of the Chef recipes, the fqdn is set in /etc/sysconfig/network so the active hostname will switch to the fqdn after a reboot.
2014-01-08 17:49:54 -05:00

98 lines
2.7 KiB
Ruby

module VagrantPlugins
module GuestRedHat
module Cap
class ChangeHostName
def self.change_host_name(machine, name)
new(machine, name).change!
end
attr_reader :machine, :new_hostname
def initialize(machine, new_hostname)
@machine = machine
@new_hostname = new_hostname
end
def change!
return unless should_change?
update_sysconfig
update_hostname
update_etc_hosts
update_dhcp_hostnames
restart_networking
end
def should_change?
new_hostname != current_hostname
end
def current_hostname
@current_hostname ||= get_current_hostname
end
def get_current_hostname
hostname = ''
block = lambda do |type, data|
if type == :stdout
hostname += data.chomp
end
end
execute 'hostname -f', error_check: false, &block
execute 'hostname',&block if hostname.empty?
/localhost(\..*)?/.match(hostname) ? '' : hostname
end
def update_sysconfig
sudo "sed -i 's/\\(HOSTNAME=\\).*/\\1#{fqdn}/' /etc/sysconfig/network"
end
def update_hostname
sudo "hostname #{fqdn}"
end
# /etc/hosts should resemble:
# 127.0.0.1 host.fqdn.com host localhost ...
def update_etc_hosts
s = '[[:space:]]'
current_fqdn = Regexp.escape(current_hostname)
current_short = Regexp.escape(current_hostname.split('.').first.to_s)
currents = "\\(#{current_fqdn}#{s}\\+\\|#{current_short}#{s}\\+\\)*" unless current_hostname.empty?
local_ip = '127[.]0[.]0[.]1'
search = "^\\(#{local_ip}#{s}\\+\\)#{currents}"
replace = "\\1#{fqdn} "
replace = "#{replace}#{short_hostname} " unless fqdn == short_hostname
expression = ['s', search, replace,''].join('@')
sudo "sed -i '#{expression}' /etc/hosts"
end
def update_dhcp_hostnames
sudo "sed -i 's/\\(DHCP_HOSTNAME=\\).*/\\1\"#{short_hostname}\"/' /etc/sysconfig/network-scripts/ifcfg-*"
end
def restart_networking
sudo 'service network restart'
end
def fqdn
new_hostname
end
def short_hostname
new_hostname.split('.').first
end
def execute(cmd, opts=nil, &block)
machine.communicate.execute(cmd, opts, &block)
end
def sudo(cmd, opts=nil, &block)
machine.communicate.sudo(cmd, opts, &block)
end
end
end
end
end