#! /bin/sh # This file is part of BEAM # Copyright (C) 2012 Sergey Poznyakoff # # BEAM is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # BEAM is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with BEAM. If not, see . # Force C locale LC_ALL=C export LC_ALL openlog_hook= prologue_hook= epilogue_hook= # User configuration variables backup_tar_options= backup_suffix= backup_archive_dir= backup_snapshot_dir= backup_verbose= backup_logfile="/var/log/backup" error() { echo >&2 $0: $* } logit() { echo `date`: $* } abend() { ec=$1 shift error $@ exit $ec } tarcode() { case $1 in 0) logit "success";; 1) logit "some files changed while being archived";; 2) logit "fatal error occurred, but trying to continue anyway" tarerror=$((tarerror + 1));; *) logit "unexpected error code $1" tarerror=$((tarerror + 1)); esac } load_config() { local delayed_exit test -z "$BEAM_CONFIG" && BEAM_CONFIG=@SYSCONFDIR@/beam.conf if [ -r $BEAM_CONFIG ]; then . $BEAM_CONFIG else abend 1 "configuration file $BEAM_CONFIG does not exist or is unreadable" fi if [ -z "$backup_items" ]; then abend 1 "backup_items not specified" fi delayed_exit= loaded_types= for item in $backup_items do eval type=\$${item}_type if [ -z "$type" ]; then error "${item}_type not set" delayed_exit=1 continue fi if echo "$loaded_types" | grep -wq $type; then : elif [ -x $libdir/${type}.sh ]; then . $libdir/${type}.sh || delayed_exit=1 loaded_types="$loaded_files $type" else error "$libdir/${type}.sh not found" delayed_exit=1 fi ${type}_check $item || delayed_exit=1 done test -n "$delayed_exit" && abend 1 "aborting" tar_suffix=${backup_suffix:-.tar} if [ -n "$backup_bucket_name" ]; then . @LIBDIR@/beam/s3.sh prologue_hook="s3_mount $prologue_hook" fi } runhook() { local hook_list eval hook_list=\$$1 for hook in $hook_list do $hook done } print_version() { name=$(basename $0) cat < This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. EOF exit 0 } wtf() { l=`echo "${1#beam-}"|sed "s|.|.|g"` s=$(echo " " | sed "s|$l|${1#beam-}|") shift echo " $s $@" } dry_mail() { echo "=============================================================" cat - echo "=============================================================" } # mail_report FILE mail_report() { : ${backup_mailer_program:=/usr/sbin/sendmail -oi -t -F $backup_sender_email} if [ -n "$dry_run" ]; then echo "Sending mail using $backup_mailer_program" backup_mailer_program=dry_mail fi if [ -z "$backup_sender_email" ]; then backup_sender_email=root@$(hostname) fi case $backup_sender_email in "<"*) ;; *) backup_sender_email="<$backup_sender_email>" esac if [ -n "$backup_sender_personal" ]; then case $backup_sender_personal in \"*) ;; *) backup_sender_personal="\"$backup_sender_personal\"" esac backup_sender_personal="$backup_sender_personal " fi if [ -z "$backup_report_subject" ]; then backup_report_subject="Backup of $(hostname) on $(date)" fi test -n "$backup_report_signature" && echo "$backup_report_signature" >> $report (cat - < $conf <