#!/bin/sh
##
## This file name is "weeklydump.cron".
## for /etc/cron.daily/weeklydump.cron
##
## [crond 데몬을 이용한 설정파일 백업-매주]
##
## 작성자 김칠봉<san2(at)linuxchannel.net>
## 작성일 : 2001.03.16
##
## *** 다른 백업툴을 사용하지 않은 방법입니다. ***
##
######################################################
##
## [사용법]
##
## cp weeklydump.cron /etc/cron.weekly/
## chmod 700 /etc/cron.weekly/weeklydump.cron
##
## 설정후, 설정파일의 문법이 맞나 확인하는 방법(디버깅)
##
## # sh -xv dailydump.cron
##
######################################################
##
## [백업하는 자료]
##
## [0] 기본 백업 디렉토리 지정
## [1] 압축 여부
## [2] /etc 디렉토리의 각종 설정파일(서버 데몬 설정파일 제외)
## [3] 서버 데몬 설정 파일
## [4] 사용자 정의 설정파일 지정
##
######################################################
##
## [백업할 자료 설정하기]
##
## *** 설정시 주의사항 ***
## 1. '='의 양 사이에 공백을 두면 안됩니다.
## 2. 백업하고자 하는 설정파일을 수정하거나,
## 3. 주석(#)으로 처리하면 그 항목을 백업하지 않습니다.
## 4. 또한 주석으로 처리되어 있지 않더라고 해당 파일이 0 bytes 이면
## 백업하지 않습니다.
##

## [0] 기본 백업 디렉토리 설정(수동으로 디렉토리 만들 필요없음)
##
backupdir="/var/backup"

## [1] 날짜별로 압축할까요
## 1 = yes(예: xxxx-20010314-04.tar.gz)
## 0 = no (예: xxxx-20010314-04)
##
conf_compress="1"

## [2] /etc 디렉토리를 통째로 백업할까요?
## 1 = yes(/etc/ 전체를 백업합니다..)
## 0 = no (하나하나 필요한 것 만 백업합니다.)
##
## *주의) 만약 여기에 주석(#)을 추가하면 $E, $EADD 설정파일은 백업하지 않습니다.
##
etc_all="0"

## 다음의 $E, $EADD 변수는 [2]에서 '0'으로 답한 경우에 만 해당됩니다.
##
## 설정시 주의사항
## - 변수 지정시 인용부호("") 안쪽에는 공백이 있어도 상관없으나,
## - (공백으로 각 설정파일 구분),
## - 인용부호로 감싸이지 않은 설정파일은 변수로 지정할 수 없음. 본쉘의 변수지정 참조
##
## for 문에 사용될 구문자(지우지 마세요)
##
B=" $ "
##
## 직접 설정파일 지정
##
E="/etc/passwd $"
E="/etc/shadow $$$"
E="/etc/group $$$"
E="/etc/gshadow $$$"
E="/etc/my.cnf $$$"
E="/etc/bashrc $$$"
E="/etc/hosts $$$"
E="/etc/hosts.allow $$$"
E="/etc/hosts.deny $$$"
E="/etc/modules.conf $$$"
E="/etc/conf.modules $$$" ## 확인 요망
E="/etc/fstab $$$"
E="/etc/resolv.conf $$$"
E="/etc/lilo.conf $$$"
E="/etc/ftpusers $$$"
E="/etc/host.conf $$$"
E="/etc/services $$$"
E="/etc/rc.d/rc.local $$$"
E="/etc/login.defs $$$"
E="/etc/crontab $$$"
E="/etc/profile $$$"
E="/etc/sysconfig/network $$$"
E="/etc/sysconfig/network-scripts/ifcfg-eth0 $$$"

## 앞에서 설정하지 않은 사용자 정의 추가 설정파일
##
EADD="/etc/hosts.denyck $"
EADD="/etc/cron.daily/dailydump.cron $$$"
EADD="/etc/cron.weekly/weeklydump.cron $$$"
EADD="/etc/rc.d/rc.local.mine $$$"

## [3] 각 서버 데몬 설정파일 지정
## 각 서버데몬의 설정파일이 없으면 백업하지 않으니
## 굳지 주석처리하지 않아도 됩니다.
## 만약 설정파일이 존재하지만 백업하고 싶지 않다면 주석처리

## [3-1] (x)inetd.conf 설정파일
##
inetdconf="/etc/inetd.conf"
xinetdconf="/etc/xinetd.conf" ## redhat 7.x 이상(주석처리할 필요없음)
xinetddir="/etc/xinetd.d" ## redhat 7.x 이상(주석처리할 필요없음)

## [3-2] SMTP 서버 관련 설정파일
## qmail을 사용하는 시스템은 맞게 수정하세요.
##
mailconf="/etc/aliases $"
mailconf="/etc/mail/aliases $$$"
mailconf="/etc/sendmail.cf $$$"
mailconf="/etc/sendmail.cw $$$"
mailconf="/etc/mail/local-host-names $$$"
mailconf="/etc/mail/access $$$"
mailconf="/etc/mail/virtusertable $$$"

## [3-3] FTPd 설정파일
##
ftpdconf="/etc/proftpd.conf"

## [3-4] DNS 설정파일
##
bindconf="/etc/named.conf"
binddbdir="/var/named" ## 다른곳에 DB를 둔다면 수정하세요.

## [3-5] SMBAB 설정파일과 암호
##
#smbconf="/etc/smb.conf $" ## 삼바설정 파일
#smbconf="/etc/smbusers $$$" ## 삼바유저 파일
#smbconf="/etc/smbpasswd $$$" ## 삼바유저 암호파일

## [3-6] HTTPd 설정파일
##
httpdconf="/usr/local/apache/conf/httpd.conf $"
#httpdconf="/etc/httpd/conf/httpd.conf $"
httpdconf="/usr/local/apache/conf/php.ini $$$" ## php 설정파일
#httpdconf=" $$$" ## 기타 httpd 관련

## [3-7] /etc/logrotate.d 디렉토리 백업
##
logrotate_d="/etc/logrotate.d"

## [4] 사용자 정의
## 사용자 정의 설정파일이나 디렉토리 지정

## [4-1] 사용자 정의 설정파일
## 파일명이 각각 틀려야합니다.
## 시스템 계정의 각 설정파일은 아직...T.T
##
userconf="/home/san2/.bashrc $"
userconf="/home/san2/.bash_profile $$$"
userconf="/root/.my.cnf $$$"

## [4-2] 사용자 정의 백업 디렉토리(주로 htdocs)
## 디렉토리 만 설정하세요(이 경우는 압축함).
##
## 주의사항)
## 1. home-san2-wwwhome-20010315-04.tar.gz 형태
## 2. 제일 마지막에 '/'를 넣지 마세요.
## 3. 서브디렉토리는 자동 생성하므로 굳지 서브디렉토리 지정불필요
##
userdirs="/home/san2/wwwhome $"
#userdirs="/usr/local/apache/htdocs $$$"

##
##
## 설정 내용 끝(이하 수정할 필요 없음)
##
######################################################
######################################################
##
## 파일을 구분하기 위해서 날짜-시간으로 설정
##
sysdtime=`date +%Y%m%d-%H`

check_backupdir()
{
KEY="$1"
DIR="$2"
if [ "$KEY" = "1" ] && [ ! -d "$DIR" ] ; then
mkdir -p "$DIR"
fi
}

check_compress()
{
compress_yn="$1"
if [ "$compress_yn" = "1" ] ; then
DKN="$2" ## 각 백업 디렉토리(Dir-Key-Name)
cd "$/$DKN" 2>/dev/null
tar cfpP "$-$.tar" "$-$" >/dev/null 2>&1
gzip -9 "$-$.tar" >/dev/null 2>&1
rm -rf "$-$"
fi
}


each_copy()
{
CONFs="$1" ## 복사할 각각의 설정파일(일종의 배열)
DKN2="$2" ## 복사할 위치의 디렉토리(Dir-Key-Name2)
workdir="$/$/$-$"

for Each_sys_conf in $CONFs ; do
if [ -s "$Each_sys_conf" ] ; then ## 크기가 0kbytes 큰 경우
check_backupdir "1" "$workdir"
cp -af "$Each_sys_conf" "$/" >/dev/null 2>&1
fi
done
if [ -d "$workdir" ] ; then
check_compress "$conf_compress" "$DKN2"
fi
}

## 기본 백업 디렉토리 체크 및 퍼미션 조정
##
check_backupdir "1" "$backupdir"
chmod 700 "$backupdir" 2>/dev/null
chown root.root "$backupdir" 2>/dev/null


## /etc 설정파일들 백업
##
if [ "$etc_all" != "" ] ; then
## /etc 각 설정파일 백업 디렉토리 체크
check_backupdir "1" "$/etc"

##
if [ "$etc_all" = "1" ] ; then
cp -af /etc "$/etc/etc-$" >/dev/null 2>&1
check_compress "$conf_compress" "etc"
else
etc_conf="$$$" ## 일종의 배열로 생각(?)
each_copy "$etc_conf" "etc"
fi
fi

## BIND 설정파일 및 각 DB 파일 백업
##
if [ -d "$binddbdir" ] ; then
binddb=`find $binddbdir ( -type f -o -type l ) -print 2>/dev/null`
fi
bindconf="$$$"

## (X)INETd 설정파일 백업
##
if [ -d "$xinetddir" ] ; then
xinetddirconf=`find $xinetddir -type f -print 2>/dev/null`
fi
inetdconf="$$$$$"

## /etc/logrotate_d 디렉토리 백업
##
if [ -d "$logrotate_d" ] ; then
#check_backupdir "1" "$/logrotate.d"
#cp -af /etc/logrotate.d "$/logrotate.d/logrotate.d-$" >/dev/null 2>&1
#check_compress "$conf_compress" "logrotate.d"
#
logrotate_dconf=`find $logrotate_d -type f -print 2>/dev/null`
fi

each_copy "$bindconf" "bind"

each_copy "$inetdconf" "inetd"

each_copy "$mailconf" "mail"

each_copy "$ftpdconf" "ftpd"

each_copy "$smbconf" "samba"

each_copy "$httpdconf" "httpd"

each_copy "$logrotate_dconf" "logrotate.d"

each_copy "$userconf" "userconf"


## 사용자 정의 디렉토리 백업(압축함)
##

backupdir="$/userdir"

for Each_user_dir in $userdirs ; do
if [ -d "$Each_user_dir" ] ; then

check_backupdir "1" "$backupdir"
##
## $target_dir home-aaa-bbb-ccc와 같은 디렉토리
##
target_dir=`echo "$Each_user_dir" | awk '{print(substr($0,2));}' 2>/dev/null | sed 's///-/g' 2>/dev/null`

user_workdir="$/$"
check_backupdir "1" "$user_workdir"

cp -af "$Each_user_dir" "$/$-$" >/dev/null 2>&1
check_compress "1" "$target_dir"

fi
done

exit 0
Posted by [czar]
,