class Facter::Util::Linux::Dhcp

Constants

DIRS

Public Class Methods

dhcp(interface_name, interface_index, logger) click to toggle source
# File lib/facter/util/linux/dhcp.rb, line 14
def dhcp(interface_name, interface_index, logger)
  @log = logger
  @log.debug("Get DHCP for interface #{interface_name}")

  dhcp = search_systemd_netif_leases(interface_index, interface_name)
  dhcp ||= search_dhclient_leases(interface_name)
  dhcp ||= search_internal_leases(interface_name)
  dhcp ||= search_with_dhcpcd_command(interface_name)
  dhcp
end

Private Class Methods

search_dhclient_leases(interface_name) click to toggle source
# File lib/facter/util/linux/dhcp.rb, line 37
def search_dhclient_leases(interface_name)
  @log.debug("Attempt to get DHCP for interface #{interface_name}, from dhclient leases")

  DIRS.each do |dir|
    next unless File.readable?(dir)

    lease_files = Dir.entries(dir).select { |file| file =~ /dhclient.*\.lease/ }
    next if lease_files.empty?

    lease_files.select do |file|
      content = Facter::Util::FileHelper.safe_read("#{dir}#{file}", nil)
      next unless /interface.*#{interface_name}/.match?(content)

      dhcp = content.match(/dhcp-server-identifier ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/)
      return dhcp[1] if dhcp
    end
  end

  nil
end
search_internal_leases(interface_name) click to toggle source
# File lib/facter/util/linux/dhcp.rb, line 58
def search_internal_leases(interface_name)
  return unless File.readable?('/var/lib/NetworkManager/')

  @log.debug("Attempt to get DHCP for interface #{interface_name}, from NetworkManager leases")

  files = Dir.entries('/var/lib/NetworkManager/').reject { |dir| dir =~ /^\.+$/ }
  lease_file = files.find { |file| file =~ /internal.*#{interface_name}\.lease/ }
  return unless lease_file

  dhcp = Facter::Util::FileHelper.safe_read("/var/lib/NetworkManager/#{lease_file}", nil)

  return unless dhcp

  dhcp = dhcp.match(/SERVER_ADDRESS=(.*)/)
  dhcp[1] if dhcp
end
search_systemd_netif_leases(index, interface_name) click to toggle source
# File lib/facter/util/linux/dhcp.rb, line 27
def search_systemd_netif_leases(index, interface_name)
  return if index.nil?

  @log.debug("Attempt to get DHCP for interface #{interface_name}, from systemd/netif/leases")

  file_content = Facter::Util::FileHelper.safe_read("/run/systemd/netif/leases/#{index}", nil)
  dhcp = file_content.match(/SERVER_ADDRESS=(.*)/) if file_content
  dhcp[1] if dhcp
end
search_with_dhcpcd_command(interface_name) click to toggle source
# File lib/facter/util/linux/dhcp.rb, line 75
def search_with_dhcpcd_command(interface_name)
  @log.debug("Attempt to get DHCP for interface #{interface_name}, from dhcpcd command")

  @dhcpcd_command ||= Facter::Core::Execution.which('dhcpcd')
  return unless @dhcpcd_command

  output = Facter::Core::Execution.execute("#{@dhcpcd_command} -U #{interface_name}", logger: @log)
  dhcp = output.match(/dhcp_server_identifier='(.*)'/)
  dhcp[1] if dhcp
end