#!/bin/bash # ================================================================================ # # UPDATE REPAIR USB STICK # # -------------------------------------------------------------------------------- # 2024-10-27 www.axel-hahn.de v1.0 # ================================================================================ cd "$( dirname "$0" )" || exit 1 . vendor/color.class.sh || exit 1 FILE_LAST_SYNC=logs/last_sync2usb FILE_SKIP_SYNC=logs/last_sync2usb_skip SYNC_TARGET= typeset -i iAge=0 typeset -i iAgeH=0 typeset -i iAgeD=0 # ---------------------------------------------------------------------- # FUNCTIONS # ---------------------------------------------------------------------- function pageheader(){ clear color.fg yellow cat << EOH _________________________________________________________________________ ____/ Create/ Update Repair System ____ _________________________________________________________________________/ EOH color.reset } function initializeUsbStick(){ cat << EO_WELCOME WELCOME! This is a helper to create a repair system on a USB stick. With the repair system you can connect the backup repository if your system crashed and you have no local data anymore. 💡 Hint: This is highly recommended if you have no system backup as image that can restore a complete system. EO_WELCOME color.print green "Do you have a system backup as image? [y/N] " read -r answer if [ "$answer" = "y" ]; then echo "OK, I won't disturb you again." echo "Creating [$FILE_SKIP_SYNC] ..." date > "$FILE_SKIP_SYNC" echo "Bye." exit 0 fi pageheader } # get age of a given file and fill global vars # iAge # iAgeH # iAgeD # param string filename function getAge(){ local tsfile; typeset -i tsfile=0 test -r "$1" && tsfile=$( date +%s -r "$1" ) iAge=$( date +%s )-$tsfile iAgeH=$iAge/60/60 iAgeD=$iAge/60/60/24 } function showAge(){ getAge "$1" if [ $iAgeD -gt 10000 ]; then echo "NEVER" else test $iAgeD -gt 0 && echo -n "$iAgeD days" test $iAgeD -eq 0 && test $iAgeH -gt 0 && echo -n "$iAgeH h" test $iAgeD -eq 0 && test $iAgeH -eq 0 && echo -n "$iAge s" echo " ago" fi } function _showUsbdrives(){ local out; out="$( df -H | grep media)" grep -q "." <<< "$out" && (df -H | head -1; echo "$out") } function _getSyncdir(){ SYNC_TARGET="$( cat "$FILE_LAST_SYNC" 2>/dev/null | grep '^SYNC_TARGET=' | cut -f 2 -d '=' )" } # ---------------------------------------------------------------------- # MAIN # ---------------------------------------------------------------------- pageheader # ---------------------------------------------------------------------- if [ -f "$FILE_SKIP_SYNC" ]; then echo "Found the skip file [$FILE_SKIP_SYNC]." echo "The sync to USB will be skipped." exit 0 fi # ---------------------------------------------------------------------- if [ ! -f "$FILE_LAST_SYNC" ]; then initializeUsbStick else echo -n "--- Last sync: " showAge "$FILE_LAST_SYNC" ls -l "$FILE_LAST_SYNC" 2>/dev/null echo fi # ---------------------------------------------------------------------- drivelist="$( _showUsbdrives )" color.fg green test -z "$drivelist" && color.fg red cat <<USB ___ | | |___| /_____\\ | | | USB | | _ | |_/=\_| USB color.reset if [ -z "$drivelist" ]; then color.echo red " ERROR: No USB drive found." echo " Plug in your recovery usb stick and mount it before trying again." echo " Onto the stick the backup client directory will be copied." echo " You don't lose any data that are already there." echo exit 1 else echo " USB drive found." echo fi # ---------------------------------------------------------------------- _getSyncdir if [ -z "$SYNC_TARGET" ]; then echo "I expect that you added a usb drive where to sync the backup client." echo " Onto the stick the backup client directory will be copied." echo " You don't lose any data that are already there." echo echo "Select a target path (column Mounted on)" echo echo "$drivelist" | sed "s,^, ,g" echo color.print green "Enter target path: " read -r mypath if [ -z "$mypath" ]; then color.echo red "No target path given. Exiting." exit 1 fi if [ ! -d "$mypath" ]; then color.echo red "Target path [$mypath] does not exist. Exiting." exit 1 fi subdir="$( hostname -f )__user__${USER}" SYNC_TARGET="$mypath/$subdir" echo " Sync target: $SYNC_TARGET" echo color.print green "Please confirm - store the backup client in this path? [y/N] " read -r store if [ "$store" != "y" ] && [ "$store" != "Y" ]; then color.echo red "Target was not confirmeed. Aborting." exit 1 fi mkdir -p "$SYNC_TARGET" pageheader fi # ---------------------------------------------------------------------- if [ ! -d "$SYNC_TARGET" ]; then color.echo red "Target path does not exist." echo echo "Content of $( dirname "$SYNC_TARGET" )" ls -l "$( dirname "$SYNC_TARGET" )" echo color.print green "Create subdir <$( basename "$SYNC_TARGET")> here? [y/N] " read -r answer if [ "$answer" != "y" ] && [ "$answer" != "Y" ]; then echo "Bye." exit 1 fi mkdir -p "$SYNC_TARGET" || exit 2 fi # ---------------------------------------------------------------------- echo "--- Syncing to USB stick [$SYNC_TARGET] ..." if rsync -ra --delete . "$SYNC_TARGET" ; then color.echo green "OK" echo "SYNC_TARGET=$SYNC_TARGET" > "$FILE_LAST_SYNC" echo echo "The sync was successful." echo "Unmount your USB stick and put it to a safe place." echo else color.echo red "FAILED :-/" echo "Check the errors above. Then try again." echo exit 1 fi exit 0 # ----------------------------------------------------------------------