
問題は、クライアントマシンにWindowsシステムがあることです。 また、受信側も同様のOSを使用します。 Linuxのrsyncサーバーは、2台のマシン間の余分なレイヤーです。 WinサーバーにRsyncをインストールすることは可能ですが、他の抽象的な理由のため、不要です。 その結果、独自のディレクトリ同期スクリプトに出会い、シャドウコピーの作成と組み合わせて、新しいソリューションを作成しました。
結果のスクリプトは完全にここにあります 。 この記事では、主なマイルストーンとその結果の機能を簡単に説明します。
スクリプトは、ディスクのシャドウコピーを作成します。 指定されたディレクトリをsmbを介してリモートリソースにコピーします。 ソースと結果のコピーの差が計算されます。 コピーおよび受信した差分に関するレポートを生成し、指定した受信者にメールでレポートを送信します。
上記の記事のように、開始するには、 Microsoft WebサイトからボリュームシャドウコピーサービスSDK 7.2をダウンロードします。 マシンにインストールし、必要なユーティリティを引き出します。
このSDKのvshadow.exeおよびvshadow.pdbファイルが必要です。 注意-64ビットシステムと32ビットシステムでは異なります。
インストール後、次の場所にあります。
64ビット-%PROGRAMFILES%\ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ obj-chk \ amd64
32ビット-%PROGRAMFILES%\ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ release-xp
別のディレクトリに配置します。 私は通常、さまざまなタスク用にc:\ Windows \!Scriptディレクトリを作成しますが、既にサブディレクトリがあります。 これはすべての人にとって個人的な問題です。 結果の2つのファイルとスクリプトをターゲットマシンにコピーし、タスク用にカスタマイズしたスクリプトを作成できます。 ただし、スクリプトの実行に必要なPythonは、各クライアントマシンにインストールする必要があります。
スクリプト本体自体は137行目から始まります。コピーの目標と他の関連機能を設定するには、変数を定義する必要があります。
#################### ## ## #################### work_dir = 'C:\Windows\!Script\Backup' # . vshadow.exe source_disk = 'c:' destin_disk = 'o:' param_script = 'vs_generated.cmd' # cwd_list = [['o:\\Windows\\!Script\\Backup', '\\\\master\\apps\\temp\\viv\\backup'],['o:\\ocs-ng', '\\\\master\\apps\\temp\\viv\\ocs-ng']] # from_addr = 'admin@typa.ru' # tech_addr = ['user1@typa.ru', 'user1@typa.ru'] #
この場合、これはスクリプトが置かれている作業ディレクトリ、コピーのあるターゲットディスク、作成されたシャドウコピーがマウントされるディスクの名前、vshadow.exeユーティリティが変数の値を保存するファイルの名前です。 次に、cwd_list変数には、コピーするディレクトリとコピー先のリストが含まれます。 変数には、2つの要素リストのリストが含まれます。 Pythonでパスのスラッシュをエスケープするには、スラッシュを2回配置し、ネットワークパスへのリンクを4つまで指定する必要があることに注意してください。
メール送信設定の定義を完了します。 レターの送信者のアドレスを含む変数と、受信者のリストを含む変数。

結論として、スクリプトの主要なマイルストーンをすぐに説明します。
169行目から、シャドウコピーを作成します。
# # if not(path.exists(getcwd() + '\\vshadow.exe')) and not(path.isfile(getcwd() + '\\vshadow.exe')) : exit(1) proc = Popen('vshadow.exe -nw -p -script=' + param_script + ' ' + source_disk, shell=True, stdout=PIPE) proc.wait() out = proc.stdout.readlines()
呼び出しパラメーター-script = '+ param_scriptに注意してください。vshadow.exeの結果、変数の値がこのファイルに配置されます。 それらのうち、作成したシャドウコピーの識別子を含むSHADOW_ID_1のみに関心があります。 実際、さらに受信したファイルを読み取り、さらに作業するために識別子の値を引き出しています。 そして、識別子を見つけた後、シャドウコピーを接続します。
proc = Popen('vshadow.exe -el=' + SHADOW_ID + ',' + destin_disk, shell=True, stdout=PIPE)
さらに、すべてが日常的です。 コピーリストを並べ替えます。 ロボコピーを設定します。 ログを読み取り、レポートを生成します。 結論として、関心のあるすべての人に報告書を送ります。 vshadow.exeからシャドウコピーと変数を含むファイルを削除します
PSところで、このスクリプトの開始時に定義ファイルが残っている場合、vshadowはそれを書き換えることができず、スクリプトはそのIDで古いシャドウコピーを接続しようとします。 理論的には、将来、作業の開始時でもこのファイルの存在を確認し、必要に応じて削除しても問題はありません。
PPSディレクトリがコピーされていることに注意してください。 ディスク全体をコピーする場合は、同期手順をわずかに変更する必要があります。 コピーする場合、ログは保持され、ログファイルの名前はソースディレクトリの名前から取得されます。 ディスク、名前、ログファイル、「o:.txt」などを指定するだけの場合、スクリプトは失敗します。 この場合、受信したファイル名のすべての文字が有効であることを確認し、他の文字を削除することをお勧めします。