|
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
|