0
  1   ˆl–äY>”ÊC]Šq@½p!¸ÓjbÑ¿Â„dN¼Ï_ŒuÐb&=LyYÿÁÆ ?÷     #!/usr/bin/bash
#
# Kdump common variables and functions
#

. /usr/lib/kdump/kdump-lib-initramfs.sh

FADUMP_ENABLED_SYS_NODE="/sys/kernel/fadump/enabled"
FADUMP_REGISTER_SYS_NODE="/sys/kernel/fadump/registered"
FADUMP_APPEND_ARGS_SYS_NODE="/sys/kernel/fadump/bootargs_append"

is_uki()
{
	local img

	img="$1"

	[[ -f "$img" ]] || return
	[[ "$(objdump -a "$img" 2> /dev/null)" =~ pei-(x86-64|aarch64-little) ]] || return
	objdump -h -j .linux "$img" &> /dev/null
}

is_fadump_capable()
{
	# Check if firmware-assisted dump is enabled
	# if no, fallback to kdump check
	if [[ -f $FADUMP_ENABLED_SYS_NODE ]]; then
		rc=$(< $FADUMP_ENABLED_SYS_NODE)
		[[ $rc -eq 1 ]] && return 0
	fi
	return 1
}

is_sme_or_sev_active()
{
	journalctl -q --dmesg --grep "^Memory Encryption Features active: AMD (SME|SEV)$" >/dev/null 2>&1
}

is_squash_available()
{
	local _version kmodule

	_version=$(_get_kdump_kernel_version)
	for kmodule in squashfs overlay loop; do
		modprobe -S "$_version" --dry-run $kmodule &> /dev/null || return 1
	done
}

is_zstd_command_available()
{
	[[ -x "$(command -v zstd)" ]]
}

dracut_have_option()
{
	local _option=$1
	! dracut "$_option" 2>&1 | grep -q "unrecognized option"
}

perror_exit()
{
	derror "$@"
	exit 1
}

# Check if fence kdump is configured in Pacemaker cluster
is_pcs_fence_kdump()
{
	# no pcs or fence_kdump_send executables installed?
	type -P pcs > /dev/null || return 1
	[[ -x $FENCE_KDUMP_SEND ]] || return 1

	# fence kdump not configured?
	(pcs cluster cib | grep 'type="fence_kdump"') &> /dev/null || return 1
}

# Check if fence_kdump is configured using kdump options
is_generic_fence_kdump()
{
	[[ -x $FENCE_KDUMP_SEND ]] || return 1

	[[ $(kdump_get_conf_val fence_kdump_nodes) ]]
}

to_dev_name()
{
	local dev="${1//\"/}"

	case "$dev" in
	UUID=*)
		blkid -U "${dev#UUID=}"
		;;
	LABEL=*)
		blkid -L "${dev#LABEL=}"
		;;
	*)
		echo "$dev"
		;;
	esac
}

is_user_configured_dump_target()
{
	[[ $(kdump_get_conf_val "ext[234]|xfs|btrfs|minix|raw|nfs|ssh|virtiofs") ]] || is_mount_in_dracut_args
}

get_block_dump_target()
{
	local _target _fstype

	if is_ssh_dump_target || is_nfs_dump_target; then
		return
	fi

	_target=$(kdump_get_conf_val "ext[234]|xfs|btrfs|minix|raw|virtiofs")
	[[ -n $_target ]] && to_dev_name "$_target" && return

	_target=$(get_dracut_args_target "$(kdump_get_conf_val "dracut_args")")
	[[ -b $_target ]] && to_dev_name "$_target" && return

	_fstype=$(get_dracut_args_fstype "$(kdump_get_conf_val "dracut_args")")
	is_fs_type_virtiofs "$_fstype" && echo "$_target" && return

	_target=$(get_target_from_path "$(get_save_path)")
	[[ -b $_target ]] && to_dev_name "$_target" && return

	_fstype=$(get_fs_type_from_target "$_target")
	is_fs_type_virtiofs "$_fstype" && echo "$_target" && return
}

is_dump_to_rootfs()
{
	[[ $(kdump_get_conf_val 'failure_action|default') == dump_to_rootfs ]]
}

is_lvm2_thinp_dump_target()
{
	_target=$(get_block_dump_target)
	[ -n "$_target" ] && is_lvm2_thinp_device "$_target"
}

get_failure_action_target()
{
	local _target

	if is_dump_to_rootfs; then
		# Get rootfs device name
		_target=$(get_root_fs_device)
		[[ -b $_target ]] && to_dev_name "$_target" && return
		is_fs_type_virtiofs "$(get_fs_type_from_target "$_target")" && echo "$_target" && return
		# Then, must be nfs root
		echo "nfs"
	fi
}

# Get kdump targets(including root in case of dump_to_rootfs).
get_kdump_targets()
{
	local _target _root
	local kdump_targets

	_target=$(get_block_dump_target)
	if [[ -n $_target ]]; then
		kdump_targets=$_target
	elif is_ssh_dump_target; then
		kdump_targets="ssh"
	else
		kdump_targets="nfs"
	fi

	# Add the root device if dump_to_rootfs is specified.
	_root=$(get_failure_action_target)
	if [[ -n $_root ]] && [[ $kdump_targets != "$_root" ]]; then
		kdump_targets="$kdump_targets $_root"
	fi

	echo "$kdump_targets"
}

# Return the bind mount source path, return the path itself if it's not bind mounted
# Eg. if /path/to/src is bind mounted to /mnt/bind, then:
# /mnt/bind -> /path/to/src, /mnt/bind/dump -> 