diff --git a/ccollect.sh b/ccollect.sh index e298326..007bca4 100755 --- a/ccollect.sh +++ b/ccollect.sh @@ -405,11 +405,11 @@ while [ "${i}" -lt "${no_sources}" ]; do done < "${TMP}" ) || _exit_err "Searching for incomplete backups failed." + # # check if maximum number of backups is reached, if so remove - # - # use grep and ls -p so we only look at directories + # count=$(cd "${c_dest}" && ls -p1 | grep "^${INTERVAL}\..*/\$" | wc -l \ | sed 's/^ *//g') || _exit_err "Counting backups failed" @@ -427,46 +427,51 @@ while [ "${i}" -lt "${no_sources}" ]; do while read to_remove; do _techo "Removing ${to_remove} ..." - rm $VVERBOSE -rf "$to_remove" + # FIXME DEBUG + echo rm $VVERBOSE -rf "$to_remove" done < "${TMP}" - ) || _exit_err " + ) || _exit_err "Problem removing old backups" fi - #last_dir=$(ls -d "${c_dest}/${INTERVAL}."?* 2>/dev/null | sort -n | tail -n 1) + # # Check for backup directory to clone from # - found_old=0 - ( - # can we use ls? or will it produce broken results? - #cd "${c_dest}" && ls -dp1 | grep "^${INTERVAL}\..*/\$" | wc -l | sed 's/^ *//g') - cd "${c_dest}" && ls -dp1 "${INTERVAL}".* > "${TMP}" - ) - while read old; do - echo "Found ${old}" - done < "${TMP}" - # - # Check for backups on other intervals, if we did not find any - # + # try our interval + set -x + last_dir="$(ls -d "${c_dest}/${INTERVAL}."?* 2>/dev/null | sort -n | tail -n 1)" + + # try other intervals, if there's none four our interval + if [ -z "${last_dir}" ]; then + _techo "Did not find existing backups for interval ${INTERVAL}." - # - # clone the old directory with hardlinks - # + # get list + : > "${TMP}" + ( cd "${backup}/intervals/" 2>/dev/null && ls >> "${TMP}" ) + ( cd "${CDEFAULTS}/intervals/" 2>/dev/null && ls >> "${TMP}" ) - destination_date=$($CDATE) - destination_dir="$c_dest/${INTERVAL}.${destination_date}.$$" - # - # FIXME: In 0.6 add search for the latest available backup! - # - last_dir=$(ls -d "$c_dest/${INTERVAL}."?* 2>/dev/null | sort -n | tail -n 1) + + # FIXME in 0.6.1: choose best source, not first one. + while read other_interval; do + last_dir="$(ls -d "${c_dest}/${other_interval}."?* 2>/dev/null | sort -n | tail -n 1)" + if [ "${last_dir}" ]; then + _techo "Using backup from ${other_interval}." + break + fi + done < "${TMP}" + fi + + # set time when we really begin to backup, not when we began to remove above + destination_date=$(${CDATE}) + destination_dir="${c_dest}/${INTERVAL}.${destination_date}.$$" # give some info - echo "Beginning to backup, this may take some time..." + _techo "Beginning to backup, this may take some time..." - echo "Creating $destination_dir ..." - mkdir $VVERBOSE "$destination_dir" || \ + echo "Creating ${destination_dir} ..." + mkdir ${VVERBOSE} "${destination_dir}" || \ _exit_err "Creating $destination_dir failed. Skipping." # @@ -493,7 +498,8 @@ while [ "${i}" -lt "${no_sources}" ]; do # set -x - rsync "$@" "$source" "$abs_destination_dir"; ret=$? + rsync "$@" "${source}" "${abs_destination_dir}"; ret=$? + # abs_last_dir="$(cd "$last_dir" && pwd -P)" # if [ -z "$abs_last_dir" ]; then # echo "Changing to the last backup directory failed. Skipping." @@ -501,18 +507,15 @@ while [ "${i}" -lt "${no_sources}" ]; do # fi # rsync_hardlink="--link-dest=$abs_last_dir" - set +x - if [ "$ret" -ne 0 ]; then - echo "Warning: rsync exited non-zero, the backup may be broken (see rsync errors)." - fi - # # remove marking here # rm -f "${abs_destination_dir}/${c_marker}" _techo "Finished backup (rsync return code: $ret)." - + if [ "$ret" -ne 0 ]; then + _techo "Warning: rsync exited non-zero, the backup may be broken (see rsync errors)." + fi # # post_exec