#!/bin/sh

CONFIG="${CONFIG:-/etc/zfs/zdev.conf}"

if [ -z "${PATH_ID}" ]; then
	# The path_id helper became a builtin command in udev 174.
	if [ -x '/lib/udev/path_id' ]; then
		PATH_ID='/lib/udev/path_id'
	else
		PATH_ID='udevadm test-builtin path_id'
	fi
fi

die() {
	echo "Error: $*"
	exit 1
}

usage() {
	cat << EOF
Usage: zpool_id [-h] [-c configfile] <devpath>
  -c    Alternate config file [default /etc/zfs/zdev.conf]
  -d    Use path_id from device as the mapping key
  -h    Show this message
EOF
	exit 1
}

while getopts 'c:d:h' OPTION; do
	case ${OPTION} in
	c)
		CONFIG="${OPTARG}"
		;;
	d)
		DEVICE="${OPTARG}"
		;;
	h)
		usage
		;;
	esac
done

# Check that a device was requested
[ -z "${DEVICE}" ] && usage

# Check for the existence of a configuration file
[ ! -f "${CONFIG}" ] && die "Missing config file: ${CONFIG}"

# If we are handling a multipath device then $DM_UUID will be
# exported and we'll use its value (prefixed with dm-uuid per
# multipathd's naming convention) as our unique persistent key.
# For traditional devices we'll obtain the key from udev's
# path_id.
if [ -n "${DM_UUID}" ] && echo "${DM_UUID}" | grep -q -e '^mpath' ; then
	ID_PATH="dm-uuid-${DM_UUID}"
else
	eval `${PATH_ID} ${DEVICE}`
	[ -z "${ID_PATH}" ] && die "Missing ID_PATH for ${DEVICE}"
fi

# Use the persistent key to lookup the zpool device id in the
# configuration file which is of the format <device id> <key>.
# Lines starting with #'s are treated as comments and ignored.
# Exact matches are required, wild cards are not supported,
# and only the first match is returned.
ID_ZPOOL=''
while read CONFIG_ZPOOL CONFIG_PATH REPLY; do
	if [ "${CONFIG_ZPOOL}" != "${CONFIG_ZPOOL#\#}" ]; then
		# Skip comment lines.
		continue
	fi
	if [ "${CONFIG_PATH}" = "${ID_PATH}" ]; then
		ID_ZPOOL="${CONFIG_ZPOOL}"
		break
	fi
done <"${CONFIG}"

[ -z "${ID_ZPOOL}" ] && die "Missing ID_ZPOOL for ID_PATH: ${ID_PATH}"

if [ -n "${ID_ZPOOL}" ]; then
	echo "ID_PATH=${ID_PATH}"
	echo "ID_ZPOOL=${ID_ZPOOL}"
	echo "ID_ZPOOL_PATH=disk/zpool/${ID_ZPOOL}"
fi

exit 0
