#! /usr/bin/perl -w # # サイト用にカスタマイズされた RCM スクリプトの例 # # RCM_ENV_FORCE が FALSE の場合、RCM はテープドライブが # バックアップのために使用されているときは、 # ドライブを解放できない # # RCM_ENV_FORCE が TRUE の場合、DR はテープドライブをバックアップのために # 使用しているバックアップアプリケーションを終了してテープドライブを # 取り外すことができる。 # use strict; my ($cmd, %dispatch); $cmd = shift(@ARGV); # RCM コマンドのテーブルをディスパッチする %dispatch = ( "scriptinfo" => \&do_scriptinfo, "register" => \&do_register, "resourceinfo" => \&do_resourceinfo, "queryremove" => \&do_preremove, "preremove" => \&do_preremove ); if (defined($dispatch{$cmd})) { &{$dispatch{$cmd}}; } else { exit (2); } sub do_scriptinfo { print "rcm_script_version=1\n"; print "rcm_script_func_info=Tape backup appl script for DR\n"; exit (0); } sub do_register { my ($dir, $f, $errmsg); $dir = opendir(RMT, "/dev/rmt"); if (!$dir) { $errmsg = "Unable to open /dev/rmt directory: $!"; print "rcm_failure_reason=$errmsg\n"; exit (1); } while ($f = readdir(RMT)) { # 非表示のファイルや同一デバイスの複数の名前を無視する if (($f !~ /^\./) && ($f =~ /^[0-9]+$/)) { print "rcm_resource_name=/dev/rmt/$f\n"; } } closedir(RMT); exit (0); } sub do_resourceinfo { my ($rsrc, $unit); $rsrc = shift(@ARGV); if ($rsrc =~ /^\/dev\/rmt\/([0-9]+)$/) { $unit = $1; print "rcm_resource_usage_info=Backup Tape Unit Number $unit\n"; exit (0); } else { print "rcm_failure_reason=Unknown tape device!\n"; exit (1); } } sub do_preremove { my ($rsrc); $rsrc = shift(@ARGV); # このリソースをバックアップアプリケーションが # 使用している場合にチェックする # if ($rsrc 上でバックアップアプリケーションが # 動作していない場合) { # DR を続行させる # exit (0); #} # # RCM_ENV_FORCE が FALSE の場合、処理を拒否する # RCM_ENV_FORCE が TRUE の場合、バックアップアプリケーションを # 終了して DR が処理を続行できるようにする # if ($ENV{RCM_ENV_FORCE} eq 'TRUE') { if ($cmd eq 'preremove') { # kill the tape backup application } exit (0); } else { # # テープバックアップアプリケーションによって # デバイスが使用されていたため、テープドライブを # 解放できなかったことを示す # print "rcm_failure_reason=tape backup in progress pid=...\n" ; exit (3); } } |