#!/bin/bash
####################################################################
#
#本脚本通过参数 0 实现svnadmin hotcopy 的全量备份
# 通过参数 1 实现svnadmin dump 的增量备份
#
#每天凌晨0时1分 执行svnbackup.sh 0 删除备份版本记录文件backversion,
#实现svnadmin hotcopy 的全量备份。
#
#每个小时执行一次脚本,实现增量备份,当版本未变更时将不执行备份。
#具体执行备份的时间可以根据需要调整crontab
#
#1 0 * * * /opt/csvn/bin/svnbackup.sh 0
#55 * * * * /opt/csvn/bin/svnbackup.sh 1
#
####################################################################
#设置SVN命令所在目录
SVN_BIN_DIR=/opt/csvn/bin
#设置SVN仓库所在位置
SVN_REPO_DIR=/opt/csvn/data/repositories
#设置SVN备份所在目录
SVN_BACKUP_DIR=/opt/csvn/data/dumps
if [ $# -lt 1 ];then
echo $0 "<backup type>"
echo " backup type:"
echo " 0: hotcopy 全量备份"
echo " 1: svnadmin dump 增量备份"
exit
fi
for repodir in `ls $SVN_REPO_DIR`
do
DATE=`date +%Y%m%d%H%M`
if [ -d $SVN_REPO_DIR/$repodir ];then
mkdir -p $SVN_BACKUP_DIR/$repodir
cd $SVN_BACKUP_DIR/$repodir
if [ "$1" -eq "0" ];then
rm -rf $SVN_BACKUP_DIR/$repodir/backversion
fi
if [ -e $SVN_BACKUP_DIR/$repodir/backversion ];then
OLD_VERSION=`cat $SVN_BACKUP_DIR/$repodir/backversion`
YOUNGEST=`$SVN_BIN_DIR/svnlook youngest $SVN_REPO_DIR/$repodir`
if [ "$OLD_VERSION" -eq "$YOUNGEST" ];then
echo "$repodir 版本未变化,无需备份"
else
OLD_VERSION=`expr $OLD_VERSION + 1`
echo "svnadmin dump $repodir $OLD_VERSION:$YOUNGEST begin"
$SVN_BIN_DIR/svnadmin dump $SVN_REPO_DIR/$repodir --incremental -r $OLD_VERSION:$YOUNGEST >$SVN_BACKUP_DIR/$repodir/$repodir-dump-r$OLD_VERSION-$YOUNGEST-$DATE
gzip $repodir-dump-r$OLD_VERSION-$YOUNGEST-$DATE
echo $YOUNGEST >backversion
echo "svnadmin dump $repodir $OLD_VERSION:$YOUNGEST end"
fi
else
echo "svnadmin hotcopy $repodir beging"
$SVN_BIN_DIR/svnadmin hotcopy $SVN_REPO_DIR/$repodir $repodir
YOUNGEST=`$SVN_BIN_DIR/svnlook youngest $repodir`
tar -czf $repodir-hotcopy-r0_$YOUNGEST-$DATE.tar.gz $repodir
echo $YOUNGEST >backversion
rm -rf $repodir
echo "svnadmin hotcopy $repodir end"
fi
fi
done