diff --git a/install/docker/setup-scrypted-nvr-volume.sh b/install/docker/setup-scrypted-nvr-volume.sh new file mode 100644 index 000000000..4d9f577d7 --- /dev/null +++ b/install/docker/setup-scrypted-nvr-volume.sh @@ -0,0 +1,140 @@ + +if [ -z "$SERVICE_USER" ] +then + echo "Scrypted SERVICE_USER environment variable was not specified. NVR Storage can not be configured." + exit 0 +fi + +if [ "$USER" != "root" ] +then + echo "$USER" + echo "This script must be run as sudo or root." + exit 1 +fi + +USER_HOME=$(eval echo ~$SERVICE_USER) +SCRYPTED_HOME=$USER_HOME/.scrypted +DOCKER_COMPOSE_YML=$SCRYPTED_HOME/docker-compose.yml + +if [ ! -f "$DOCKER_COMPOSE_YML" ] +then + echo "$DOCKER_COMPOSE_YML not found. Install Scrypted first." + exit 1 +fi + +NVR_MOUNT_LINE=$(cat "$DOCKER_COMPOSE_YML" | grep :/nvr) +if [ -z "$NVR_MOUNT_LINE" ] +then + echo "Unexpected contents in $DOCKER_COMPOSE_YML. Rerun the Scrypted docker compose installer." + exit 1 +fi + +function backup() { + BACKUP_FILE="$1".scrypted-bak + if [ ! -f "$BACKUP_FILE" ] + then + cp "$1" "$BACKUP_FILE" + fi +} + +backup "$DOCKER_COMPOSE_YML" + +function readyn() { + while true; do + read -p "$1 (y/n) " yn + case $yn in + [Yy]* ) break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no. (y/n)";; + esac + done +} + +if [ -z "$1" ] +then + lsblk + echo "" + echo "Please run the script with an existing mount path or the 'disk' device to format (e.g. sdx)." + exit 1 +fi + +function stopscrypted() { + cd "$SCRYPTED_HOME" + echo "" + echo "Stopping the Scrypted container. If there are any errors during disk setup, Scrypted will need to be manually restarted with:" + echo "cd $SCRYPTED_HOME && docker compose up -d" + echo "" + docker compose down +} + +BLOCK_DEVICE="/dev/$1" +if [ -b "$BLOCK_DEVICE" ] +then + readyn "Format $BLOCK_DEVICE?" + if [ "$yn" == "n" ] + then + exit 1 + fi + + stopscrypted + + umount "$BLOCK_DEVICE"1 2> /dev/null + umount "$BLOCK_DEVICE"2 2> /dev/null + umount /mnt/scrypted-nvr 2> /dev/null + + set -e + parted "$BLOCK_DEVICE" --script mklabel gpt + parted -a optimal "$BLOCK_DEVICE" mkpart scrypted-nvr "0%" "100%" + set +e + + sync + mkfs -F -t ext4 "$BLOCK_DEVICE"1 + sync + + # parse/evaluate blkid line as env vars + for attr in $(blkid | grep "$BLOCK_DEVICE") + do + e=$(echo $attr | grep =) + if [ ! -z "$e" ] + then + export "$e" + fi + done + if [ -z "$UUID" ] + then + echo "Error parsing disk UUID." + exit 1 + fi + + echo "UUID: $UUID" + set -e + backup "/etc/fstab" + grep -v "scrypted-nvr" /etc/fstab > /tmp/fstab && cp /tmp/fstab /etc/fstab + # ensure newline + sed -i -e '$a\' /etc/fstab + mkdir -p /mnt/scrypted-nvr + echo "PARTLABEL=scrypted-nvr /mnt/scrypted-nvr ext4 defaults 0 0" >> /etc/fstab + mount -a + set +e + + DIR="/mnt/scrypted-nvr" +else + if [ ! -d "$1" ] + then + echo "$1 is not a valid directory." + exit 1 + fi + + stopscrypted + + DIR="$1" +fi + +ESCAPED_DIR=$(echo "$DIR" | sed s/\\//\\\\\\//g) + +set -e +sed -i s/'^.*:\/nvr'/" - $ESCAPED_DIR:\/nvr"/ "$DOCKER_COMPOSE_YML" +sed -i s/'^.*SCRYPTED_NVR_VOLUME.*$'/" - SCRYPTED_NVR_VOLUME=\/nvr"/ "$DOCKER_COMPOSE_YML" +set +e + +cd "$SCRYPTED_HOME" && docker compose up -d