X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=bin%2Fbackup-script;h=fb9fee4b500f7bc0b9f1db24979d1c0197022805;hb=abf81bab512e361ddb171d36a81332c1b1fd5315;hp=5df6c6710bd58d1a803c31262785f6ca8690bad2;hpb=3bb3f03e6e8b846946713386656eb1d0c3d5b167;p=backup-script.git diff --git a/bin/backup-script b/bin/backup-script index 5df6c67..fb9fee4 100755 --- a/bin/backup-script +++ b/bin/backup-script @@ -26,15 +26,18 @@ declare -i count_ok_vanished=0 destinations="" # Default settings, can be overwritten in backup-script.conf: -conf_d="/etc/backup-script.d" +[ -d "/usr/local/etc/backup-script.d" ] \ + && conf_d="/usr/local/etc/backup-script.d" \ + || conf_d="/etc/backup-script.d" pre_exec="" post_exec="" default_source_root="/" -default_target="" +default_target="/var/backups" default_user="root" default_ssh_args_add="" default_rsync_args_add="" default_exclude_args_add="" +default_exclude_dirs_add="" default_compress=1 default_ping=1 default_local=0 @@ -50,7 +53,9 @@ Usage() { echo echo "When no is given, all defined systems are used." echo - exit 1 + echo -e $config_info + echo + exit 2 } CleanUp() { @@ -72,6 +77,7 @@ GotSignal() { CleanUp echo -n "Aborted: "; date echo + sleep 3 exit 9 } @@ -233,10 +239,21 @@ Initialize_Last_SysTarget_Snapshot() { ;; "zfs") # On ZFS, the last generation is always named "current" - [ -e "$sys_target/current" ] \ - && last="$sys_target/current" \ - || last="" - snapshot="$(echo "$sys_target/current" | cut -c2-)@$(date +%Y%m%d-%H%M%S)" + if [ -e "$sys_target/current" ]; then + last="$sys_target/current" + if [ "$(uname)" = "Linux" ]; then + date=$(LC_ALL=C stat "$1" | grep "^Modify: " \ + | cut -d':' -f2- | cut -d. -f1) + else + date=$(LC_ALL=C stat -f "%Sc" "$1") + fi + date=$(echo "$date" | sed -e's/^ //g' -e 's/[-:]//g' -e 's/ /-/g') + + else + last="" + date="$(date +%Y%m%d-%H%M%S)" + fi + snapshot="$(echo "$sys_target/current" | cut -c2-)@$date" sys_target="$sys_target/current" ;; *) @@ -246,6 +263,25 @@ Initialize_Last_SysTarget_Snapshot() { return 0 } +# Search configuration file (last one is used as default!) +for conf in \ + "/usr/local/etc/backup-script.conf" \ + "/etc/backup-script.conf" \ + "${conf_d}/backup-script.conf" \ + "/usr/local/etc/backup-script.conf" \ +; do + [ -r "$conf" ] && break +done + +# Read in configuration file +config_info="Configuration file is \"$conf\"" +if [ -r "$conf" ]; then + source "$conf" +else + config_info="${config_info} (not readable, using defaults)" +fi +config_info="${config_info},\nusing \"$conf_d\" as configuration directory." + while [ $# -gt 0 ]; do case "$1" in "-n"|"--dry-run") @@ -265,20 +301,14 @@ done trap GotSignal SIGINT echo -n "Started: "; date - -for conf in "/etc/backup-script.conf" "${conf_d}/backup-script.conf"; do - if [ -r "$conf" ]; then - echo "Reading configuration: \"$conf\" ..." - source "$conf" - fi -done +echo -e $config_info echo if [ $# -ge 1 ]; then for s in "$@"; do if [ ! -r "${conf_d}/$s" ]; then echo "$NAME: Can' read \"${conf_d}/$s\"!" - exit 1 + exit 3 fi sys="$sys ${conf_d}/$s" done @@ -293,7 +323,7 @@ if [ -e "$PIDFILE" ]; then echo echo -n "Aborted: "; date echo - exit 3 + exit 4 fi touch "$PIDFILE" 2>/dev/null if [ $? -ne 0 ]; then @@ -310,7 +340,7 @@ if [ -n "$pre_exec" ]; then echo "Error: pre-exec command failed!"; echo CleanUp echo "Aborting backup."; echo - exit 2 + exit 5 fi sleep 2 echo @@ -334,6 +364,7 @@ for f in $sys; do ssh_args_add="$default_ssh_args_add" rsync_args_add="$default_rsync_args_add" exclude_args_add="$default_exclude_args_add" + exclude_dirs_add="$default_exclude_dirs_add" compress="$default_compress" ping="$default_ping" local="$default_local" @@ -369,7 +400,26 @@ for f in $sys; do post_exec="$post_exec_saved" # Validate configuration - [ "$system" = "localhost" -o "$system" = "127.0.0.1" ] && local=1 + if [ "$system" = "localhost" -o "$system" = "127.0.0.1" ]; then + # Local system + local=1 + compress=0 + fi + + # Make sure "source" ends with a slash ("/") + case "$source" in + "*/") + ;; + "*") + source="$source/" + esac + + # Make sure "target" DOESN'T end with a slash ("/") + case "$target" in + "*/") + target=$( echo "$target" | sed -e 's/\/$//g' ) + ;; + esac [ "$system" = "$fname" ] \ && systxt="\"$system\"" \ @@ -444,7 +494,7 @@ for f in $sys; do fi echo "Created new snapshot in \"$snapshot\"." else - echo " *** Trial run, not creating new snapshot in \"$sys_target\"!" + echo " *** Trial run, not creating new snapshot in \"$snapshot\"!" fi else # No old backup found, create new subvolume @@ -487,6 +537,9 @@ for f in $sys; do cmd="$cmd --exclude=/var/cache/apt --exclude=/var/log" fi [ -n "$exclude_args_add" ] && cmd="$cmd $exclude_args_add" + for dir in $exclude_dirs_add; do + cmd="$cmd --exclude=$dir" + done [ -n "$rsync_args_add" ] && cmd="$cmd $rsync_args_add" [ "$local" -eq 0 ] \ @@ -510,8 +563,7 @@ for f in $sys; do if [ $ret -eq 20 ]; then echo "Backup of \"$system\" interrupted. Aborting ..." - CleanUp - exit 1 + GotSignal fi echo -n "End date: "; date @@ -572,10 +624,27 @@ done sync -paths=$( echo $destinations | sed -e 's/ /\n/g' | sort | uniq ) -if [ "$DRYRUN" -eq 0 -a -n "$paths" ]; then - df -h $paths - echo +if [ "$DRYRUN" -eq 0 ]; then + paths="" + paths_zfs="" + for dest in $(echo $destinations | sed -e 's/ /\n/g' | sort | uniq); do + fs=$(GetFS "$dest") + case $fs in + "zfs" ) + paths_zfs="$paths_zfs $dest" + ;; + *) + paths="$paths $dest" + esac + done + if [ -n "$paths" ]; then + df -h $paths + echo + fi + if [ -n "$paths_zfs" ]; then + zfs list $paths_zfs + echo + fi fi CleanUp @@ -592,6 +661,9 @@ echo if [ $count_started -ne $count_ok ]; then echo "-----> THERE HAVE BEEN ERRORS! <-----" echo + exit 6 +elif [ $count_all -ne $count_started ]; then + exit 7 fi # -eof-