|
Packit |
d86cd3 |
newns () {
|
|
Packit |
d86cd3 |
[ "$OS_PROBER_NEWNS" ] || exec /usr/lib/os-prober/newns "$0" "$@"
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
cleanup_tmpdir=false
|
|
Packit |
d86cd3 |
cleanup () {
|
|
Packit |
d86cd3 |
if $cleanup_tmpdir; then
|
|
Packit |
d86cd3 |
rm -rf "$OS_PROBER_TMP"
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
require_tmpdir() {
|
|
Packit |
d86cd3 |
if [ -z "$OS_PROBER_TMP" ]; then
|
|
Packit |
d86cd3 |
if type mktemp >/dev/null 2>&1; then
|
|
Packit |
d86cd3 |
export OS_PROBER_TMP="$(mktemp -d /tmp/os-prober.XXXXXX)"
|
|
Packit |
d86cd3 |
cleanup_tmpdir=:
|
|
Packit |
d86cd3 |
trap cleanup EXIT HUP INT QUIT TERM
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
export OS_PROBER_TMP=/tmp
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
count_for() {
|
|
Packit |
d86cd3 |
_labelprefix="$1"
|
|
Packit |
d86cd3 |
_result=$(grep "^${_labelprefix} " /var/lib/os-prober/labels 2>/dev/null || true)
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
if [ -z "$_result" ]; then
|
|
Packit |
d86cd3 |
return
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
echo "$_result" | cut -d' ' -f2
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
count_next_label() {
|
|
Packit |
d86cd3 |
require_tmpdir
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
_labelprefix="$1"
|
|
Packit |
d86cd3 |
_cfor="$(count_for "${_labelprefix}")"
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
if [ -z "$_cfor" ]; then
|
|
Packit |
d86cd3 |
echo "${_labelprefix} 1" >> /var/lib/os-prober/labels
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
sed "s/^${_labelprefix} ${_cfor}/${_labelprefix} $(($_cfor + 1))/" /var/lib/os-prober/labels > "$OS_PROBER_TMP/os-prober.tmp"
|
|
Packit |
d86cd3 |
mv "$OS_PROBER_TMP/os-prober.tmp" /var/lib/os-prober/labels
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
echo "${_labelprefix}${_cfor}"
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
progname=
|
|
Packit |
d86cd3 |
cache_progname() {
|
|
Packit |
d86cd3 |
case $progname in
|
|
Packit |
d86cd3 |
'')
|
|
Packit |
d86cd3 |
progname="${0##*/}"
|
|
Packit |
d86cd3 |
;;
|
|
Packit |
d86cd3 |
esac
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit Service |
75bd63 |
log() {
|
|
Packit Service |
75bd63 |
cache_progname
|
|
Packit Service |
75bd63 |
logger -t "$progname" "$@"
|
|
Packit Service |
75bd63 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
error() {
|
|
Packit |
d86cd3 |
log "error: $@"
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
warn() {
|
|
Packit |
d86cd3 |
log "warning: $@"
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
debug() {
|
|
Packit |
d86cd3 |
if [ -z "$OS_PROBER_DISABLE_DEBUG" ]; then
|
|
Packit |
d86cd3 |
log "debug: $@"
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit Service |
75bd63 |
result () {
|
|
Packit Service |
75bd63 |
log "result:" "$@"
|
|
Packit Service |
75bd63 |
echo "$@"
|
|
Packit Service |
75bd63 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
# shim to make it easier to use os-prober outside d-i
|
|
Packit |
d86cd3 |
if ! type mapdevfs >/dev/null 2>&1; then
|
|
Packit |
d86cd3 |
mapdevfs () {
|
|
Packit |
d86cd3 |
readlink -f "$1"
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
item_in_dir () {
|
|
Packit |
d86cd3 |
if [ "$1" = "-q" ]; then
|
|
Packit |
d86cd3 |
q="-q"
|
|
Packit |
d86cd3 |
shift 1
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
q=""
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
[ -d "$2" ] || return 1
|
|
Packit |
d86cd3 |
# find files with any case
|
|
Packit |
d86cd3 |
ls -1 "$2" | grep $q -i "^$1$"
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
# We can't always tell the filesystem type up front, but if we have the
|
|
Packit |
d86cd3 |
# information then we should use it. Note that we can't use block-attr here
|
|
Packit |
d86cd3 |
# as it's only available in udebs.
|
|
Packit |
d86cd3 |
# If not detected after different attempts then "NOT-DETECTED" will be printed
|
|
Packit |
d86cd3 |
# because function is not supposed to exit error codes.
|
|
Packit |
d86cd3 |
fs_type () {
|
|
Packit |
d86cd3 |
local fstype=""
|
|
Packit |
d86cd3 |
if (export PATH="/lib/udev:$PATH"; type vol_id) >/dev/null 2>&1; then
|
|
Packit |
d86cd3 |
PATH="/lib/udev:$PATH" \
|
|
Packit |
d86cd3 |
fstype=$(vol_id --type "$1" 2>/dev/null || true)
|
|
Packit |
d86cd3 |
[ -z "$fstype" ] || { echo "$fstype"; return; }
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
if type lsblk >/dev/null 2>&1 ; then
|
|
Packit |
d86cd3 |
fstype=$(lsblk --nodeps --noheading --output FSTYPE -- "$1" || true)
|
|
Packit |
d86cd3 |
[ -z "$fstype" ] || { echo "$fstype"; return; }
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
if type blkid >/dev/null 2>&1; then
|
|
Packit |
d86cd3 |
fstype=$(blkid -o value -s TYPE "$1" 2>/dev/null || true)
|
|
Packit |
d86cd3 |
[ -z "$fstype" ] || { echo "$fstype"; return; }
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
echo "NOT-DETECTED"
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
is_dos_extended_partition() {
|
|
Packit |
d86cd3 |
if type blkid >/dev/null 2>&1; then
|
|
Packit |
d86cd3 |
local output
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
output="$(blkid -o export $1)"
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
# old blkid (util-linux << 2.24) errors out on extended p.
|
|
Packit |
d86cd3 |
if [ "$?" = "2" ]; then
|
|
Packit |
d86cd3 |
return 0
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
# dos partition type and no filesystem type?...
|
|
Packit |
d86cd3 |
if echo $output | grep -q ' PTTYPE=dos ' &&
|
|
Packit |
d86cd3 |
! echo $output | grep -q ' TYPE='; then
|
|
Packit |
d86cd3 |
return 0
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
return 1
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
return 1
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
parse_proc_mounts () {
|
|
Packit |
d86cd3 |
while read -r line; do
|
|
Packit |
d86cd3 |
set -f
|
|
Packit |
d86cd3 |
set -- $line
|
|
Packit |
d86cd3 |
set +f
|
|
Packit Service |
75bd63 |
printf '%s %s %s\n' "$(mapdevfs "$1")" "$2" "$3"
|
|
Packit |
d86cd3 |
done
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
parsefstab () {
|
|
Packit |
d86cd3 |
while read -r line; do
|
|
Packit |
d86cd3 |
case "$line" in
|
|
Packit |
d86cd3 |
"#"*)
|
|
Packit |
d86cd3 |
:
|
|
Packit |
d86cd3 |
;;
|
|
Packit |
d86cd3 |
*)
|
|
Packit |
d86cd3 |
set -f
|
|
Packit |
d86cd3 |
set -- $line
|
|
Packit |
d86cd3 |
set +f
|
|
Packit Service |
75bd63 |
printf '%s %s %s\n' "$1" "$2" "$3"
|
|
Packit |
d86cd3 |
;;
|
|
Packit |
d86cd3 |
esac
|
|
Packit |
d86cd3 |
done
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
unescape_mount () {
|
|
Packit |
d86cd3 |
printf %s "$1" | \
|
|
Packit |
d86cd3 |
sed 's/\\011/ /g; s/\\012/\n/g; s/\\040/ /g; s/\\134/\\/g'
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
find_label () {
|
|
Packit |
d86cd3 |
local output
|
|
Packit |
d86cd3 |
if type blkid >/dev/null 2>&1; then
|
|
Packit |
d86cd3 |
# Hopefully everyone has blkid by now
|
|
Packit |
d86cd3 |
output="$(blkid -o device -t LABEL="$1")" || return 1
|
|
Packit |
d86cd3 |
echo "$output" | head -n1
|
|
Packit |
d86cd3 |
elif [ -h "/dev/disk/by-label/$1" ]; then
|
|
Packit |
d86cd3 |
# Last-ditch fallback
|
|
Packit |
d86cd3 |
readlink -f "/dev/disk/by-label/$1"
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
return 1
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
find_uuid () {
|
|
Packit |
d86cd3 |
local output
|
|
Packit |
d86cd3 |
if type blkid >/dev/null 2>&1; then
|
|
Packit |
d86cd3 |
# Hopefully everyone has blkid by now
|
|
Packit |
d86cd3 |
output="$(blkid -o device -t UUID="$1")" || return 1
|
|
Packit |
d86cd3 |
echo "$output" | head -n1
|
|
Packit |
d86cd3 |
elif [ -h "/dev/disk/by-uuid/$1" ]; then
|
|
Packit |
d86cd3 |
# Last-ditch fallback
|
|
Packit |
d86cd3 |
readlink -f "/dev/disk/by-uuid/$1"
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
return 1
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
do_dmsetup () {
|
|
Packit |
d86cd3 |
local prefix partition dm_device partition_name size_p
|
|
Packit |
d86cd3 |
prefix="$1"
|
|
Packit |
d86cd3 |
partition="$2"
|
|
Packit |
d86cd3 |
dm_device=
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
if type dmsetup >/dev/null 2>&1 && \
|
|
Packit |
d86cd3 |
type blockdev >/dev/null 2>&1; then
|
|
Packit |
d86cd3 |
partition_name="osprober-linux-${partition##*/}"
|
|
Packit |
d86cd3 |
dm_device="/dev/mapper/$partition_name"
|
|
Packit |
d86cd3 |
size_p=$(blockdev --getsize $partition )
|
|
Packit |
d86cd3 |
if [ -e "$dm_device" ]; then
|
|
Packit |
d86cd3 |
error "$dm_device already exists"
|
|
Packit |
d86cd3 |
dm_device=
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
debug "creating device mapper device $dm_device"
|
|
Packit |
d86cd3 |
echo "0 $size_p linear $partition 0" | dmsetup create -r $partition_name
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
echo "$dm_device"
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
# Sets $mountboot and $dm_device as output variables. This is very messy,
|
|
Packit |
d86cd3 |
# but POSIX shell isn't really up to the task of doing it more cleanly.
|
|
Packit |
d86cd3 |
linux_mount_boot () {
|
|
Packit |
d86cd3 |
partition="$1"
|
|
Packit |
d86cd3 |
tmpmnt="$2"
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
bootpart=""
|
|
Packit |
d86cd3 |
mounted=""
|
|
Packit |
d86cd3 |
dm_device=""
|
|
Packit |
d86cd3 |
if [ -e "$tmpmnt/etc/fstab" ]; then
|
|
Packit |
d86cd3 |
# Try to mount any /boot partition.
|
|
Packit |
d86cd3 |
bootmnt=$(parsefstab < "$tmpmnt/etc/fstab" | grep " /boot ") || true
|
|
Packit |
d86cd3 |
if [ -n "$bootmnt" ]; then
|
|
Packit |
d86cd3 |
set -f
|
|
Packit |
d86cd3 |
set -- $bootmnt
|
|
Packit |
d86cd3 |
set +f
|
|
Packit |
d86cd3 |
boottomnt=""
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
# Try to map labels and UUIDs ourselves if possible,
|
|
Packit |
d86cd3 |
# so that we can check whether they're already
|
|
Packit |
d86cd3 |
# mounted somewhere else.
|
|
Packit |
d86cd3 |
tmppart="$1"
|
|
Packit |
d86cd3 |
if echo "$1" | grep -q "LABEL="; then
|
|
Packit |
d86cd3 |
label="$(echo "$1" | cut -d = -f 2)"
|
|
Packit |
d86cd3 |
if tmppart="$(find_label "$label")"; then
|
|
Packit |
d86cd3 |
debug "mapped LABEL=$label to $tmppart"
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
debug "found boot partition LABEL=$label for Linux system on $partition, but cannot map to existing device"
|
|
Packit |
d86cd3 |
mountboot="$partition 0"
|
|
Packit |
d86cd3 |
return
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
elif echo "$1" | grep -q "UUID="; then
|
|
Packit |
d86cd3 |
uuid="$(echo "$1" | cut -d = -f 2)"
|
|
Packit |
d86cd3 |
if tmppart="$(find_uuid "$uuid")"; then
|
|
Packit |
d86cd3 |
debug "mapped UUID=$uuid to $tmppart"
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
debug "found boot partition UUID=$uuid for Linux system on $partition, but cannot map to existing device"
|
|
Packit |
d86cd3 |
mountboot="$partition 0"
|
|
Packit |
d86cd3 |
return
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
shift
|
|
Packit |
d86cd3 |
set -- "$(mapdevfs "$tmppart")" "$@"
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
if grep -q "^$1 " "$OS_PROBER_TMP/mounted-map"; then
|
|
Packit |
d86cd3 |
bindfrom="$(grep "^$1 " "$OS_PROBER_TMP/mounted-map" | head -n1 | cut -d " " -f 2)"
|
|
Packit |
d86cd3 |
bindfrom="$(unescape_mount "$bindfrom")"
|
|
Packit |
d86cd3 |
if [ "$bindfrom" != "$tmpmnt/boot" ]; then
|
|
Packit |
d86cd3 |
if mount --bind "$bindfrom" "$tmpmnt/boot"; then
|
|
Packit |
d86cd3 |
mounted=1
|
|
Packit Service |
75bd63 |
bootpart="$1"
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
debug "failed to bind-mount $bindfrom onto $tmpmnt/boot"
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
if [ "$mounted" ]; then
|
|
Packit |
d86cd3 |
:
|
|
Packit |
d86cd3 |
elif [ -e "$1" ]; then
|
|
Packit |
d86cd3 |
bootpart="$1"
|
|
Packit |
d86cd3 |
boottomnt="$1"
|
|
Packit |
d86cd3 |
elif [ -e "$tmpmnt/$1" ]; then
|
|
Packit |
d86cd3 |
bootpart="$1"
|
|
Packit |
d86cd3 |
boottomnt="$tmpmnt/$1"
|
|
Packit |
d86cd3 |
elif [ -e "/target/$1" ]; then
|
|
Packit |
d86cd3 |
bootpart="$1"
|
|
Packit |
d86cd3 |
boottomnt="/target/$1"
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
bootpart=""
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
if [ ! "$mounted" ]; then
|
|
Packit |
d86cd3 |
if [ -z "$bootpart" ]; then
|
|
Packit |
d86cd3 |
debug "found boot partition $1 for linux system on $partition, but cannot map to existing device"
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
debug "found boot partition $bootpart for linux system on $partition"
|
|
Packit |
d86cd3 |
if type grub-mount >/dev/null 2>&1 && \
|
|
Packit |
d86cd3 |
grub-mount "$boottomnt" "$tmpmnt/boot" 2>/dev/null; then
|
|
Packit |
d86cd3 |
mounted=1
|
|
Packit |
d86cd3 |
elif dm_device="$(do_dmsetup osprober-linux "$boottomnt")" && [ "$dm_device" ]; then
|
|
Packit |
d86cd3 |
if mountinfo=`mount -o ro "$dm_device" "$tmpmnt/boot" -t "$3"`; then
|
|
Packit |
d86cd3 |
debug "mounted as $3 filesystem"
|
|
Packit |
d86cd3 |
mounted=1
|
|
Packit |
d86cd3 |
else
|
|
Packit |
d86cd3 |
error "failed to mount $dm_device on $tmpmnt/boot: $mountinfo"
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
if [ -z "$bootpart" ]; then
|
|
Packit |
d86cd3 |
bootpart="$partition"
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
if [ -z "$mounted" ]; then
|
|
Packit |
d86cd3 |
mounted=0
|
|
Packit |
d86cd3 |
fi
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
mountboot="$bootpart $mounted"
|
|
Packit |
d86cd3 |
}
|