#!/bin/sh ## # Wilfredo Sanchez # Andew Nesbitt # # Performs backups on a backup server. ## . "$(dirname "$0")/common.sh"; server_load_config; # Determine client host name from inbound IP address. client="$( \ host "$(echo "${SSH_CLIENT}" | awk '{print $1}')" \ | sed 's|.*.in-addr.arpa domain name pointer \(.*\)\.|\1|' \ )"; # ${client} should be a host name, not empty. if [ -z "${client}" ]; then error "ERROR: No backup client identified."; exit 1; fi; # Check that the client is registered. registered="false"; for registered_client in $(list_clients); do if [ "${client}" == "${registered_client}" ]; then registered="true"; break; fi; done; if ! "${registered}"; then error "Client is not registered for backup service: ${client}"; exit 1; fi; ## # Start backup ## today="$(date +%A)"; # eg. Wednesday yesterday="$(date -v-1d +%A)"; # eg. Tuesday date="$(date "+%Y.%m.%d")"; # eg. 2007.10.10 lockfile="$(client_backup_lock_file "${client}")"; pidfile="$(client_backup_pid_file "${client}")"; client_backup_root="$(client_backup_root "${client}")"; yesterday_backup_dir="${client_backup_root}/${yesterday}"; today_backup_dir="${client_backup_root}/${today}"; weekly_backup_file="${client_backup_root}/Weekly-${date}.tgz"; while lockfile -r 1 -! "${lockfile}" 2>/dev/null; do pid="$(cat "${pidfile}" 2>/dev/null)"; if [ -n "${pid}" ]; then if ! kill -0 "${pid}" >/dev/null 2>&1; then error "Removing stale lock for PID: ${pid}"; rm -f "${lockfile}" "${pidfile}"; else error "Backup is already running (PID=$(cat "${pidfile}")) for client ${client}."; exit 1; fi; fi; done; echo "$$" > "${pidfile}"; backup_log_file="$(client_backup_log_file "${client}")"; log_start="$(date) - Starting daily back up for ${today}"; echo "${log_start}" >> "${backup_log_file}"; # # Note: rsync server output goes to the client channel; don't try to # redirect it to the log file, etc. # sudo rsync \ --server \ --archive \ --extended-attributes \ --delete \ --delete-excluded \ --delete-after \ --force \ --ignore-errors \ --link-dest="${yesterday_backup_dir}" \ . "${today_backup_dir}/"; exec >> "${backup_log_file}" 2>&1; echo "$(date) - Completed daily back up for ${today}"; if [ "${today}" == "Sunday" ]; then sudo tar --create --gzip --directory "${today_backup_dir}" --file "${weekly_backup_file}" .; echo "$(date) - Weekly back up for ${date}"; fi; if [ -n "${backup_email_to}" ]; then grep -A 1000 "${log_start}" "${backup_log_file}" \ | printf "From: %s\nReply-To: %s\nSubject: %s\n\n%s" \ "\"Backup Subsystem on $(hostname)\" <${backup_email_from}>" \ "${backup_email_reply_to}" \ "${client} backup report for ${today}" \ "$(cat -)" \ | sendmail "${backup_email_to}"; fi; rm -f "${backup_log_file}" "${pidfile}";