summaryrefslogtreecommitdiffstats
path: root/modules.d/slx-uuid/hooks/s3-get-system-uuid.sh
diff options
context:
space:
mode:
Diffstat (limited to 'modules.d/slx-uuid/hooks/s3-get-system-uuid.sh')
-rwxr-xr-xmodules.d/slx-uuid/hooks/s3-get-system-uuid.sh71
1 files changed, 71 insertions, 0 deletions
diff --git a/modules.d/slx-uuid/hooks/s3-get-system-uuid.sh b/modules.d/slx-uuid/hooks/s3-get-system-uuid.sh
new file mode 100755
index 00000000..e65a3394
--- /dev/null
+++ b/modules.d/slx-uuid/hooks/s3-get-system-uuid.sh
@@ -0,0 +1,71 @@
+#!/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
+ else
+ echo "Don't have /run/openslx/network.conf"
+ fi
+
+ if [ -z "$SLX_PXE_MAC" ]; then
+ warn "Getting MAC from /run/openslx/network.conf failed, using 'ip a'..."
+ for iface in "${SLX_BRIDGE:-br0}" boot0 eth0; do
+ BOOTIF=01-$(ip a | grep -A 1 ": ${iface}" | grep -o 'ether ..:..:..:..:..:..' | cut -d' ' -f2 | sed s/:/-/g)
+ [ "${#BOOTIF}" -eq "20" ] && break
+ done
+ if [ "${#BOOTIF}" -ne "20" ]; then
+ warn "Getting MAC from 'ip a' failed, using bogus 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