1*0696600cSBjoern A. Zeeb#!/bin/sh 2*0696600cSBjoern A. Zeeb# 3*0696600cSBjoern A. Zeeb# Copyright (c) 2007 Pawel Jakub Dawidek <[email protected]> 4*0696600cSBjoern A. Zeeb# Copyright (c) 2015 Xin LI <[email protected]> 5*0696600cSBjoern A. Zeeb# 6*0696600cSBjoern A. Zeeb# Redistribution and use in source and binary forms, with or without 7*0696600cSBjoern A. Zeeb# modification, are permitted provided that the following conditions 8*0696600cSBjoern A. Zeeb# are met: 9*0696600cSBjoern A. Zeeb# 1. Redistributions of source code must retain the above copyright 10*0696600cSBjoern A. Zeeb# notice, this list of conditions and the following disclaimer. 11*0696600cSBjoern A. Zeeb# 2. Redistributions in binary form must reproduce the above copyright 12*0696600cSBjoern A. Zeeb# notice, this list of conditions and the following disclaimer in the 13*0696600cSBjoern A. Zeeb# documentation and/or other materials provided with the distribution. 14*0696600cSBjoern A. Zeeb# 15*0696600cSBjoern A. Zeeb# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 16*0696600cSBjoern A. Zeeb# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*0696600cSBjoern A. Zeeb# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*0696600cSBjoern A. Zeeb# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 19*0696600cSBjoern A. Zeeb# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*0696600cSBjoern A. Zeeb# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*0696600cSBjoern A. Zeeb# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*0696600cSBjoern A. Zeeb# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*0696600cSBjoern A. Zeeb# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*0696600cSBjoern A. Zeeb# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*0696600cSBjoern A. Zeeb# SUCH DAMAGE. 26*0696600cSBjoern A. Zeeb# 27*0696600cSBjoern A. Zeeb# $FreeBSD$ 28*0696600cSBjoern A. Zeeb# 29*0696600cSBjoern A. Zeeb 30*0696600cSBjoern A. Zeeb# PROVIDE: hostid 31*0696600cSBjoern A. Zeeb# REQUIRE: sysctl 32*0696600cSBjoern A. Zeeb# KEYWORD: nojail 33*0696600cSBjoern A. Zeeb 34*0696600cSBjoern A. Zeeb. /etc/rc.subr 35*0696600cSBjoern A. Zeeb 36*0696600cSBjoern A. Zeebname="hostid" 37*0696600cSBjoern A. Zeebdesc="Generate a unique host ID" 38*0696600cSBjoern A. Zeebstart_cmd="hostid_start" 39*0696600cSBjoern A. Zeebstop_cmd=":" 40*0696600cSBjoern A. Zeebreset_cmd="hostid_reset" 41*0696600cSBjoern A. Zeebextra_commands="reset" 42*0696600cSBjoern A. Zeebrcvar="hostid_enable" 43*0696600cSBjoern A. Zeeb 44*0696600cSBjoern A. Zeebhostid_set() 45*0696600cSBjoern A. Zeeb{ 46*0696600cSBjoern A. Zeeb uuid=$1 47*0696600cSBjoern A. Zeeb # Generate hostid based on hostuuid - take first four bytes from md5(uuid). 48*0696600cSBjoern A. Zeeb id=`echo -n $uuid | /sbin/md5` 49*0696600cSBjoern A. Zeeb id="0x${id%????????????????????????}" 50*0696600cSBjoern A. Zeeb 51*0696600cSBjoern A. Zeeb # Set both kern.hostuuid and kern.hostid. 52*0696600cSBjoern A. Zeeb # 53*0696600cSBjoern A. Zeeb check_startmsgs && echo "Setting hostuuid: ${uuid}." 54*0696600cSBjoern A. Zeeb ${SYSCTL} kern.hostuuid="${uuid}" >/dev/null 55*0696600cSBjoern A. Zeeb check_startmsgs && echo "Setting hostid: ${id}." 56*0696600cSBjoern A. Zeeb ${SYSCTL} kern.hostid=${id} >/dev/null 57*0696600cSBjoern A. Zeeb} 58*0696600cSBjoern A. Zeeb 59*0696600cSBjoern A. Zeebvalid_hostid() 60*0696600cSBjoern A. Zeeb{ 61*0696600cSBjoern A. Zeeb uuid=$1 62*0696600cSBjoern A. Zeeb 63*0696600cSBjoern A. Zeeb x="[0-9a-f]" 64*0696600cSBjoern A. Zeeb y=$x$x$x$x 65*0696600cSBjoern A. Zeeb 66*0696600cSBjoern A. Zeeb # Check against a blacklist before 67*0696600cSBjoern A. Zeeb # accepting the UUID. 68*0696600cSBjoern A. Zeeb case "${uuid}" in 69*0696600cSBjoern A. Zeeb 00000000-0000-0000-0000-000000000000) 70*0696600cSBjoern A. Zeeb ;; 71*0696600cSBjoern A. Zeeb 00020003-0004-0005-0006-000700080009) 72*0696600cSBjoern A. Zeeb ;; 73*0696600cSBjoern A. Zeeb 03000200-0400-0500-0006-000700080009) 74*0696600cSBjoern A. Zeeb ;; 75*0696600cSBjoern A. Zeeb 07090201-0103-0301-0807-060504030201) 76*0696600cSBjoern A. Zeeb ;; 77*0696600cSBjoern A. Zeeb 11111111-1111-1111-1111-111111111111) 78*0696600cSBjoern A. Zeeb ;; 79*0696600cSBjoern A. Zeeb 11111111-2222-3333-4444-555555555555) 80*0696600cSBjoern A. Zeeb ;; 81*0696600cSBjoern A. Zeeb 4c4c4544-0000-2010-8020-80c04f202020) 82*0696600cSBjoern A. Zeeb ;; 83*0696600cSBjoern A. Zeeb 58585858-5858-5858-5858-585858585858) 84*0696600cSBjoern A. Zeeb ;; 85*0696600cSBjoern A. Zeeb 890e2d14-cacd-45d1-ae66-bc80e8bfeb0f) 86*0696600cSBjoern A. Zeeb ;; 87*0696600cSBjoern A. Zeeb 8e275844-178f-44a8-aceb-a7d7e5178c63) 88*0696600cSBjoern A. Zeeb ;; 89*0696600cSBjoern A. Zeeb dc698397-fa54-4cf2-82c8-b1b5307a6a7f) 90*0696600cSBjoern A. Zeeb ;; 91*0696600cSBjoern A. Zeeb fefefefe-fefe-fefe-fefe-fefefefefefe) 92*0696600cSBjoern A. Zeeb ;; 93*0696600cSBjoern A. Zeeb *-ffff-ffff-ffff-ffffffffffff) 94*0696600cSBjoern A. Zeeb ;; 95*0696600cSBjoern A. Zeeb $y$y-$y-$y-$y-$y$y$y) 96*0696600cSBjoern A. Zeeb return 0 97*0696600cSBjoern A. Zeeb ;; 98*0696600cSBjoern A. Zeeb esac 99*0696600cSBjoern A. Zeeb 100*0696600cSBjoern A. Zeeb return 1 101*0696600cSBjoern A. Zeeb} 102*0696600cSBjoern A. Zeeb 103*0696600cSBjoern A. Zeebhostid_hardware() 104*0696600cSBjoern A. Zeeb{ 105*0696600cSBjoern A. Zeeb uuid=`kenv -q smbios.system.uuid` 106*0696600cSBjoern A. Zeeb 107*0696600cSBjoern A. Zeeb if valid_hostid $uuid; then 108*0696600cSBjoern A. Zeeb echo "${uuid}" 109*0696600cSBjoern A. Zeeb fi 110*0696600cSBjoern A. Zeeb} 111*0696600cSBjoern A. Zeeb 112*0696600cSBjoern A. Zeebhostid_generate() 113*0696600cSBjoern A. Zeeb{ 114*0696600cSBjoern A. Zeeb # First look for UUID in hardware. 115*0696600cSBjoern A. Zeeb uuid=`hostid_hardware` 116*0696600cSBjoern A. Zeeb if [ -z "${uuid}" ]; then 117*0696600cSBjoern A. Zeeb warn "hostid: unable to figure out a UUID from DMI data, generating a new one" 118*0696600cSBjoern A. Zeeb sleep 2 119*0696600cSBjoern A. Zeeb # If not found, fall back to software-generated UUID. 120*0696600cSBjoern A. Zeeb uuid=`uuidgen` 121*0696600cSBjoern A. Zeeb fi 122*0696600cSBjoern A. Zeeb hostid_set $uuid 123*0696600cSBjoern A. Zeeb} 124*0696600cSBjoern A. Zeeb 125*0696600cSBjoern A. Zeebhostid_reset() 126*0696600cSBjoern A. Zeeb{ 127*0696600cSBjoern A. Zeeb hostid_generate 128*0696600cSBjoern A. Zeeb # Store newly generated UUID in ${hostid_file}. 129*0696600cSBjoern A. Zeeb echo $uuid > ${hostid_file} 130*0696600cSBjoern A. Zeeb if [ $? -ne 0 ]; then 131*0696600cSBjoern A. Zeeb warn "could not store hostuuid in ${hostid_file}." 132*0696600cSBjoern A. Zeeb fi 133*0696600cSBjoern A. Zeeb} 134*0696600cSBjoern A. Zeeb 135*0696600cSBjoern A. Zeebhostid_start() 136*0696600cSBjoern A. Zeeb{ 137*0696600cSBjoern A. Zeeb # If ${hostid_file} already exists, we take UUID from there. 138*0696600cSBjoern A. Zeeb if [ -r ${hostid_file} ]; then 139*0696600cSBjoern A. Zeeb read saved_hostid < ${hostid_file} 140*0696600cSBjoern A. Zeeb if valid_hostid ${saved_hostid}; then 141*0696600cSBjoern A. Zeeb hostid_set `cat ${hostid_file}` 142*0696600cSBjoern A. Zeeb exit 0 143*0696600cSBjoern A. Zeeb fi 144*0696600cSBjoern A. Zeeb fi 145*0696600cSBjoern A. Zeeb 146*0696600cSBjoern A. Zeeb # No hostid file, generate UUID. 147*0696600cSBjoern A. Zeeb hostid_generate 148*0696600cSBjoern A. Zeeb} 149*0696600cSBjoern A. Zeeb 150*0696600cSBjoern A. Zeebload_rc_config $name 151*0696600cSBjoern A. Zeebrun_rc_command "$1" 152