From 22cddd5c61d150584a065c1a5e6963e8e95a43cb Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Wed, 19 Mar 2014 05:44:16 +0000 Subject: Use uniform indentation, add missing copyleft headers, update years. --- diff --git a/Make.rules b/Make.rules index 186de06..cafa879 100644 --- a/Make.rules +++ b/Make.rules @@ -1,5 +1,5 @@ # This file is part of BEAM -# Copyright (C) 2012 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 diff --git a/Makefile.am b/Makefile.am index c65a39d..551f7b2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ # This file is part of BEAM -# Copyright (C) 2012 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 diff --git a/NEWS b/NEWS index 7ef3571..1671079 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,5 @@ -BEAM NEWS -- history of user-visible changes. 2013-08-05 -Copyright (C) 2012, 2013 Sergey Poznyakoff. +BEAM NEWS -- history of user-visible changes. 2014-03-19 +Copyright (C) 2012-2014 Sergey Poznyakoff. See the end of file for copying conditions. Please send mailutils bug reports to . @@ -44,7 +44,7 @@ First release. ---------------------------------------------------------------------- Copyright information: -Copyright (C) 2012, 2013 Sergey Poznyakoff. +Copyright (C) 2012-2014 Sergey Poznyakoff. Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the diff --git a/README b/README index c407c0a..9e7410c 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ BEAM README file. -Copyright (C) 2012 Sergey Poznyakoff +Copyright (C) 2012-2014 Sergey Poznyakoff See the end of file for copying conditions. * Introduction @@ -112,7 +112,7 @@ Send bug reports to . * Copyright information: -Copyright (C) 2012 Sergey Poznyakoff +Copyright (C) 2012-2014 Sergey Poznyakoff Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that diff --git a/backup.in b/backup.in index ca479b1..477b839 100644 --- a/backup.in +++ b/backup.in @@ -1,6 +1,6 @@ #! /bin/sh # This file is part of BEAM -# Copyright (C) 2012 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 @@ -23,8 +23,8 @@ ts=`date +%Y%m%d`; week=`date +%U` if [ "$1" = "--wtf" ]; then - wtf $(basename $0) create a backup - exit 0 + wtf $(basename $0) create a backup + exit 0 fi load_config @@ -36,9 +36,9 @@ taroptions="-c -Hpax $backup_tar_options $backup_rsh_command" # Set it to "-v" to make script verbose if [ -n "$backup_verbose" ]; then - verbose=-v + verbose=-v else - verbose= + verbose= fi # Set it to "echo" to initiate dry-run mode. unset dry_run @@ -54,7 +54,7 @@ round=0 ########################################################### help() { - cat < EOF - exit 0 + exit 0 } ########################################################### @@ -80,63 +80,63 @@ EOF while [ $# -ne 0 ] do - case $1 in - -v|--verbose) verbose="$verbose -v";; - -l|--logfile) shift; backup_logfile=$1;; - -n|--dry-run) dry_run=echo; backup_logfile=;; - -N|--no-logfile) backup_logfile=;; - -h|--help) help;; - -V|--version) print_version;; - -L|--level) shift; level=$1;; - -R|--round) shift; round=$1;; - --week) shift; week=$1;; - *) echo >&2 "$0: unrecognized option $1"; exit 1;; - esac - shift + case $1 in + -v|--verbose) verbose="$verbose -v";; + -l|--logfile) shift; backup_logfile=$1;; + -n|--dry-run) dry_run=echo; backup_logfile=;; + -N|--no-logfile) backup_logfile=;; + -h|--help) help;; + -V|--version) print_version;; + -L|--level) shift; level=$1;; + -R|--round) shift; round=$1;; + --week) shift; week=$1;; + *) echo >&2 "$0: unrecognized option $1"; exit 1;; + esac + shift done backup() { - logit "started" - - runhook prologue_hook - trap "runhook epilogue_hook" EXIT INT QUIT TERM - - if test -n "$backup_retain_interval" && - test $backup_retain_interval -gt 0; then - @LIBEXECDIR@/beam-cleaner --retain $backup_retain_interval $verbose \ + logit "started" + + runhook prologue_hook + trap "runhook epilogue_hook" EXIT INT QUIT TERM + + if test -n "$backup_retain_interval" && + test $backup_retain_interval -gt 0; then + @LIBEXECDIR@/beam-cleaner --retain $backup_retain_interval $verbose \ ${dry_run+--dry-run} --suffix $backup_suffix $backup_archive_dir - @LIBEXECDIR@/beam-cleaner --retain $backup_retain_interval $verbose \ + @LIBEXECDIR@/beam-cleaner --retain $backup_retain_interval $verbose \ ${dry_run+--dry-run} --suffix .db $backup_snapshot_dir - fi - - for item in $backup_items - do - eval type=\$${item}_type - ${type}_backup $item - done - - trap - EXIT INT QUIT TERM - runhook epilogue_hook - - logit "finished" + fi + + for item in $backup_items + do + eval type=\$${item}_type + ${type}_backup $item + done + + trap - EXIT INT QUIT TERM + runhook epilogue_hook + + logit "finished" } umask ${backup_umask:-077} prologue_hook="beam_lock $prologue_hook" if [ -n "$backup_logfile" ]; then - runhook openlog_hook - exec >>$backup_logfile - exec 2>&1 + runhook openlog_hook + exec >>$backup_logfile + exec 2>&1 fi if [ -z "$backup_notify_email" ]; then - backup + backup else - report=$backup_snapshot_dir/report.$$ - touch $report - backup 2>&1 | tee $report - mail_report $report - rm $report + report=$backup_snapshot_dir/report.$$ + touch $report + backup 2>&1 | tee $report + mail_report $report + rm $report fi diff --git a/beam.in b/beam.in index 480351c..7281a18 100644 --- a/beam.in +++ b/beam.in @@ -1,4 +1,19 @@ #! /bin/sh +# This file is part of BEAM +# Copyright (C) 2012-2014 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 . libdir=@LIBDIR@/beam set -e @@ -6,53 +21,53 @@ set -e set +e help() { - cat <" - exit 0 + for cmd in @LIBEXECDIR@/beam-* + do + test -x $cmd && $cmd --wtf + done + wtf help display help page for a particular command + echo "" + echo "Report bugs to <@PACKAGE_BUGREPORT@>" + exit 0 } while [ $# -ne 0 ] do - case $1 in - -h|--help) help;; - -V|--version) print_version;; - --) shift; break;; - -*) echo >&2 "$0: unrecognized option $1"; exit 1;; - *) break;; - esac - shift + case $1 in + -h|--help) help;; + -V|--version) print_version;; + --) shift; break;; + -*) echo >&2 "$0: unrecognized option $1"; exit 1;; + *) break;; + esac + shift done if [ $# -eq 0 ]; then - error "command not specified" - abend 1 "try $0 --help for more details" + error "command not specified" + abend 1 "try $0 --help for more details" fi if [ $1 = "help" ]; then - shift - if [ $# -eq 0 ]; then - man 1 beam - else - man 1 beam-$1 - fi - exit $? + shift + if [ $# -eq 0 ]; then + man 1 beam + else + man 1 beam-$1 + fi + exit $? fi if [ -x @LIBEXECDIR@/beam-$1 ]; then - cmd=@LIBEXECDIR@/beam-$1 - shift - $cmd $@ + cmd=@LIBEXECDIR@/beam-$1 + shift + $cmd $@ else - error "unknown command" - abend 1 "try $0 --help for more details" + error "unknown command" + abend 1 "try $0 --help for more details" fi diff --git a/cleaner.in b/cleaner.in index 035892f..0a9a35f 100755 --- a/cleaner.in +++ b/cleaner.in @@ -1,4 +1,19 @@ #! /bin/sh +# This file is part of BEAM +# Copyright (C) 2012-2014 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 . libdir=@LIBDIR@/beam set -e @@ -29,27 +44,27 @@ EOF while [ $# -ne 0 ] do - case $1 in - -s|--suffix) shift; suffix=$1;; - -r|--retain) shift; retainweeks=$1;; - -v|--verbose) verbose=echo;; - -n|--dry-run) dry_run=echo; verbose=echo;; - -h|--help) help;; - --wtf) wtf $(basename $0) clean up old files; exit 0;; - --) shift; break;; - -*) echo >&2 "$0: unrecognized option $1" - exit 1;; - *) break - esac - shift + case $1 in + -s|--suffix) shift; suffix=$1;; + -r|--retain) shift; retainweeks=$1;; + -v|--verbose) verbose=echo;; + -n|--dry-run) dry_run=echo; verbose=echo;; + -h|--help) help;; + --wtf) wtf $(basename $0) clean up old files; exit 0;; + --) shift; break;; + -*) echo >&2 "$0: unrecognized option $1" + exit 1;; + *) break + esac + shift done case $# in -0) echo >&2 "$0: not enough arguments" - exit 1;; -1) dir=$1;; -*) echo >&2 "$0: too many arguments" - exit 1;; + 0) echo >&2 "$0: not enough arguments" + exit 1;; + 1) dir=$1;; + *) echo >&2 "$0: too many arguments" + exit 1;; esac thisweek=$(date +%U) @@ -58,31 +73,31 @@ thisweek=$(date +%U) # because weeks prior to 10 begin with 0 and therefore are processed # as octal numbers. This causes grief for weeks 08 and 09. if [ $thisweek -gt $retainweeks ]; then - lastweek=$(expr $thisweek - $retainweeks) + lastweek=$(expr $thisweek - $retainweeks) else - lastweek=$(expr $thisweek + 54 - $retainweeks) + lastweek=$(expr $thisweek + 54 - $retainweeks) fi $verbose \# removing from $dir files ending in $suffix and older than week $lastweek if [ -z "$suffix" ]; then - find $dir -maxdepth 1 -type f -printf '%f\n' + find $dir -maxdepth 1 -type f -printf '%f\n' else - find $dir -maxdepth 1 -type f -name "*$suffix" -printf '%f\n' + find $dir -maxdepth 1 -type f -name "*$suffix" -printf '%f\n' fi | while read name do - $verbose \# considering $name - week=$(expr "$name" : '[^-][^-]*-\([0-9][0-9]*\)-.*') - if [ $thisweek -ge $week ]; then - if [ $(expr $thisweek - $week) -gt $retainweeks ]; then - $verbose \# removing $name - $dry_run rm $dir/$name - fi - else - if [ $(expr $thisweek + 54 - $week) -gt $retainweeks ]; then - $verbose \# removing $name - $dry_run rm $dir/$name - fi - fi + $verbose \# considering $name + week=$(expr "$name" : '[^-][^-]*-\([0-9][0-9]*\)-.*') + if [ $thisweek -ge $week ]; then + if [ $(expr $thisweek - $week) -gt $retainweeks ]; then + $verbose \# removing $name + $dry_run rm $dir/$name + fi + else + if [ $(expr $thisweek + 54 - $week) -gt $retainweeks ]; then + $verbose \# removing $name + $dry_run rm $dir/$name + fi + fi done diff --git a/configure.ac b/configure.ac index a90c938..6e39a4a 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ # This file is part of BEAM -*- autoconf -*- -# Copyright (C) 2012, 2013 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 diff --git a/doc/Makefile.am b/doc/Makefile.am index 846c1de..0d82900 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,5 +1,5 @@ # This file is part of BEAM -# Copyright (C) 2012 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 diff --git a/doc/beam-backup.1in b/doc/beam-backup.1in index be45a44..2438d7b 100644 --- a/doc/beam-backup.1in +++ b/doc/beam-backup.1in @@ -1,5 +1,5 @@ .\" This file is part of BEAM -*- nroff -*- -.\" Copyright (C) 2012 Sergey Poznyakoff +.\" Copyright (C) 2012-2014 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 @@ -14,7 +14,7 @@ .\" You should have received a copy of the GNU General Public License .\" along with BEAM. If not, see . .\" -.TH BEAM\-BACKUP 1 "October 24, 2012" "BEAM" "BEAM User Reference" +.TH BEAM\-BACKUP 1 "March 19, 2014" "BEAM" "BEAM User Reference" .SH NAME beam\-backup \- create a back up. .SH SYNOPSIS diff --git a/doc/beam-cleaner.1in b/doc/beam-cleaner.1in index 36f2de7..59a39b4 100644 --- a/doc/beam-cleaner.1in +++ b/doc/beam-cleaner.1in @@ -1,5 +1,5 @@ .\" This file is part of BEAM -*- nroff -*- -.\" Copyright (C) 2012 Sergey Poznyakoff +.\" Copyright (C) 2012-2014 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 @@ -14,7 +14,7 @@ .\" You should have received a copy of the GNU General Public License .\" along with BEAM. If not, see . .\" -.TH BEAM\-CLEANER 1 "October 24, 2012" "BEAM" "BEAM User Reference" +.TH BEAM\-CLEANER 1 "March 19, 2014" "BEAM" "BEAM User Reference" .SH NAME beam\-cleaner \- clean up old backup files. .SH SYNOPSIS diff --git a/doc/beam-list.1in b/doc/beam-list.1in index 0614e81..57aa537 100644 --- a/doc/beam-list.1in +++ b/doc/beam-list.1in @@ -1,5 +1,5 @@ .\" This file is part of BEAM -*- nroff -*- -.\" Copyright (C) 2012 Sergey Poznyakoff +.\" Copyright (C) 2012-2014 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 @@ -14,7 +14,7 @@ .\" You should have received a copy of the GNU General Public License .\" along with BEAM. If not, see . .\" -.TH BEAM\-LIST 1 "October 24, 2012" "BEAM" "BEAM User Reference" +.TH BEAM\-LIST 1 "March 19, 2014" "BEAM" "BEAM User Reference" .SH NAME beam\-list \- list items included in backup .SH SYNOPSIS diff --git a/doc/beam-module.5in b/doc/beam-module.5in index f650c65..9ba239f 100644 --- a/doc/beam-module.5in +++ b/doc/beam-module.5in @@ -1,5 +1,5 @@ .\" This file is part of BEAM -*- nroff -*- -.\" Copyright (C) 2012 Sergey Poznyakoff +.\" Copyright (C) 2012-2014 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 @@ -14,7 +14,7 @@ .\" You should have received a copy of the GNU General Public License .\" along with BEAM. If not, see . .\" -.TH BEAM\-MODULE 5 "January 16, 2013" "BEAM" "BEAM Programmer Reference" +.TH BEAM\-MODULE 5 "March 19, 2014" "BEAM" "BEAM Programmer Reference" .SH NAME beam\-module \- format of .BR beam (1) diff --git a/doc/beam-restore.1in b/doc/beam-restore.1in index bbbfbba..6d24ad8 100644 --- a/doc/beam-restore.1in +++ b/doc/beam-restore.1in @@ -1,5 +1,5 @@ .\" This file is part of BEAM -*- nroff -*- -.\" Copyright (C) 2012 Sergey Poznyakoff +.\" Copyright (C) 2012-2014 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 @@ -14,7 +14,7 @@ .\" You should have received a copy of the GNU General Public License .\" along with BEAM. If not, see . .\" -.TH BEAM\-RESTORE 1 "October 24, 2012" "BEAM" "BEAM User Reference" +.TH BEAM\-RESTORE 1 "March 19, 2014" "BEAM" "BEAM User Reference" .SH NAME beam\-restore \- restore file system from a backup. .SH SYNOPSIS diff --git a/doc/beam-s3.1in b/doc/beam-s3.1in index 68dc66b..a295270 100644 --- a/doc/beam-s3.1in +++ b/doc/beam-s3.1in @@ -1,5 +1,5 @@ .\" This file is part of BEAM -*- nroff -*- -.\" Copyright (C) 2012 Sergey Poznyakoff +.\" Copyright (C) 2012-2014 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 @@ -14,7 +14,7 @@ .\" You should have received a copy of the GNU General Public License .\" along with BEAM. If not, see . .\" -.TH BEAM\-S3 1 "October 24, 2012" "BBE" "BBE User Reference" +.TH BEAM\-S3 1 "March 19, 2014" "BBE" "BBE User Reference" .SH NAME beam\-s3 \- manage a backup s3 bucket .SH SYNOPSIS diff --git a/doc/beam.1in b/doc/beam.1in index fc15064..0fd3ce5 100644 --- a/doc/beam.1in +++ b/doc/beam.1in @@ -1,5 +1,5 @@ .\" This file is part of BEAM -*- nroff -*- -.\" Copyright (C) 2012 Sergey Poznyakoff +.\" Copyright (C) 2012-2014 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 @@ -14,7 +14,7 @@ .\" You should have received a copy of the GNU General Public License .\" along with BEAM. If not, see . .\" -.TH BEAM 1 "October 24, 2012" "BEAM" "BEAM User Reference" +.TH BEAM 1 "March 19, 2014" "BEAM" "BEAM User Reference" .SH NAME beam \- a backup manager .SH SYNOPSIS diff --git a/lib/beam/Makefile.am b/lib/beam/Makefile.am index 22c9a12..81385ad 100644 --- a/lib/beam/Makefile.am +++ b/lib/beam/Makefile.am @@ -1,5 +1,5 @@ # This file is part of BEAM -# Copyright (C) 2012 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 diff --git a/lib/beam/common.in b/lib/beam/common.in index 4f2184b..94b4565 100644 --- a/lib/beam/common.in +++ b/lib/beam/common.in @@ -34,111 +34,111 @@ backup_pidfile="/var/run/beam.pid" backup_tmp_dir=/tmp error() { - echo >&2 $0: $* + echo >&2 $0: $* } logit() { - echo `date`: $* + echo `date`: $* } abend() { - ec=$1 - shift - error $@ - exit $ec + ec=$1 + shift + error $@ + exit $ec } beam_lock() { - if [ -r $backup_pidfile ]; then + if [ -r $backup_pidfile ]; then pid=$(head -n 1 $backup_pidfile) if [ -z "$pid" ]; then - abend 1 "pidfile $backup_pidfile exists but is unreadable or empty" + abend 1 "pidfile $backup_pidfile exists but is unreadable or empty" fi abend 1 "another beam process (pid $pid) is still running; exiting" - fi - echo $$ > $backup_pidfile || exit 1 - epilogue_hook="$epilogue_hook beam_unlock" + fi + echo $$ > $backup_pidfile || exit 1 + epilogue_hook="$epilogue_hook beam_unlock" } beam_unlock() { - rm -f $backup_pidfile + rm -f $backup_pidfile } 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 + 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 remote - - 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 + local delayed_exit remote - if [ -z "$backup_items" ]; then - abend 1 "backup_items not specified" - fi - - if [ -z "$backup_archive_dir" ]; then - if [ -n "$backup_bucket_name" ]; then - backup_archive_dir=$backup_mp_s3 + test -z "$BEAM_CONFIG" && BEAM_CONFIG=@SYSCONFDIR@/beam.conf + if [ -r $BEAM_CONFIG ]; then + . $BEAM_CONFIG else - abend 1 "backup_archive_dir not set" + abend 1 "configuration file $BEAM_CONFIG does not exist or is unreadable" fi - 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 + + if [ -z "$backup_items" ]; then + abend 1 "backup_items not specified" fi + + if [ -z "$backup_archive_dir" ]; then + if [ -n "$backup_bucket_name" ]; then + backup_archive_dir=$backup_mp_s3 + else + abend 1 "backup_archive_dir not set" + fi + 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 + 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 + else + error "$libdir/${type}.sh not found" + delayed_exit=1 + fi - ${type}_check $item || delayed_exit=1 - done + ${type}_check $item || delayed_exit=1 + done - test -n "$delayed_exit" && abend 1 "aborting" + test -n "$delayed_exit" && abend 1 "aborting" - tar_suffix=${backup_suffix:-.tar} + tar_suffix=${backup_suffix:-.tar} - if [ -n "$backup_bucket_name" ]; then - . @LIBDIR@/beam/s3.sh - prologue_hook="s3_mount $prologue_hook" - fi + if [ -n "$backup_bucket_name" ]; then + . @LIBDIR@/beam/s3.sh + prologue_hook="s3_mount $prologue_hook" + fi - remote=${backup_archive_dir%%:*} - if [ "$remote" != "$backup_archive_dir" ]; then - beam_rsh="${backup_rsh:-ssh} $remote" - backup_local_archive_dir=${backup_archive_dir#*:} - else - beam_rsh= - backup_local_archive_dir=$backup_archive_dir - fi + remote=${backup_archive_dir%%:*} + if [ "$remote" != "$backup_archive_dir" ]; then + beam_rsh="${backup_rsh:-ssh} $remote" + backup_local_archive_dir=${backup_archive_dir#*:} + else + beam_rsh= + backup_local_archive_dir=$backup_archive_dir + fi } beam_exec() { @@ -152,67 +152,67 @@ beam_exec() { } runhook() { - local hook_list + local hook_list - eval hook_list=\$$1 - for hook in $hook_list - do - $hook - done + 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 + exit 0 } wtf() { - l=`echo "${1#beam-}"|sed "s|.|.|g"` - s=$(echo " " | sed "s|$l|${1#beam-}|") - shift - echo " $s $@" + l=$(echo "${1#beam-}"|sed "s|.|.|g") + s=$(echo " " | sed "s|$l|${1#beam-}|") + shift + echo " $s $@" } dry_mail() { - echo "=============================================================" - cat - - echo "=============================================================" + 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\"" + : ${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 - 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 - <> $report + (cat - < $conf < $conf < $backup_tmp_dir/$1-$week-$round-$level - else - echo "su postgres -c \"pg_dump $verbose $database\" > $backup_tmp_dir/$1-$week-$round-$level" - fi + eval database=\$${1}_database + logit "backing up PostgreSQL database $database" + test -z "$database" && abend 1 "${1}_database not set" + if [ -z "$dry_run" ]; then + su postgres -c "pg_dump $verbose $database" > $backup_tmp_dir/$1-$week-$round-$level + else + echo "su postgres -c \"pg_dump $verbose $database\" > $backup_tmp_dir/$1-$week-$round-$level" + fi - if [ $? -ne 0 ]; then - tarerror=$((tarerror + 1)) - logit "failed" - else - logit "creating $1-$week-$round-$level.$tar_suffix" - $dry_run tar $verbose $taroptions \ + if [ $? -ne 0 ]; then + tarerror=$((tarerror + 1)) + logit "failed" + else + logit "creating $1-$week-$round-$level.$tar_suffix" + $dry_run tar $verbose $taroptions \ -f $backup_archive_dir/$1-$week-$round-$level.$tar_suffix \ -C $backup_tmp_dir $1-$week-$round-$level - tarcode $? - $dry_run rm $backup_tmp_dir/$1-$week-$round-$level - fi + tarcode $? + $dry_run rm $backup_tmp_dir/$1-$week-$round-$level + fi } postgres_restore() { - local u database + local u database - eval database=\$${1}_database - logit "restoring PostgreSQL database $database" - u=$(umask) - trap "umask $u" 1 2 3 13 15 - umask 077 - $dry_run tar $verbose $taroptions \ + eval database=\$${1}_database + logit "restoring PostgreSQL database $database" + u=$(umask) + trap "umask $u" 1 2 3 13 15 + umask 077 + $dry_run tar $verbose $taroptions \ -f $backup_archive_dir/$1-$week-$round-$level.$tar_suffix - e=$? - tarcode $e - if [ $e -eq 0 ]; then - logit "restoring database from the dump" - if [ -n "$dry_run" ]; then - cat <<-EOT + e=$? + tarcode $e + if [ $e -eq 0 ]; then + logit "restoring database from the dump" + if [ -n "$dry_run" ]; then + cat <<-EOT su postgres -c "dropdb $database" su postgres -c "createdb $database" su postgres -c "psql -d $database -f $1-$week-$round-$level" rm $1-$week-$round-$level EOT - elif [ -r $1-$week-$round-$level ]; then - su postgres -c "dropdb $database" - su postgres -c "createdb $database" - su postgres -c "psql -d $database -f $1-$week-$round-$level" > db-$1.log - if grep ERROR db-$1.log >/dev/null; then - error "errors occurred during restore; see db-$1.log for details" - error "dump preserved in file $1-$week-$round-$level" - tarerror=$((tarerror + 1)) - else - rm $1-$week-$round-$level - fi + elif [ -r $1-$week-$round-$level ]; then + su postgres -c "dropdb $database" + su postgres -c "createdb $database" + su postgres -c "psql -d $database -f $1-$week-$round-$level" > db-$1.log + if grep ERROR db-$1.log >/dev/null; then + error "errors occurred during restore; see db-$1.log for details" + error "dump preserved in file $1-$week-$round-$level" + tarerror=$((tarerror + 1)) + else + rm $1-$week-$round-$level + fi + fi fi - fi - umask $u - trap - 1 2 3 13 15 + umask $u + trap - 1 2 3 13 15 } diff --git a/lib/beam/s3.sh b/lib/beam/s3.sh index d2fcfe6..7b6ad91 100644 --- a/lib/beam/s3.sh +++ b/lib/beam/s3.sh @@ -1,6 +1,6 @@ #! /bin/sh # This file is part of BEAM -# Copyright (C) 2012 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 @@ -25,7 +25,7 @@ test -z "$backup_mp" && backup_mp_s3=/mnt/s3 s3_getmpoint() { - case $1 in + case $1 in # Sample mount output, split into several lines: # a) With --vhost: # http://BUCKETNAME.s3.amazonaws.com/ on /mnt/s3backer type fuse.s3backer @@ -33,71 +33,73 @@ s3_getmpoint() # b) Without --vhost: # http://s3.amazonaws.com/BUCKETNAME/ on /mnt/s3backer type fuse.s3backer # (rw,nosuid,nodev,allow_other,default_permissions) - backer) - mount -tfuse.s3backer | - awk '/https?:\/\/.*'$backup_bucket_name'/ { print $3 }';; - s3) - s=$(mount | grep "^${backup_mp_s3backer}/file" | awk '{ print $3 }') - if [ -z "$s" ]; then - # Some kernels print device name instead of the actual mount file: - s=$(mount | grep "^/dev/loop[0-9] on ${backup_mp_s3}" | awk '{ print $3 }') - fi - echo $s;; - *) - abent 1 "invalid usage of getmpoint" - esac + backer) + mount -tfuse.s3backer | + awk '/https?:\/\/.*'$backup_bucket_name'/ { print $3 }';; + s3) + s=$(mount | grep "^${backup_mp_s3backer}/file" | awk '{ print $3 }') + if [ -z "$s" ]; then + # Some kernels print device name instead of the actual mount file: + s=$(mount | grep "^/dev/loop[0-9] on ${backup_mp_s3}" | + awk '{ print $3 }') + fi + echo $s;; + *) + abent 1 "invalid usage of getmpoint" + esac } # This variable is populated by s3_mount and is used by s3_unmount to unmount # s3-backed file system. umount_list="" -s3_mount() { - # Make sure both mountpoints exist - test -d $backup_mp_s3backer || mkdir $backup_mp_s3backer - test -d $backup_mp_s3 || mkdir $backup_mp_s3 +s3_mount() { + # Make sure both mountpoints exist + test -d $backup_mp_s3backer || mkdir $backup_mp_s3backer + test -d $backup_mp_s3 || mkdir $backup_mp_s3 - set -- $(s3_getmpoint backer) - if test -z "$1"; then - $dry_run s3backer $backup_s3backer_options \ + set -- $(s3_getmpoint backer) + if test -z "$1"; then + $dry_run s3backer $backup_s3backer_options \ $backup_bucket_name $backup_mp_s3backer || abend 1 "unable to mount $backup_bucket_name" - umount_list="$backup_mp_s3backer" - else - backup_mp_s3backer=$1 - fi - set -- $(s3_getmpoint s3) - if test -z "$1"; then - case $(basename $0) in - beam-restore|restore) mountopt=",ro";; - beam-backup|backup) mountopt=",rw";; - beam-s3) ;; - *) error "called as $0: assuming default mount options" - esac - test -n "$backup_s3_mount_options" && - mountopt="$mountopt,$backup_s3_mount_options" - # NOTE: For ext4 add the journal_async_commit option. - $dry_run mount -oloop$mountopt $backup_mp_s3backer/file $backup_mp_s3 || - abend 1 "unable to mount $backup_mp_s3backer/file" - umount_list="$backup_mp_s3 $umount_list" - else - backup_mp_s3=$1 - fi - epilogue_hook="s3_unmount $epilogue_hook" + umount_list="$backup_mp_s3backer" + else + backup_mp_s3backer=$1 + fi + set -- $(s3_getmpoint s3) + if test -z "$1"; then + case $(basename $0) in + beam-restore|restore) mountopt=",ro";; + beam-backup|backup) mountopt=",rw";; + beam-s3) ;; + *) error "called as $0: assuming default mount options" + esac + test -n "$backup_s3_mount_options" && + mountopt="$mountopt,$backup_s3_mount_options" + # NOTE: For ext4 add the journal_async_commit option. + $dry_run mount -oloop$mountopt \ + $backup_mp_s3backer/file $backup_mp_s3 || + abend 1 "unable to mount $backup_mp_s3backer/file" + umount_list="$backup_mp_s3 $umount_list" + else + backup_mp_s3=$1 + fi + epilogue_hook="s3_unmount $epilogue_hook" } s3_unmount() { - if test "$1" = "--force"; then - for id in s3 backer - do - mpoint=$(s3_getmpoint $id) - test -n "$mpoint" && $dry_run umount $mpoint - done - else - for mpoint in $umount_list - do - test -n "$mpoint" && $dry_run umount $mpoint - done - fi + if test "$1" = "--force"; then + for id in s3 backer + do + mpoint=$(s3_getmpoint $id) + test -n "$mpoint" && $dry_run umount $mpoint + done + else + for mpoint in $umount_list + do + test -n "$mpoint" && $dry_run umount $mpoint + done + fi } diff --git a/list.in b/list.in index 1452a9d..4198d3c 100644 --- a/list.in +++ b/list.in @@ -1,6 +1,6 @@ #! /bin/sh # This file is part of BEAM -# Copyright (C) 2012 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 @@ -21,12 +21,12 @@ set -e set +e if [ "$1" = "--wtf" ]; then - wtf $(basename $0) list what is included in backups - exit 0 + wtf $(basename $0) list what is included in backups + exit 0 fi help() { - cat < EOF - exit 0 + exit 0 } ########################################################### @@ -49,51 +49,51 @@ EOF numbered_list= while [ $# -ne 0 ] do - case $1 in - -l|--number) numbered_list=1;; - -h|--help) help;; - -V|--version) print_version;; - *) echo >&2 "$0: unrecognized option $1"; exit 1;; - esac - shift + case $1 in + -l|--number) numbered_list=1;; + -h|--help) help;; + -V|--version) print_version;; + *) echo >&2 "$0: unrecognized option $1"; exit 1;; + esac + shift done load_config if [ -z "$backup_items" ]; then - echo "Nothing is being backed up" + echo "Nothing is being backed up" fi delayed_exit= loaded_types= if test -n "$numbered_list"; then - n=0 + n=0 fi prefix= 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 + 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 + else + error "$libdir/${type}.sh not found" + delayed_exit=1 + fi - if test -n "$numbered_list"; then - n=$((n + 1)) - prefix="$n. " - fi - ${type}_list $item "$prefix" || delayed_exit=1 + if test -n "$numbered_list"; then + n=$((n + 1)) + prefix="$n. " + fi + ${type}_list $item "$prefix" || delayed_exit=1 done test -n "$delayed_exit" && abend 1 "aborting" diff --git a/restore.in b/restore.in index c1dc0c6..8618e2d 100644 --- a/restore.in +++ b/restore.in @@ -21,8 +21,8 @@ set -e set +e if [ "$1" = "--wtf" ]; then - wtf $(basename $0) create a backup - exit 0 + wtf $(basename $0) create a backup + exit 0 fi load_config @@ -37,16 +37,16 @@ listonly= confirm=1 getyn() { - echo -n "$0:" $* " [Y/n]? " - read REPLY - case $REPLY in - ''|y*|Y*) REPLY=y;; - *) REPLY=n;; - esac + echo -n "$0:" $* " [Y/n]? " + read REPLY + case $REPLY in + ''|y*|Y*) REPLY=y;; + *) REPLY=n;; + esac } help() { - cat < EOT - exit 0 + exit 0 } while [ $# -ne 0 ] do - case $1 in - -C|--directory) shift; root=$1;; - -c|--confirm) confirm=0;; - -v|--verbose) verbose="$verbose -v";; - -t|--list) listonly=1;; - -l|--logfile) shift; logfile=$1; confirm=0;; - -n|--dry-run) dry_run=echo;; - -h|--help) help;; - -V|--version) print_version;; - -L|--level) shift; level=$1;; - -R|--round) shift; round=$1;; - -W|--week) shift; week=$1;; - --) shift; break;; - -*) echo >&2 "$0: unrecognized option $1"; exit 1;; - *) break;; - esac - shift + case $1 in + -C|--directory) shift; root=$1;; + -c|--confirm) confirm=0;; + -v|--verbose) verbose="$verbose -v";; + -t|--list) listonly=1;; + -l|--logfile) shift; logfile=$1; confirm=0;; + -n|--dry-run) dry_run=echo;; + -h|--help) help;; + -V|--version) print_version;; + -L|--level) shift; level=$1;; + -R|--round) shift; round=$1;; + -W|--week) shift; week=$1;; + --) shift; break;; + -*) echo >&2 "$0: unrecognized option $1"; exit 1;; + *) break;; + esac + shift done if [ -z "$listonly" ]; then - taroptions="$taroptions -x" + taroptions="$taroptions -x" else - taroptions="$taroptions -t" + taroptions="$taroptions -t" fi # Collect items to be restored. @@ -102,9 +102,9 @@ items=$* test -z "$items" && items="$backup_items" if [ -n "$logfile" ]; then - confirm=0 - exec >>$logfile - exec 2>&1 + confirm=0 + exec >>$logfile + exec 2>&1 fi runhook prologue_hook @@ -112,32 +112,32 @@ trap "runhook epilogue_hook" EXIT INT QUIT TERM # Guess missing values if [ -z "$week" ]; then - hour=$(date +%H) - if [ $hour -gt 6 ]; then - week=$(date +%U) - else - week=$(date -d yesterday +%U) - fi + hour=$(date +%H) + if [ $hour -gt 6 ]; then + week=$(date +%U) + else + week=$(date -d yesterday +%U) + fi fi if [ -z "$round" ]; then - round=$(beam_exec find $backup_local_archive_dir \ + round=$(beam_exec find $backup_local_archive_dir \ -regex '.*-'$week'-[0-9][0-9]*-[0-9][0-9]*\..*' \ -printf '%f\\n' | - sed 's/.*-'$week'-\([0-9][0-9]*\)-[0-9][0-9]*\..*/\1/' | - sort +0 -1 | - tail -1) - test -z "$round" && abend 1 "cannot determine last round number" + sed 's/.*-'$week'-\([0-9][0-9]*\)-[0-9][0-9]*\..*/\1/' | + sort +0 -1 | + tail -1) + test -z "$round" && abend 1 "cannot determine last round number" fi if [ -z "$level" ]; then - level=$(beam_exec find $backup_local_archive_dir \ + level=$(beam_exec find $backup_local_archive_dir \ -regex '.*-'$week-$round'-[0-9][0-9]*\..*' \ -printf '%f\\n' | - sed 's/.*-'$week-$round'-\([0-9][0-9]*\)\..*/\1/' | - sort +0 -1 | - tail -1) - test -z "$level" && abend 1 "cannot determine last level number" + sed 's/.*-'$week-$round'-\([0-9][0-9]*\)\..*/\1/' | + sort +0 -1 | + tail -1) + test -z "$level" && abend 1 "cannot determine last level number" fi echo "$0: target root directory $root" @@ -145,16 +145,16 @@ echo "$0: items to be restored: $items" echo "$0: restoring from week $week, round $round, level $level" if [ $confirm -ne 0 ]; then - getyn "Do you wish to proceed" - test $REPLY = "n" && exit 0 + getyn "Do you wish to proceed" + test $REPLY = "n" && exit 0 fi logit "started" for item in $items do - eval type=\$${item}_type - ${type}_restore $item + eval type=\$${item}_type + ${type}_restore $item done trap - EXIT INT QUIT TERM diff --git a/s3.in b/s3.in index e4d838f..3d9f2c5 100644 --- a/s3.in +++ b/s3.in @@ -1,6 +1,6 @@ #! /bin/sh # This file is part of BEAM -# Copyright (C) 2012 Sergey Poznyakoff +# Copyright (C) 2012-2014 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 @@ -20,27 +20,27 @@ set -e set +e if [ "$1" = "--wtf" ]; then - wtf $(basename $0) mount or unmount a backup s3 bucket - exit 0 + wtf $(basename $0) mount or unmount a backup s3 bucket + exit 0 fi test -z "$BEAM_CONFIG" && BEAM_CONFIG=@SYSCONFDIR@/beam.conf if [ ! -r $BEAM_CONFIG ]; then - echo >&2 "$0: configuration file $BEAM_CONFIG is not found or is unreadable" - exit 1 + echo >&2 "$0: configuration file $BEAM_CONFIG is not found or is unreadable" + exit 1 fi . $BEAM_CONFIG . @LIBDIR@/beam/s3.sh if [ -z "$backup_bucket_name" ]; then - echo >&2 "$0: backup_bucket_name is not defined (examine $BEAM_CONFIG)" - exit 1 + echo >&2 "$0: backup_bucket_name is not defined (examine $BEAM_CONFIG)" + exit 1 fi help() { - cat < EOT - exit 0 + exit 0 } while [ $# -ne 0 ] do - case $1 in - -h|--help) help;; - -V|--version) print_version;; - *) break;; - esac + case $1 in + -h|--help) help;; + -V|--version) print_version;; + *) break;; + esac done case $1 in -mount) - s3_mount - echo "$backup_bucket_name mounted under $backup_mp_s3";; -umount|unmount) - s3_unmount --force;; -status) - for id in s3 backer - do - mpoint=$(s3_getmpoint $id) - if [ -n "$mpoint" ]; then - echo "$id is mounted on $mpoint" - fi - done;; + mount) + s3_mount + echo "$backup_bucket_name mounted under $backup_mp_s3";; + umount|unmount) + s3_unmount --force;; + status) + for id in s3 backer + do + mpoint=$(s3_getmpoint $id) + if [ -n "$mpoint" ]; then + echo "$id is mounted on $mpoint" + fi + done;; -*) help - exit 1;; + *) help + exit 1;; esac -- cgit v0.9.0.3