summaryrefslogtreecommitdiffstats
path: root/modules.d/slx-uuid/scripts/get-system-uuid.sh
blob: fd6bb125d73c84c545ec31475a900d4bd0f51be3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/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