Linux-Backup-Script

Aus Info-Theke
Version vom 24. Dezember 2022, 10:15 Uhr von Hamatoma (Diskussion | Beiträge) (→‎Script)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen


Zielsetzung

Erstellen eines Backups auf einem USB-Laufwerk.

Script

#! /bin/bash
CMD=$1
ARG1=$2
LABEL=usb_sams232
OPT_BTRFS="noatime,nodiratime,compress=zstd,space_cache,autodefrag,subvolid=5,subvol=/"
MOUNT_OPT="$OPT_BTRFS"
MOUNT_POINT=/media/fs.$LABEL
MARKER=.backup.$LABEL.mrk
#SOURCES="/home /opt /etc"
SOURCES="/home /opt"
STD_USER=wk
TO_DELETE="/home/$STD_USER/.cache/mozilla/firefox/5xur4v4t.default-esr/cache2 /home/$STD_USER/.cache/mozilla/firefox/i9nyukos.default-esr-1/cache2"
TO_DELETE="$TO_DELETE /home/$STD_USER/.cache/xreader/CacheStorage /home/$STD_USER/.cache/thumbnails"
TO_DELETE="$TO_DELETE /home/$STD_USER/.local/share/Trash"
HOST=rambo
RSYNC_OPTS="-auv --progress --delete"
IS_BTRFS=True

function Usage(){
  echo "Usage: BackupUsb { mount | run | init LABEL | xfce | help { init }}"
  echo "Examples:"
  echo "BackupUsb mount"
  echo "BackupUsb run"
  echo "BackupUsb help init"
  echo "BackupUsb init usb-black"

  echo "+++ $*"
}
function DeleteCache(){
  for dir in $TO_DELETE; do
    test -d $dir && rm -Rfv $dir/* 
  done
}
function Help(){
  what=$1
  case "$what" in
    init)
      HelpInit
      ;;
    *)
      Usage
      ;;
  esac
}
function HelpInit(){
    echo "Run:"
    echo "lsblk"
    echo "LABEL=usb-blue"
    echo "DEV=/dev/sdc3"
    echo "mkfs.btrfs -L \$LABEL \$DEV"
    echo "tune2fs –L \$LABEL \$DEV"
    echo "btrfs filesystem label \$DEV \$LABEL"
    echo "BackupUsb init \$LABEL"
}

function Mount(){
  local mark=$1
  local rc=0
  test -d $MOUNT_POINT || mkdir $MOUNT_POINT
  #set -x
  local msg="$(mount | grep $LABEL)"
  if [ -n "$msg" ]; then
    echo "+++ already mounted: $msg"
  else
    mount LABEL=$LABEL -o $MOUNT_OPT $MOUNT_POINT
    mount | grep "$LABEL"
  fi
  if [ -n "$mark" ]; then
    if [ ! -e $MOUNT_POINT/$mark ]; then
      Usage "not a backup drive. Use 'init' to initialize"
      rc=1
    fi
  fi
  return $rc
}

function Init(){
  local label=$1
  Mount
  if [ $? = 0 ]; then
    echo "= creating marker"
    touch $MOUNT_POINT/$MARKER
    mkdir $MOUNT_POINT/$HOST
  fi
}

function SnapshotBtrfs(){
  local name=$1
  local trgBase=$MOUNT_POINT/$HOST/snapshots/$name
  local trg=$trgBase/$(date +%Y.%m.%d)
  local src=$MOUNT_POINT/$HOST/$name
  test -d $trgBase || mkdir -p $trgBase
  if [ -d $trg ]; then
    echo "= deleting snapshot $trg"
    btrfs subvolume delete $trg 
  fi
  echo "= creating snapshot $trg"
  btrfs subvolume snapshot -r $src $trg
}

function Run(){
  Mount $MARKER
  if [ $? = 0 ]; then
    for source in $SOURCES; do
      echo "=== $source"
      local name=$(basename $source)
      trg=$MOUNT_POINT/$HOST/$name
      if [ ! -d $trg ]; then
        echo "= creating $trg..."
        if [ "$IS_BTRFS" = "True" ]; then
          btrfs sub create $trg
        else
          mkdir $trg
        fi
      fi
      if [ $IS_BTRFS = True ]; then
        SnapshotBtrfs $name
      fi
      rsync $RSYNC_OPTS $source/ $trg
    done
    umount $MOUNT_POINT
  fi
}

function Xfce(){
  local trg2=$HOME/.local/share/applications/BackupUsb.desktop
  local trg=/tmp/BackupUsb.desktop
  if [ "$(id -u)" = 0 ]; then
    Usage "don't be root!"
  else
    cat <<EOS >$trg
[Desktop Entry]
Version=1.0
Type=Application
Name=BackupUsb
Comment=
Exec=/usr/bin/sudo /usr/local/bin/local/BackupUsb run
Icon=media-removable
Path=/tmp
Terminal=true
StartupNotify=true
EOS
    desktop-file-install --dir=$HOME/.local/share/applications $trg
    echo "= Find BackupUsb in Wisker menu and put it to the desktop"
  fi
}
if [ "$CMD" != xfce -a "$(id -u)" != 0 ]; then
  Usage "Be root!"
else
  case $CMD in
  help)
    Help $ARG1
    ;;
  init)
    Init $ARG1
    ;;
  run)
    DeleteCache
    Run
    read dummy "Bitte ENTER drücken"
    ;;
  xfce)
    Xfce
    ;;
  *)
    Usage "unknown command: $CMD"
    ;;
  esac
fi