#!/usr/bin/env bash # used to work around cases where stdin is unavailable or not a terminal if bash -c ': > /dev/tty' > /dev/null 2>&1; then TTY_OR_CONSOLE="/dev/tty" else TTY_OR_CONSOLE="/dev/console" fi function yesno { unset DISCARD_ME while [ -z "$DISCARD_ME" ]; do read -p "[y/n] " -n1 DISCARD_ME < $TTY_OR_CONSOLE case "$DISCARD_ME" in y) echo "" return 0 ;; n) echo "" return 1 ;; *) echo " Please enter y for yes or n for no." unset DISCARD_ME ;; esac done } # cutting off the leading slash allows us to just ignore empty lines below readarray -t MOUNT_LIST <<< "$(findmnt --output TARGET --noheadings --raw | sed -e 's|^/||' | sort)" # always ignore /tmp and the package cache EXCLUDE_LIST=("tmp" "var/cache/xbps") for I in ${!MOUNT_LIST[@]}; do if [ ! -z "${MOUNT_LIST[$I]}" ]; then FOUND=0 for J in ${!EXCLUDE_LIST[@]}; do if grep "${EXCLUDE_LIST[$J]}" > /dev/null <<< "${MOUNT_LIST[$I]}"; then FOUND=1 break fi done # if no parent dir of ${MOUNT_LIST[$I]} is found in $EXCLUDE_LIST if [ $FOUND -eq 0 ]; then EXCLUDE_LIST+=("${MOUNT_LIST[$I]}") fi fi done touch /run/void-usb/system-image-excludes touch /run/void-usb/system-image-pseudo for I in ${!EXCLUDE_LIST[@]}; do echo "/${EXCLUDE_LIST[$I]}" >> /run/void-usb/system-image-excludes FILE_PERMS="$(stat -c '%a %u %g' "${EXCLUDE_LIST[$I]}")" echo "\"/${EXCLUDE_LIST[$I]}\" d $FILE_PERMS" >> /run/void-usb/system-image-pseudo done #TODO: refuse to run if system is running #TODO: add a way to force a new system image up without asking (for example a file in /run/void-usb) #TODO: colors (bright white / light gray for readability) echo "Create a new system image? This will replace the existing system image with a snapshot of the currently running system. Choosing no here will discard any newly installed programs, updates, system configuration changes, etc. This should not affect your files in /home as they are stored to disk directly. Check /TODO/README.txt for more information. Creating a new system image will take some time. " if yesno; then echo "Building image..." mksquashfs / /run/void-usb/container/new_squashfs.img -b 1M -comp xz -progress -noappend -pf /run/void-usb/system-image-pseudo -ef /run/void-usb/system-image-excludes #TODO: check if enough disk space # yes -> create new image next to old image # no -> create new image in RAM #TODO: figure out when appending to existing squashfs is a good idea mv /run/void-usb/container/new_squashfs.img /run/void-usb/container/squashfs.img else echo "Discarding system changes." fi