]> git.sesse.net Git - backup.sh/commitdiff
Move from configuration in various scattered single files to everything (except exclu...
authorSteinar H. Gunderson <sesse@samfundet.no>
Sat, 15 Oct 2016 09:28:38 +0000 (11:28 +0200)
committerSteinar H. Gunderson <sesse@samfundet.no>
Sat, 15 Oct 2016 09:28:38 +0000 (11:28 +0200)
README
backup.sh
conf/backup.config.example [new file with mode: 0644]

diff --git a/README b/README
index 82719157c06635294db95d3a3f267dd12cca396f..cdae319594f4a55b2c45d9124ba9ea2f70adfa09 100644 (file)
--- a/README
+++ b/README
@@ -8,6 +8,7 @@ x GNU bash
 x GNU tar 
 x GNU shellutils
 x GNU moreutils
+x git (backup machine only)
 
 How to prepare your computer:
 x mount your huge partition (we use /backup).
@@ -15,6 +16,8 @@ x make it possible for ssh to log in from this computer
   to your other computers as root without a password. scary.
 x put this software in a directory (we use /home/backup/)
 x put the name of your computers in /home/backup/conf/computers.unix
+x put the global config file in /home/backup/conf/backup.config,
+  adjust to taste
 x the fifth field (of the partitions you want to back up) in
   /etc/fstab on your clients should be >0 
 
index 71ebfe1084897fe525dd14091340d4c100a74ccb..b808d5611e49636cec8adf41705ab2f7b6aaac01 100755 (executable)
--- a/backup.sh
+++ b/backup.sh
 # The script is halfway Norwegian and halfway English. Newer modifications are
 # in English, we should probably stick to that.
 
-SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"  # Absolute directory the script lives in
-confdir=$SCRIPTPATH/conf/                        # Directory configuration files
-[ -r $confdir/env ] && . $confdir/env
-
-# Default configuration; used unless $confdir/env has set something different.
-storagedir=${storagedir:-/backup}                # Where we keep backups
-exclude=${exclude:-$confdir/exclude}             # List of exclude patterns
-maxnumfull=${maxnumfull:-3}                      # Number of full backups
-daysbetweenfull=${daysbetweenfull:-30}           # Days between full backups
-
-# Days between full backups for machines with fixed full-backup date
-# (in case the fixed day gets missed).
-daysbetweenfullforfixed=${daysbetweenfullforfixed:-32}
-
-# End of configuration.
-
 computer=$1                                      # The computer to backup.
+SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"  # Absolute directory the script lives in
+confdir=$SCRIPTPATH/conf                         # Directory for configuration files
+conffile=$confdir/backup.config
 LOCKFILE=$SCRIPTPATH/backuprun.lockfile.$computer
 DAY_OF_MONTH=`date "+%d" | sed s/^0//`           # from 1 to 31
 DATE=`date "+%Y%m%d%H%M"`                        # format: touch
 DATEs=`date "+%Y-%m-%d %H:%M"`                   # format: tar
+TOP_PID=$$
 
 if [ -z "$computer" ]; then
        echo "Usage: $0 COMPUTER"
@@ -64,6 +52,22 @@ warnmsg() {
 infomsg() {
        echo `date`": $computer: $@" >&2
 }
+findconf() {  # getconf is already taken
+       key=$1
+       computer=$2
+       filesystem=$( echo $3 | tr / . )
+
+       if [ "$computer" ] && [ "$filesystem" ] && git config -f $conffile $computer$filesystem.$key > /dev/null; then
+               git config -f $conffile $computer$filesystem.$key
+       elif [ "$computer" ] && git config -f $conffile $computer.$key > /dev/null; then
+               git config -f $conffile $computer.$key
+       elif git config -f $conffile defaults.$key > /dev/null; then
+               git config -f $conffile defaults.$key
+       else
+               warnmsg "No configuration found for $key in $conffile, aborting."
+               kill -TERM $TOP_PID
+       fi
+}
 
 # Trap C-c and kill
 trap die SIGINT SIGTERM
@@ -111,11 +115,7 @@ backup()
        # but in some cases, like backing up to a remote and untrusted
        # file system, it could be useful to replace it with e.g.
        # a GPG command line.
-       if [ -f $confdir/storageprogram.$computer ]; then
-               storageprogram=`cat $confdir/storageprogram.$computer`
-       else
-               storageprogram=cat
-       fi
+       storageprogram=$( findconf storageprogram $computer $sfilesystem )
 
        # We try to run tar on the remote computer
        #    c create archive
@@ -207,6 +207,11 @@ nonprivbackup()
        fi
 }
 
+# Get basic configuration.
+storagedir=$( findconf storagedir $computer )
+username=$( findconf username $computer )
+exclude=$( findconf excludefile $computer )
+
 # Check that the target filesystem is mounted (actually check that it's not
 # the root filesystem)
 if [ ! -d "$storagedir/$computer" ]; then
@@ -218,13 +223,6 @@ if [ "$rootfilesystem" == "$targetfilesystem" ]; then
        diemsg "Target filesystem ($storagedir/$computer) was mounted on /."
 fi
  
-# Find the user to do the backup as.
-if [ -f $confdir/username.$computer ] ; then
-       username=`cat $confdir/username.$computer`
-else 
-       username=root
-fi
-
 infomsg "Backing up $computer"
 
 # Try to SSH to the computer without entering a password.
@@ -305,18 +303,14 @@ for filesystem in $filesystems; do
        fi
 
        # Check if we want a full backup
-       if [ -f $confdir/fastfullbackupdag.$computer.$sfilesystem ]; then
-               fullbackup_min_for_this_machine=$daysbetweenfullforfixed
-               if [ "$DAY_OF_MONTH" = "`cat $confdir/fastfullbackupdag.$computer.$sfilesystem`" ]; then
-                       backuplevel=full
-               fi
-       elif [ -f $confdir/fastfullbackupdag.$computer ]; then
-               fullbackup_min_for_this_machine=$daysbetweenfullforfixed
-               if [ "$DAY_OF_MONTH" = "`cat $confdir/fastfullbackupdag.$computer`" ]; then
+       fixedfullbackupday=$( findconf fixedfullbackupday $computer $filesystem )
+       if [ "$fixedfullbackupday" ]; then
+               fullbackup_min_for_this_machine=$( findconf daysbetweenfullforfixed $computer $filesystem )
+               if [ "$DAY_OF_MONTH" = "$fixedfullbackupday" ]; then
                        backuplevel=full
                fi
        else
-               fullbackup_min_for_this_machine=$daysbetweenfull 
+               fullbackup_min_for_this_machine=$( findconf daysbetweenfull $computer $filesystem )
        fi
 
        if [ -z "`find $storagedir/$computer/$sfilesystem/full/ -name \*tgz\* -mtime -$fullbackup_min_for_this_machine`" ]; then
@@ -327,22 +321,15 @@ for filesystem in $filesystems; do
        cd $storagedir/$computer/$sfilesystem/$backuplevel || diemsg "$storagedir/$computer/$sfilesystem/$backuplevel does not exist"
 
        # Perform the actual backup
-       if [ "$username" = "root" ]; then
-               backup
-       else
+       if [ "$( findconf nonpriv $computer )" ]; then
                nonprivbackup
-       fi
-
-       # Check if this box has a custom number of full backups
-       if [ -f $confdir/maksfulle.$computer.$sfilesystem ]; then
-               mf=$((`cat $confdir/maksfulle.$computer.$sfilesystem`+1))
-       elif [ -f $confdir/maksfulle.$computer ] ; then
-               mf=$((`cat $confdir/maksfulle.$computer`+1))
        else
-               mf=$(($maxnumfull+1))
+               backup
        fi
 
        # Delete old full backups
+       mf=$( findconf maxnumfull $computer $filesystem )
+       mf=$(( mf + 1 ))
        for full in `ls -1t $storagedir/$computer/$sfilesystem/full/*tgz* | tail -n +$mf`; do
                prefix=`echo $full | sed "s/\.[^.]*$//"`
                infomsg "$computer:$filesystem Deleting full backup $prefix"
diff --git a/conf/backup.config.example b/conf/backup.config.example
new file mode 100644 (file)
index 0000000..52dde92
--- /dev/null
@@ -0,0 +1,51 @@
+# backup.sh configuration file; follows git-config(1) syntax.
+[defaults]
+       # Where we keep backups.
+       # Note: You cannot set this per-filesystem, only per machine.
+       storagedir = /backup
+
+       # List of exlude patterns. Relative to the script's directory!
+       # Note: You cannot set this per-filesystem, only per machine.
+       excludefile = conf/exclude
+
+       # What username to perform the backup as.
+       # Note: You cannot set this per-filesystem, only per machine.
+       username = root
+
+       # Number of full backups.
+       maxnumfull = 3
+
+       # Days between full backups.
+       daysbetweenfull = 30
+
+       # Force fixed full-backup date for a given machine or filesystem
+       # (e.g. "3" to always take backup of this machine the 3rd of the month).
+       # Leave blank to take full backups just whenever necessary.
+       fixedfullbackupday =
+
+       # Days between full backups for machines with fixed full-backup date
+       # (in case the fixed day gets missed).
+       daysbetweenfullforfixed = 32
+
+       # The file is usually stored to disk with a simple cat > $TARFILE,
+       # but in some cases, like backing up to a remote and untrusted
+       # file system, it could be useful to replace it with e.g.
+       # a GPG command line.
+       storageprogram = cat
+
+       # If set, do a non-privileged backup (ie., assume we need to call
+       # “sudo /usr/local/sbin/output-encrypted-backup” to get our backup).
+       # Otherwise, assume root privileges.
+       nonpriv =
+
+# Config for a given host
+[pannekake.samfundet.no]
+       maxnumfull = 2
+       username = samfundetbackup
+       nonpriv = true
+
+# Config for a given filesystem
+[pannekake.samfundet.no.srv.chroot]
+       maxnumfull = 1
+
+