svnconfbackup:設定ファイルをバックアップするスクリプト

数年前、構成ファイルをバックアップする作業に直面しました。 はい、単純ではありませんが、いつ何がいつ変更されたかを見ることができます。 csvbackupの存在は知っていましたが、Subversionを使用してPerlを使用しない独自のスクリプトが必要でした。

Subversionに慣れていない人のために説明します。 Subversionはバージョン管理システムの 1つです 。 このようなシステムでは、同じファイルの複数のバージョンを保存できます。 信じられないほど便利です。 会社には2人の管理者がいると想像してください-あなたとあなたのパートナー。 月曜日 あなたは休暇を離れた最初の日であり、パートナーは電話なしで土曜日に海外に休暇に出かけました。 そして突然、Webサーバーなどのサービスの1つが適切に機能していないことがわかります。 しかし、休暇に入る前に、すべてがうまくいきました! 何が変わった? バージョン管理システムに構成ファイルのバックアップコピーがあるため、作業バージョンの構成にロールバックできるだけでなく、不在中に構成ファイルに加えられたすべての変更をトレースして、実際に問題を特定できます。

スクリプトをシンプルでクロスプラットフォーム、いわば最小限の依存関係で作成したかったのです。 Shが通訳として選ばれたのは、 基本FreeBSDシステムに入っています。 Paxはファイルのコピーに使用されます。これは、ファイルをコピーするときのpaxがファイルへのフルパスを再作成するためです。つまり、コマンドの後

pax -rw /etc/ssh/ssh_config /var/tmp

ファイル/ var / tmp / etc / ssh / ssh_configを取得します。 paxは、FreeBSDの基本システムにも含まれています。 その後、Debianに移ったとき、paxを追加でインストールする必要があるのは不愉快な驚きでした。
バックアップ用のファイルのリストは、findコマンドの結果として、およびスペースで区切られたファイルのリストとして、2つの方法で定義します。これは、単一ファイルに便利です。

変数を設定ファイル/usr/local/etc/svnconfbackup.confに配置します。

#,
TMPDIR= "/var/tmp"
#
REPDIR= "conf"
#
DESTDIR=$REPDIR.`date +%s`
#
LIST= "/etc /usr/local/etc /var/named"
EXCLUDE_LIST= "-not -path /etc/'*'shadow'*' \
-and -not -path /var/named/internal/slave/'*' \
-and -not -name '*'.pem \
-and -not -name '*'.key \
-and -not -name '*'.crt \
-and -not -path /etc/ssh_host_rsa_key \
-and -not -path /etc/ssh_host_dsa_key"

FILES= "/home/pgsql/data/*.conf"
#
SVN=`which svn`
SVNADMIN=`which svnadmin`
#
SVNROOT= "/usr/local/svnconfbackuproot"

* This source code was highlighted with Source Code Highlighter .


LIST変数には、findがファイルを検索するディレクトリのリストが含まれ、FILES変数には、バックアップ用のファイルの追加リストが含まれます。 この設定ファイルは、本格的なshスクリプトと見なすことができます。 単一引用符または強力な引用符内では、 ''特殊文字(単一引用符 'を除く)は単純な文字として解釈されます。 つまり、EXCLUDE_LIST変数では、アスタリスクはアスタリスクのままになります。 また、FILES変数では、ディレクトリ/home/pgsql/data/にあるファイルのリストで終わります。この場合の「*」文字はファイル名テンプレートであるためです。
そして、バッククォートで囲まれた内容は、コマンドの結果、つまり 彼女のコンソール出力に。 したがって、 `date +%s`代わりに、1970年1月1日00:00:00から経過した秒数を取得します(LinuxとFreeBSDの動作が異なるため、 mktempは拒否されました)。
バックスラッシュ\は、改行文字の特別な値を上書きします。 これは念のために行われます。

しかし、スクリプトに戻ります。 Subversionリポジトリの初期化とバックアップ手順の2つの部分で構成されます。 初期化は、最初に手動で1回実行する必要があります。 バックアップ自体は、ユーザーの介入なしに実行する必要があります。
コマンド構文:

svnbackupconfig init|update

つまり svnbackupconfig initはリポジトリの初期化を開始し、 svnbackupconfig updateはバックアップ手順を開始します。つまり、リポジトリ内のデータを更新します。

まず、設定をロードしてローカル変数を初期化する必要があります

#!/bin/sh
. /usr/local/etc/svnconfbackup.conf

# URL
SVNROOTsvn= "file://$SVNROOT"



次に、コマンドラインから渡されたコマンドパラメーターを処理します

case "$1" in
init)
#
;;
update)
#
esac


* This source code was highlighted with Source Code Highlighter .


初期化手順

cd $TMPDIR
#
mkdir $DESTDIR
chmod 700 $DESTDIR
#
mkdir $DESTDIR/branch
mkdir $DESTDIR/tag
mkdir $DESTDIR/trunk
cd $DESTDIR
#
#
if [ ! -d $SVNROOT ]; then
$SVNADMIN create $SVNROOT
fi
#
$SVN import $SVNROOTsvn/$REPDIR -q -m "Initial repository layout"
#
cd ../
rm -rf $DESTDIR


* This source code was highlighted with Source Code Highlighter .


バックアップ手順はそれほど長くありませんが、アルゴリズムについて詳しく説明します。 スクリプトを簡単でわかりやすくするために、ヒンドゥー教の 「額」の問題を解決しました。
  1. リポジトリから一時ディレクトリに以前のバックアップをダウンロードします。
  2. バックアップリストで指定されたすべてのファイルをそこにコピーします。 Subversionに何が変わったのかを理解させてください。
  3. 以前のバックアップにない新しいファイルをリポジトリに追加します。
  4. バックアップから各ファイルを確認します。 システムにない場合は、リポジトリから削除します。
  5. 結果をリポジトリに保存します。


これは、間違いなく、リソースを大量に消費するアルゴリズムです。 ただし、典型的なシステムでは、その実装には数分しかかかりません。
新しいファイル(項目3)は簡単に見つけることができますsvn status出力ではsvn status行は文字「?」で始まります。

$ svn status
? some.file


ファイル名を取得するには、構造を使用します

svn status|grep ^?|awk '{print $2}'

これは、 svn status出力がgrep ?渡されるということgrep ? 、最初の文字「?」で行を返します。 この出力は、 awk '{print $2}'コマンドの入力に渡され、2番目のパラメーターを返します。 ファイル名。

実際には、バックアップ手順。

cd $TMPDIR
#
mkdir $DESTDIR
chmod 700 $DESTDIR
#
$SVN checkout -q $SVNROOTsvn/$REPDIR/trunk $DESTDIR
cd $DESTDIR
# ,
list=`eval find $LIST $EXCLUDE_LIST -and -type f|sort`
#
for p in ${list} $FILES ; do
pax -rw $p . > /dev/ null 2>&1
done;
# ,
list=`eval $SVN status|grep ^?|awk '{print $2}' `
#
for p in ${list} ; do
$SVN add -q $p
done;
#
# .svn
list=`eval find . -name .svn -prune -or -print`
#
#
for p in ${list} ; do
if [ ! -e /$p ]; then
$SVN delete -q $p --force
fi
done;
#
$SVN diff
#
$SVN commit -q -m "svnbackup automatic update"
#
cd ../
rm -rf $DESTDIR


* This source code was highlighted with Source Code Highlighter .


svnconfbackup.googlecode.com/files/svnconfbackup.tar.gzアーカイブへのリンク

このスクリプトの使用も簡単です。 アーカイブを解凍した後、スクリプトファイルを/usr/local/binに、設定ファイルを/usr/local/etc OSに合わせて設定してください。 次に、リポジトリを初期化する必要があります。 コマンドを実行する

svnbackupconfig init

これで、必要に応じて、最初のバックアップを手動で実行できます。

svnbackupconfig update

このプロセスには数分かかり、すべての構成ファイルのテキストがコンソールに出力されるまで完了します。これは、リポジトリがまだ空であるためです。 将来の使用では、出力にはバージョン間の変更のみが含まれます。
LinuxとFreeBSDでは、自動起動構成が少し異なります。

Linuxの場合:

echo -e "/usr/local/bin/svnconfbackup update\n" > /etc/cron.daily/svnconfbackup<br>
chmod 755 /etc/cron.daily/svnconfbackup


FreeBSDの場合:

echo "/usr/local/bin/svnconfbackup update\n" > /usr/local/etc/periodic/daily/999.svnbackup<br>
chmod 755 /usr/local/etc/periodic/daily/999.svnbackup


今-バックアップの使用方法について。 概して、以下は主要なsvnコマンドの非常に簡単な説明です。
明確にするために、デフォルト設定を使用します。 最新のバックアップを取得するには、次のコマンドを実行します

svn checkout file:///usr/local/svnconfbackup/conf/trunk conf

confディレクトリは現在のディレクトリに作成され、最後のバックアップのコピーが配置されます。 データを復元するときは、各ディレクトリに.svnという名前のサービスディレクトリがあることに注意してください。

以下の操作については、svn作業ディレクトリとも呼ばれるconfディレクトリに移動します。
必要なコマンドは、updateとdiffの2つだけです。 updateコマンドは、リポジトリではなく、svn作業ディレクトリを更新することに注意してください。 したがって、前のバージョンにロールバックするには、コマンドを実行する必要があります

svn update --revision PREV

一般に、リビジョン番号と日付の両方を--revisionキーまたはその短縮形-rの引数として指定できます。 たとえば、次のように:

svn update -r "{2010-03-31}"

この場合、バックアップは2010年3月31日00:00:00に取得されます。 これより後の自動バックアップ(午前4時など)がある場合、3月30日のバックアップディレクトリは作業ディレクトリにあることに注意してください。

diffコマンドを使用すると、ファイルの2つのバージョン間の変更を確認できます。 この場合、比較するファイルバージョンを明示的に指定できます。 たとえば、コマンド

svn diff -r "{2010-01-01}:HEAD"

昨年から何が変わったかを表示します。 ところで、-rスイッチはcheckoutコマンドでも動作します! 構文とキーの詳細については、ヘルプを参照してください。

svn help < >

のため、素晴らしいSubversion bookのサイトへのリンクを残します。

頑張って! そして覚えておいてください-管理者は2つのタイプに分けられます-一部のデータはすでに失われていますが、他のデータはまだ失われます!

テーマ別ブログに移動したUPD

Source: https://habr.com/ru/post/J83120/


All Articles