#!/bin/bash 
#
# By:      John Stile
# Date:    20061025
# Purpose: Make daily near-line backup of each repository 
# Steps:   Make list of repos. and process one at a time
#          1. run svnadmin verify on repo
#          2. move old backup out of the way
#          3. run svnadmin hotcopy on repo

#
# Configurable Varialbes:
#
REPOS_BASE="/svn/repos"
HOT_BASE="/svn/hotcopy"
SVNADMIN="/usr/bin/svnadmin"
FIND="/usr/bin/find"
EXPR="/usr/bin/expr"
LOG="/svn/hotcopy/backup_log.txt"
DATE=`date +%Y%m%d-%H:%S`
#
# Parse the apache config file to determing what Repos to backup
# i.e. each repo config section looks like this
#<Location /NAME>
#  DAV svn
#  SVNPath /svn/repos/NAME
#  SVNIndexXSLT "/svnindex.xsl"
#  AuthType Basic
#  AuthName "Subversion Repository: NAME"
#  #AuthBasicAuthoritative Off
#  AuthBasicProvider external
#  AuthExternal pwauth
#  Require valid-user
#  AuthzSVNAccessFile /svn/acls/NAME.acl
#  SetOutputFilter xslt
#  AddDefaultCharset utf-8
#</Location>
#
REPOS_TOTAL=`grep '^<Location' /etc/apache2/conf.d/subversion.conf |sed 's|<Location /\(.*\)>|\1|'`

echo "#########################" 
echo "Starting: $DATE" 
echo "#########################" 
echo -e "Rev\tMb\tRepo"
for  MATCH in $REPOS_TOTAL
do 
  #Foo=`expr match "$MATCH" '\(.*\)/format'` &> /dev/null
  Foo=$REPOS_BASE/$MATCH
  Size=`du -sm $Foo`
  Youngest=`svnlook youngest $Foo`
  echo -e "$Youngest\t$Size"
done

#testing#  for MATCH in /svn/repos/TEST2/format
for MATCH in $REPOS_TOTAL
do
  #
  # match contains './repos_dir/format'
  # Strip the 'format'
  #
  #REPOS_DIR=`expr match "$MATCH" '\(.*\)/format'`
  REPOS_DIR=${REPOS_BASE}/${MATCH}
  if [ $? -ne 0 ]; then
    echo "Failed to determine repository from path $MATCH!"  
  elif [[ ! -e "$REPOS_DIR" || ! -d "$REPOS_DIR" ]]; then
    echo "$REPOS_DIR is not a valid repository!"  
  else
    echo "Verifying repository $REPOS_DIR ..." 
    # time shows how long verify took in seconds, sends to log file
    # nice sets prioirty of process to lowest possible
    # verify checks each refision of repo for errors
    /usr/bin/time -f "%S sec" -o $LOG --append  nice --adjustment=19 $SVNADMIN verify ${REPOS_DIR} &> /dev/null 
    if [ $? -ne 0 ]; then
      echo "Verification failed on $REPOS_DIR"
    else
      echo "Verification succeded. Starting hotcopy:" 
      HOT_DIR=`echo "$REPOS_DIR" |sed "s/repos/hotcopy/"`
      if [ -d "$HOT_DIR" ]; then
          if [ -d "$HOT_DIR".bak ]; then
              rm -rf "$HOT_DIR".bak
	  fi
          mv "$HOT_DIR" "$HOT_DIR".bak
      fi
      # time shows how long verify took in seconds, sends to log file
      # nice sets prioirty of process to lowest possible
      # hotcopy makes exact copy of the repo 
      /usr/bin/time -f "%S sec" -o $LOG --append nice --adjustment=19 svnadmin hotcopy  ${REPOS_DIR} ${HOT_DIR}  &> /dev/null 
      if [ $? -ne 0 ]; then
          echo "Hotcopy failed on $REPOS_DIR" 
      else
          echo "Hotcopy succeded on $REPOS_DIR!" 
      fi
      # Fix file permissions
      chown -R apache:apache ${HOT_DIR}
    fi
  fi
done

cat $LOG |mailx -s "[SVN BACKUP] $DATE" john@stilen.com   
