Blame os-prober

Packit d86cd3
#!/bin/sh
Packit d86cd3
set -e
Packit d86cd3
rpm-build 614032
# dash shell does not have "{varname}>&1" feature that bash shell has
rpm-build 614032
# for auto-assignment of new filedescriptors.
rpm-build 614032
# It is cumbersome to write the 'eval' to use our own variables in redirections.
rpm-build 614032
# Therefore use fixed numbers.
rpm-build 614032
export fd_result=3  # file descriptor for external results
rpm-build 614032
export fd_logger=9  # file descriptor for input to logger
rpm-build 614032
rpm-build 614032
 . /usr/share/os-prober/common.sh
Packit d86cd3
Packit d86cd3
newns "$@"
Packit d86cd3
require_tmpdir
Packit d86cd3
Packit d86cd3
log_output () {
Packit d86cd3
	if type log-output >/dev/null 2>&1; then
Packit d86cd3
		log-output -t os-prober --pass-stdout $@
Packit d86cd3
	else
Packit d86cd3
		$@
Packit d86cd3
	fi
Packit d86cd3
}
Packit d86cd3
Packit d86cd3
: >"$OS_PROBER_TMP/dmraid-map"
Packit d86cd3
DMRAID=$(type dmraid >/dev/null 2>&1 || true)
Packit d86cd3
if [ "$DMRAID" ]; then
Packit d86cd3
	dmraid -r -c >"$OS_PROBER_TMP/dmraid-map"
Packit d86cd3
fi
Packit d86cd3
Packit d86cd3
on_sataraid () {
Packit d86cd3
	local parent="${1%/*}"
Packit d86cd3
	local device="/dev/${parent##*/}"
Packit d86cd3
	if grep -q "$device" "$OS_PROBER_TMP/dmraid-map"; then
Packit d86cd3
		return 0
Packit d86cd3
	fi
Packit d86cd3
	return 1
Packit d86cd3
}
Packit d86cd3
Packit d86cd3
partitions () {
Packit d86cd3
	os_name="$(uname -s)"
Packit d86cd3
	# Exclude partitions that have whole_disk sysfs attribute set.
Packit d86cd3
	if [ -d /sys/block ]; then
Packit d86cd3
		# Exclude partitions on physical disks that are part of a
Packit d86cd3
		# Serial ATA RAID disk.
Packit d86cd3
		for part in /sys/block/*/*[0-9]; do
Packit d86cd3
			if [ -f "$part/start" ] && \
Packit d86cd3
			   [ ! -f "$part/whole_disk" ] && ! on_sataraid $part; then
Packit d86cd3
				name="$(echo "${part##*/}" | sed 's,[!.],/,g')"
Packit d86cd3
				if [ -e "/dev/$name" ]; then
Packit d86cd3
					echo "/dev/$name"
Packit d86cd3
				fi
Packit d86cd3
			fi
Packit d86cd3
		done
Packit d86cd3
Packit d86cd3
		# Add Serial ATA RAID devices
Packit d86cd3
		if type dmraid >/dev/null 2>&1 && \
Packit d86cd3
		   dmraid -s -c >/dev/null 2>&1; then
Packit d86cd3
			for raidset in $(dmraid -sa -c); do
Packit d86cd3
				for part in /dev/mapper/"$raidset"*[0-9]; do
Packit d86cd3
					echo "$part"
Packit d86cd3
				done
Packit d86cd3
			done
Packit d86cd3
		fi
Packit d86cd3
	elif [ "$os_name" = Linux ]; then
Packit d86cd3
		echo "Cannot find list of partitions!  (Try mounting /sys.)" >&2
Packit d86cd3
		exit 1
Packit d86cd3
	elif [ "$os_name" = GNU ]; then
Packit d86cd3
		for part in /dev/hd*s*[0-9] /dev/sd*s*[0-9]; do
Packit d86cd3
			if [ -s "$part" ]; then
Packit d86cd3
				echo "$part"
Packit d86cd3
			fi
Packit d86cd3
		done
Packit d86cd3
	else
Packit d86cd3
		# We don't know how to probe OSes on non-Linux and non-GNU kernels.
Packit d86cd3
		# For now, just don't get in the way.
Packit d86cd3
		exit 0
Packit d86cd3
	fi
Packit d86cd3
rpm-build d7be71
	# Add MD RAID devices
rpm-build d7be71
	if [ -f /proc/mdstat ] ; then
rpm-build d7be71
		awk '/^md/ {printf "/dev/"$1"\n"}' /proc/mdstat
rpm-build d7be71
	fi
rpm-build d7be71
Packit d86cd3
	# Also detect OSes on LVM volumes (assumes LVM is active)
Packit d86cd3
	if type lvs >/dev/null 2>&1; then
rpm-build fe73fc
		echo "$(LVM_SUPPRESS_FD_WARNINGS=1 log_output lvs --noheadings --separator : -o vg_name,lv_name 2>/dev/null |
Packit d86cd3
			sed "s|-|--|g;s|^[[:space:]]*\(.*\):\(.*\)$|/dev/mapper/\1-\2|")"
Packit d86cd3
	fi
rpm-build fe73fc
rpm-build fe73fc
	# now lets make sure we got all of the btrfs partitions and disks
rpm-build fe73fc
	blkid | grep 'TYPE="btrfs"' | cut -d ':' -f 1
Packit d86cd3
}
Packit d86cd3
Packit d86cd3
parse_proc_swaps () {
Packit d86cd3
	while read line; do
Packit d86cd3
		set -f
Packit d86cd3
		set -- $line
Packit d86cd3
		set +f
Packit d86cd3
		echo "$(mapdevfs $1) swap"
Packit d86cd3
	done
Packit d86cd3
}
Packit d86cd3
Packit d86cd3
parse_proc_mdstat () {
Packit d86cd3
	if type udevadm >/dev/null 2>&1; then
Packit d86cd3
		udevinfo () {
Packit d86cd3
			udevadm info "$@"
Packit d86cd3
		}
Packit d86cd3
	fi
Packit d86cd3
	while read line; do
Packit d86cd3
		for word in $line; do
Packit d86cd3
			dev="${word%%\[*}"
Packit d86cd3
			# TODO: factor this out to something in di-utils if
Packit d86cd3
			# it's needed elsewhere
Packit d86cd3
			if [ -d /sys/block ] && type udevinfo >/dev/null 2>&1; then
Packit d86cd3
				if ! udevinfo -q path -n "/dev/$dev" 2>/dev/null | \
Packit d86cd3
				     grep -q '/.*/.*/'; then
Packit d86cd3
					continue
Packit d86cd3
				fi
Packit d86cd3
			elif ! echo "$dev" | grep -q "/part"; then
Packit d86cd3
				continue
Packit d86cd3
			fi
Packit d86cd3
			raidpart="/dev/$dev"
Packit d86cd3
			echo "$(mapdevfs "$raidpart")"
Packit d86cd3
		done
Packit d86cd3
	done
Packit d86cd3
}
Packit d86cd3
Packit d86cd3
# Needed for idempotency
Packit d86cd3
rm -f /var/lib/os-prober/labels
Packit d86cd3
Packit Service 8d4c46
for prog in /usr/libexec/os-probes/init/*; do
Packit d86cd3
	if [ -x "$prog" ] && [ -f "$prog" ]; then
Packit d86cd3
		"$prog" || true
Packit d86cd3
	fi
Packit d86cd3
done
Packit d86cd3
Packit d86cd3
# We need to properly canonicalize partitions with mount points and partitions
Packit d86cd3
# used in RAID
Packit d86cd3
grep "^/dev/" /proc/mounts | parse_proc_mounts >"$OS_PROBER_TMP/mounted-map" || true
Packit d86cd3
: >"$OS_PROBER_TMP/swaps-map"
Packit d86cd3
if [ -f /proc/swaps ]; then
Packit d86cd3
	grep "^/dev/" /proc/swaps | parse_proc_swaps >"$OS_PROBER_TMP/swaps-map" || true
Packit d86cd3
fi
Packit d86cd3
: >"$OS_PROBER_TMP/raided-map"
Packit d86cd3
if [ -f /proc/mdstat ] ; then
rpm-build d7be71
	grep "^md" /proc/mdstat | cut -d: -f2- | parse_proc_mdstat >"$OS_PROBER_TMP/raided-map" || true
Packit d86cd3
fi
Packit d86cd3
rpm-build fe73fc
: >"$OS_PROBER_TMP/btrfs-vols"
rpm-build fe73fc
rpm-build 614032
( (
Packit d86cd3
for partition in $(partitions); do
Packit d86cd3
	if ! mapped="$(mapdevfs "$partition")"; then
Packit d86cd3
		log "Device '$partition' does not exist; skipping"
Packit d86cd3
		continue
Packit d86cd3
	fi
Packit d86cd3
Packit d86cd3
	# Skip partitions used in software RAID arrays
Packit d86cd3
	if grep -q "^$mapped" "$OS_PROBER_TMP/raided-map" ; then
Packit d86cd3
		debug "$partition: part of software raid array"
Packit d86cd3
		continue
Packit d86cd3
	fi
Packit d86cd3
Packit d86cd3
	# Skip partitions used as active swap
Packit d86cd3
	if grep -q "^$mapped " "$OS_PROBER_TMP/swaps-map" ; then
Packit d86cd3
		debug "$partition: is active swap"
Packit d86cd3
		continue
Packit d86cd3
	fi
Packit d86cd3
rpm-build fe73fc
	# do btrfs processing here; both mounted and unmounted will
rpm-build fe73fc
	# be handled by 50mounted-tests so we can do a subvol only once.
rpm-build fe73fc
	type=$(blkid -o value -s TYPE $mapped || true)
rpm-build fe73fc
	if [ "$type" = btrfs ]; then
rpm-build fe73fc
		uuid=$(blkid -o value -s UUID $mapped)
rpm-build fe73fc
		if grep -q "^$uuid" "$OS_PROBER_TMP/btrfs-vols" ; then
rpm-build fe73fc
			continue
rpm-build fe73fc
		fi
rpm-build fe73fc
		debug "btrfs volume uuid=$uuid partition=$partition"
rpm-build fe73fc
		echo "$uuid" >>"$OS_PROBER_TMP/btrfs-vols"
Packit Service 8d4c46
		test="/usr/libexec/os-probes/50mounted-tests"
rpm-build fe73fc
		if [ -f "$test" ] && [ -x "$test" ]; then
rpm-build fe73fc
			debug "running $test on btrfs $partition"
rpm-build fe73fc
			if "$test" btrfs "$uuid" "$partition"; then
rpm-build fe73fc
				debug "os detected by $test"
rpm-build fe73fc
				continue
rpm-build fe73fc
			fi
rpm-build fe73fc
		fi
rpm-build fe73fc
rpm-build fe73fc
	elif ! grep -q "^$mapped " "$OS_PROBER_TMP/mounted-map" ; then
Packit Service 8d4c46
		for test in /usr/libexec/os-probes/*; do
Packit d86cd3
			if [ -f "$test" ] && [ -x "$test" ]; then
Packit d86cd3
				debug "running $test on $partition"
Packit d86cd3
				if "$test" "$partition"; then
Packit d86cd3
					debug "os detected by $test"
Packit d86cd3
			   		break
Packit d86cd3
				fi
Packit d86cd3
			fi
Packit d86cd3
		done
Packit d86cd3
	else
Packit d86cd3
		mpoint=$(grep "^$mapped " "$OS_PROBER_TMP/mounted-map" | head -n1 | cut -d " " -f 2)
Packit d86cd3
		mpoint="$(unescape_mount "$mpoint")"
Packit d86cd3
		if [ "$mpoint" != "/target/boot" ] && [ "$mpoint" != "/target" ] && [ "$mpoint" != "/" ]; then
Packit d86cd3
			type=$(grep "^$mapped " "$OS_PROBER_TMP/mounted-map" | head -n1 | cut -d " " -f 3)
Packit Service 8d4c46
			for test in /usr/libexec/os-probes/mounted/*; do
Packit d86cd3
				if [ -f "$test" ] && [ -x "$test" ]; then
Packit d86cd3
					debug "running $test on mounted $partition"
Packit d86cd3
					if "$test" "$partition" "$mpoint" "$type"; then
Packit d86cd3
						debug "os detected by $test"
Packit d86cd3
						break
Packit d86cd3
					fi
Packit d86cd3
				fi
Packit d86cd3
			done
Packit d86cd3
		fi
Packit d86cd3
	fi
Packit d86cd3
done
rpm-build 614032
) 9>&1 | logger 1>&-  # fd_logger
rpm-build 614032
) 3>&1  # fd_result