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