From f910d56dca5abf14c5679eec32ff7d3d57892437 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 1 Jul 2017 09:11:16 +0200 Subject: Avoid removing top-level directories when cleaning up bind mounts in container remove and stop commands. Previously when using 'bind=/mnt/foo:/foo/bar/baz;', this removed /mnt on the host system too (if empty). Signed-off-by: Daniel Baumann --- lib/container/remove | 25 +++++++++++++++++++++++-- lib/container/stop | 30 ++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/container/remove b/lib/container/remove index 1b1ba7d..c9a45a6 100755 --- a/lib/container/remove +++ b/lib/container/remove @@ -76,6 +76,27 @@ Usage () exit 1 } +Rmdir () +{ + DIRECTORIES="${@}" + + for DIRECTORY in ${DIRECTORIES} + do + PARENT_DIRECTORY="/$(echo ${DIRECTORY} | cut -d / -f 2)" + + if [ "${PARENT_DIRECTORY}" != "${DIRECTORY}" ] + then + # the directory is at least two levels down from / + cd "${PARENT_DIRECTORY}" + + CRUFT="$(echo ${DIRECTORY} | cut -d / -f 3-)" + rmdir --ignore-fail-on-non-empty --parents "${CRUFT}" > /dev/null 2>&1 || true + + cd "${OLDPWD}" + fi + done +} + Parameters "${@}" if [ -z "${NAME}" ] @@ -152,7 +173,7 @@ then do DIRECTORY="$(echo ${BIND} | awk -F: '{ print $1 }')" - rmdir --ignore-fail-on-non-empty --parents ${DIRECTORY} > /dev/null 2>&1 || true + Rmdir "${DIRECTORY}" done fi @@ -167,7 +188,7 @@ then do DIRECTORY="$(echo ${BIND_RO} | awk -F: '{ print $1 }')" - rmdir --ignore-fail-on-non-empty --parents ${DIRECTORY} > /dev/null 2>&1 || true + Rmdir "${DIRECTORY}" done fi fi diff --git a/lib/container/stop b/lib/container/stop index 359a136..12cf7fa 100755 --- a/lib/container/stop +++ b/lib/container/stop @@ -78,6 +78,27 @@ Usage () exit 1 } +Rmdir () +{ + DIRECTORIES="${@}" + + for DIRECTORY in ${DIRECTORIES} + do + PARENT_DIRECTORY="/$(echo ${DIRECTORY} | cut -d / -f 2)" + + if [ "${PARENT_DIRECTORY}" != "${DIRECTORY}" ] + then + # the directory is at least two levels down from / + cd "${PARENT_DIRECTORY}" + + CRUFT="$(echo ${DIRECTORY} | cut -d / -f 3-)" + rmdir --ignore-fail-on-non-empty --parents "${CRUFT}" > /dev/null 2>&1 || true + + cd "${OLDPWD}" + fi + done +} + Parameters "${@}" if [ -z "${NAME}" ] @@ -120,10 +141,7 @@ case "${CLEAN}" in umount -f "${DIRECTORY_MERGED}" - for DIRECTORY in "${DIRECTORY_LOWER}" "${DIRECTORY_UPPER}" "${DIRECTORY_WORK}" "${DIRECTORY_MERGED}" - do - rmdir --ignore-fail-on-non-empty --parents ${DIRECTORY} > /dev/null 2>&1 || true - done + Rmdir "${DIRECTORY_LOWER}" "${DIRECTORY_UPPER}" "${DIRECTORY_WORK}" "${DIRECTORY_MERGED}" done fi @@ -138,7 +156,7 @@ case "${CLEAN}" in do DIRECTORY="$(echo ${BIND} | awk -F: '{ print $1 }')" - rmdir --ignore-fail-on-non-empty --parents ${DIRECTORY} > /dev/null 2>&1 || true + Rmdir "${DIRECTORY}" done fi @@ -153,7 +171,7 @@ case "${CLEAN}" in do DIRECTORY="$(echo ${BIND_RO} | awk -F: '{ print $1 }')" - rmdir --ignore-fail-on-non-empty --parents ${DIRECTORY} > /dev/null 2>&1 || true + Rmdir "${DIRECTORY}" done fi -- cgit v1.2.3