xref: /dflybsd-src/contrib/dhcpcd/hooks/30-hostname (revision 6a6d63c5317abf314a78f8c8300ef73c2bc0c39e)
10a68f8d2SRoy Marples# Set the hostname from DHCP data if required
20a68f8d2SRoy Marples
30a68f8d2SRoy Marples# A hostname can either be a short hostname or a FQDN.
40a68f8d2SRoy Marples# hostname_fqdn=true
50a68f8d2SRoy Marples# hostname_fqdn=false
60a68f8d2SRoy Marples# hostname_fqdn=server
70a68f8d2SRoy Marples
80a68f8d2SRoy Marples# A value of server means just what the server says, don't manipulate it.
90a68f8d2SRoy Marples# This could lead to an inconsistent hostname on a DHCPv4 and DHCPv6 network
100a68f8d2SRoy Marples# where the DHCPv4 hostname is short and the DHCPv6 has an FQDN.
110a68f8d2SRoy Marples# DHCPv6 has no hostname option.
120a68f8d2SRoy Marples# RFC4702 section 3.1 says FQDN should be prefered over hostname.
130a68f8d2SRoy Marples#
140a68f8d2SRoy Marples# As such, the default is hostname_fqdn=true so that a consistent hostname
150a68f8d2SRoy Marples# is always assigned.
160a68f8d2SRoy Marples: ${hostname_fqdn:=true}
170a68f8d2SRoy Marples
180a68f8d2SRoy Marples# If we used to set the hostname, but relinquish control of it, we should
190a68f8d2SRoy Marples# reset to the default value.
200a68f8d2SRoy Marples: ${hostname_default=}
210a68f8d2SRoy Marples
220a68f8d2SRoy Marples# Some systems don't have hostname(1)
230a68f8d2SRoy Marples_hostname()
240a68f8d2SRoy Marples{
250a68f8d2SRoy Marples	if [ -z "${1+x}" ]; then
260a68f8d2SRoy Marples		if [ -r /proc/sys/kernel/hostname ]; then
270a68f8d2SRoy Marples			read name </proc/sys/kernel/hostname && echo "$name"
2880aa9461SRoy Marples		elif command -v hostname >/dev/null 2>/dev/null; then
290a68f8d2SRoy Marples			hostname
300a68f8d2SRoy Marples		elif sysctl kern.hostname >/dev/null 2>&1; then
310a68f8d2SRoy Marples			sysctl -n kern.hostname
320a68f8d2SRoy Marples		elif sysctl kernel.hostname >/dev/null 2>&1; then
330a68f8d2SRoy Marples			sysctl -n kernel.hostname
340a68f8d2SRoy Marples		else
350a68f8d2SRoy Marples			return 1
360a68f8d2SRoy Marples		fi
370a68f8d2SRoy Marples		return $?
380a68f8d2SRoy Marples	fi
390a68f8d2SRoy Marples
400a68f8d2SRoy Marples	if [ -w /proc/sys/kernel/hostname ]; then
410a68f8d2SRoy Marples		echo "$1" >/proc/sys/kernel/hostname
4280aa9461SRoy Marples	elif [ -n "$1" ] && command -v hostname >/dev/null 2>&1; then
430a68f8d2SRoy Marples		hostname "$1"
440a68f8d2SRoy Marples	elif sysctl kern.hostname >/dev/null 2>&1; then
450a68f8d2SRoy Marples		sysctl -w "kern.hostname=$1" >/dev/null
460a68f8d2SRoy Marples	elif sysctl kernel.hostname >/dev/null 2>&1; then
470a68f8d2SRoy Marples		sysctl -w "kernel.hostname=$1" >/dev/null
480a68f8d2SRoy Marples	else
490a68f8d2SRoy Marples		# May fail to set a blank hostname
500a68f8d2SRoy Marples		hostname "$1"
510a68f8d2SRoy Marples	fi
520a68f8d2SRoy Marples}
530a68f8d2SRoy Marples
540a68f8d2SRoy Marplesis_default_hostname()
550a68f8d2SRoy Marples{
560a68f8d2SRoy Marples	case "$1" in
570a68f8d2SRoy Marples	""|"$hostname_default"|localhost|localhost.localdomain)
580a68f8d2SRoy Marples		return 0;;
590a68f8d2SRoy Marples	esac
600a68f8d2SRoy Marples	return 1
610a68f8d2SRoy Marples}
620a68f8d2SRoy Marples
630a68f8d2SRoy Marplesneed_hostname()
640a68f8d2SRoy Marples{
650a68f8d2SRoy Marples	# Always load the hostname variable for future use
660a68f8d2SRoy Marples	hostname="$(_hostname)"
670a68f8d2SRoy Marples	is_default_hostname "$hostname" && return 0
680a68f8d2SRoy Marples
690a68f8d2SRoy Marples	case "$force_hostname" in
700a68f8d2SRoy Marples	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) return 0;;
710a68f8d2SRoy Marples	esac
720a68f8d2SRoy Marples
730a68f8d2SRoy Marples	if [ -n "$old_fqdn" ]; then
740a68f8d2SRoy Marples		if ${hfqdn} || ! ${hshort}; then
750a68f8d2SRoy Marples			[ "$hostname" = "$old_fqdn" ]
760a68f8d2SRoy Marples		else
770a68f8d2SRoy Marples			[ "$hostname" = "${old_fqdn%%.*}" ]
780a68f8d2SRoy Marples		fi
790a68f8d2SRoy Marples	elif [ -n "$old_host_name" ]; then
800a68f8d2SRoy Marples		if ${hfqdn}; then
810a68f8d2SRoy Marples			if [ -n "$old_domain_name" ] &&
820a68f8d2SRoy Marples			   [ "$old_host_name" = "${old_host_name#*.}" ]
830a68f8d2SRoy Marples			then
840a68f8d2SRoy Marples				[ "$hostname" = \
850a68f8d2SRoy Marples				    "$old_host_name.$old_domain_name" ]
860a68f8d2SRoy Marples			else
870a68f8d2SRoy Marples				[ "$hostname" = "$old_host_name" ]
880a68f8d2SRoy Marples			fi
890a68f8d2SRoy Marples		elif ${hshort}; then
900a68f8d2SRoy Marples			[ "$hostname" = "${old_host_name%%.*}" ]
910a68f8d2SRoy Marples		else
920a68f8d2SRoy Marples			[ "$hostname" = "$old_host_name" ]
930a68f8d2SRoy Marples		fi
940a68f8d2SRoy Marples	else
950a68f8d2SRoy Marples		# No old hostname
960a68f8d2SRoy Marples		false
970a68f8d2SRoy Marples	fi
980a68f8d2SRoy Marples}
990a68f8d2SRoy Marples
1000a68f8d2SRoy Marplestry_hostname()
1010a68f8d2SRoy Marples{
1020a68f8d2SRoy Marples	[ "$hostname" = "$1" ] && return 0
1030a68f8d2SRoy Marples	if valid_domainname "$1"; then
1040a68f8d2SRoy Marples		syslog info "Setting hostname: $1"
1050a68f8d2SRoy Marples		_hostname "$1"
1060a68f8d2SRoy Marples	else
1070a68f8d2SRoy Marples		syslog err "Invalid hostname: $1"
1080a68f8d2SRoy Marples	fi
1090a68f8d2SRoy Marples}
1100a68f8d2SRoy Marples
1110a68f8d2SRoy Marplesset_hostname()
1120a68f8d2SRoy Marples{
1130a68f8d2SRoy Marples	hfqdn=false
1140a68f8d2SRoy Marples	hshort=false
1150a68f8d2SRoy Marples	case "$hostname_fqdn" in
1160a68f8d2SRoy Marples	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1)	hfqdn=true;;
1170a68f8d2SRoy Marples	""|[Ss][Ee][Rr][Vv][Ee][Rr])		;;
1180a68f8d2SRoy Marples	*)					hshort=true;;
1190a68f8d2SRoy Marples	esac
1200a68f8d2SRoy Marples
121*54175cefSRoy Marples	need_hostname || return 0
1220a68f8d2SRoy Marples
1230a68f8d2SRoy Marples	if [ -n "$new_fqdn" ]; then
1240a68f8d2SRoy Marples		if ${hfqdn} || ! ${hshort}; then
1250a68f8d2SRoy Marples			try_hostname "$new_fqdn"
1260a68f8d2SRoy Marples		else
1270a68f8d2SRoy Marples			try_hostname "${new_fqdn%%.*}"
1280a68f8d2SRoy Marples		fi
1290a68f8d2SRoy Marples	elif [ -n "$new_host_name" ]; then
1300a68f8d2SRoy Marples		if ${hfqdn}; then
1310a68f8d2SRoy Marples			if [ -n "$new_domain_name" ] &&
1320a68f8d2SRoy Marples			   [ "$new_host_name" = "${new_host_name#*.}" ]
1330a68f8d2SRoy Marples			then
1340a68f8d2SRoy Marples				try_hostname "$new_host_name.$new_domain_name"
1350a68f8d2SRoy Marples			else
1360a68f8d2SRoy Marples				try_hostname "$new_host_name"
1370a68f8d2SRoy Marples			fi
1380a68f8d2SRoy Marples		elif ${hshort}; then
1390a68f8d2SRoy Marples			try_hostname "${new_host_name%%.*}"
1400a68f8d2SRoy Marples		else
1410a68f8d2SRoy Marples			try_hostname "$new_host_name"
1420a68f8d2SRoy Marples		fi
1430a68f8d2SRoy Marples	elif ! is_default_hostname "$hostname"; then
1440a68f8d2SRoy Marples		try_hostname "$hostname_default"
1450a68f8d2SRoy Marples	fi
1460a68f8d2SRoy Marples}
1470a68f8d2SRoy Marples
1480a68f8d2SRoy Marples# For ease of use, map DHCP6 names onto our DHCP4 names
1490a68f8d2SRoy Marplescase "$reason" in
1500a68f8d2SRoy MarplesBOUND6|RENEW6|REBIND6|REBOOT6|INFORM6)
1510a68f8d2SRoy Marples	new_fqdn="$new_dhcp6_fqdn"
1520a68f8d2SRoy Marples	old_fqdn="$old_dhcp6_fqdn"
1530a68f8d2SRoy Marples	;;
1540a68f8d2SRoy Marplesesac
1550a68f8d2SRoy Marples
1560a68f8d2SRoy Marplesif $if_configured && $if_up && [ "$reason" != ROUTERADVERT ]; then
1570a68f8d2SRoy Marples	set_hostname
1580a68f8d2SRoy Marplesfi
159