Add management of hostsfile on the host machine.
This commit is contained in:
		
							parent
							
								
									264856478f
								
							
						
					
					
						commit
						67644a6de0
					
				| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
require 'vagrant-hostmanager/hosts_file'
 | 
			
		||||
 | 
			
		||||
module VagrantPlugins
 | 
			
		||||
  module HostManager
 | 
			
		||||
    module Action
 | 
			
		||||
      class DeleteLocalEntry
 | 
			
		||||
        include HostsFile
 | 
			
		||||
 | 
			
		||||
        def initialize(app, env)
 | 
			
		||||
          @app = app
 | 
			
		||||
          @machine = env[:machine]
 | 
			
		||||
          @logger = Log4r::Logger.new('vagrant::hostmanager::delete_local_entry')
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        def call(env)
 | 
			
		||||
 | 
			
		||||
          @logger.info 'delete called'
 | 
			
		||||
          # check config to see if the hosts file should be updated automatically
 | 
			
		||||
          return @app.call(env) unless @machine.config.hostmanager.enabled?
 | 
			
		||||
          @logger.info 'Updating /etc/hosts file automatically'
 | 
			
		||||
 | 
			
		||||
          # delete entry for id
 | 
			
		||||
          delete_local(@machine)
 | 
			
		||||
 | 
			
		||||
          @app.call(env)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
require 'vagrant-hostmanager/hosts_file'
 | 
			
		||||
 | 
			
		||||
module VagrantPlugins
 | 
			
		||||
  module HostManager
 | 
			
		||||
    module Action
 | 
			
		||||
      class UpdateLocalEntry
 | 
			
		||||
        include HostsFile
 | 
			
		||||
 | 
			
		||||
        def initialize(app, env)
 | 
			
		||||
          @app = app
 | 
			
		||||
          @machine = env[:machine]
 | 
			
		||||
          @logger = Log4r::Logger.new('vagrant::hostmanager::update_local_entry')
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        def call(env)
 | 
			
		||||
          # check if machine is already active
 | 
			
		||||
          @logger.info "Called update"
 | 
			
		||||
          return @app.call(env) if @machine.id
 | 
			
		||||
 | 
			
		||||
          # check config to see if the hosts file should be update automatically
 | 
			
		||||
          return @app.call(env) unless @machine.config.hostmanager.enabled?
 | 
			
		||||
          @logger.info 'Updating /etc/hosts file automatically'
 | 
			
		||||
 | 
			
		||||
          # continue the action stack so the machine will be created
 | 
			
		||||
          @app.call(env)
 | 
			
		||||
 | 
			
		||||
          # delete entry for id
 | 
			
		||||
          update_local(@machine)
 | 
			
		||||
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ module VagrantPlugins
 | 
			
		|||
 | 
			
		||||
        with_target_vms(argv, options) do |machine|
 | 
			
		||||
          update(machine)
 | 
			
		||||
          update_local(machine)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ module VagrantPlugins
 | 
			
		|||
  module HostManager
 | 
			
		||||
    class Config < Vagrant.plugin('2', :config)
 | 
			
		||||
      attr_accessor :enabled
 | 
			
		||||
      attr_accessor :manage_local
 | 
			
		||||
      attr_accessor :ignore_private_ip
 | 
			
		||||
      attr_accessor :aliases
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -9,6 +10,7 @@ module VagrantPlugins
 | 
			
		|||
 | 
			
		||||
      def initialize
 | 
			
		||||
        @enabled = false
 | 
			
		||||
        @manage_local = true
 | 
			
		||||
        @ignore_private_ip = UNSET_VALUE
 | 
			
		||||
        @aliases = Array.new
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -25,6 +27,11 @@ module VagrantPlugins
 | 
			
		|||
          errors << "A value for hostmanager.enabled can be true or false."
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        # check if manage_local option is either true or false
 | 
			
		||||
        if ![TrueClass, FalseClass].include?(manage_local.class)
 | 
			
		||||
          errors << "A value for hostmanager.manage_local can be true or false."
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        # check if ignore_private_ip option is either true or false
 | 
			
		||||
        if ![TrueClass, FalseClass].include?(ignore_private_ip.class) &&
 | 
			
		||||
          @ignore_private_ip != UNSET_VALUE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,18 +7,6 @@ module VagrantPlugins
 | 
			
		|||
      def generate(env, provider)
 | 
			
		||||
        machines = []
 | 
			
		||||
 | 
			
		||||
        # define a lambda for looking up a machine's ip address
 | 
			
		||||
        get_ip_address = lambda do |machine|
 | 
			
		||||
          ip = nil
 | 
			
		||||
          if machine.config.hostmanager.ignore_private_ip != true
 | 
			
		||||
            machine.config.vm.networks.each do |network|
 | 
			
		||||
              key, options = network[0], network[1]
 | 
			
		||||
              ip = options[:ip] if key == :private_network
 | 
			
		||||
              next if ip
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
          ip || machine.ssh_info[:host]
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        # create the temporary hosts file
 | 
			
		||||
        path = env.tmp_path.join('hosts')
 | 
			
		||||
| 
						 | 
				
			
			@ -30,10 +18,12 @@ module VagrantPlugins
 | 
			
		|||
            if provider == p
 | 
			
		||||
              machines << machine = env.machine(name, provider)
 | 
			
		||||
              host = machine.config.vm.hostname || name
 | 
			
		||||
              ip = get_ip_address.call(machine)
 | 
			
		||||
              id = machine.id
 | 
			
		||||
              ip = get_ip_address(machine)
 | 
			
		||||
              host_aliases = machine.config.hostmanager.aliases.join("\s").chomp
 | 
			
		||||
              @logger.info "Adding /etc/hosts entry: #{ip} #{host} #{host_aliases}"
 | 
			
		||||
              file << "#{ip}\t#{host}\s#{host_aliases}\n"
 | 
			
		||||
              host_entry = "#{ip}\t#{host}\s#{host_aliases}\n"
 | 
			
		||||
              @logger.info "Adding /etc/hosts entry: #{ip} #{host} #{host_aliases} #{id}"
 | 
			
		||||
              file << "#{host_entry}"
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +31,58 @@ module VagrantPlugins
 | 
			
		|||
        machines
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
        # define a lambda for looking up a machine's ip address
 | 
			
		||||
      def  get_ip_address(machine)
 | 
			
		||||
          ip = nil
 | 
			
		||||
          if machine.config.hostmanager.ignore_private_ip != true
 | 
			
		||||
            machine.config.vm.networks.each do |network|
 | 
			
		||||
              key, options = network[0], network[1]
 | 
			
		||||
              ip = options[:ip] if key == :private_network
 | 
			
		||||
              next if ip
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
          ip || machine.ssh_info[:host]
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
      def update_local(machine)
 | 
			
		||||
         return if machine.id.nil?
 | 
			
		||||
         tmplocal=machine.env.tmp_path.join('hosts.local')
 | 
			
		||||
         delete_local(machine)
 | 
			
		||||
         
 | 
			
		||||
         host = machine.config.vm.hostname || name
 | 
			
		||||
         id = machine.id
 | 
			
		||||
         ip = get_ip_address(machine)
 | 
			
		||||
         host_aliases = machine.config.hostmanager.aliases.join("\s").chomp
 | 
			
		||||
         host_entry = "#{ip}\t#{host}\s#{host_aliases}\s# VAGRANT: #{id}\n" 
 | 
			
		||||
         @logger.info "Adding /etc/hosts entry: #{ip} #{host} #{host_aliases} # #{id} - #{tmplocal}"
 | 
			
		||||
         File.open(tmplocal,'a') do |tmpfile|
 | 
			
		||||
             tmpfile << host_entry
 | 
			
		||||
         end
 | 
			
		||||
         publish_local(machine.env)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def delete_local(machine)
 | 
			
		||||
          return if machine.id.nil?
 | 
			
		||||
          tmplocal=machine.env.tmp_path.join('hosts.local')
 | 
			
		||||
          File.open(tmplocal, 'w') do |tmpfile|
 | 
			
		||||
            File.open('/etc/hosts','r').each_line do |line|
 | 
			
		||||
              if line.match(/#{machine.id}$/).nil?
 | 
			
		||||
                 @logger.info "Found #{machine.id} in hosts file"
 | 
			
		||||
                 tmpfile << line
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
          publish_local(machine.env)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def publish_local(env)
 | 
			
		||||
          @logger.info `sudo cp -v /etc/hosts /etc/hosts.bak`
 | 
			
		||||
          @logger.info `sudo cp -v #{env.tmp_path.join('hosts.local')} /etc/hosts`
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      # Copy the temporary hosts file to the specified machine overwritting
 | 
			
		||||
      # the existing /etc/hosts file.
 | 
			
		||||
      def update(machine)
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +92,7 @@ module VagrantPlugins
 | 
			
		|||
            :name => machine.name
 | 
			
		||||
          })
 | 
			
		||||
          machine.communicate.upload(path, '/tmp/hosts')
 | 
			
		||||
          machine.communicate.sudo("mv /tmp/hosts /etc/hosts")
 | 
			
		||||
          machine.communicate.sudo("mv /tmp/hosts /etc/hosts.hostmanager")
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,6 @@
 | 
			
		|||
require 'vagrant-hostmanager/action/update_hosts_file'
 | 
			
		||||
require 'vagrant-hostmanager/action/update_local_entry'
 | 
			
		||||
require 'vagrant-hostmanager/action/delete_local_entry'
 | 
			
		||||
 | 
			
		||||
module VagrantPlugins
 | 
			
		||||
  module HostManager
 | 
			
		||||
| 
						 | 
				
			
			@ -16,9 +18,11 @@ module VagrantPlugins
 | 
			
		|||
 | 
			
		||||
      action_hook(:hostmanager, :machine_action_up) do |hook|
 | 
			
		||||
        hook.prepend(Action::UpdateHostsFile)
 | 
			
		||||
        hook.prepend(Action::UpdateLocalEntry)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      action_hook(:hostmanager, :machine_action_destroy) do |hook|
 | 
			
		||||
        hook.prepend(Action::DeleteLocalEntry)
 | 
			
		||||
        hook.append(Action::UpdateHostsFile)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue