#!/bin/bash # Emulate genhostid(1) available on RHEL/CENTOS, for use on distros # which do not provide that utility. # # Usage: # zgenhostid # zgenhostid # # If /etc/hostid already exists and is size > 0, the script exits immediately # and changes nothing. Unlike genhostid, this generates an error message. # # The first form generates a random hostid and stores it in /etc/hostid. # The second form checks that the provided value is between 0x1 and 0xFFFFFFFF # and if so, stores it in /etc/hostid. This form is not supported by # genhostid(1). hostid_file=/etc/hostid function usage { echo "$0 [value]" echo "If $hostid_file is not present, store a hostid in it." >&2 echo "The optional value must be an 8-digit hex number between" >&2 echo "1 and 2^32-1. If no value is provided, a random one will" >&2 echo "be generated. The value must be unique among your systems." >&2 } # hostid(1) ignores contents of /etc/hostid if size < 4 bytes. It would # be better if this checked size >= 4 bytes but it the method must be # widely portable. if [ -s $hostid_file ]; then echo "$hostid_file already exists. No change made." >&2 exit 1 fi if [ -n "$1" ]; then host_id=$1 else # $RANDOM goes from 0..32k-1 number=$((((RANDOM % 4) * 32768 + RANDOM) * 32768 + RANDOM)) host_id=$(printf "%08x" $number) fi if egrep -o '^0{8}$' <<< $host_id >/dev/null 2>&1; then usage exit 2 fi if ! egrep -o '^[a-fA-F0-9]{8}$' <<< $host_id >/dev/null 2>&1; then usage exit 3 fi a=${host_id:6:2} b=${host_id:4:2} c=${host_id:2:2} d=${host_id:0:2} echo -ne \\x$a\\x$b\\x$c\\x$d > $hostid_file exit 0