xref: /netbsd-src/external/bsd/dhcpcd/dist/hooks/30-hostname (revision 31430cea00c87f20dd7ba60694ff3370f8701fff)
1ecaf8d77Sroy# Set the hostname from DHCP data if required
2ecaf8d77Sroy
3ecaf8d77Sroy# A hostname can either be a short hostname or a FQDN.
4ecaf8d77Sroy# hostname_fqdn=true
5ecaf8d77Sroy# hostname_fqdn=false
6ecaf8d77Sroy# hostname_fqdn=server
7ecaf8d77Sroy
8ecaf8d77Sroy# A value of server means just what the server says, don't manipulate it.
9ecaf8d77Sroy# This could lead to an inconsistent hostname on a DHCPv4 and DHCPv6 network
10ecaf8d77Sroy# where the DHCPv4 hostname is short and the DHCPv6 has an FQDN.
11ecaf8d77Sroy# DHCPv6 has no hostname option.
12ecaf8d77Sroy# RFC4702 section 3.1 says FQDN should be prefered over hostname.
13ecaf8d77Sroy#
14ecaf8d77Sroy# As such, the default is hostname_fqdn=true so that a consistent hostname
15ecaf8d77Sroy# is always assigned.
16ecaf8d77Sroy: ${hostname_fqdn:=true}
17ecaf8d77Sroy
18ecaf8d77Sroy# If we used to set the hostname, but relinquish control of it, we should
19ecaf8d77Sroy# reset to the default value.
20ecaf8d77Sroy: ${hostname_default=}
21ecaf8d77Sroy
22ecaf8d77Sroy# Some systems don't have hostname(1)
23ecaf8d77Sroy_hostname()
24ecaf8d77Sroy{
25ecaf8d77Sroy	if [ -z "${1+x}" ]; then
26ecaf8d77Sroy		if [ -r /proc/sys/kernel/hostname ]; then
27ecaf8d77Sroy			read name </proc/sys/kernel/hostname && echo "$name"
2874820ea0Sroy		elif command -v hostname >/dev/null 2>/dev/null; then
29ecaf8d77Sroy			hostname
30ecaf8d77Sroy		elif sysctl kern.hostname >/dev/null 2>&1; then
31ecaf8d77Sroy			sysctl -n kern.hostname
32ecaf8d77Sroy		elif sysctl kernel.hostname >/dev/null 2>&1; then
33ecaf8d77Sroy			sysctl -n kernel.hostname
34ecaf8d77Sroy		else
35ecaf8d77Sroy			return 1
36ecaf8d77Sroy		fi
37ecaf8d77Sroy		return $?
38ecaf8d77Sroy	fi
39ecaf8d77Sroy
40ecaf8d77Sroy	if [ -w /proc/sys/kernel/hostname ]; then
41ecaf8d77Sroy		echo "$1" >/proc/sys/kernel/hostname
4274820ea0Sroy	elif [ -n "$1" ] && command -v hostname >/dev/null 2>&1; then
43ecaf8d77Sroy		hostname "$1"
44ecaf8d77Sroy	elif sysctl kern.hostname >/dev/null 2>&1; then
45ecaf8d77Sroy		sysctl -w "kern.hostname=$1" >/dev/null
46ecaf8d77Sroy	elif sysctl kernel.hostname >/dev/null 2>&1; then
47ecaf8d77Sroy		sysctl -w "kernel.hostname=$1" >/dev/null
48ecaf8d77Sroy	else
49ecaf8d77Sroy		# May fail to set a blank hostname
50ecaf8d77Sroy		hostname "$1"
51ecaf8d77Sroy	fi
52ecaf8d77Sroy}
53ecaf8d77Sroy
54ecaf8d77Sroyis_default_hostname()
55ecaf8d77Sroy{
56ecaf8d77Sroy	case "$1" in
57ecaf8d77Sroy	""|"$hostname_default"|localhost|localhost.localdomain)
58ecaf8d77Sroy		return 0;;
59ecaf8d77Sroy	esac
60ecaf8d77Sroy	return 1
61ecaf8d77Sroy}
62ecaf8d77Sroy
63ecaf8d77Sroyneed_hostname()
64ecaf8d77Sroy{
65ecaf8d77Sroy	# Always load the hostname variable for future use
66ecaf8d77Sroy	hostname="$(_hostname)"
67ecaf8d77Sroy	is_default_hostname "$hostname" && return 0
68ecaf8d77Sroy
69ecaf8d77Sroy	case "$force_hostname" in
70ecaf8d77Sroy	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) return 0;;
71ecaf8d77Sroy	esac
72ecaf8d77Sroy
73ecaf8d77Sroy	if [ -n "$old_fqdn" ]; then
74ecaf8d77Sroy		if ${hfqdn} || ! ${hshort}; then
75ecaf8d77Sroy			[ "$hostname" = "$old_fqdn" ]
76ecaf8d77Sroy		else
77ecaf8d77Sroy			[ "$hostname" = "${old_fqdn%%.*}" ]
78ecaf8d77Sroy		fi
79ecaf8d77Sroy	elif [ -n "$old_host_name" ]; then
80ecaf8d77Sroy		if ${hfqdn}; then
81ecaf8d77Sroy			if [ -n "$old_domain_name" ] &&
82ecaf8d77Sroy			   [ "$old_host_name" = "${old_host_name#*.}" ]
83ecaf8d77Sroy			then
84ecaf8d77Sroy				[ "$hostname" = \
85ecaf8d77Sroy				    "$old_host_name.$old_domain_name" ]
86ecaf8d77Sroy			else
87ecaf8d77Sroy				[ "$hostname" = "$old_host_name" ]
88ecaf8d77Sroy			fi
89ecaf8d77Sroy		elif ${hshort}; then
90ecaf8d77Sroy			[ "$hostname" = "${old_host_name%%.*}" ]
91ecaf8d77Sroy		else
92ecaf8d77Sroy			[ "$hostname" = "$old_host_name" ]
93ecaf8d77Sroy		fi
94ecaf8d77Sroy	else
95ecaf8d77Sroy		# No old hostname
96ecaf8d77Sroy		false
97ecaf8d77Sroy	fi
98ecaf8d77Sroy}
99ecaf8d77Sroy
100ecaf8d77Sroytry_hostname()
101ecaf8d77Sroy{
102ecaf8d77Sroy	[ "$hostname" = "$1" ] && return 0
103ecaf8d77Sroy	if valid_domainname "$1"; then
104ecaf8d77Sroy		syslog info "Setting hostname: $1"
105ecaf8d77Sroy		_hostname "$1"
106ecaf8d77Sroy	else
107ecaf8d77Sroy		syslog err "Invalid hostname: $1"
108ecaf8d77Sroy	fi
109ecaf8d77Sroy}
110ecaf8d77Sroy
111ecaf8d77Sroyset_hostname()
112ecaf8d77Sroy{
113ecaf8d77Sroy	hfqdn=false
114ecaf8d77Sroy	hshort=false
115ecaf8d77Sroy	case "$hostname_fqdn" in
116ecaf8d77Sroy	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1)	hfqdn=true;;
117ecaf8d77Sroy	""|[Ss][Ee][Rr][Vv][Ee][Rr])		;;
118ecaf8d77Sroy	*)					hshort=true;;
119ecaf8d77Sroy	esac
120ecaf8d77Sroy
121*31430ceaSroy	need_hostname || return 0
122ecaf8d77Sroy
123ecaf8d77Sroy	if [ -n "$new_fqdn" ]; then
124ecaf8d77Sroy		if ${hfqdn} || ! ${hshort}; then
125ecaf8d77Sroy			try_hostname "$new_fqdn"
126ecaf8d77Sroy		else
127ecaf8d77Sroy			try_hostname "${new_fqdn%%.*}"
128ecaf8d77Sroy		fi
129ecaf8d77Sroy	elif [ -n "$new_host_name" ]; then
130ecaf8d77Sroy		if ${hfqdn}; then
131ecaf8d77Sroy			if [ -n "$new_domain_name" ] &&
132ecaf8d77Sroy			   [ "$new_host_name" = "${new_host_name#*.}" ]
133ecaf8d77Sroy			then
134ecaf8d77Sroy				try_hostname "$new_host_name.$new_domain_name"
135ecaf8d77Sroy			else
136ecaf8d77Sroy				try_hostname "$new_host_name"
137ecaf8d77Sroy			fi
138ecaf8d77Sroy		elif ${hshort}; then
139ecaf8d77Sroy			try_hostname "${new_host_name%%.*}"
140ecaf8d77Sroy		else
141ecaf8d77Sroy			try_hostname "$new_host_name"
142ecaf8d77Sroy		fi
143ecaf8d77Sroy	elif ! is_default_hostname "$hostname"; then
144ecaf8d77Sroy		try_hostname "$hostname_default"
145ecaf8d77Sroy	fi
146ecaf8d77Sroy}
147ecaf8d77Sroy
148ecaf8d77Sroy# For ease of use, map DHCP6 names onto our DHCP4 names
149ecaf8d77Sroycase "$reason" in
150ecaf8d77SroyBOUND6|RENEW6|REBIND6|REBOOT6|INFORM6)
151ecaf8d77Sroy	new_fqdn="$new_dhcp6_fqdn"
152ecaf8d77Sroy	old_fqdn="$old_dhcp6_fqdn"
153ecaf8d77Sroy	;;
154ecaf8d77Sroyesac
155ecaf8d77Sroy
156ecaf8d77Sroyif $if_configured && $if_up && [ "$reason" != ROUTERADVERT ]; then
157ecaf8d77Sroy	set_hostname
158ecaf8d77Sroyfi
159