diff options
-rwxr-xr-x | backup.sh | 113 |
1 files changed, 78 insertions, 35 deletions
@@ -1,15 +1,58 @@ #!/bin/bash #set -x +# get path to all needed tools +# /bin +cp=$(which cp) +date=$(which date) +echo=$(which echo) +grep=$(which grep) +mktemp=$(which mktemp) +mv=$(which mv) +pwd=$(which pwd) +rm=$(which rm) +sed=$(which sed) +tar=$(which tar) +umount=$(which umount) +# /usr/bin +cut=$(which cut) +dirname=$(which dirname) +expr=$(which expr) +head=$(which head) +nice=$(which nice) +rsync=$(which rsync) +seq=$(which seq) +ssh=$(which ssh) +sshfs=$(which sshfs) +tail=$(which tail) + +# check if all needed tools are installed (only the ones not installed under /bin/) +alltoolsinstalled="yes" +test "$cut" = "" && echo "'cut' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$dirname" = "" && echo "'dirname' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$expr" = "" && echo "'expr' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$head" = "" && echo "'head' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$nice" = "" && echo "'nice' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$rsync" = "" && echo "'rsync' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$seq" = "" && echo "'sed' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$ssh" = "" && echo "'ssh' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$sshfs" = "" && echo "'sshfs' not installed or not found by 'which'" && alltoolsinstalled="no" +test "$tail" = "" && echo "'tail' not installed or not found by 'which'" && alltoolsinstalled="no" + +if [ "$alltoolsinstalled" = "no" ] +then + exit 1 +fi + # main configuration -script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +script_dir="$( cd "$( $dirname "${BASH_SOURCE[0]}" )" && $pwd )" config_file="$script_dir/main.cfg" # timestamps yyyy-mm-dd and unixtime for calculating -backup_stamp=$(date +%F) -backup_time=$(date -d$backup_stamp +%s) +backup_stamp=$($date +%F) +backup_time=$($date -d$backup_stamp +%s) # check if it is the first of the month to do monthly backups backup_month="no" -if [ "$(echo $backup_stamp | cut -d- -f3)" = "01" ] +if [ "$($echo $backup_stamp | $cut -d- -f3)" = "01" ] then backup_month="yes" fi @@ -21,14 +64,14 @@ function source_section { section_start="^\[$section_name\]$" section_end="^\[/$section_name\]$" - line_start=$(grep -n "$section_start" "$config_name" | cut -d: -f1) - line_end=$(expr $(grep -n "$section_end" "$config_name" | cut -d: -f1) - 1) - line_diff=$(expr $line_end - $line_start) + line_start=$($grep -n "$section_start" "$config_name" | $cut -d: -f1) + line_end=$($expr $($grep -n "$section_end" "$config_name" | $cut -d: -f1) - 1) + line_diff=$($expr $line_end - $line_start) - tmp_file=$(mktemp) - head -n $line_end "$config_name" | tail -n $line_diff > "$tmp_file" + tmp_file=$($mktemp) + $head -n $line_end "$config_name" | $tail -n $line_diff > "$tmp_file" source "$tmp_file" - rm -f "$tmp_file" + $rm -f "$tmp_file" } # copy file with rsync to server and save last timestamp to logfile @@ -38,19 +81,19 @@ function rsync_server { logfileentry="$3" #nice -n 19 rsync -rle "ssh -i $keyfile" "$filefrom" "$userserver:$dirto" # limit the bandwith - nice -n 19 rsync --bwlimit=100000 -rle "ssh -i $keyfile" "$filefrom" "$userserver:$dirto" + $nice -n 19 $rsync --bwlimit=100000 -rle "$ssh -i $keyfile" "$filefrom" "$userserver:$dirto" ret=$? if [ $ret -ne 0 ] then - echo "problem in rsync: $filefrom" + $echo "problem in rsync: $filefrom" fi - echo "$filefrom" | grep ".month." > /dev/null 2>&1 + $echo "$filefrom" | $grep ".month." > /dev/null 2>&1 ret2=$? # on monthly backups and connection errors there should be no update of logfile if [ $ret2 -ne 0 -a $ret -eq 0 ] then - sed -e "s/^$logfileentry .*$/${logfileentry} $backup_time/" "$logfile" > "$logfile.tmp" - mv -f "$logfile.tmp" "$logfile" + $sed -e "s/^$logfileentry .*$/${logfileentry} $backup_time/" "$logfile" > "$logfile.tmp" + $mv -f "$logfile.tmp" "$logfile" fi } @@ -77,19 +120,19 @@ do # section for specified folder source_section "$config_act" "$dir_single" # rotate is done through days, so we have to know the interval in sections - rotate_stamp=$(expr $time \* 24 \* 60 \* 60) + rotate_stamp=$($expr $time \* 24 \* 60 \* 60) # for new configurations that does not have a last timestamp we create a zero one - grep "^${config_single}_$dir_single " $logfile > /dev/null 2>&1 + $grep "^${config_single}_$dir_single " $logfile > /dev/null 2>&1 if [ $? -ne 0 ] then - echo "${config_single}_$dir_single 0" >> $logfile + $echo "${config_single}_$dir_single 0" >> $logfile fi # add /. to directory for also backing up softlinks dir_single_soft_link_path="$dir_single/." # get the stamp for the last backup - last_stamp=$(grep "^${config_single}_$dir_single " $logfile | cut -d" " -f2) + last_stamp=$($grep "^${config_single}_$dir_single " $logfile | $cut -d" " -f2) # get the stamp for the next backup - now_stamp=$(expr $last_stamp + $rotate_stamp) + now_stamp=$($expr $last_stamp + $rotate_stamp) do_backup="no" do_monthly="no" do_normal="no" @@ -114,17 +157,17 @@ do if [ "$rotate" = "inc" ] then # tar is not able to handle unix-timestamps, so we calculate the required one - tar_stamp=$(date -d "1970-01-01 $last_stamp sec" +%F) + tar_stamp=$($date -d "1970-01-01 $last_stamp sec" +%F) # only changed files since last modification in backup if [ -f "$dir_single_soft_link_path/backup.ignore" ] then - nice -n 19 tar czf "$dir_single.$backup_stamp.tar.gz" --warning=none --exclude-from="$dir_single_soft_link_path/backup.ignore" -N "$tar_stamp" "$dir_single_soft_link_path" + $nice -n 19 $tar czf "$dir_single.$backup_stamp.tar.gz" --warning=none --exclude-from="$dir_single_soft_link_path/backup.ignore" -N "$tar_stamp" "$dir_single_soft_link_path" else - nice -n 19 tar czf "$dir_single.$backup_stamp.tar.gz" --warning=none -N "$tar_stamp" "$dir_single_soft_link_path" + $nice -n 19 $tar czf "$dir_single.$backup_stamp.tar.gz" --warning=none -N "$tar_stamp" "$dir_single_soft_link_path" fi rsync_server "$dir_single.$backup_stamp.tar.gz" "$backupdir/$backupdirsingle/" "${config_single}_$dir_single" # delete backups from local - rm -f "$dir_single.$backup_stamp.tar.gz" + $rm -f "$dir_single.$backup_stamp.tar.gz" fi # if [ "$rotate" = "inc" ] # we want a full backup if [ "$do_monthly" = "yes" -o "$do_normal" = "yes" ] @@ -132,29 +175,29 @@ do # backup everything if [ -f "$dir_single_soft_link_path/backup.ignore" ] then - nice -n 19 tar czf "$dir_single.tar.gz" --warning=none --exclude-from="$dir_single_soft_link_path/backup.ignore" "$dir_single_soft_link_path" + $nice -n 19 $tar czf "$dir_single.tar.gz" --warning=none --exclude-from="$dir_single_soft_link_path/backup.ignore" "$dir_single_soft_link_path" else - nice -n 19 tar czf "$dir_single.tar.gz" --warning=none "$dir_single_soft_link_path" + $nice -n 19 $tar czf "$dir_single.tar.gz" --warning=none "$dir_single_soft_link_path" fi # check wether we should rotate if [ "$rotate" != "inc" -a "$do_normal" = "yes" ] then # mount for renaming - sshfs $userserver:$backupdir $backupdir_local -o IdentityFile=$keyfile -o IdentitiesOnly=yes + $sshfs $userserver:$backupdir $backupdir_local -o IdentityFile=$keyfile -o IdentitiesOnly=yes # rotate old backups for count in `seq $rotate -1 2` do count_last=$(expr $count - 1) - rm -f "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.$count" - mv -f "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.$count_last" "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.$count" > /dev/null 2>&1 + $rm -f "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.$count" + $mv -f "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.$count_last" "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.$count" > /dev/null 2>&1 done - rm -f "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.1" - mv -f "$backupdir_local/$backupdirsingle/$dir_single.tar.gz" "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.1" > /dev/null 2>&1 + $rm -f "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.1" + $mv -f "$backupdir_local/$backupdirsingle/$dir_single.tar.gz" "$backupdir_local/$backupdirsingle/$dir_single.tar.gz.1" > /dev/null 2>&1 # unmount - umount $backupdir_local + $umount $backupdir_local fi # if [ "$rotate" != "inc" -a "$do_normal" = "yes" ] # copy new backups @@ -165,12 +208,12 @@ do if [ "$do_monthly" = "yes" ] then #TODO: check why move sometimes causes problems - nice -n 19 cp "$dir_single.tar.gz" "$dir_single.$backup_stamp.month.tar.gz" + $nice -n 19 $cp "$dir_single.tar.gz" "$dir_single.$backup_stamp.month.tar.gz" rsync_server "$dir_single.$backup_stamp.month.tar.gz" "$backupdir/$backupdirsingle/" "${config_single}_$dir_single" fi # delete backups from local - rm -f "$dir_single.$backup_stamp.month.tar.gz" - rm -f "$dir_single.tar.gz" + $rm -f "$dir_single.$backup_stamp.month.tar.gz" + $rm -f "$dir_single.tar.gz" fi # if [ "$do_monthly" = "yes" -o "$do_normal" = "yes" ] fi # if [ "$do_backup" = "yes" ] fi # if [ -e "$dir_single" ] |