Kopia danych rsync/DVD

Przeglądając internet napotkałem się na poniższy skrypt, według mnie wart zapisania:


#!/bin/bash
# Script that informs that you did not make backup in a while.
# And it does that backup.
# It is very unlikely that it will work for you unless you make changes.
#
# Skrypt do informowania że nie zrobiło się backupu.
# I robienia tych backupów.
# Zapewne nie zadziała na Twoim systemie bez odpowiednich zmian.
#
# Author: Mirosław "Minio" Zalewski http://minio.xt.pl
# License: None
# Last modified: Wed, 05 Sep 2012 20:58:17 +0200
##########################################################################

#WM=fluxbox
WM=kwin
ZENITY_TITLE='NOTIFICATION-backup'
CONFIG_FILE="$HOME/.config/backup-notification"
RT_COLOR='#fff'
BACKUP_DIR="/mnt/backup/"

function rsync_cmd {
sudo rsync -avl --delete --backup --backup-dir "${BACKUP_DIR}/deleted-files/" \
--exclude-from "$HOME/.rsync-exclude" / "${BACKUP_DIR}/current/"
}

function genisoimage_cmd {
GENISO_PATH_LIST="$BACKUP_TMP_DIR/geniso-path-list"
echo "Tworzenie listy plików. To może potrwać chwilę..."
find "$HOME" -type f |while read file; do
ISO_PATH="$file"
REAL_PATH="$file"
ISO_PATH="${ISO_PATH//=/\=}"
# Zmień ISO_PATH tak żeby odzwierciedlało to co chcesz mieć
# na płycie.
echo "${ISO_PATH/\/home\/minio\//}=${REAL_PATH}" >> "$GENISO_PATH_LIST"
done
if [ -e "$HOME/.geniso-exclude" ]; then
echo "Usuwanie z listy niechcianych katalogów"
grep -v -f "$HOME/.geniso-exclude" "$GENISO_PATH_LIST" > "$GENISO_PATH_LIST"-excluded
mv "$GENISO_PATH_LIST"-excluded "$GENISO_PATH_LIST"
fi

echo "Generowanie obrazu ISO. To może potrwać nawet kilka minut..."
genisoimage -D -gui -o "$BACKUP_TMP_DIR/obraz.iso" -graft-points -volid "backup $(date +%d.%m.%y)" -rock -no-cache-inodes -allow-leading-dots -full-iso9660-filenames -allow-lowercase -no-iso-translate -allow-multidot -iso-level 3 -path-list "$GENISO_PATH_LIST" -new-dir-mode 0755 2>&1
}

function backup_dir {
if [ "$1" = mount ]; then
echo "Montuję $BACKUP_DIR"
sudo mount "$BACKUP_DIR"
if [ $? -eq 0 ]; then
echo "$BACKUP_DIR zamontowano poprawnie"
else
echo "Nie udało się zamontować $BACKUP_DIR"
fi
elif [ "$1" = "umount" ]; then
echo "Odmontowuję $BACKUP_DIR"
sudo umount "$BACKUP_DIR"
if [ $? -eq 0 ]; then
echo "$BACKUP_DIR odmontowano poprawnie"
else
echo "Nie udało się odmontować $BACKUP_DIR"
fi
fi
}

function cleanup {
rm -rf "$BACKUP_TMP_DIR"
}

function help_msg {
echo "$(basename $0) - program do robienia backupów"
echo "Usage: $(basename $0) [update] [rsync|dvd [force]]"
echo "pierwszy argument określa sposób backupowania, drugi może"
echo "być użyty żeby nie wyświetlać okien (praca w konsoli)"
echo "Jeśli pierwszym argumentem jest update, drugim musi być"
echo "dvd lub rsync - wtedy tylko dopisuje do listy że należy"
echo "wykonać backup określonego typu (przydatne dla crona)"
}

function wait_for_wm {
while ! ps -C "$WM" >/dev/null 2>&1 ; do
sleep 1
done
}

function remember_later {
PROTOCOL="$1"
if ! grep -q "$PROTOCOL" "$CONFIG_FILE"; then
echo "$PROTOCOL" >> "$CONFIG_FILE"
fi
}

function successfull {
sed -i -e "/$1/d" "$CONFIG_FILE"
}

# Zwraca 0 przy OK, 1 przy przypomnieniu
function zenity_print {
zenity --question --text="$1" --ok-label="Zrób teraz" --cancel-label="Przypomnij mi później" --title="$ZENITY_TITLE"
return $?
}

function backup_rsync {
if ! BACKUP_TMP_DIR=$(mktemp -d /tmp/backup-notification-XXXXX) ; then
NO_TMP_FILE_ERROR_MSG="Nie udało się utworzyć pliku tymczasowego.\nMożesz spróbować uruchomić $(basename $0) rsync force"
if [ -z "$1" ]; then
zenity --error --text "$NO_TMP_FILE_ERROR_MSG"
else
echo "$NO_TMP_FILE_ERROR_MSG"
fi
exit 1
fi
BACKUP_TMP_RSYNC_FILE="$BACKUP_TMP_DIR/rsync-file"
trap cleanup 1 2 3 6 15
if [ -z "$1" ]; then
wait_for_wm
if ! zenity_print "Powinieneś wykonać kopię zapasową przy pomocy rsync."; then
remember_later "rsync"
cleanup
exit 0
fi
#root-tail -g 800x500+300+100 --update --wordwrap -i 0.5 --frame "$BACKUP_TMP_RSYNC_FILE","$RT_COLOR" &
#ROOT_TAIL_PID=$!
konsole --profile transparent-embedded --name root-tail-konsole -e tail -f "$BACKUP_TMP_RSYNC_FILE" &
backup_dir mount >> "$BACKUP_TMP_RSYNC_FILE"
rsync_cmd >> "$BACKUP_TMP_RSYNC_FILE" 2>&1
RSYNC_RETURN_VALUE=$?

ROOT_TAIL_PID=$(ps aux |grep -i -e konsole |grep -i transparent |awk '{print $2}')
if [ $RSYNC_RETURN_VALUE -eq 0 ]; then
zenity --info --text "Kopia zapasowa wykonana pomyślnie"
successfull "rsync"
backup_dir umount >> "$BACKUP_TMP_RSYNC_FILE"
cleanup
else
zenity --error --text "Podczas tworzenia kopii zapasowej wystąpił błąd.\nWięcej informacji znajdziesz w $BACKUP_TMP_RSYNC_FILE"
remember_later "rsync"
fi
kill $ROOT_TAIL_PID
else
backup_dir mount
rsync_cmd
RSYNC_RETURN_VALUE=$?
if [ $RSYNC_RETURN_VALUE -eq 0 ]; then
successfull "rsync"
backup_dir umount
cleanup
else
remember_later "rsync"
fi
fi
}

function backup_dvd {
if ! BACKUP_TMP_DIR=$(mktemp -d ~/backup-notification-XXXXX) ; then
NO_TMP_FILE_ERROR_MSG="Nie udało się utworzyć pliku tymczasowego.\nMożesz spróbować uruchomić $(basename $0) dvd force"
if [ -z "$1" ]; then
zenity --error --text "$NO_TMP_FILE_ERROR_MSG"
else
echo "$NO_TMP_FILE_ERROR_MSG"
fi
exit 1
fi
trap cleanup 1 2 3 6 15
BACKUP_TMP_DVD_FILE="$BACKUP_TMP_DIR/dvd-file"
if [ -z "$1" ]; then
wait_for_wm
if ! zenity_print "Powinieneś wypalić płytę DVD z kopią zapasową"; then
remember_later "dvd"
cleanup
exit 0
fi
#root-tail -g 800x500+300+100 --update --wordwrap -i 0.5 --frame "$BACKUP_TMP_DVD_FILE","$RT_COLOR" &
konsole --profile transparent-embedded --name root-tail-konsole -e tail -f "$BACKUP_TMP_DVD_FILE" &
ROOT_TAIL_PID=$(ps aux |grep -i -e konsole |grep -i transparent |awk '{print $2}')
fi
# generujemy iso
genisoimage_cmd | tee "$BACKUP_TMP_DVD_FILE"
kill $ROOT_TAIL_PID

k3b "$BACKUP_TMP_DIR/obraz.iso"
successfull "dvd"
}

case $1 in
rsync) shift ; backup_rsync "$@" ;;
dvd) shift ; backup_dvd "$@" ;;
update) shift ; remember_later "$@" ;;
-h|--help) help_msg ;;
*)
if grep -q "rsync" "$CONFIG_FILE"; then
backup_rsync
fi
if grep -q "dvd" "$CONFIG_FILE"; then
backup_dvd
fi
;;
esac

Źródło: https://github.com/Minio/scripts/blob/master/backup-notification.sh

backup-notification.sh