From af4066d05df2e0fc782c8483ddfeffefe99d87e5 Mon Sep 17 00:00:00 2001 From: Arvinda R <17693119+vindard@users.noreply.github.com> Date: Wed, 9 Sep 2020 09:59:05 -0400 Subject: [PATCH] Stop Umbrel if external storage device is unreliable (#224) Co-authored-by: Luke Childs --- scripts/umbrel-os/external-storage/monitor | 48 ++++++++++++++++++++++ scripts/umbrel-os/external-storage/mount | 4 ++ 2 files changed, 52 insertions(+) create mode 100755 scripts/umbrel-os/external-storage/monitor diff --git a/scripts/umbrel-os/external-storage/monitor b/scripts/umbrel-os/external-storage/monitor new file mode 100755 index 0000000..2da070a --- /dev/null +++ b/scripts/umbrel-os/external-storage/monitor @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +set -euo pipefail + +UMBREL_ROOT="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/../../..)" +block_device="${1}" +mount_point="${2}" + +check_if_not_already_running() { + if ps ax | grep $0 | grep -v $$ | grep bash | grep -v grep + then + echo "storage monitor is already running" + exit 1 + fi +} + +main () { + check_if_not_already_running + + while true; do + if ! [[ -e "/dev/${block_device}" ]]; then + echo "Mounted block device no longer exists!" + break + fi + + if ! grep --quiet " ${mount_point} " /proc/mounts; then + echo "External storage is no longer mounted!" + break + fi + + if grep " ${mount_point} " /proc/mounts | grep --quiet '[ ,]ro[ ,]'; then + echo "External storage is mounted as read only!" + break + fi + + if ! df -h "${UMBREL_ROOT}" | grep --quiet "/dev/${block_device}"; then + echo "Umbrel root is no longer bind mounted to external storage!" + break + fi + + sleep 1 + done + + echo "Stopping Umbrel due to failed storage device check..." + docker kill $(docker ps -aq) +} + +main diff --git a/scripts/umbrel-os/external-storage/mount b/scripts/umbrel-os/external-storage/mount index 5136ef7..3da25cf 100755 --- a/scripts/umbrel-os/external-storage/mount +++ b/scripts/umbrel-os/external-storage/mount @@ -203,6 +203,10 @@ main () { echo "Checking SD Card root is bind mounted at /sd-root..." df -h "/sd-root${UMBREL_ROOT}" | grep --quiet "/dev/root" + echo "Starting external drive mount monitor..." + echo + ${UMBREL_ROOT}/scripts/umbrel-os/external-storage/monitor ${block_device} ${MOUNT_POINT} & + echo "Mount script completed successfully!" }