File: //proc/self/root/usr/lib/ruby/site_ruby/1.8/facter/domain.rb
# Fact: domain
#
# Purpose:
# Return the host's primary DNS domain name.
#
# Resolution:
# On UNIX (excluding Darwin), first try and use the hostname fact,
# which uses the `hostname` system command, and then parse the output
# of that.
# Failing that, it tries the `dnsdomainname` system command.
# Failing that, it uses `/etc/resolv.conf` and takes the domain from that, or as
# a final resort, the search from that.
# Otherwise returns `nil`.
#
# On Windows uses the win32ole gem and winmgmts to get the DNSDomain value
# from the Win32 networking stack.
#
# Caveats:
#
Facter.add(:domain) do
setcode do
# Get the domain from various sources; the order of these
# steps is important
# In some OS 'hostname -f' will change the hostname to '-f'
# We know that Solaris and HP-UX exhibit this behavior
# On good OS, 'hostname -f' will return the FQDN which is preferable
# Due to dangerous behavior of 'hostname -f' on old OS, we will explicitly opt-in
# 'hostname -f' --hkenney May 9, 2012
basic_hostname = 'hostname 2> /dev/null'
windows_hostname = 'hostname > NUL'
full_hostname = 'hostname -f 2> /dev/null'
can_do_hostname_f = Regexp.union /Linux/i, /FreeBSD/i, /Darwin/i
hostname_command = if Facter.value(:kernel) =~ can_do_hostname_f
full_hostname
elsif Facter.value(:kernel) == "windows"
windows_hostname
else
basic_hostname
end
if name = Facter::Core::Execution.exec(hostname_command) \
and name =~ /.*?\.(.+$)/
return_value = $1
elsif Facter.value(:kernel) != "windows" and domain = Facter::Core::Execution.exec('dnsdomainname 2> /dev/null') \
and domain =~ /.+/
return_value = domain
elsif FileTest.exists?("/etc/resolv.conf")
domain = nil
search = nil
File.open("/etc/resolv.conf") { |file|
file.each { |line|
if line =~ /^\s*domain\s+(\S+)/
domain = $1
elsif line =~ /^\s*search\s+(\S+)/
search = $1
end
}
}
return_value ||= domain
return_value ||= search
end
if return_value
return_value.gsub(/\.$/, '')
end
end
end
Facter.add(:domain) do
confine :kernel => :windows
setcode do
require 'facter/util/registry'
domain = nil
regvalue = Facter::Util::Registry.hklm_read('SYSTEM\CurrentControlSet\Services\Tcpip\Parameters', 'Domain')
if regvalue and not regvalue.empty?
domain = regvalue
else
require 'facter/util/wmi'
Facter::Util::WMI.execquery("select DNSDomain from Win32_NetworkAdapterConfiguration where IPEnabled = True").each { |nic|
if nic.DNSDomain && nic.DNSDomain.length > 0
domain = nic.DNSDomain
break
end
}
end
if domain
domain.gsub(/\.$/, '')
end
end
end