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