#!/bin/bash
#### //kinggoo.com
#### 需要安装sendmail、mutt以便发送邮件通知,当然也可以改下代码,弄成网页访问形式也可以
#### 不要删除SVN_LOG后面设置变量的任何文件,否则备份时会自动全备
#### if [[ ${WEEKDAY} = 'Fri' ]];then 这里是做全备的判断可以修改为其他,但请尽量不要修改为周末。
TIME=`date +%Y%m%d`
YM=`date +%Y%m`
WEEKDAY=`date +%a`
DAYTIME=`date +%Y%m%d%H`
SVNROOT=/opt/svnroot
SVNDATA=/svn
HTTP=/etc/init.d
#请创建用于全备的目录文件SVNALL
SVNALL=${SVNDATA}/svnall
SVN_LOG=${SVNDATA}/log
TOMAIL="kinggoo@kinggoo.com"
if [ ! -e ${SVNDATA}/${YM} ] || [ ! -d ${SVNDATA}/${YM} ];then
mkdir -p ${SVNDATA}/${YM}
SVNDATA=${SVNDATA}/${YM}
else
SVNDATA=${SVNDATA}/${YM}
fi
echo "" > ${SVN_LOG}/svn.mail > /dev/null
#针对配置http集成svn服务来做,如果你没有将http添加到服务。脚本内是通过http服务生效后返回显示信息OK来判断是否启动的!
declare -a REPOSITORY
REPOSITORY=( KingGoo com )
ARR=0
# - function 集合
function RunStophttp()
{ # apache服务起停
${HTTP}/httpd $1 |grep -i OK && I=$? || I=1
sleep 5
if [ "$1" = "stop" ];then
if [[ "${I}" -eq "0" ]];then
echo "-- httpd is stopping" >> ${SVN_LOG}/svn.mail
else
/usr/bin/pgrep httpd|xargs kill -9
echo "-- httpd is kill for stopping" >> ${SVN_LOG}/svn.mail
fi
else
if [ "$1" = "start" ];then
if [[ "${I}" -eq "0" ]];then
echo "-- httpd is running" >> ${SVN_LOG}/svn.mail
else
echo "-- httpd is failed" >> ${SVN_LOG}/svn.mail
${HTTP}/httpd restart |grep -i OK && I=$? || I=ERROR
echo -e "成功:0,失败:1 -- \r\n [ $I ] " >> ${SVN_LOG}/svn.mail
fi
fi
fi
}
##function end
# ---------------------------
while [ "${ARR}" -lt "${#REPOSITORY[@]}" ]
do
if [ ! -e ${SVN_LOG} ] || [ ! -d ${SVN_LOG} ];then
mkdir -p ${SVN_LOG}
fi
if [ ! -e ${SVNALL} ] || [ ! -d ${SVNALL} ];then
mkdir -p ${SVNALL}
fi
if [ ! -e ${SVNDATA}/${REPOSITORY[$ARR]} ] || [ ! -d ${SVNDATA}/${REPOSITORY[$ARR]} ];then
mkdir -p ${SVNDATA}/${REPOSITORY[$ARR]}
fi
BUILD=`svnlook youngest ${SVNROOT}/${REPOSITORY[$ARR]}` && sleep 2
KG_BUILD=`cat ${SVN_LOG}/${REPOSITORY[$ARR]}.version`
if [ ! -e ${SVN_LOG}/${REPOSITORY[$ARR]}.version ] && [ -z ${KG_BUILD} ];then
echo "0" > ${SVN_LOG}/${REPOSITORY[$ARR]}.version
KG_BUILD=0
else
#将最新得到的reversion存储起来,并将之前reversion+1
((KG_BUILD=${KG_BUILD}+1))
echo "${BUILD}" > ${SVN_LOG}/${REPOSITORY[$ARR]}.version
fi
#ago 小于等于 after
if [ ${KG_BUILD} -le ${BUILD} ];then
RunStophttp stop
if [[ ${WEEKDAY} = 'Fri' ]];then
##为什么是周五,原因在周末做全备此脚本是不可能的,当然你可以改下我里面的判断逻辑是可以改的。但发这个版本我并没有时间去做修改了,希望理解!
svnadmin dump ${SVNROOT}/${REPOSITORY[$ARR]} > ${SVNALL}/backup.all.${REPOSITORY[$ARR]}.${BUILD}.${DAYTIME}.dump 2> ${SVNALL}/log.${DAYTIME} && sleep 30
echo -e "已执行全备信息如下:\r\n `ls -l ${SVNALL}/backup.all.${REPOSITORY[$ARR]}.${BUILD}.${DAYTIME}.dump`" >> ${SVN_LOG}/svn.mail
fi
echo "${REPOSITORY[$ARR]}:${YM}:${KG_BUILD}:${BUILD}" >> ${SVN_LOG}/svn.important
svnadmin dump ${SVNROOT}/${REPOSITORY[$ARR]} -r ${KG_BUILD}:${BUILD} --incremental > ${SVNDATA}/${REPOSITORY[$ARR]}/${REPOSITORY[$ARR]}.${KG_BUILD}_${BUILD}.dump.${TIME} 2>> ${SVN_LOG}/${REPOSITORY[$ARR]}.log && sleep 30
echo -e "已备份${REPOSITORY[$ARR]}代码库 \r\n `ls -l ${SVNDATA}/${REPOSITORY[$ARR]}/${REPOSITORY[$ARR]}.${KG_BUILD}_${BUILD}.dump.${TIME}`" >> ${SVN_LOG}/svn.mail
RunStophttp start
else
echo -e "代码库:${REPOSITORY[$ARR]} , 前一版本:${KG_BUILD} 大于后一版本:${BUILD} ,没有执行备份操作!" >> ${SVN_LOG}/svn.mail
fi
((ARR=$ARR+1))
unset KG_BUILD BUILD BUILD_TEMP
done
echo "`cat ${SVN_LOG}/svn.mail`" |mutt -s "Svn incremental backup ${TIME}" ${TOMAIL}
/var/spool/cron/ftpRemote.cron.sh > /root/svn.ftp.log 2>&1
最新评语