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