#!/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