Blame common.sh

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
}