cvs repository 백업 스크립트
글쓴이: 송지석 / 작성시간: 화, 2004/01/20 - 11:42오전
cvs로 프로젝트 관리하실 때
/cvs/ 와 같이 top 디렉토리 밑에 proj1 proj2 등으로 프로젝트별로 리포지토리가 여럿일 때 리포지토리 하나씩 백업하는 스크립트입니다.
저는 cvs 서버의 hdd가 모자라서 smb로 연결된 NAS에 ssh되는 서버를 물리고 ssh 터널로 삼바 연결해서 백업하도록 했습니다.
cron에 등록해서 매일 백업하고, 오래된 것은 자동으로 지우도록 했습니다. 며칠 전 것까지 보관할 지도 정할 수 있습니다.
단점은,
1. 터널을 미리 만들어두어야 함 : 보안상 암호를 안넣게 하기는 좀 찜찜해서 그렇습니다. ssh 연결시 rsa키로 인증하고 그냥 터널을 계속 켜놓기로 했습니다.
2. 삼바 암호가 스크립트에 그냥 들어감. : cvs 서버가 뚫리면 삼바 암호가 누출될 수 있습니다. 스크립트로 돌리려니 어쩔 수 없는 결과 같습니다.
혹시 더 좋은 생각 있으시면 코멘트 환영합니다.
이걸 응용해서 삼바말고 다른 방법으로 백업할 수도 있을 것 같습니다.
/home/cvs/.cron/bin/cvs-repbackup.sh
#!/bin/bash
# Daniel Jiseok Song
# cvs repository backup script
#
# 2004-1-19 tunneled smb version
# 2004-1-20 added old (4 days ago) back removing routine,
# more generalization.
echo 'Start of cvs repository backup'
CVSROOT_TOP=/home/cvs
BACKUP_DIR=/home/cvs/.cron/tmp
REPO_NAME=test
REMOTE_BACKUP_DIR=samba-directory
SMB_USER=yourname
SMB_PASSWD=yourpasswd
TUNNEL_PORT=ssh-local-tunnel-port-number
NUMPARAM=($#)
BACKUP_KEEP_DAYS=4
if [ $NUMPARAM -eq 0 ]; then
echo 'usage: cvs-repbackup.sh [cvsroot-top] [temporary-backup-dir] [repository-name]'
echo 'doing default setting'
echo $CVSROOT_TOP $BACKUP_DIR $REPO_NAME
fi
if [ $NUMPARAM -gt 0 ]; then
CVSROOT_TOP=$1
fi
if [ $NUMPARAM -gt 1 ]; then
BACKUP_DIR=$2
fi
if [ $NUMPARAM -gt 2 ]; then
REPO_NAME=$3
fi
echo 'backing up cvs repository. cvsroot:'$CVSROOT_TOP/$REPO_NAME 'backup-dir:'$BACKUP_DIR
CUR_TIME=$(date +%Y-%m-%d)
OF=$REPO_NAME-$CUR_TIME.tar.gz
# to delete old backup file
AGO="$BACKUP_KEEP_DAYS days ago"
#OLD_TIME=$(date +%Y-%m-%d --date '4 days ago')
OLD_TIME=$(date +%Y-%m-%d --date "$AGO")
DELF=$REPO_NAME-$OLD_TIME.tar.gz
echo $OF
if [ ! -e $BACKUP_DIR ]; then
echo 'not exist backup directory ' $BACKUP_DIR
echo 'creating directory'
mkdir $BACKUP_DIR
fi
cd $BACKUP_DIR
pwd
# make tar ball
if [ -e $OF ]; then
echo 'already exist backup file ' $OF 'deleting..'
rm $OF
fi
tar -cpszf "$OF" "$CVSROOT_TOP/$REPO_NAME"
if [ $? = 0 ] ; then
echo success;
else
echo failed;
exit 0;
fi
# upload
# you should have ssh port forwarded local port
# ssh -f sshuser@firewall -L ssh-tunnel-port:samba-nas-ip:139 tail -f /etc/motd
echo upload $BACKUP_DIR/$OF $OF
smbclient //localhost/home_dir $SMB_PASSWD -p $TUNNEL_PORT -U $SMB_USER -c "cd $REMOTE_BACKUP_DIR; put $BACKUP_DIR/$OF $OF"
echo end upload
echo removing old $DELF from $REMOTE_BACKUP_DIR
smbclient //localhost/home_dir $SMB_PASSWD -p $TUNNEL_PORT -U $SMB_USER -c "cd $REMOTE_BACKUP_DIR; rm $DELF"
echo end remove
#echo deleting temporary tarball
rm "$OF"
echo 'End of cvs-repbackup.sh'
exit 0
(samba에서 자기 홈디렉토리는 home_dir로 가정했습니다)
아래는 위 스크립트를 cron으로 동작시키는 스크립트입니다.
/home/cvs/.cron/daily/cvs_backup.sh
#!/bin/bash /home/cvs/.cron/bin/cvs-repbackup.sh /home/cvs /home/cvs/.cron/tmp repository1 /home/cvs/.cron/bin/cvs-repbackup.sh /home/cvs /home/cvs/.cron/tmp repository2
Quote:
$ crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (- installed on Mon Jan 19 17:26:35 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
02 4 * * * run-parts /home/cvs/.cron/daily >> /home/cvs/.cron/log
Forums:


댓글 달기