#!/bin/sh -fu

CONFIG="/etc/sysconfig/network"
CONFIG_SYSTEMD="/etc/hostname"

list_eth() {
	local sysdir=/sys/class/net
	local iface type
	[ -d "$sysdir" ] || return 1
	find "$sysdir" -mindepth 1 -maxdepth 1 -name en* -xtype d -printf '%f\n' |
		while read iface; do
			read type < "$sysdir/$iface/type"
			[ "$type" = 1 ] && echo "$iface" # ethernet
		done
}

set_hostname() {
	local HOSTNAMECTL=hostnamectl
	local hostname="$1"
	[ ! -f "$CONFIG" ] ||
	    subst "s/HOSTNAME=localhost.localdomain/HOSTNAME=$hostname/" "$CONFIG"
	echo "$hostname" > "$CONFIG_SYSTEMD"
	sd_booted && $HOSTNAMECTL set-hostname "$hostname" ||:
	sd_booted || hostname "$hostname" ||:
}

hostname=
h=
[ -z "${HOSTNAME-}" -o \
  "${HOSTNAME-}" = '(none)' -o \
  "${HOSTNAME-}" = localhost -o \
  "${HOSTNAME-}" = localhost.localdomain ] ||
	hostname="$HOSTNAME"

[ -n "$hostname" ] ||
    for iface in $(list_eth); do
	ip="$(ip addr show $iface |sed -n 's,.*[[:space:]]inet[[:space:]]\+\([^/]\+\)/.*,\1,p' |head -n1)"
	[ -n "$ip" ] || continue
	h="$(hostinfo $ip |sed '/^hostname:[[:space:]]*/!d;s///;q')"
	# hostname from hostinfo is the best, so
	# $hostname is final, $h is a guess
	if [ -z "$h" ] || [ "$h" = 'localhost.localdomain' ] || [ "$h" = 'localhost' ] ; then
		h="host-${ip##*.}"
	else
		hostname="$h"
		break
	fi
    done

[ -n "$hostname" ] || hostname="$h"

if [ -n "$hostname" ]; then
	set_hostname "$hostname"
	exit 0
fi

proc="$(sed -n 's;^model name[[:blank:]:]*\(.\+\);\1;p' < /proc/cpuinfo \
	| head -1 \
	| cut -d' ' -f 3 \
	| sed 's;(.*);;' \
	| tr ' _/' '---' \
	| tr '[:upper:]' '[:lower:]')"

mactail="$(ip link show \
	| sed -n 's;^.*link/ether[[:blank:]]\+\([[:xdigit:]:]\+\).*$;\1;p' \
	| head -1 \
	| cut -d: -f4-6 \
	| tr -d ":")"

[ -n "$mactail" -o -n "$proc" ] || exit 0

hostname="$proc${mactail:+-}$mactail"
set_hostname "$hostname"
