X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Frbdmap;fp=src%2Fceph%2Fsrc%2Frbdmap;h=3b840aef94c7b2962a204d13703637c677ac5b35;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/rbdmap b/src/ceph/src/rbdmap new file mode 100755 index 0000000..3b840ae --- /dev/null +++ b/src/ceph/src/rbdmap @@ -0,0 +1,167 @@ +#!/bin/bash + +do_map() { + # Read /etc/rbdtab to create non-existant mapping + RET=0 + while read DEV PARAMS; do + case "$DEV" in + ""|\#*) + continue + ;; + */*) + ;; + *) + DEV=rbd/$DEV + ;; + esac + logger -p "daemon.debug" -t rbdmap "Mapping '${DEV}'" + newrbd="" + MAP_RV="" + OIFS=$IFS + IFS=',' + CMDPARAMS="" + for PARAM in ${PARAMS[@]}; do + CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')" + done + IFS=$OIFS + if [ -b /dev/rbd/$DEV ]; then + MAP_RV="$(readlink -f /dev/rbd/$DEV)" + else + MAP_RV="$(rbd map $DEV $CMDPARAMS 2>&1)" + if [ $? -eq 0 ]; then + newrbd="yes" + else + RET=$((${RET}+$?)) + logger -p "daemon.warning" -t rbdmap "Failed to map '${DEV}" + continue + fi + fi + logger -p "daemon.debug" -t rbdmap "Mapped '${DEV}' to '${MAP_RV}'" + + if [ "$newrbd" ]; then + ## Mount new rbd + MNT_RV="" + mount --fake /dev/rbd/$DEV >>/dev/null 2>&1 \ + && MNT_RV=$(mount -vn /dev/rbd/$DEV 2>&1) + [ -n "${MNT_RV}" ] && logger -p "daemon.debug" -t rbdmap "Mounted '${MAP_RV}' to '${MNT_RV}'" + + ## post-mapping + if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then + logger -p "daemon.debug" -t rbdmap "Running post-map hook '/etc/ceph/rbd.d/${DEV}'" + /etc/ceph/rbd.d/${DEV} map "/dev/rbd/${DEV}" + fi + fi + done < $RBDMAPFILE + exit ${RET} + +} + +unmount_unmap() { + local rbd_dev=$1 + local mnts=$(findmnt --mtab --source ${rbd_dev} --noheadings \ + | awk '{print $1'}) + + logger -p "daemon.debug" -t rbdmap "Unmapping '${rbd_dev}'" + for mnt in ${mnts}; do + logger -p "daemon.debug" -t rbdmap "Unmounting '${mnt}'" + umount "${mnt}" >>/dev/null 2>&1 + if mountpoint -q "${mnt}"; then + ## Un-mounting failed. + logger -p "daemon.warning" -t rbdmap "Failed to unmount '${mnt}'" + return 1 + fi + done + ## Un-mapping. + rbd unmap $rbd_dev >>/dev/null 2>&1 + if [ $? -ne 0 ]; then + logger -p "daemon.warning" -t rbdmap "Failed to unmap '${mnt}'" + return 1 + fi + logger -p "daemon.debug" -t rbdmap "Unmapped '${rbd_dev}'" + + return 0 +} + +do_unmap_all() { + RET=0 + ## Unmount and unmap all rbd devices + if ls /dev/rbd[0-9]* >/dev/null 2>&1; then + for DEV in /dev/rbd[0-9]*; do + ## pre-unmapping + for L in $(find /dev/rbd -type l); do + LL="${L##/dev/rbd/}" + if [ "$(readlink -f $L)" = "${DEV}" ] \ + && [ -x "/etc/ceph/rbd.d/${LL}" ]; then + logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook for '${DEV}': '/etc/ceph/rbd.d/${LL}'" + /etc/ceph/rbd.d/${LL} unmap "$L" + break + fi + done + + unmount_unmap "$DEV" || RET=$((${RET}+$?)) + + done + fi + exit ${RET} +} + +do_unmap() { + RET=0 + ## skip if nothing is mapped + ls /dev/rbd[0-9]* >/dev/null 2>&1 || exit ${RET} + + # Read /etc/rbdtab to create non-existant mapping + while read DEV PARAMS; do + case "$DEV" in + ""|\#*) + continue + ;; + */*) + ;; + *) + DEV=rbd/$DEV + ;; + esac + + MAP_RV="$(readlink -f /dev/rbd/$DEV)" + if [ ! -b $MAP_RV ]; then + logger -p "daemon.debug" -t rbdmap "$DEV not mapped, skipping unmap" + continue + fi + + ## pre-unmapping + if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then + logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook '/etc/ceph/rbd.d/${DEV}'" + /etc/ceph/rbd.d/${DEV} unmap "/dev/rbd/${DEV}" + fi + + unmount_unmap "$MAP_RV" || RET=$((${RET}+$?)) + + done < $RBDMAPFILE + exit ${RET} +} + +# default to reasonable value if RBDMAPFILE not set in environment +RBDMAPFILE="${RBDMAPFILE:-/etc/ceph/rbdmap}" + +if [ ! -f "$RBDMAPFILE" ]; then + logger -p "daemon.warning" -t rbdmap "No $RBDMAPFILE found." + exit 0 +fi + +case "$1" in + map) + do_map + ;; + + unmap) + do_unmap + ;; + + unmap-all) + do_unmap_all + ;; + + *) + echo "Usage: rbdmap map | unmap | unmap-all" +esac