Solaris のシステム管理 (基本編)

例 — テープバックアップ用の RCM スクリプト


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