#!/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] -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 . # 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