|
#!/bin/bash |
|
# Notes: |
|
# - Please install "jq" package before using this driver. |
|
usage() { |
|
err "Invalid usage. Usage: " |
|
err "\t$0 init" |
|
err "\t$0 attach <json params>" |
|
err "\t$0 detach <mount device>" |
|
err "\t$0 mount <mount dir> <mount device> <json params>" |
|
err "\t$0 unmount <mount dir>" |
|
exit 1 |
|
} |
|
|
|
err() { |
|
echo -ne $* 1>&2 |
|
} |
|
|
|
log() { |
|
echo -ne $* >&1 |
|
} |
|
|
|
ismounted() { |
|
MOUNT=`findmnt -n ${MNTPATH} 2>/dev/null | cut -d' ' -f1` |
|
if [ "${MOUNT}" == "${MNTPATH}" ]; then |
|
echo "1" |
|
else |
|
echo "0" |
|
fi |
|
} |
|
|
|
attach() { |
|
MNTPATH=$(echo $1 | jq -r '.fromPath') |
|
if [ ! -d "${MNTPATH}" ]; then |
|
mkdir -p ${MNTPATH} &> /dev/null |
|
if [ $? -ne 0 ]; then |
|
err "{ \"status\": \"Failure\", \"message\": \"Failed to create source directory ${MNTPATH}\"}" |
|
exit 1 |
|
fi |
|
fi |
|
|
|
if [ $(ismounted) -eq 0 ] ; then |
|
mount --rbind ${MNTPATH} ${MNTPATH} &> /dev/null |
|
if [ $? -ne 0 ]; then |
|
err "{ \"status\": \"Failure\", \"message\": \"Failed to bind mount ${MNTPATH}\"}" |
|
exit 1 |
|
fi |
|
fi |
|
|
|
mount --make-rshared $MNTPATH &> /dev/null |
|
if [ $? -ne 0 ]; then |
|
umount ${MNTPATH} &> /dev/null |
|
err "{ \"status\": \"Failure\", \"message\": \"Failed to mark mount directory for ${MNTPATH} as shared\"}" |
|
exit 1 |
|
fi |
|
|
|
log "{\"status\": \"Success\", \"device\":\"${MNTPATH}\"}" |
|
exit 0 |
|
} |
|
|
|
detach() { |
|
unmount $1 |
|
} |
|
|
|
domount() { |
|
MNTPATH=$1 |
|
FROM_PATH=$2 |
|
|
|
mkdir -p ${MNTPATH} &> /dev/null |
|
|
|
mount --rbind ${FROM_PATH} ${MNTPATH} &> /dev/null |
|
if [ $? -ne 0 ]; then |
|
err "{ \"status\": \"Failure\", \"message\": \"Failed to mount ${FROM_PATH} at ${MNTPATH}\"}" |
|
exit 1 |
|
fi |
|
|
|
mount --make-rshared $MNTPATH &> /dev/null |
|
if [ $? -ne 0 ]; then |
|
umount ${MNTPATH} &> /dev/null |
|
err "{ \"status\": \"Failure\", \"message\": \"Failed to mark mount directory for ${MNTPATH} as shared\"}" |
|
exit 1 |
|
fi |
|
|
|
log "{\"status\": \"Success\"}" |
|
exit 0 |
|
} |
|
|
|
unmount() { |
|
MNTPATH=$1 |
|
if [ $(ismounted) -eq 0 ] ; then |
|
log "{\"status\": \"Success\"}" |
|
exit 0 |
|
fi |
|
|
|
umount ${MNTPATH} &> /dev/null |
|
if [ $? -ne 0 ]; then |
|
err "{ \"status\": \"Failed\", \"message\": \"Failed to unmount volume at ${MNTPATH}\"}" |
|
exit 1 |
|
fi |
|
rmdir ${MNTPATH} &> /dev/null |
|
|
|
log "{\"status\": \"Success\"}" |
|
exit 0 |
|
} |
|
|
|
op=$1 |
|
|
|
if [ "$op" = "init" ]; then |
|
log "{\"status\": \"Success\"}" |
|
exit 0 |
|
fi |
|
|
|
if [ $# -lt 2 ]; then |
|
usage |
|
fi |
|
|
|
shift |
|
|
|
case "$op" in |
|
attach) |
|
attach $* |
|
;; |
|
detach) |
|
detach $* |
|
;; |
|
mount) |
|
domount $* |
|
;; |
|
unmount) |
|
unmount $* |
|
;; |
|
*) |
|
usage |
|
esac |
|
|
|
exit 1 |