#! /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);
}
}
|