shig**のブログ

shignoとshigenが日々をblogするところです。

xianをフルバックアップしよう。(5/4)

2007-10-03 23:44:15 | 1W180M
ふっ、「5」が眩しいぜ。。TT

大体の骨格はできあがった感じです。
完成度70%位?

では、今日も行ってみましょう。
ようやく、バックアップ本体の部分が形になりました。^^

作成ファイル:
bk_cire.func :各種共通関数を格納。バックアップ機能が追加されました。完成間近。。
bk_main.sh :バックアップスクリプト本体。こっちはあいかわらず。というか、殆ど上が持っていっちゃいました。^^;;


bk_core.func


##############################
### xian backup script ###
### core functions. ###
##############################

###### initialize ######
initproc(){          ← 起動時最初の初期化をこの関数で行うようにしました。
# usage: DO NOT FORGET!!          ← こいつを呼ぶのを忘れると大変な事になります。。

# set default settings.
ourdir="./"          ← 初期化中のログ処理でどうしてもフォルダとログファイル名を決めておく必要があったので、こんな仕様になってます。
logfile=${outdir}xianbk.log

writelog "xian backup script. initialized."
}


##### set output logfile name. #####
setlogf(){          ← こいつは基本的に呼ばないことにしました。理由は後述。
# useage: setlogf (logfile name)

logfile=$1
writelog "ログの出力先を ${logfile} に設定します。" "ログ出力先の設定に失敗しました。"

}


##### set output dir. #####
setoutdir(){          ← 出力先のフォルダを変更します。
# usage: setoutdir (output dir)          ← 使いかたは、setoutdir (新しいフォルダパス)

# check dir.
if [ -d $1 ]
then
outdir=$1
else          ← 指定したフォルダが存在しない時には作ってくれます。
mkdir $1
writelog "$1 が存在しなかったため、新規に作成しました。" "$1 の作成に失敗しました。"
outdir=$1
fi

# output log.
test -d $outdir          ← フォルダ変更のタイミングで、ログファイルの保存先も変更するようにしました。
writelog "ファイルの出力フォルダを ${outdir} に設定しました。" "ファイルの出力フォルダを ${outdir} に変更できませんでした。"
          ← フォルダ変わったのにログファイルが変わらないのはおかしいし、ログファイル名がコロコロ変わるのもおかしいので。^^;
# change log file.
if [ -f $logfile ]
then
writelog "出力フォルダが変更されたため、ログファイルを ${outdir}xianbk.log に移動します。"
cat $logfile >> ${outdir}xianbk.log
if [ $?=0 ]           ← 既にログファイルに何か書き込みが有った場合、ログ内容の移動をします。
then
oldlogfile=$logfile
setlogf ${outdir}xianbk.log
else
:
fi
rm $oldlogfile
writelog "移動元のログファイル $oldlogfile を削除しました。" "移動元のログファイル $oldlogfile の削除に失敗しました。"
else
setlogf ${outdir}xianbk.log           ← よって上のsetlogf関数は、ここでしか呼ばなくなりました。苦労したのに;;
fi
}


##### output log file. #####
writelog(){
# useage: writelog (true_msg) (false_msg)

# catch error No.
errno=$?

# get nowtime , PID
logheader=`date +%D" "%T" "`xian_bk_script[$$]:

# output log.
if [ $errno = "0" ]
then
log_mes="$1 ($errno)"
elif [ $2 ]
then
log_mes="$2 ($errno)"
else
log_mes="【ERROR】 $1 ($errno)"
fi

echo $logheader $log_mes >> $logfile

# check, output log.           ← ログの書き込みチェックをするようにしました。
if [ -f $logfile ]           ← 初回書き込み時のみ有効です。 でも、ロジック変えた方がいいかも。。
then
:
else
echo "ログが書き込めません! writting: "$logheader $log_mes
fi

# if error, exit script.
if [ $errno = "0" ]
then
:
else
exitproc shigen "エラーが発生した為、強制終了します。" $errno
fi

}


##### exit processing. ######
exitproc(){           ← ここは変わらず。
# useage: exitproc (mail address) [message] [exitno]

# get last status.
if [ $# = 3 ]
then
lastst=$3
else
lastst=0
fi

# output log.
writelog $2

# send mail.
mail -s "$2 - xian backup script" $1 << Mmes
xian backup scriptの処理が終了しました。
終了ステータスは $lastst です。実行ログを以下に添付します。
-----From logfile.-----
`cat $logfile`
Mmes

# exit.
exit $lastst
}

##### backup files. #####
xianbkfs(){           ← バックアップ処理部分です。
          ← 決め打ち部分が多いので、スクリプト関数にした意味が在りませんw
## root dir.
writelog "ルートのみをバックアップします。"
# list dir.           ← ルート部分と/home部分で処理を分けています。
ls / -1 > "${outdir}/rootdir.list"           ← まずはフォルダの一覧を取得。

# backup.
while read fline
do
case $fline in           ← それぞれに対して、/homeでないことを確認します。 でも、/tmpとかも要らないんじゃ??
home*);;
*)           ← バックアップはtar.gz形式にします。DVD一枚毎とかに分割できないので、今後の課題。。
writelog "/$fline をバックアップします。以下はtarのログです。=="
tar -cpzf "${outdir}${fline}.tar.gz" "/${fline}" ${dir}${LINE} >> $logfile 2>&1
#writelog "==ここまで。 /$fline をバックアップしました。"           ← さらに、半角スペースの入ったファイル名が有ると、エラーになってスキップしちゃうので、エラーチェックもできません。これも課題。
;;
esac
done < "${outdir}/rootdir.list"


## home dir.
writelog "/home/以下をバックアップします。"
# list dir.           ← こっちはhome以下を対象。
ls /home/ -1 > "${outdir}/homedir.list"

# create home dir.
mkdir ${outdir}/home/

# backup.           ← 基本的な動きに変わりは有りません。ユーザー名毎に1ファイルにバックアップされます。
while read fline
do
case $fline in
*)           ← tarは自身のエラーなんかもログファイルに書き込むようにしてます。できればwritelogにのせたい。。
writelog "/home/$fline をバックアップします。以下はtarのログです。=="
tar -cpzf "${outdir}/home/${fline}.tar.gz" "/home/${fline}" ${dir}${LINE} >> $logfile 2>&1
#writelog "==ここまで。 /home/$fline をバックアップしました。"
;;
esac
done < "${outdir}/homedir.list"

}




bk_main.sh


#!/bin/bash

##############################

### xian backup script ###

##############################

##### startup #####
# import function file.
. ./bk_core.func

# initialize.
initproc           ← こいつを忘れると、大変です。忘れるな→自分。

# mount HDD.
### todo : mount HDD           ← こいつは本番環境にのせた時点で追加します。
writelog "バックアップHDDをマウントました。" "バックアップHDDのマウントに失敗しました。"

# backup dir.
setoutdir "./test/"

writelog "初期化が終了しました。"


##### backup files. #####
xianbkfs            ← 処理をbk_core.confに持っていかれたので気楽なもんです。何がbk_mainだかw

##### debug #####
exitproc shigen テスト終了




【メモ】
・ログファイルの扱いについて
ログファイルは一端、作業フォルダに書き込んだ後、最後にバックアップ先に保存した方が??
でも、エラー発生時に作業フォルダに取り残される危険が・・
→というか、この仕様にするなら、終了時にログファイルをコピーする必要なんてないのか。。後で削除しよう。
→削除して、フォルダ変更時に併せて変更するようにしました。ついでに、ログファイルはxianbk.logに決め打ち。変えないようにしました。

・バックアップ時の注意
コピーだとファイル属性と作成ユーザー名が変更される。圧縮ファイルに。
ただし、大きさのコントロールをしないと、DVD-Rに移せない可能性が・・
→圧縮ファイルにはできたけど、容量のコントロールは未解決。どうしたものか。。

・半角スペースを持つファイルの扱い
tarでエラーになる。こいつが解決しないと、tarのエラーチェックができない。

【TODO】
・本番テスト
・マウントとアンマウントを追加。


今日はここまで。
明日、本番でテストして、導入しちゃいます。
長引いたけど、ようやく終わりがみえてきました!!

最新の画像もっと見る