diff --git a/setup/start/sudoers b/setup/start/sudoers index 234509929..54edb4dbc 100644 --- a/setup/start/sudoers +++ b/setup/start/sudoers @@ -7,11 +7,14 @@ yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/checkvolume.sh Defaults!/home/yellowtent/box/src/scripts/clearvolume.sh env_keep="HOME BOX_ENV" yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/clearvolume.sh +Defaults!/home/yellowtent/box/src/scripts/rmvolume.sh env_keep="HOME BOX_ENV" +yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/rmvolume.sh + Defaults!/home/yellowtent/box/src/scripts/mvvolume.sh env_keep="HOME BOX_ENV" yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/mvvolume.sh -Defaults!/home/yellowtent/box/src/scripts/mkdirvolume.sh env_keep="HOME BOX_ENV" -yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/mkdirvolume.sh +Defaults!/home/yellowtent/box/src/scripts/setupvolume.sh env_keep="HOME BOX_ENV" +yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/setupvolume.sh Defaults!/home/yellowtent/box/src/scripts/rmaddondir.sh env_keep="HOME BOX_ENV" yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/rmaddondir.sh diff --git a/src/scripts/clearvolume.sh b/src/scripts/clearvolume.sh index 6f7a075a8..3e856579c 100755 --- a/src/scripts/clearvolume.sh +++ b/src/scripts/clearvolume.sh @@ -17,8 +17,7 @@ if [[ "$1" == "--check" ]]; then exit 0 fi -cmd="$1" -volume_dir="$2" +volume_dir="12" if [[ "${BOX_ENV}" == "test" ]]; then # be careful not to nuke some random directory when testing @@ -30,11 +29,6 @@ if [[ -d "${volume_dir}" ]]; then find "${volume_dir}" -maxdepth 1 -mindepth 1 -exec rm -rf '{}' \; fi -if [[ "${cmd}" == "clear" ]]; then - mkdir -p "${volume_dir}" - # set it up so that we can restore here as normal user - chown $SUDO_USER:$SUDO_USER "${volume_dir}" -else - # this make not succeed if volume is a mount point - rmdir "${volume_dir}" || true -fi +mkdir -p "${volume_dir}" +# set it up so that we can restore here as normal user +chown $SUDO_USER:$SUDO_USER "${volume_dir}" diff --git a/src/scripts/rmvolume.sh b/src/scripts/rmvolume.sh new file mode 100755 index 000000000..23f3717bc --- /dev/null +++ b/src/scripts/rmvolume.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -eu -o pipefail + +if [[ ${EUID} -ne 0 ]]; then + echo "This script should be run as root." > /dev/stderr + exit 1 +fi + +if [[ $# -eq 0 ]]; then + echo "No arguments supplied" + exit 1 +fi + +if [[ "$1" == "--check" ]]; then + echo "OK" + exit 0 +fi + +volume_dir="$1" + +if [[ "${BOX_ENV}" == "test" ]]; then + # be careful not to nuke some random directory when testing + [[ "${volume_dir}" != *"/.cloudron_test/"* ]] && exit 1 +fi + +if [[ -d "${volume_dir}" ]]; then + # this removes hidden files + find "${volume_dir}" -maxdepth 1 -mindepth 1 -exec rm -rf '{}' \; +fi + +# this make not succeed if volume is a mount point +rmdir "${volume_dir}" || true diff --git a/src/scripts/mkdirvolume.sh b/src/scripts/setupvolume.sh similarity index 100% rename from src/scripts/mkdirvolume.sh rename to src/scripts/setupvolume.sh diff --git a/src/services.js b/src/services.js index 8ebfa947b..6b1069acc 100644 --- a/src/services.js +++ b/src/services.js @@ -74,7 +74,8 @@ const NOOP = async function (/*app, options*/) {}; const RMADDONDIR_CMD = path.join(__dirname, 'scripts/rmaddondir.sh'); const RESTART_SERVICE_CMD = path.join(__dirname, 'scripts/restartservice.sh'); const CLEARVOLUME_CMD = path.join(__dirname, 'scripts/clearvolume.sh'); -const MKDIRVOLUME_CMD = path.join(__dirname, 'scripts/mkdirvolume.sh'); +const RMVOLUME_CMD = path.join(__dirname, 'scripts/rmvolume.sh'); +const SETUPVOLUME_CMD = path.join(__dirname, 'scripts/setupvolume.sh'); // setup can be called multiple times for the same app (configure crash restart) and existing data must not be lost // teardown is destructive. app data stored with the addon is lost @@ -879,7 +880,7 @@ async function setupLocalStorage(app, options) { const volumeDataDir = await apps.getStorageDir(app); - const [error] = await safe(shell.promises.sudo([ MKDIRVOLUME_CMD, volumeDataDir ], {})); + const [error] = await safe(shell.promises.sudo([ SETUPVOLUME_CMD, volumeDataDir ], {})); if (error) throw new BoxError(BoxError.FS_ERROR, `Error creating app storage data dir: ${error.message}`); } @@ -890,7 +891,7 @@ async function clearLocalStorage(app, options) { debug('clearLocalStorage'); const volumeDataDir = await apps.getStorageDir(app); - const [error] = await safe(shell.promises.sudo([ CLEARVOLUME_CMD, 'clear', volumeDataDir ], {})); + const [error] = await safe(shell.promises.sudo([ CLEARVOLUME_CMD, volumeDataDir ], {})); if (error) throw new BoxError(BoxError.FS_ERROR, error); } @@ -901,7 +902,7 @@ async function teardownLocalStorage(app, options) { debug('teardownLocalStorage'); const volumeDataDir = await apps.getStorageDir(app); - const [error] = await safe(shell.promises.sudo([ CLEARVOLUME_CMD, 'rmdir', volumeDataDir ], {})); + const [error] = await safe(shell.promises.sudo([ RMVOLUME_CMD, volumeDataDir ], {})); if (error) throw new BoxError(BoxError.FS_ERROR, error); // sqlite files are automatically cleared