hostid revision 168607
1168546Spjd#!/bin/sh 2168546Spjd# 3168546Spjd# Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org> 4168546Spjd# All rights reserved. 5168546Spjd# 6168546Spjd# Redistribution and use in source and binary forms, with or without 7168546Spjd# modification, are permitted provided that the following conditions 8168546Spjd# are met: 9168546Spjd# 1. Redistributions of source code must retain the above copyright 10168546Spjd# notice, this list of conditions and the following disclaimer. 11168546Spjd# 2. Redistributions in binary form must reproduce the above copyright 12168546Spjd# notice, this list of conditions and the following disclaimer in the 13168546Spjd# documentation and/or other materials provided with the distribution. 14168546Spjd# 15168546Spjd# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 16168546Spjd# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17168546Spjd# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18168546Spjd# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 19168546Spjd# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20168546Spjd# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21168546Spjd# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22168546Spjd# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23168546Spjd# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24168546Spjd# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25168546Spjd# SUCH DAMAGE. 26168546Spjd# 27168546Spjd# $FreeBSD: head/etc/rc.d/hostid 168607 2007-04-11 00:05:25Z pjd $ 28168546Spjd# 29168546Spjd 30168546Spjd# PROVIDE: hostid 31168546Spjd# REQUIRE: root 32168546Spjd# BEFORE: mountcritlocal 33168546Spjd# KEYWORD: nojail 34168546Spjd 35168546Spjd. /etc/rc.subr 36168546Spjd 37168546Spjdname="hostid" 38168546Spjdstart_cmd="hostid_start" 39168546Spjdstop_cmd=":" 40168546Spjdreset_cmd="hostid_reset" 41168546Spjdextra_commands="reset" 42168546Spjdrcvar="hostid_enable" 43168546Spjd 44168546Spjdhostid_set() 45168546Spjd{ 46168546Spjd uuid=$1 47168546Spjd # Generate hostid based on hostuuid - take first four bytes from md5(uuid). 48168546Spjd id=`echo -n $uuid | md5` 49168546Spjd id="0x${id%????????????????????????}" 50168546Spjd # Set both kern.hostuuid and kern.hostid. 51168546Spjd echo "Setting hostuuid: ${uuid}." 52168546Spjd ${SYSCTL_W} kern.hostuuid="${uuid}" >/dev/null 53168546Spjd echo "Setting hostid: ${id}." 54168546Spjd ${SYSCTL_W} kern.hostid=${id} >/dev/null 55168546Spjd} 56168546Spjd 57168607Spjdhostid_hardware() 58168607Spjd{ 59168607Spjd uuid=`kenv smbios.system.uuid 2>/dev/null` 60168607Spjd x="[0-9a-zA-Z]" 61168607Spjd y=$x$x$x$x 62168607Spjd case "${uuid}" in 63168607Spjd $y$y-$y-$y-$y-$y$y$y) 64168607Spjd echo "${uuid}" 65168607Spjd ;; 66168607Spjd esac 67168607Spjd} 68168607Spjd 69168546Spjdhostid_reset() 70168546Spjd{ 71168607Spjd # First look for UUID in hardware. 72168607Spjd uuid=`hostid_hardware` 73168607Spjd if [ -z ${uuid} ]; then 74168607Spjd # If not found, fall back to software-generated UUID. 75168607Spjd uuid=`uuidgen` 76168607Spjd fi 77168546Spjd # Store newly generated UUID in ${hostid_file}. 78168546Spjd echo $uuid > ${hostid_file} 79168546Spjd if [ $? -ne 0 ]; then 80168546Spjd warn "could not store hostuuid in ${hostid_file}." 81168546Spjd fi 82168546Spjd hostid_set $uuid 83168546Spjd} 84168546Spjd 85168546Spjdhostid_start() 86168546Spjd{ 87168546Spjd # If ${hostid_file} already exists, we take UUID from there. 88168546Spjd if [ -r ${hostid_file} ]; then 89168546Spjd hostid_set `cat ${hostid_file}` 90168546Spjd else 91168546Spjd # No hostid file, generate UUID. 92168546Spjd hostid_reset 93168546Spjd fi 94168546Spjd} 95168546Spjd 96168546Spjdload_rc_config $name 97168546Spjdrun_rc_command "$1" 98