diff --git a/plugins/guests/fedora/cap/change_host_name.rb b/plugins/guests/fedora/cap/change_host_name.rb new file mode 100644 index 000000000..2a93b9de6 --- /dev/null +++ b/plugins/guests/fedora/cap/change_host_name.rb @@ -0,0 +1,75 @@ +module VagrantPlugins + module GuestFedora + 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_etc_hostname + update_etc_hosts + refresh_hostname_service + end + + def should_change? + new_hostname != current_hostname + end + + def current_hostname + @current_hostname ||= get_current_hostname + end + + def get_current_hostname + hostname = "" + sudo "hostname -f" do |type, data| + hostname = data.chomp if type == :stdout && hostname.empty? + end + + hostname + end + + def update_etc_hostname + sudo("echo '#{short_hostname}' > /etc/hostname") + end + + # /etc/hosts should resemble: + # 127.0.0.1 localhost + # 127.0.1.1 host.fqdn.com host.fqdn host + def update_etc_hosts + ip_address = '([0-9]{1,3}\.){3}[0-9]{1,3}' + search = "^(#{ip_address})\\s+#{Regexp.escape(current_hostname)}(\\s.*)?$" + replace = "\\1 #{fqdn} #{short_hostname}" + expression = ['s', search, replace, 'g'].join('@') + + sudo("sed -ri '#{expression}' /etc/hosts") + end + + def refresh_hostname_service + sudo("hostname -F /etc/hostname") + end + + def fqdn + new_hostname + end + + def short_hostname + new_hostname.split('.').first + end + + def sudo(cmd, &block) + machine.communicate.sudo(cmd, &block) + end + end + end + end +end \ No newline at end of file diff --git a/plugins/guests/fedora/plugin.rb b/plugins/guests/fedora/plugin.rb index fdfdab807..66b2d111f 100644 --- a/plugins/guests/fedora/plugin.rb +++ b/plugins/guests/fedora/plugin.rb @@ -11,6 +11,11 @@ module VagrantPlugins Guest end + guest_capability("fedora", "change_host_name") do + require_relative "cap/change_host_name" + Cap::ChangeHostName + end + guest_capability("fedora", "configure_networks") do require_relative "cap/configure_networks" Cap::ConfigureNetworks