#!/usr/bin/env bash # # Slighty changed version of: # http://git.openslx.org/openslx-ng/mltk.git/plain/core/modules/system-uuid/data/bin/get-uuid . /lib/dracut-lib.sh get_system_uuid() { if [ -e /run/openslx/network.conf ]; then . /run/openslx/network.conf fi if [ -z "$SLX_PXE_MAC" ]; then eval $(grep -Eo BOOTIF=\\S+ /proc/cmdline) if [ "${#BOOTIF}" -ne "20" ]; then warn "Getting MAC from /proc/cmdline failed, using 'ip a'..." BOOTIF=01-$(ip a | grep -A 1 ": ${SLX_BRIDGE:-br0}" | grep -o 'ether ..:..:..:..:..:..' | cut -d' ' -f2 | sed s/:/-/g) fi if [ "${#BOOTIF}" -ne "20" ]; then warn "Getting MAC from 'ip a' failed, using a default value..." BOOTIF="99-88-77-66-55-44-33" fi else BOOTIF="01-$(tr ':' '-' <<< $SLX_PXE_MAC)" fi local UUID=$(dmidecode -q -s system-uuid | grep -v '^#' | head -n 1 | tr 'a-z' 'A-Z') if [ "${#UUID}" -ne "36" ]; then warn "Determined UUID (${UUID}) has not expected length of 36, falling back to MAC..." # Maybe use /proc/sys/kernel/random/uuid ? UUID= else # Got UUID, check blacklist local DIR="/etc/bad-uuid.d" local TMPLIST=$(mktemp) local BADLIST=$(mktemp) for file in "$DIR"/*; do [ -f "$file" ] || continue # 11111111-2222-3333-4444-555555555555 < "$file" tr 'a-z' 'A-Z' | grep -Eo '[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}' done | tee "$TMPLIST" > "$BADLIST" # Also add flipped version of bad uuids. Found some of them through googling and discovered that sometimes # users report them in a different order. UUIDs use different endianness for the first three blocks than # the remaining two, but some tools seem to ignore that fact. < "$BADLIST" sed -r 's/^(..)(..)(..)(..)\-(..)(..)\-(..)(..)\-([0-9A-F]{4}\-[0-9A-F]{12})$/\4\3\2\1-\6\5-\8\7-\9/' >> "$TMPLIST" # Finally make unique sort -u "$TMPLIST" > "$BADLIST" if grep -Fxq "$UUID" "$BADLIST"; then warn "WARNING: UUID is blacklisted as potentially not being unique, using MAC fallback" UUID= fi rm -f -- "$TMPLIST" "$BADLIST" fi if [ -z "$UUID" ]; then UUID=$( echo "$BOOTIF" | sed -r 's/[^0-9A-Fa-f]//g' ) [ "${#UUID}" -eq 14 ] && UUID="${UUID:2}" if [ "${#UUID}" -eq 12 ]; then UUID="baad1d00-9491-4716-b98b-$UUID" else UUID="baad1d00-9491-4716-b98b-000000000000" fi fi UUID=$( echo "$UUID" | tr 'a-z' 'A-Z' ) readonly UUID echo "$UUID" > "/run/system-uuid" } get_system_uuid