#!/bin/bash # shellcheck source=kz-common.sh ############################################################################### # Back-up maken. # # Geschreven door Karel Zimmer . ############################################################################### PROGRAM_PATH=$(realpath "$(dirname "$0")") readonly PROGRAM_PATH source "$PROGRAM_PATH"/kz-common.sh readonly PROGRAM_NAME='kz-backup' readonly DISPLAY_NAME=${PROGRAM_NAME/kz-/kz } readonly RELEASE_YEAR=2007 ############################################################################### # Global constants ############################################################################### readonly OPTIONS_SHORT=$OPTIONS_SHORT_COMMON'gt:' readonly OPTIONS_LONG=$OPTIONS_LONG_COMMON',delete,dry-run,gui,target:' readonly USAGE="Gebruik: $DISPLAY_NAME [--delete] [--dry-run] [-g|--gui] \ [-t|--target=DOELMAP] $OPTIONS_USAGE_COMMON" readonly HELP="Gebruik: $DISPLAY_NAME [OPTIE...] Back-up maken. Opties: --delete uit de Persoonlijke map verwijderde bestanden ook uit de back-up verwijderen (standaard bij optie -g, --gui) --dry-run een proefrun uitvoeren zonder wijzigingen aan te brengen -g, --gui start in grafische modus -t, --target=DOELMAP plaats back-up in de DOELMAP $OPTIONS_HELP_COMMON" readonly SOURCE=$HOME MEDIUM=$(ls --directory /media/"$USER"/* 2> /dev/null) readonly MEDIUM ############################################################################### # Global variables ############################################################################### declare OPTION_DELETE='' declare OPTION_DRY_RUN='' declare OPTION_GUI=false declare OPTION_TARGET=false declare TARGET_ARGUMENT='' declare TARGET_MEDIUM='' declare TARGET='' ############################################################################### # Functions ############################################################################### function check_input { local -i getopt_rc=0 local parsed='' parsed=$( getopt --alternative \ --options "$OPTIONS_SHORT" \ --longoptions "$OPTIONS_LONG" \ --name "$DISPLAY_NAME" \ -- "$@" ) || getopt_rc=$? if [[ $getopt_rc -ne $SUCCESS ]]; then process_usage NOERROR=true exit $ERROR fi eval set -- "$parsed" process_common_options "$@" while true; do case $1 in -g|--gui) OPTION_GUI=true reset_terminal_attributes shift ;; --delete) OPTION_DELETE='--delete' shift ;; --dry-run) OPTION_DRY_RUN='--dry-run' shift ;; -t|--target) OPTION_TARGET=true TARGET_ARGUMENT=$2 shift 2 ;; --) shift break ;; *) shift ;; esac done if [[ "$*" ]]; then info 'Geen argumenten toegestaan.' process_usage NOERROR=true exit $ERROR fi check_user_root } function process_input { if $OPTION_TARGET; then if ! [[ -d $TARGET_ARGUMENT ]]; then info "Map $TARGET_ARGUMENT bestaat niet." process_usage NOERROR=true exit $ERROR fi TARGET=$TARGET_ARGUMENT/backup-$HOSTNAME-$USER TARGET_MEDIUM=$TARGET_ARGUMENT else TARGET=$MEDIUM/backup-$HOSTNAME-$USER if [[ -z $MEDIUM ]]; then error 'Geen USB-medium gevonden. Koppel een USB-medium aan, en start daarna opnieuw.' NOERROR=true exit $ERROR elif [[ $(printf '%s\n' "$MEDIUM" | wc --lines) -gt 1 ]]; then error "Koppel slechts één USB-medium aan. Nu aangekoppeld zijn: $MEDIUM Koppel media af via Bestanden, en start daarna opnieuw." NOERROR=true exit $ERROR fi TARGET_MEDIUM=$MEDIUM fi check_on_ac_power create_backup } function create_backup { local exclude='' local temp_log='' local -i rsync_rc=0 exclude=$(mktemp -t 'kz-backup-XXXXXXXXXX') # Backup solution Déjà Dup exclude these files by default. cat << EOF > "$exclude" .adobe/Flash_Player/AssetCache .cache .ccache .gvfs .Private .recent-applications.xbel .recently-used.xbel snap/*/*/.cache .steam/root .thumbnails .var/app/*/cache .xsession-errors EOF TITLE='Back-up maken' TEXT='Backup voorbereiden (dit kan even duren)' if $OPTION_GUI; then rsync --archive \ --verbose \ --delete \ --exclude-from="$exclude" \ --delete-excluded \ "$SOURCE"/ \ "$TARGET" \ 2> >($LOGCMD) | sed --expression='s/^/#/' | zenity --progress \ --auto-close \ --no-cancel \ --pulsate \ --width 600 \ --height 50 \ --title "$TITLE" \ --text "$TEXT" 2> >($LOGCMD) || rsync_rc=$? else info "$TEXT..." rsync --archive \ --verbose \ --human-readable \ $OPTION_DRY_RUN \ $OPTION_DELETE \ --exclude-from="$exclude" \ "$SOURCE"/ \ "$TARGET" 2> >($LOGCMD) || rsync_rc=$? fi rm "$exclude" case $rsync_rc in 0) return $SUCCESS ;; *) error "Back-up maken is geëindigd met fouten. Mogelijk zijn enkele bestanden niet leesbaar, of zijn er bestanden verwijderd of toegevoegd tijdens het maken van de back-up, of is er te weinig ruimte op $TARGET." NOERROR=true exit $ERROR ;; esac } function term_script { local dev='' local -i rc=0 TEXT='Gegevens uit tijdelijk geheugen wegschrijven (dit kan even duren)' if $OPTION_GUI; then sync | zenity --progress \ --pulsate \ --auto-close \ --no-cancel \ --width 600 \ --height 50 \ --title "$TITLE" \ --text "$TEXT" 2> >($LOGCMD) || rc+=$? else info " $TEXT..." sync |& $LOGCMD || rc+=$? fi TEXT='' if [[ $TARGET_MEDIUM == /media/* ]]; then TEXT='Het USB-medium afkoppelen' dev='/dev/'$( lsblk --ascii | grep --before-context=1 \ "$TARGET_MEDIUM" | head -1 | cut --delimiter='-' \ --fields=2 | cut --delimiter=' ' \ --fields=1 ) if $OPTION_GUI; then umount "$TARGET_MEDIUM"; \ udisksctl lock --block-device "$dev"; \ udisksctl power-off --block-device "$dev" | zenity --progress \ --pulsate \ --auto-close \ --no-cancel \ --width 600 \ --height 50 \ --title "$TITLE" \ --text "$TEXT" 2> >($LOGCMD) || rc+=$? else info "$TEXT..." umount "$TARGET_MEDIUM" |& $LOGCMD || rc+=$? udisksctl lock --block-device "$dev" |& $LOGCMD || rc+=$? udisksctl power-off --block-device "$dev" |& $LOGCMD || rc+=$? fi if [[ $rc -eq $SUCCESS ]]; then info " De back-up is gemaakt. Het USB-medium kan verwijderd worden." else warning " De back-up is gemaakt. Koppel zelf (veilig!) het USB-medium af." fi fi exit $SUCCESS } ############################################################################### # Script ############################################################################### function main { init_script "$@" check_input "$@" process_input term_script } main "$@"