#!/usr/bin/perl
#
# do fsck for sm volumes only
#
# usage:
#  uuid /path/to/log
#
# ex:
# sm_fsck  0cc8e318-ddde-47f6-ac99-ec1cac3b9b4f /opt/sarch/var/log/sm/fsck/0cc8e.123123123
#
# Note:
# it is not intedned for manual start. Run from sm_spindle
# Linux only 
#
# TBD: check arguments for spoofing
# 
use File::Basename qw(dirname);

# ARGS ------------------------------------------------------------------------
$uuid=$ARGV[0];
$log =$ARGV[1];

# CONS ------------------------------------------------------------------------
my $FSCK='/sbin/fsck -p';
my $MOUNT=dirname(__FILE__)."/sm_mount";
my $start=time;

# PROC ------------------------------------------------------------------------
sub Log {
  open LOG,">>$log";
  print LOG @_;
  close LOG;
}

# MAIN ========================================================================

 print("MSG=CALL_ERROR\n"), exit 111 if $uuid eq ''; # uuid is not provided
 print("MSG=CALL_ERROR\n"), exit 112 if $log  eq ''; # log  is not provided
 Log("$MOUNT $uuid '' -r check\n");
 $_=`$MOUNT $uuid '' -r check`;
 Log ($_);
 if($?) {                       # mount error
    Log "MSG=MOUNT_ERROR\n";
    print "MSG=MOUNT_ERROR\nERR='$_'";
    exit 100+$?;
 }
 my %minfo=map{/(^\w+)=(.+)/} grep {/^\w+=.+/} split /\n/,$_;
 if(not exists $minfo{DEV}) {
    Log   "MSG=CANNOT FIND DEVICE BY UUID\n";
    print "MSG=CANNOT FIND DEVICE BY UUID\n";
    exit 113;
 }
 Log ("Starting fsck at ". scalar(gmtime) ."\n");
 `$FSCK $minfo{DEV} >>$log`;
 my $elapsed=time-$start;
 Log ("FSCK COMPLETED with code=$? at ". scalar(gmtime) ." runtime=$elapsed\n");
 exit $?;
