#!/bin/bash CONFIG=${CONFIG:-/etc/zfs/zdev.conf} PATH_ID=${PATH_ID:-/lib/udev/path_id} AWK=${AWK:-/usr/bin/awk} 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} | egrep -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. Also note the following # regex pattern only appears to work with gawk, not mawk or awk. ID_ZPOOL=`${AWK} "/\<${ID_PATH}\>/ && !/^#/ { print \\$1; exit }" ${CONFIG}` [ -z ${ID_ZPOOL} ] && die "Missing ID_ZPOOL for ID_PATH: ${ID_PATH}" if [ ${ID_ZPOOL} ]; then echo "ID_PATH=${ID_PATH}" echo "ID_ZPOOL=${ID_ZPOOL}" echo "ID_ZPOOL_PATH=disk/zpool/${ID_ZPOOL}" fi exit 0